一般的に、Mac OS Xで「Wi-Fi接続をトリガーに(SSIDに応じて)何かを実行する」というのは容易に書ける。今回は、au Wi-Fiが提供するアクセスポイントに接続した際にすかさずau Wi-Fi接続ツールを起動するという機構を実現してみた。
まずは、SSIDを判定してアプリを起動するスクリプトを書く。もちろん、shが苦手なら他の言語でも良い。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/sh ssid="$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -I | awk '$1=="SSID:"{print $2}')" case "$ssid" in au_Wi-Fi|Wi2_club|Wi2premium_club|UQ_Wi-Fi|Wi2|Wi2premium|wifi_square|'[wi2]') app='au Wi-Fi接続ツール' killall -s "$app" >/dev/null 2>&1 || open -ga "$app" ;; esac |
細かいテクニックとして、killall -s
でアプリが起動しているかをチェックし、open -g
で前面に出てきてフォーカスを奪うのを抑制している。いきなりopenしてもよさそうだが、-g
が利かないアプリもあるので一般的にこうするのが望ましい。
さて、このスクリプトをcronに登録して定期実行しても動くといえば動くが、もうちょっとスマートな方法を考えよう。Unix系OSでは、ネットワークの接続・切断時には特定の設定ファイルが更新されることが多い。OS X 10.9の場合は、昔ながらの/etc/resolv.conf
(実体は/var/run/resolv.conf
)を含め、3つほどのファイルが、ネットワーク環境の変化に応じて更新されるようだ。
そして、OS Xにはファイルの更新を検知する機構が備わっており、launchd(8)を使えば一般ユーザでも手軽に更新をトリガーに何かを実行するということが可能だ。
つまり、こんなplistを書けば良い。(ホームディレクトリのパスは各自要修正)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>org.idaemons.wifido</string> <key>LowPriorityIO</key> <true/> <key>ProgramArguments</key> <array> <string>/Users/knu/bin/wifidoit</string> </array> <key>RunAtLoad</key> <true/> <key>WatchPaths</key> <array> <string>/var/run/resolv.conf</string> <string>/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist</string> <string>/Library/Preferences/SystemConfiguration/NetworkInterfaces.plist</string> </array> </dict> </plist> |
あとは、launchdに登録すれば完了。
1 |
% launchctl load -w ~/Library/LaunchAgents/org.idaemons.wifido.plist |
これで、対応アクセスポイントにつながるや否や、接続ツールが起動して認証され、Wi-Fiが使えるようになるはず。
うまく動いたら、他の接続サービスでも同様にするとか、特定のSSIDのときだけdaemonを起動するとか、応用してみよう。