無線LANの接続先でAdiumのステータスを自動的に変更するスクリプト
タイトルまんま。
普段無線LANで生活してるので、接続先みれば今どこにいるのか自動化できる気がしたのでやってみた。
まず、SSIDの取得方法。
最初さっぱり分からなくて苦肉の策でsystem.logあたりを監視していたのですが、さすがにあれなのでGoogle先生にお伺いたてたところ
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --getinfo
で、無線LANの情報がとれるらしい。
うちのだとこんな感じ。
agrCtlRSSI: -74 agrExtRSSI: 0 agrCtlNoise: -92 agrExtNoise: 0 state: running op mode: station lastTxRate: 52 maxRate: 130 lastAssocStatus: 0 802.11 auth: open link auth: wpa2-psk BSSID: xx:xx:xx:xx:xx:xx SSID: xxxxxxxx MCS: 11 channel: 1
一応MACアドレスとSSIDは伏せてますが、まぁ、深い意味はない。
で、てきとうにsedるとSSID取得完了。
#!/bin/bash /System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --getinfo | sed -n "s/^[ ]*SSID: \([^ ]*\)[ ]*$/\1/p";
正規表現はもうちっときれいになると思うので適宜変更をば。
で、次にAdiumの状態変更。
さすがにこれはShellScriptじゃどうにもならないので、AppleScript頼りに。
Automatorとかでどうにかなるかなとか考えていたのだけど、AppleScript直書きに方が楽です。
というのも、AdiumはAppleScript用に(?)APIというか、いくつか名前とコマンドを提供しているらしいので、そいつを使うと一発。
とりあえず、ScriptEditorを立ち上げて、ファイル->用語説明を開く...、一覧からAdium.appを選択。
あとはなんかそれっぽいキーワード拾ってAppleScriptを書くだけ。
...だけなんだけど、AppleScriptの書き方が全然分からない。
しばらく格闘してできたのが↓
on run argv tell application "Adium" set status message of accounts to ("" & item 1 of argv) end tell end run
AppleScriptの方で細かい処理をやるのは死ぬので、とりあえず、AppleScript側ではAdiumのステータスを変えるだけ。
特定のアカウントのステートだけ変えたい場合はaccountsじゃなくて、account nで。
nはaccountのIDらしいので、適当に変えてみるといいかも。
あと、
tell application "Adium" name of account 1 end tell
を実行するとaccount 1のログインIDが拾えるので参考に。
本当はstatus messageじゃなくて、status自体を変えるべきなんだろうけど、status IDとかめんどくさそうなのでmessage直変え。
適当に進化させてあげてください。
あ、あと、進化後のスクリプトをこっちにフィードバックしていただけると、俺が喜びます。はい。
あとはくっつけるだけ。
うちのはこんな感じ。
#!/bin/bash scriptDir="${0}.d"; GetSSID="${scriptDir}/getSSID.sh"; SetAdiumStatus="osascript ${scriptDir}/SetAdiumStatus.scpt"; PostUpdate="osascript ${scriptDir}/PostUpdate.scpt"; Sleep="${scriptDir}/sleep.sh"; ssid=$(${GetSSID}); while true; do oldssid=${ssid}; ssid=$(${GetSSID}); # 変更があったときだけAdiumに通知 if [ "${oldssid}" != "${ssid}" ]; then case ${ssid} in "") # 無線LANに繋がっていない。 # 切れるたびにAdiumに通知するのもあれなので、 # ssidをoldssidで上書きして、 # あたかも変更が無かったかのように振る舞う。 ssid=${oldssid}; ;; "YourHome") # 自宅。 ${SetAdiumStatus} "at 自宅"; #${PostUpdate} "at 自宅"; ;; "YourUniversity") # 学校とか。 ${SetAdiumStatus} "at 学校"; #${PostUpdate} "at 学校"; ;; "YourLabs") # 研究室とか。 ${SetAdiumStatus} "at 研究室"; #${PostUpdate} "at 研究室"; ;; *) # Unknown ;; esac else # 変更なし。 fi # しばらくまつ。 ${Sleep} done
スクリプト名+".d"という名前のディレクトリ掘って、そこに必要なスクリプト類をぶち込んでみた。
Sleepをわざわざ別ファイルに分けたのは、このメインスクリプト自体はnohup*1 + backgroundで回すつもりなので、スリープ時間を変えたかったときに直ぐ変えられるように。
と、思ったのだけどあまりいらない機能。
むしろSSIDとメッセージの組を別ファイルにした方がよかったかも。
あと、PostUpdateはtwitterクライアントのTwitterificがAppleScriptでいじれたの試しに作ってみたやつ。
ただ、ちょっとうざいので今は使ってない。
あとは
$ nohup autoState.sh >/dev/null 2>&1 &
みたく、nohup+backgroundで起動しておくだけ。
無線LANの接続先が変わる度にAdiumのステートも変わります。多分。
*1:ムトウハップのこと。嘘。簡単に言えば親のShellが死んでも生き残るようにするためのおまじない。