WiFiの調子が悪い時など、IPを固定したい。
しかし、外出時はDHCPにしたい。
そんなときに考えた事。

なお、MacOSX 10.11.6でとりあえず動くよ、というレベルです。

ネットワーク設定をCLIで変更

まずは、CLIでネットワーク設定を変更する方法から。

/usr/sbin/networksetupにより、DHCP/manualや、IPなどを設定する事ができます。

#!/bin/bash

# config
my_SSID=""
ip=""
subnet="255.255.255.0"
gateway=""

SSID=`/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | grep " SSID" | tr -d " " | cut -c6-`

if [ "${SSID}" =  "${my_SSID}" ] ; then
  sudo /usr/sbin/networksetup -setmanual Wi-Fi ${ip} ${subnet} ${gateway}                                                                                          
else
  sudo /usr/sbin/networksetup -setdhcp Wi-Fi
fi

configに適切な値を入れてください。

SSIDの切り替えを検知する方法

SSIDが切り替わる際、以下のファイルが変更されるので、これをトリガーにします。
/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist

ファイル変更をトリガーに、コマンドを実行

ファイルの変更をトリガーに、スクリプトを実行するように仕込みます。
スクリプトは/usr/local/bin/以下に置きました。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
          "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key>
    <string>wifi_auto_config</string>
    <key>ProgramArguments</key>
    <array>
      <string>/usr/local/bin/wifi_auto_config.sh</string>
    </array>
    <key>RunAtLoad</key>                                                                                                                                      
    <true/>
    <key>StandardErrorPath</key>
    <string>/dev/null</string>
    <key>StandardOutPath</key>
    <string>/dev/null</string>
    <key>WatchPaths</key>
    <array>
      <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string>
    </array>
  </dict>
</plist>

上記をlaunchctlに登録します。

cd ~/Library/LaunchAgents
sudo launchctl load wifi_auto_config.plist
launchctl list | prep wifi

sudoで登録しないと、切り替え時にrootパスワードが聞かれてしまいました。
sudoで登録するには、権限周りに注意。

ls ~/Library/LaunchAgents/wifi_auto_config.plist 
> -rw-r--r--+ 1 root  wheel   735B  9 13 01:02 ~/Library/LaunchAgents/wifi_auto_config.plist

参考