ThinkPad X21 に Puppy Linuxをインストールし、AirStationに無線LAN接続しました。 接続設定を保存しておけばパピーは立ち上がり時に自動的に接続してくれます。 しかし、ひとつ問題があります。
保存された設定で接続を試みるが失敗した場合、パピーは他を探して可能なところがあればそこに接続します。 親切仕様みたいですが、困ることもあります。 代替の接続先は必ずしもインターネットに接続されているとは限りません。 また我が家ではホームLANみたいなものを構成しているので、他のネットに繋げられると、ホームLAN内の他のパソコンにアクセスできなくなります。
そこで接続先が正しいかどうかをチェックすることにしました。 我が家の場合、正しいIPは 192.168.11.??? のはずです。 192.168.1.??? や 169.254.なんとか(これは繋がらないときのデフォルトか?) などになったら 不正常。 IPは次の コマンド で チェック できます。 インターフェースはBUFFALO WLI-CB-AG54Lでは ath0ですが、機器によって wlan0 など異なった名前になります。 分からなければインターフェース指定なしで、ただ ifconfig と入力すれば見つかります。
ifconfig ath0
パピーの自動接続はスクリプト /etc/rc.d/rc.network をバックグラウンドで動かすことで行っています。 このスクリプトの終了を待って IPをチェック、 正しくなければ rc.networkをいったん停止してやり直します。
/etc/rc.d/rc.network stop /etc/rc.d/rc.network start
以上を毎回手動でやるのはたいへんなので、これを自動化するスクリプトを作りました。 バックグラウンドで動かすと不具合があったので、Xが立ち上がってから仮想端末上で実行することとしました。
使ったスクリプト checknet, aircheck, refreshairの3つはこちらに用意しています。 環境に合わせ変更し実行属性を付けて /root/my_applications/bin などパスの通った場所に置いてください。
aircheck へのリンクを作り /root/Startup に置きます。 このディレクトリに置かれたプログラムは Xが起動したときに自動的に実行されます。 aircheckは仮想端末を立ち上げて checknetを実行します。 正しく接続されるまで何度も繰り返します。 中止したいときは仮想端末のウィンドウを閉じてください。
refreshairは現在の接続を強制的に閉じてやり直したいときに使います。 デスクトップにアイコンを作るなどして、必要なときにクリックしてください。
#!/bin/bash # 14 May 2009 Masaki ShinomiyaADEV=ath0 EDEV=eth0 PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin ADDRESS="inet.addr:$1" RCNETWORK=/etc/rc.d/rc.network OKSOUND=/usr/share/audio/2barks.au MYNAME=$(basename $0) RUN=yes while ps x | grep -v grep| grep -q $RCNETWORK do echo 'Waiting... ネットワークの処理が終わるのを待っています' sleep 10 done sleep 2 until [ "$REFRESH" = "" ] && ( ifconfig $ADEV | grep $ADDRESS || ifconfig $EDEV | grep $ADDRESS ) do if [ "$REFRESH" = "" ] then ifconfig $ADEV | grep 'inet.addr:' || ifconfig $EDEV | grep 'inet.addr:' && echo "Ilegal connection. 接続先が正しくありません。" fi REFRESH= echo 'Disconnecting. ネットワークを切断します' $RCNETWORK stop sleep 5 echo 'Connecting... ネットワークへの接続を試しています' #ps x | grep -v grep| grep $RCNETWORK || $RCNETWORK restart $RCNETWORK restart sleep 5 done echo 'Connected. ネットワークに接続しました' [ -f $OKSOUND ] && aplay -q $OKSOUND sleep 5
#!/bin/bash TERMINAL=/usr/bin/urxvt [ -e "$TERMINAL" ] || TERMINAL=/usr/bin/rxvt $TERMINAL -bg 3 -fg 4 -e checknet 192.168.11
#!/bin/bash REFRESH=yes aircheck