無線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が死んでも生き残るようにするためのおまじない。