Иван Андреевич (diente_de_lion) wrote,
Иван Андреевич
diente_de_lion

Что делать с глючным роутером?

Есть у моего роутера неприятная особенность: если через него идет слишком большой поток траффика его начинает плющить. Он теряет соединение с провайдером и начинает предпринимать безуспешные попытки это соединение переустановить. Помогает только перезагрузка роутера.

Что делает нормальный человек в подобной ситуации? Правильно, выбрасывает глючный девайс и покупает новый роутер. Что делает в такой ситуации программист? Правильно, пишет скрипт! Скрипт каждые 10 секунд ходит на роутер и спрашивает его статус. Если соединение с провайдером потеряно - перезагружает роутер. Ну и в качестве бонуса скрипт проверяет аптайм роутера: если аптайм меньше минуты, то "лежачего не бьют".

Выкладываю здесь исходник на перле, на случай если кто-то (как и я) мучается с роутером TP-LINK модели TL-WR541G/TL-WR542G.

#!/usr/bin/perl

use warnings;
use strict;

use LWP;

use constant MIN_UPTIME => 60; # seconds

use constant CONNECTED    => 1;
use constant CONNECTING   => 2;
use constant DISCONNECTED => 3;

use constant OK        => 1;
use constant WAIT_MORE => 2;
use constant REBOOTED  => 3;

for(;;)
{
    my $result = CheckRouterState();    
    
    print "OK.\n"                                            if $result == OK;
    print "Router's uptime is too small, let's wait more.\n" if $result == WAIT_MORE;
    print "The router has been rebooted.\n"                  if $result == REBOOTED;
    
    sleep 10;
}

sub CheckRouterState
{
    my $status = GetRouterStatus();

    if (defined $status)
    {
        print "Connected.\n"    if $status == CONNECTED;
        print "Connecting...\n" if $status == CONNECTING;
        print "Disconnected.\n" if $status == DISCONNECTED;
    }
    else
    {
        print "Router status is unknown.\n";
    }
    
    return OK if defined $status && $status == CONNECTED;

    my $uptime = GetRouterUptime();
    if (defined $uptime)
    {
        print "Router uptime: $uptime seconds.\n";
    }
    else
    {
        print "Can't get router uptime\n";
    }
    
    return WAIT_MORE if defined $uptime && $uptime < MIN_UPTIME;

    print "Rebooting the router.\n";
    RebootRouter();
    return REBOOTED;
}

sub GetBrowser
{
    my $username = 'admin';
    my $password = 'admin';

    my $browser = LWP::UserAgent->new('Mozilla');
    $browser->credentials(
        "192.168.1.1:80", "TP-LINK Wireless Router WR541G/542G", $username => $password);

    return $browser;
}

sub GetRouterStatus
{
    my $browser = GetBrowser();
    my $response = $browser->get('http://192.168.1.1/userRpm/WanCfgRpm.htm');

    my $html = $response->content;

    my $connected    = $html =~ /Connected!/;
    my $connecting   = $html =~ /Connecting\.\.\./;
    my $disconnected = $html =~ /Disconnected!/;
    
    return CONNECTED    if $connected;
    return CONNECTING   if $connecting;
    return DISCONNECTED if $disconnected;
    
    return undef;
}

sub GetRouterUptime # seconds
{
    my $browser = GetBrowser();
    my $response = $browser->get('http://192.168.1.1/userRpm/StatusRpm.htm');
    my $html = $response->content;
    
    return undef unless $html =~ /"(\d+) day\(s\) (\d+):(\d+):(\d+)",/;
    
    my $day  = $1;
    my $hour = $2;
    my $min  = $3;
    my $sec  = $4;
    
    return $sec + 60 * ($min + 60 * ($hour + 24 * $day));
}

sub RebootRouter
{
    my $browser = GetBrowser();
    $browser->get('http://192.168.1.1/userRpm/SysRebootRpm.htm?Reboot=Reboot');
}
Tags: программирование, роутер
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 0 comments