2011/03/04

map script interfaces wlan

暫く自宅と会社をノートPC持って往復してたんですが
Debian でローテクでやってるんで wifi の設定も貧弱で
/etc/netwerk/interfaces を手で書き直してました
コメントにしたりコメントアウトにしたり
どうなのよそれ、と

で、Debian 系だとその interfaces で mapping っつーの使います
script を走らせて状況判断させて
事前にしてある任意の設定で interface を up できる
っつーのは知ってたけど今までそこまで使い込むことなかったんですが
やるべ、と、一大決心をして、ググりました

何も見ないし何も知らない | テーマ:コンピューター・Web
ん〜、惜しい、その最後のとこに書いてある
「Address(Mac Address)をsedで抜き出したらうまくいくかもしれない。」
それが欲しいんだ!

つわけで自分で作ればいいかと考え直しました
interfaces の mapping から復習しました
$ man interfaces
したら復習できました

例えば
wlan0 という interface に対してスクリプトで動的に設定したい、
という場合
mapping wlan0
script /usr/local/sbin/my_script.sh
map spam ham
map egg bacon
みたいに書きます

で、ifup wlan0 と wlan0 を有効にしようとすると
/usr/local/sbin/my_script.sh に引数 wlan0 が渡され
更に map で始まる行の map 以外の部分が標準入力に渡されます
つまり、
$ echo -e "spam ham\negg bacon" | /usr/local/sbin/my_script.sh wlan0
したみたいになるわけです

でで、このコマンドの出力結果の文字列が
実際に設定されます

ででで、今回は wifi AP の MAC ADDRESS を登録しといて
実際に行う動作の設定へと導いてあげることにしました
/etc/network/interfaces はこんな感じにしたい
mapping wlan0
script /usr/local/sbin/my_script.sh
map XX:XX:XX:XX:XX:XX office
map YY:YY:YY:YY:YY:YY home

iface wifi-office inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-ssid "office api"
wpa-psk "xxxxxxxxxxxxxxxxxxxxxxxx"

iface wifi-home inet dhcp
wpa-driver wext
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-ssid "office home"
wpa-psk "yyyyyyyyyyyyyyyyyyyyyyyy"
で、あとは /usr/local/sbin/my_script.sh が
出力結果として "wifi-office" か "wifi-home" を出力してくれれば
それぞれの設定を施して AP に繋ぎにいってくれるはずです

じゃぁ /usr/local/sbin/my_script.sh どうすんのよ、というと
上のサイトと Debian の examples を見たらこんな感じに
#!/bin/sh
LANG=C
set -e

# 対象 interface で scan して wifi AP の MAC ADDRESS 集め
INTERFACE=$1
ifconfig $INTERFACE up
sleep 1
MACADDRESS_LIST=$(iwlist $INTERFACE scan | sed -n -e 's/^.*Address: \([0-9A-F:]*\).*$/\1/p')
ifconfig $INTERFACE down

which=""
# read は標準入力から1行読んで変数に入れる
while read testmac scheme; do
if [ "$which" ]; then continue; fi
for MACADDRESS in $MACADDRESS_LIST; do
# 設定されてる MAC ADDRESS があれば対応する設定を $which に
if [ "$testmac" = "$MACADDRESS" ]; then which="$scheme"; fi
done
done

#仕上に出力、hit しなかったら "wifi-default" と出す
echo wifi-${which:-default}
どうも sleep が短かいのか
ちょっと調整しないと一発で成功とまではいってないんですが
これで一々設定ファイルいじらなくてもよくなりました

でもさ、どーせさ、みんな Ubuntu 使ってるからさ
こんなことしなくてもサクサク設定できちゃってるわけでしょ?
ぷんぷん