internetへの接続できなくなるとルータを再起動させるscript

 2012-07-10
長期出張中にルータのPPPがどうにかなったらしく、外部からまったくどうにもならなくなった。

たびたび発生するとうざったいので・・つくりました。

たぶんいろいろ探してみると使いやすいナニカがあるんだろうな、とは思うけど探したり設定したりするのが面倒なのでスクリプト自作しました。
やりたいことが実現できてりゃタコでもいいよ、もう。。


  • 対象のルータはAterm WR-4100Nとする。
  • no-ip純正(?)の更新ツールnoip2を使用していることとする。
  • タイムアウトを5secとし、HTTPアクセスして正常終了しない場合はカウントを増加させる。
  • 規定のカウントに達したらルータを再起動させる。
  • 再起動後は設定されたwait秒待った後、DDNS更新のためnoip2のクライアントを再実行する。



#!/bin/bash -x

SAVEFILE=/tmp/chk_internet.txt
LOGFILE=/var/log/chk_internet.log
MAXCOUNT=3
WAITSEC=120
GETURL=http://www.yahoo.jp/

### create count data file.
if [ ! -e ${SAVEFILE} ];
then
echo "0" > ${SAVEFILE}
DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : create ${SAVEFILE}" >> ${LOGFILE}
fi
COUNT=`cat ${SAVEFILE}`

### check internet.
curl -m 5 ${GETURL} > /dev/null 2>&1

if [ $? -ne 0 ];
then
COUNT=`expr ${COUNT} + 1`
echo "${COUNT}" > ${SAVEFILE}
DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : connection timeout. ${COUNT} URL=${GETURL}" >> ${LOGFILE}
else
echo "0" > ${SAVEFILE}
COUNT=`cat ${SAVEFILE}`
fi

### check count.
if [ ${COUNT} -gt ${MAXCOUNT} ];
then
echo "0" > ${SAVEFILE}

DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : count expired.(MAXCOUNT=${MAXCOUNT}) ### ROUTER REBOOT ###" >> ${LOGFILE}

curl -d DUMMY="" -d DISABLED_CHECKBOX="" -d CHECK_ACTION_MODE=0 -m 5 \
http://USERNAME:PASSWORD@ROUTER-IP/index.cgi/reboot_main_set > /dev/null 2>&1
DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : transmit reboot command to router(1)" >> ${LOGFILE}
sleep 1

curl -d DUMMY="" -d DISABLED_CHECKBOX="" -d CHECK_ACTION_MODE=0 -m 5 \
http://USERNAME:PASSWORD@ROUTER-IP/index.cgi/reboot_main_set > /dev/null 2>&1
DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : transmit reboot command to router(2)" >> ${LOGFILE}
sleep 2

curl -d DUMMY="" -d DISABLED_CHECKBOX="" -d CHECK_ACTION_MODE=0 -m 5 \
http://USERNAME:PASSWORD@ROUTER-IP/index.cgi/reboot_main_set > /dev/null 2>&1
DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : transmit reboot command to router(3)" >> ${LOGFILE}
sleep 3

DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : wait to reboot (${WAITSEC}sec)" >> ${LOGFILE}
sleep ${WAITSEC}

DATE_STR=`date +'%Y/%m/%d %H:%M.%S'`
echo "${DATE_STR} : try to update DDNS." >> ${LOGFILE}
NOIP_PID=`/usr/local/bin/noip2 -S 2>&1| grep Process | cut -d , -f 1 | cut -d " " -f 2`
/usr/local/bin/noip2 -K ${NOIP_PID}
sleep 1
/usr/local/bin/noip2

fi



SAVEFILE=/tmp/chk_internet.txtカウントを保存するファイル
LOGFILE=/var/log/chk_internet.logログファイル、不要なら/dev/nullを指定するといいかもしれない
MAXCOUNT=3カウント最大値、MAXCOUNT+1回目でREBOOTを試みる
WAITSEC=120REBOOT後の待ち時間、PPPを張ってグローバルIPを得るまで待つ
GETURL=http://www.yahoo.jp/チェック用URL、上記は例としてyahooのものだが契約しているISPのものが良いだろう



再起動時は念のためリクエストを3回送信している。
ログファイルの出力は特段内容について考慮したわけではなく、作成中に見たいと思った物を残してある感じ。


動いていそうなのが見えたら、cronに頼んで定期的に実行させて完了。

linux% crontab -e
  cronを弄る

linux% crontab -l
# every day every hour check internet connection per 10min
*/10 * * * * /DATA/bin/chk_internet.sh





実際のログは以下のようになる。(下記はテスト用に3分毎にcronしたもの)

2012/07/09 23:33.06 : connection timeout. 1 URL=http://◆◆◆/
2012/07/09 23:36.06 : connection timeout. 2 URL=http://◆◆◆/
2012/07/09 23:39.06 : connection timeout. 3 URL=http://◆◆◆/
2012/07/09 23:42.06 : connection timeout. 4 URL=http://◆◆◆/
2012/07/09 23:42.06 : count expired.(MAXCOUNT=3) ### ROUTER REBOOT ###
2012/07/09 23:42.06 : transmit reboot command to router(1)
2012/07/09 23:42.09 : transmit reboot command to router(2)
2012/07/09 23:42.16 : transmit reboot command to router(3)
2012/07/09 23:42.19 : wait to reboot (120sec)
2012/07/09 23:44.19 : try to update DDNS.
2012/07/09 23:45.06 : connection timeout. 1 URL=http://◆◆◆/
2012/07/09 23:48.07 : connection timeout. 2 URL=http://◆◆◆/
2012/07/09 23:51.06 : connection timeout. 3 URL=http://◆◆◆/
2012/07/09 23:54.06 : connection timeout. 4 URL=http://◆◆◆/
2012/07/09 23:54.06 : count expired.(MAXCOUNT=3) ### ROUTER REBOOT ###
2012/07/09 23:54.06 : transmit reboot command to router(1)
2012/07/09 23:54.09 : transmit reboot command to router(2)
2012/07/09 23:54.16 : transmit reboot command to router(3)
2012/07/09 23:54.19 : wait to reboot (120sec)
2012/07/09 23:56.19 : try to update DDNS.



とりあえず様子見。
 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/79-9cb91ae6
≪ トップページへこのページの先頭へ  ≫