Automatic Network Location

I bounce back and forth between work and home with a MacBook Pro. At work, I’m behind a firewall, and have to go through a web proxy to get to public internet sites. I have 2 network locations setup, home and work. When I get to work I manually set my location to work, and when I get home, I manually set it to home again.

I got tired of remembering to do this so I looked around, and found scselect. scselect is a command line utility that comes with OS X that lets you set your location by name

scselect "home"

Now all I needed was a way to determine whether I was at work or home and then run scselect with the corresponding location. My work assigned ip address has a set prefix, so I can use that to say I’m at work and anything else would default to home.

# exit code is 0 if on work network and 1 otherwise
ifconfig | grep -i "inet 59.33" > /dev/null

In order to prevent setting the location to the same location we need to find out what the current location is. Running scselect with no arguments displays a list of locations and the active one is marked with an asterisk (*). Here’s my list.

> scselect
Defined sets include: (* == current set)
   575844ED-8466-479C-9567-3F0B7D767EE9	(home)
   3DF4B8B9-2E92-4F61-B684-74E0D0D38DEE	(Automatic)
 * 6064213B-532D-43C9-8941-DC72B6487955	(work)

The output is a bit messy, and we need to parse out the active location.

#!/usr/bin/env ruby

# example output: * 6064213B-532D-43C9-8941-DC72B6487955	(work)
output = `scselect 2>&1 | grep ' \\* '`

# parse out the location.
location = output.scan(/\(.*\)/).first.gsub(/[\(\)]/, "")

# location = work

We now compare the active location with the location our ip address tells us. If different, we call scselect with the new location.

Complete script is available here