birdNEC Aterm WG1200HPを毎日再起動する - 改め、中継器の先へpingが届かなくなったら再起動する

無線LANの中継器用途として「デュアルバンド中継機能」に期待して買ったNEC Aterm WG1200HPが、親機とのリンクに2.4GHz帯側を使っているせいか一日くらいすると親機とのリンクが勝手に切れて通信不能になってしまう、という謎の症状が出て困っていました。ググると同じような症状を訴えている人をチラホラ見かけるので初期不良、というよりもこの機種の持病っぽい感じ。

考えてみるとこの機種に限らず最近の無線LAN機器はWeb UIの管理画面を持ち、そこからリブートしたりすることも可能です。そんなわけでとりあえずのその場しのぎとして、毎日自動的に再起動するスクリプトをおうちサーバに仕掛けて様子を見てみることにしました。自宅に常時稼働のサーバがある人(そんな人は最近はあんまり多くないと思いますが^^;)ならば同じようなことをするのも難しくないと思います。

(12/27 追記) WG1200HPのファームウェアを1.0.14に上げてから、以前よりもかなり安定して少なくとも数日間は問題なく動くようになりました。ただ残念ながらまだ完治したわけでないらしく、一週間連続稼働はまだ出来ないようでしたので、「中継器の先にあるhostにpingが届かなくなったらWG1200HPをrebootする」というスクリプトを組んで実行することにしました。

また、rebootに利用しているweb formが1.0.14からCSRF対策としてone-timeのsession IDを要求するようになっていましたのでそちらにも対応してみました。

#!/bin/bash

converter_ip='192.168.0.241'
probe_ip='192.168.0.141'
admin_email='[email protected]'

rebooted=0

while /bin/true; do
	if /bin/ping -i 2 -c 5 $probe_ip; then
        echo "Link is normal."
        sleep 2
        rebooted=0
        continue
	else
        echo "Link seems broken. Converter rebooted."
        output=`curl -v "http://$converter_ip/reboot.htm" -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Connection: keep-alive' --compressed`
        curl -v -o /dev/null "http://$converter_ip/aterm.css" -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' -H 'Accept: text/css,*/*;q=0.1' -H "Referer: http://$converter_ip/reboot.htm" -H 'Connection: keep-alive' --compressed
        curl -v -o /dev/null "http://$converter_ip/util_gw.js" -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' -H 'Accept: */*' -H "Referer: http://$converter_ip/reboot.htm" -H 'Connection: keep-alive' --compressed
        curl -v -o /dev/null "http://$converter_ip/menu-images/h1_back.gif" -H 'Accept-Encoding: gzip, deflate, sdch' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' -H 'Accept: image/webp,image/*,*/*;q=0.8' -H "Referer: http://$converter_ip/aterm.css" -H 'Connection: keep-alive' --compressed

        session_id=`echo "$output" | grep hidden | sed -e 's/.*hidden\" value=\"\([^\"]\+\)\".*/\1/g'`
        echo "sleep 3, session_id=$session_id"
        sleep 3

        curl -v -o /dev/null "http://$converter_ip/boafrm/formReboot" -H "Origin: http://$converter_ip" -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: ja,en-US;q=0.8,en;q=0.6' -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' -H 'Content-Type: application/x-www-form-urlencoded' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H "Referer: http://$converter_ip/reboot.htm" -H 'Connection: keep-alive' --data "SESSION_ID=$session_id&reboot=%BA%C6%B5%AF%C6%B0+" --compressed
        curl -v -o /dev/null "http://$converter_ip/menu-images/h1_back.gif" -H 'Accept: image/webp,image/*,*/*;q=0.8' -H 'Cache-Control: max-age=0' -H "Referer: http://$converter_ip/boafrm/formReboot" -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36' --compressed
        if [ $rebooted -eq 0 ]; then
            echo "30 min sleep...sent an email"
            echo "link seems down? converter rebooted." | /usr/bin/mail -s "converter link seems down?" $admin_email
            sleep 1800
        else
            echo "2 hours sleep...sent an email"
            echo "ping probe seems down?" | /usr/bin/mail -s "ping probe seems down?" $admin_email
            sleep 7200
        fi
        rebooted=1
	fi
done

自宅Macでの通信をエミュレートしているのでUser-AgentがMac版Chromeになっています。またウチの場合再起動したいWG1200HPのIPアドレスが192.168.0.241なのでそちらにアクセスするようになっていますが、もし流用する場合は各々の設定に変更してください。ウチではこのスクリプトを下記のように起動して常時動作させています。loggerで受けているのでsyslogにたくさんログが出力されますが、その辺りのログは適宜rotateされるので最近のマシンでなら大きな問題はないかと。ノイズとして気になるなら/dev/nullへ捨てるなりしてください。

${HOME}/bin/wg1200hp_reboot.sh 2>&1 | logger -p local3.info -t wg1200hp_reboot &

crontabへも以下のように登録しておくと、おうちサーバをrebootした時にも自動的に起動してくれて便利です。

#
# reboot wifi converter
#
@reboot		${HOME}/bin/wg1200hp_reboot.sh 2>&1 | logger -p local3.info -t wg1200hp_reboot