Banda Ancha EU

Comunidad de usuarios
de fibra, móvil y ADSL

hosting en interdominios
52 lecturas y 1 respuestas
  • Cerrado

    [Editado 25/06/06 15:40]

    Script de reseteo para 3CRWDR100?-72

    Buenas a todos!

    Me llegó hace pocos días un regalito de YA.com gratis, el router 3Com 3CRWDR100Y-72, como a todos los antiguos usuarios de dicho proveedor supongo.
    Hasta hoy, usaba un SpeedStream 5660 de los de hace 4 años y lo dejaba todo el día descargando, sabiendo que se colgaba cada X horas por culpa de la saturación de la tabla NAT. Escribí un pequeño script Perl que hacía un ping cada 10min a un host y reseteaba el router en caso de no tener conectividad.
    Esto es para mi pequeña historia.

    Tras leer algunos foros, veo que el 3Com tambien sufre de algunas limitaciones de memoria, aunque lo tengo desde hace 2 días y me va fino. Seguramente no haya abusado con los parametros de conexión P2P.

    La pequeña putada, es que según 3Com, es un router únicamente destinado a usuarios de casa, no a empresas, por lo que no se puede gestionar de forma "avanzada", es decir cambiar el rango DHCP, tener un CLI por Telnet o SSH, etc...

    En previsión a un posible cuelgue, he creado un script Perl que realiza las mismas operaciones accesibles por la interfaz Web del router. De momento, solamente las 3 más interesantes: 'Connect', 'Disconnect' y 'Restart'.

    Funciona de la siguiente forma (guardar el código fuente que sigue en un archivo de texto llamado 3com.pl por ejemplo):
    ./3com.pl Opción
    "Opción" debe cambiarse por: Connect, Disconnect o Restart
    Si no se especifica Opción, el script hará un ping al host indicado, y si es inaccesible, se usa Connect.

    Hay que cambiar las variables $host, $port y $pass por vuestros valores.
    Solamente es necesario integrarlo en "Tareas programadas" de Windows o cualquier Crontab para que se ejecute cada 10min por ejemplo.

    Funciona con Perl 5.8.7 bajo Cygwin en mi caso.
    Si teneís preguntas o comentarios a cerca del funcionamiento del script, no dudeís en contestar en este hilo.
    Espero que os sea útil,

    --------------------------------------------------------------------------------------------------------------
    #!/usr/bin/perl -w

    use strict;
    use Switch;
    use IO::Socket::INET;
    use Net::Ping;

    $|++;

    my $host = '192.168.1.1';
    my $port = 80;
    my $pass = 'admin';
    my $ping = 'www.google.com';

    sub Main {
    my $exec = uc(substr($ARGV[0], 0, 1)) . lc(substr($ARGV[0], 1));

    if (($exec ne 'Connect') && ($exec ne 'Disconnect') && ($exec ne 'Restart')) { $exec = 'Default'; }

    print "3Com OfficeConnect ADSL Wireless 11g Firewall Router (3CRWDR100?-72)\n";
    print "Opción: $exec\n";

    &Get('/login_main.stm', 'http://' . $host . '/');
    &Post('/cgi-bin/login.exe', 'http://' . $host . '/login_main.stm', 'pws=' . $pass);
    &Get('/index.stm', 'http://' . $host . '/login_main.stm');

    switch ($exec) {
    case 'Connect' { &Post('/cgi-bin/statusprocess.exe', 'http://' . $host . '/status.stm', 'ifno=-1&connect=+Connect+'); }
    case 'Disconnect' { &Post('/cgi-bin/statusprocess.exe', 'http://' . $host . '/status.stm', 'ifno=-1&disconnect=Disconnect'); }
    case 'Restart' { &Post('/cgi-bin/restart.exe', 'http://' . $host . '/system_r.stm', 'page=tools_gateway&logout='); }
    else { &Ping(); }
    }

    print "Done.\n";
    return(0);
    }

    sub Ping {
    my $Ping = Net::Ping->new('tcp', 2);

    $Ping->{'port_num'} = getservbyname('http', 'tcp');

    if ($Ping->ping($ping)) {
    #print "Ping al host $ping OK\n";
    } else {
    &Post('/cgi-bin/statusprocess.exe', 'http://' . $host . '/status.stm', 'ifno=-1&connect=+Connect+');
    }

    $Ping->close();

    return(0);
    }

    sub Get {
    my ($request, $referer) = (shift, shift);

    my $sock = IO::Socket::INET->new(
    'PeerAddr' => $host,
    'PeerPort' => $port,
    'Proto' => 'tcp',
    'Timeout' => 3
    ) || die($!);

    $sock->autoflush(1);

    &Send($sock, 'GET %s HTTP/1.1', $request);
    &Send($sock, 'Host: %s', $host);
    &Send($sock, 'User-Agent: Mozilla/5.0');
    &Send($sock, 'Accept: text/html, */*');
    &Send($sock, 'Accept-Language: en-us');
    &Send($sock, 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7');

    if ($referer) { &Send($sock, 'Referer: %s', $referer); }

    &Send($sock, 'Connection: close');
    &Send($sock, '');

    close($sock);
    return(0);
    }

    sub Post {
    my ($request, $referer, $post) = (shift, shift, shift);

    my $sock = IO::Socket::INET->new(
    'PeerAddr' => $host,
    'PeerPort' => $port,
    'Proto' => 'tcp',
    'Timeout' => 3
    ) || die($!);

    $sock->autoflush(1);

    &Send($sock, 'POST %s HTTP/1.1', $request);
    &Send($sock, 'Host: %s', $host);
    &Send($sock, 'User-Agent: Mozilla/5.0');
    &Send($sock, 'Accept: text/html, */*');
    &Send($sock, 'Accept-Language: en-us');
    &Send($sock, 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7');

    if ($referer) { &Send($sock, 'Referer: %s', $referer); }

    &Send($sock, 'Content-Type: application/x-www-form-urlencoded');
    &Send($sock, 'Content-Length: %d', length($post));
    &Send($sock, 'Connection: close');
    &Send($sock, '');
    &Send($sock, '%s', $post);
    &Send($sock, '');

    close($sock);
    return(0);
    }

    sub Send {
    my ($sock, $format, @arg) = (shift, shift, @_);
    my $buffer = sprintf($format, @arg);

    print $sock $buffer . "\r\n";
    return(0);
    }

    &Main();

    1;
    --------------------------------------------------------------------------------------------------------------

    Haré un menú de todas las opciones disponibles pero más adelante.

    Saludos!

    Este tema es antiguo y puede contener información obsoleta. Abre un nuevo tema para publicar tu mensaje.
    1