BRC-W14VGが頻繁に固まるので玄箱から定期的に、BRC-W14VGの生死を監視することにする。
CPANってやっぱ便利だなぁ。
#!/usr/bin/perl use strict; use LWP::UserAgent; use HTML::Form; use Data::Dumper; use Digest::MD5 qw(md5 md5_hex md5_base64); use Net::Ping; #main if( !isAlive()){ my $ip = "192.168.*.*";#ここ書き換える my $user = "*****";#ここ書き換える my $pass = "*****";#ここ書き換える rebootRouter( $ip, $user, $pass ); print "reboot router\n"; }else{ print "still alive\n"; } ##functions # sub isAlive { my $host = "google.com"; my $p = Net::Ping->new("tcp", 2); $p->{port_num} = getservbyname("http", "tcp"); return $p->ping($host, 2); } sub rebootRouter { my ( $ROUTER_IP, $LOGIN_USER, $LOGIN_PASS) = @_; my $ua = LWP::UserAgent->new; $ua->agent("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)"); # Create a Request my $req = HTTP::Request->new( GET => "http://".$ROUTER_IP."/"); # Pass request to the user agent and get a response back my $res = $ua->request($req); if ( !$res->is_success ) { print "ERROR -- ",$res->status_line," \n"; exit; } my $form = HTML::Form->parse( $res->decoded_content, $res->base ); my $usr_input = $form->find_input( "user_name"); my $md5_input = $form->find_input( "md5_pass"); my $mimic_btn = $form->find_input( "mimic_button_field"); my $ath_input = $form->find_input( "auth_key"); $usr_input->value($LOGIN_USER); $md5_input->value(md5_hex($LOGIN_PASS.$ath_input->value)); $mimic_btn->value("submit_button_login_submit: .."); #login $res =$ua->request($form->click()); #システム設定ページへ移動 $form = HTML::Form->parse( $res->decoded_content, $res->base ); $mimic_btn = $form->find_input("mimic_button_field"); $mimic_btn->value( "sidebar: sidebar_advanced.." ); $res = $ua->request( $form->click() ); #再起動ページへ移動 $form = HTML::Form->parse( $res->decoded_content, $res->base ); $mimic_btn = $form->find_input("mimic_button_field"); $mimic_btn->value( "goto: 140.." ); $res = $ua->request( $form->click() ); #再起動ページでOKを押す $form = HTML::Form->parse( $res->decoded_content, $res->base ); $mimic_btn = $form->find_input("mimic_button_field"); $mimic_btn->value( "submit_button_ro_submit: .." ); $res = $ua->request( $form->click() ); #print Dumper($res); return 1; }
動作は実に単純。
BRC-W14VGは外向きのPPPoEやVPNが固まる事が多く、
ルーターのメンテナンスページは殆どフリーズしない。
そこで外向きにPingを打って、外に出られなければ、ルーターを再起動させる。
HTMLフォームをごにょごにょするので、Spidering Hack程度の内容。
このスクリプトをCronで5分に1度実行してやる。
ずいぶん前に書いたけれど、玄箱のような常時起動マシンがあるとコレが役に立つ。
BRC-W14VGのフリーズ問題はこれでかなり解決した。というか抜群になった。
NTTのWebCaster7000にもこれが使える
WebCaster7000はPlanexのOEMなので、同じく使える。
BRCのシリーズ全般に使える・・・かも?
玄箱でサポートしてやらないと安定しないPlanexのルーターは・・・
BRC-W14VGのPPPoEに。。。
フレッツ用住友電工のルーターにはPPPoEにKeepAliveする。と書かれたチェックボックスがある。
BRC-W14VGに同じKeepAliveする機能があるだけで解決するんだが。
これだけのことをファームに書かない。Planexはだめぽ?