Network Manager

NetworkManagerで躓いたところがあったのでメモ。
参考元: いますぐ実践! Linux システム管理 / Vol.173 /

[目的]無線LANを接続したときにあるスクリプト(hoge.sh)を走らせたい。

使用しているOSはDebian系のUbuntu12.10。
/etc/NetworkManagerを設定をする。
system-connectionsディレクトリには接続可能なEESIDが表示されている。

ここで、NetworkManagerは無線LANが接続または切断したときにdispatcher.dディレクト
においてあるスクリプトを辞書式順に実行していく。
dispatcher.dディレクトリには01ifupdownというスクリプトが置いてある。
辞書式順(数字優先)に実行していくので「00*」というスクリプト名にしないかぎり
01ifupdownが先に実行される。
実行されるスクリプトには、第1引数にインターフェース名、第2引数に実行されるアクションが渡される。
アクションは次のとおりとなる。

  • up: 接続
  • down: 切断
  • host: ホスト名の設定
01ifupdownの一部を見てみる。

01:  case "$2" in 
02:     up|vpn-up)
03: 	export MODE="start"
04: 	export PHASE="post-up"
05:	exec run-parts /etc/network/if-up.d
06:	;;
07:    down|vpn-down)
08:	export MODE="stop"
09:	export PHASE="post-down"
10:	exec run-parts /etc/network/if-post-down.d
11:	;;

第2引数で条件分岐をしている。
02-06行で接続時のアクション、07-11行で切断時のアクション。
ここで、接続時は /etc/network/if-up.d、切断時は/etc/network/if-post-donw.dをrun-partsをexecしている。
01ifupdownは/etc/networkへのディスパッチャとなっている。
よって、hoge.shを/etc/network/if-up.dディレクトリに置けば目的が達成できるはず・・・

しかし、実際には実行されない。。。
ここで嵌った。
ここで。


調べるとrun-partsコマンドが元凶。
run-partsコマンドは引数に指定されたパス以下の実行可能ファイルを辞書式順に実行していく。
しかし、Debian系とFedora系では挙動が異なる。
Fedora系ではこの問題を起きない。Debian系でしか起きない。

実行環境(Debian系)でmanを調べるとスクリプト名前空間名が (^[a-zA-Z0-9_-]+$) となっている。
すなわち、ドット「 . 」を含むファイル名はオプションを指定しないかぎり実行されない。
なので、「hoge.sh」ではなく「hoge」というスクリプト名にしなければ実行されない。

そもそも、なぜ.shという拡張子を付けていたかというと、Emacsでシェルモードを使いたいから。
解決策としては、拡張子をつけないか、run-partsに--lsbsysinitオプションをつける名前空間を変更するか。