Pick of the Week - Nov 10 [Show all picks]
Path Finder 5 - A feature-laden Finder replacement
Submit Hint Search The Forums LinksStatsPollsFAQHeadlinesRSS
12,000 hints and counting!

10.4: Allow Location changes to trigger other events Network
I've been appreciative of the work folks have put into creating scripts to change a computer's Location based on, most often, detected SSIDs, but I've had the opposite problem: I wanted a manual change of the Location from the Apple Menu to trigger other events. Solutions such as Location X exist, but I'm cheap. Besides, I knew it had to be doable.

After a bit of poking around, I hit on the following solution, which only works in 10.4.

launchd is 10.4's replacement for cron, rc, and a bunch of other scheduler tools. One of the things it offers is a 'watch list', which allows an action to be triggered when a file is changed. Well, anytime a new Location is selected (by whatever mechanism), the file /Library -> Preferences -> SystemConfiguration -> preferences.plist is altered to reflect this. It doesn't seem to be altered for other things, so it is assumed to be safe to use for this. (Worst case scenario, you'll get spurious runs of your script -- it's up to you to make sure it's harmless.)

This plist file will suffice, when placed in /Library -> LaunchAgents -> com.macoshints.locchghook.plist. After placing this file, you need to tell launchd to respond to it. Invoking launchctl load /Library/LaunchAgents/com.macosxints.locchghook.plist in the Terminal will do that. (I am assuming that this gets picked up automagically at reboot -- I do that so rarely that I'm happy to let others test that last detail.)

Now, whenever your Location changes, the script at /Library -> LaunchAgents -> locchghook will get executed. To find out what location it is now set to, you can use scutil to get that, as in the following (braindead) Python script:
#!/usr/bin/python
import pexpect

# Trigger scutil to be run
scutil = pexpect.spawn("scutil")

# Ask for Setup:/ key (which contains the current Location)
scutil.sendline('show Setup:/')

# Flush the buffer
scutil.sendeof()

# Skip three lines of output
scutil.readline()
scutil.readline()
scutil.readline()

# Grab the location name
location = scutil.readline().split(":")[1].strip()

# Insert real work here...
f = open('/Users/Shared/foo', 'w')
if location=="Work":
  f.write("BOO!  WORK!")
elif location == "Home":
  f.write("YAY!  HOME!")
else:
  f.write("I'M LOST!")

f.close()
This uses the pexpect Python package, which is unfortunately not included by default in Mac OS X. Luckily, it is a simple install. Now, assuming that you have Locations named Work and Home, the above will write the appropriate line to /Users/Shared/foo when you change your Location.

I'm sure you can think of many other more useful things to do; this is just the hook. Since any file can be executed, you could trigger shell scripts, AppleScripts, Python, Perl, Ruby ... you name it. Have fun!
    •    
  • Currently 0.00 / 5
  • 1
  • 2
  • 3
  • 4
  • 5
  (0 votes cast)
 
[12,181 views]  

10.4: Allow Location changes to trigger other events | 9 comments | Create New Account
Click here to return to the '10.4: Allow Location changes to trigger other events' hint
The following comments are owned by whomever posted them. This site is not responsible for what they say.
10.4: Allow Location changes to trigger other events
Authored by: blalor on Thu, Jun 15 2006 at 8:01AM PDT
Brilliant! That's really excellent! I've been wanting a way to do this without modifying the kicker XML file.

Just a quick note, ncutil is another handy utility for working with the network configuration.

[ Reply to This | # ]
10.4: Allow Location changes to trigger other events
Authored by: cynikal on Thu, Jun 15 2006 at 8:54AM PDT
I used to try doing this with the kicker but it didn't quite work as expected.. i really needed something like this at my old job, where i had to use a proxy for things like ssh, aim, etc (and things ilke ssh and at the time, aim didn't read system proxy prefereces, nor does firefox).. but anyway, is there any reason you're using python? you could easily do this using perl, or even sh!

scutil<<_EOF|awk '$1 ~ /UserDefinedName/ {print $3}'
show Setup:/          
exit
_EOF
heck couldn't you even use the scelect utility:

scselect 2>&1|awk '$1 ~ /\*/ {gsub("[()]","",$3);print $3}'


[ Reply to This | # ]
10.4: Allow Location changes to trigger other events
Authored by: VAleks on Thu, Jun 15 2006 at 8:54AM PDT

That's what I was always looking for, great hint :)

Being one-liner's addict, thought, I replaced python-scutil interaction with:

echo show Setup:/ | scutil | awk '/UserDefinedName/{print $3}'



[ Reply to This | # ]
10.4: Allow Location changes to trigger other events
Authored by: blalor on Thu, Jun 15 2006 at 10:41AM PDT
These one-liners are great, but don't take into account location names with spaces in them.
Try this, which grabs everything inside the parens at the end of the string: scselect 2>&1 | egrep '^ +*' | sed -e 's#.*((.*))#1#g'

[ Reply to This | # ]
10.4: Allow Location changes to trigger other events
Authored by: Kickaha on Thu, Jun 15 2006 at 9:05AM PDT
Typo alert... in my haste to send this, I apparently made a couple of booboos. The name of the file needs to match the value of 'Label' in the plist: com.macosxhints.logchghook.plist. Also, you need to type that correctly when invoking launchd. ;)

Y'all are right, a one-line shell or Perl script would do the trick too (as would using scselect, I wasn't aware of that tool, thanks!) I just happened to be working in Python recently is all. :)

[ Reply to This | # ]
Change location based on SSID
Authored by: bedouin on Thu, Jun 15 2006 at 4:42PM PDT
What's the name of the program mentioned in this article that can change locations based on your SSID? It would be useful switching between some networks that have static and dynamic IPs.

[ Reply to This | # ]
Change location based on SSID
Authored by: BobHarris on Thu, Jun 15 2006 at 6:40PM PDT
Change location based on SSID
Authored by: richwiss on Thu, Jun 15 2006 at 9:01PM PDT
First, a typo in the html above. The correct link is:

http://www.macosxhints.com/article.php?story=2005010613401823

Also, as author of that hint, I'd strongly advocate using this more recent (Anonymously submitted) hint which works better than my original hint did:

http://www.macosxhints.com/article.php?story=20060122060330816

Note my comment in that newer hint which, IMHO, makes the hint much better.

[ Reply to This | # ]

10.4: Allow Location changes to trigger other events
Authored by: toupsz on Fri, Jun 16 2006 at 4:29AM PDT
Hmm...I'll have to try this out. Before, I was using Scenario and AppleScript...I'd have Scenario run a custom AppleScript whenever the laptop woke, then the AppleScript would check which WiFi network I'm attached to and react accordingly...this might be more elegant and more functional. Mysteriously, the airport card seems to be taking awhile to wake up (I think since the last update) and that's made the functionality of the script questionable at best.

Sad, too, since I actually bought Scenario! :)


[ Reply to This | # ]