2007-07-07

notifiedexecd: ネットワーク変更時などに指定したプログラムを実行する

ずいぶん前に 6 x 3: notifiedexecd とか 6 x 3: Mac OS X 上で configd を使って ntpd の再起動をしてみる という記事を書いた。持ち歩いている PowerBook でネットワークへの接続状況が変わると ntpd がうまく時刻を同期してくれなくなるのをなんとかしたいというのがもともとの動機だった。結局、自作の notifiedexecd というプログラムでは、他の通知(distributed notification)は受け付けられるものの、ネットワークの接続状況の変更に関してはうまくいきそうで、ダメだったというのがそのときの状況。

で、一月半くらい前に MacOSXHints で見たこの記事( macosxhints.com - How to perform an action on change of network)をヒントにして件の notifiexecd を改訂してみた。実際には、ここで紹介されている IXSCNotificationManager というクラスを Google で検索して見つけたCocoaDev: NotificationOnNewNetwork を参考にしている。というかサンプルをそのまま埋め込んだだけというか。とりあえずソースコード を置いておく。配布に特に制限は付けないけど、どこかで紹介するときにはこの記事を参照してもらえるといいかなぁ。

IXSCNotificationManager 自体は配布しているソースコードには入れていないけど、"make fetch" するとネットワーク経由で配布元から入手することができるようにはしてある。そのあとで make all; make install すれば /usr/local/bin に notifiedexecd がインストールされる。

使い方は、前に6 x 3: notifiedexecd で説明したのとほぼ同じで、普通の通知(distributed notification) ならそのまま。前はネットワークの変更を知るにはこれではダメだったので、今度は SystemConfiguration Framework からの変更通知を知る -s オプションを使うことになる。例えば IPv4 の状態?が変わったときに /usr/local/bin/restart-ntpd を実行したいならば、

notifiedexecd -s State:/Network/Global/IPv4 /usr/local/bin/restart-ntpd
のようにすればよい。

-s オプションを使うときに通知の名前の代わりに使うキー(上の例だと State:/Network/Global/IPv4)は、コマンドラインで scrutil を実行して、list サブコマンドの結果として得られたものが使える。State:/Network/Global/IPv4 はちょと意味が違うような気もするけど、ntpd を再起動するという今回の用途にはとりあえず足りてる。

No comments: