一般的に、Mac OS Xで「Wi-Fi接続をトリガーに(SSIDに応じて)何かを実行する」というのは容易に書ける。今回は、au Wi-Fiが提供するアクセスポイントに接続した際にすかさずau Wi-Fi接続ツールを起動するという機構を実現してみた。
まずは、SSIDを判定してアプリを起動するスクリプトを書く。もちろん、shが苦手なら他の言語でも良い。

#!/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を書けば良い。(ホームディレクトリのパスは各自要修正)

<?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に登録すれば完了。

% launchctl load -w ~/Library/LaunchAgents/org.idaemons.wifido.plist

これで、対応アクセスポイントにつながるや否や、接続ツールが起動して認証され、Wi-Fiが使えるようになるはず。
うまく動いたら、他の接続サービスでも同様にするとか、特定のSSIDのときだけdaemonを起動するとか、応用してみよう。

Tags :
Categories : Tech