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はだめぽ?