それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

プラネックスしっかりファーム書いてよ

BRC-W14VGが頻繁に固まるので玄箱から定期的に、BRC-W14VGの生死を監視することにする。


Perl始めてみた。Perlスクリプト体験の第1弾。

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