jueves, 7 de febrero de 2008

Controlando tu ADSL

Hace aproximadamente un mes que tengo el ADSL nuevo (20mbps).

La verdad es que me funciona de maravilla y estoy bastante contento, pero tenía una pega, de vez en cuando, la conexión pasaba a mejor vida y me tocaba resetear el router.

Evidentemente, si me pasaba estando en el ordenador, pues no pasaba nada, reinicio y listos. El problema lo tenía cuando pasaba y no estaba en casa. Cuando llegaba por la tarde... sorpresa, no ha descargado ni un poquito de las cosas que tenia programadas...

Bueno, otra de las ventajas de linux es CRON y todas las utilidades que tiene de serie en el SHELL, así que... me he hecho un rudimentario script que comprueba la conexión a internet y de paso, la velocidad de descarga. Si no hay conexión o la velocidad a la que está sincronizado es demasiado baja (he definido el limite en 5000kbps), resetea el router.

El script lo he programado en CRON cada 10 minutos y... funciona!

Evidentemente, el script es para mi modelo de router, un HUAWEI chapucero, pero que es IDÉNTICO a muchos otros clones del COMTREND 536+, así que con unos mínimos retoques deberiais poder adaptar el script para vuestro aparato.

Aquí el script (con comentarios añadidos):

#!/bin/sh
fecha=`date +%d/%m/%Y\ %H:%M:%S`
log=/LOG/`date +%Y%m%d.log` # el directorio de LOG tiene que tener permisos de escritura para el usuario que lance el script
limite=5000 # limite minimo de velocidad que aceptaremos como buena
echo $fecha - Comprobando conexión a Internet >> $log
ping -c 3 www.google.com > /dev/null
resultado=$?
if [ $resultado = 0 ]; then
fecha=`date +%d/%m/%Y\ %H:%M:%S`
echo $fecha - Conexión a Internet CORRECTA >> $log
wget http://admin:password@192.168.1.1/info.html 2> /dev/null # sacamos la info del router, adaptar al router
up=`head -n54 info.html | tail -n1 | sed s/' '//g | sed s/'<t td>'//g | sed s/'<\/td>'//g` # velocidad de subida (adaptar)
down=`head -n58 info.html | tail -n1 | sed s/' '//g | sed s/'<t td>'//g | sed s/'<\/td>'//g` # velocidad de bajada (adaptar)
fecha=`date +%d/%m/%Y\ %H:%M:%S`
echo $fecha - La velocidad actual es: UP:\<$up\> DOWN:\<$down\> >> $log
if [ $down -lt $limite ]; then
echo $fecha - Velocidad de bajada inferior a $limite. Reseteando >> $log
wget http://admin:password@192.168.1.1/rebootinfo.cgi 2> /dev/null # pagina del router que lo reinicia (adaptar)
fecha=`date +%d/%m/%Y\ %H:%M:%S`
echo $fecha - Reseteo OK >> $log
fi
rm info.html
else
fecha=`date +%d/%m/%Y\ %H:%M:%S`
echo $fecha - Conexión a Internet FALLIDA >> $log
echo $fecha - Intentando resetear el router >> $log
wget http://admin:password@192.168.1.1/rebootinfo.cgi 2> /dev/null # pagina del router que lo reinicia (adaptar)
fecha=`date +%d/%m/%Y\ %H:%M:%S`
echo $fecha - Reseteo OK >> $log
fi


Espero que os sirva de ayuda a alguien. Por supuesto el script es completamente libre, podéis hacer lo que os dé la gana con él, incluso venderlo si luego me invitaís a una cerveza.

*reemplazar t td por td... porquería HTML

2 comentarios:

  1. Justo lo que necesitaba!!!

    Eres un crack tio!!

    Voy a probar y te comento.

    Por si te sirve, mi router no es un Huawey, pero sí un comtrend.

    Gracias!

    ResponderEliminar
  2. Hola de nuevo, ya he probado el script y he tenido que hacer unos cambios para mi Mandriva: (por si interesase)

    #!/bin/sh
    fecha=$(date +%d/%m/%Y\ %H:%M:%S)
    log=/tmp/$(date +%Y%m%d.log) # el directorio de LOG tiene que tener permisos de escritura para el usuario que lance el script
    touch $log # creo el fichero par que no me de error
    limite=800 # limite minimo de velocidad que aceptaremos como buena
    echo $fecha - Comprobando conexión a Internet >> $log
    ping -c 3 www.google.com > /dev/null
    resultado=$?
    if [ $resultado = 0 ]; then
    fecha=$(date +%d/%m/%Y\ %H:%M:%S)
    echo $fecha - Conexión a Internet CORRECTA >> $log
    wget http://root:tupassword@10.10.10.100/info.html 2> /dev/null # sacamos la info del router, adaptar al router
    up=$(head -n67 info.html | tail -n1 | sed s/' '//g | sed s/'document.write("< td>'//g | sed s/'<\/td>");'//g) # velocidad de subida (adaptar)
    down=$(head -n71 info.html | tail -n1 | sed s/' '//g | sed s/'document.write("< td>'//g | sed s/'<\/td>");'//g) # velocidad de bajada (adaptar)
    fecha=$(date +%d/%m/%Y\ %H:%M:%S)
    echo $fecha - La velocidad actual es: UP:\<$up\> DOWN:\<$down\> >> $log
    if [ $down -lt $limite ]; then
    echo $fecha - Velocidad de bajada inferior a $limite. Reseteando >> $log
    wget http://root:tupassword@10.10.10.100/rebootinfo.cgi 2> /dev/null # pagina del router que lo reinicia (adaptar)
    fecha=$(date +%d/%m/%Y\ %H:%M:%S)
    echo $fecha - Reseteo OK >> $log
    fi
    rm info.html
    else
    fecha=$(date +%d/%m/%Y\ %H:%M:%S)
    echo $fecha - Conexión a Internet FALLIDA >> $log
    echo $fecha - Intentando resetear el router >> $log
    wget http://root:tupassword@10.10.10.100/rebootinfo.cgi 2> /dev/null # pagina del router que lo reinicia (adaptar)
    fecha=&(date +%d/%m/%Y\ %H:%M:%S)
    echo $fecha - Reseteo OK >> $log
    fi


    Mi firmware del router es:

    A111-306FPT-C01_R02

    En donde pone < td> hay que sustituirlo por el <, td y > sin el espacio que tiene, no se permiten los tds en el comentario :P

    El usuario en este caso es root en vez de admin pero por lo demás perfecto!!!

    ResponderEliminar