Script para renovar la IP con Tomato y módem Motorola SBV5120

Este es un script que escribí para cuando estoy bajando cosas con JDownloader y necesito reiniciar la IP. JDownloader viene con varios scripts que cumplen esta función, entre ellos algunos para el firmware (Tomato) de mi router. Sin embargo no me funcionaba muy bien y quería aprender algo de Python así que escribí mi propio script. Las únicas librerías externas que usa son curl para los pedidos HTTP y re para procesar la respuesta.

Manualmente

El proceso manual para conseguir una nueva IP consiste en:

  • Entrar a la página del router y asignar una MAC nueva:
  • Entrar a la página del módem (la IP de fábrica es http://192.168.100.1 ) e ir a Configuration.
  • Apretar “Restart Cable Modem”.

En menos de un minuto el modem debería estar conectado nuevamente y con una IP distinta.

Script

Ahora hace falta automatizar el proceso para poder dejar el JDownloader corriendo durante la noche. El script principal es muy conciso:

ipnueva.py

#!/usr/bin/env python
import router
import modem

modem.reset_modem()

mac = router.random_mac()
httpid = router.router_id()
print 'Probando...'
router.set_mac(mac,httpid)
print 'Listo.'

Las funciones que llama están definidas en otros 2 scripts, que se encargan del módem y el router.

modem.py

Esta es la configuración de fábrica del módem, debería funcionar a menos que la hayan cambiado.

#!/usr/bin/env python
import pycurl
host = 'http://192.168.100.1/'
user = 'admin'
pw = 'motorola'

Primero pido la página de login, de lo contrario no me va a permitir realizar el paso siguiente

def reset_modem():
    c = pycurl.Curl()
    c.setopt(c.URL, host+'loginData.htm?loginUsername='+user+
        '&loginPassword='+pw+'&LOGIN_BUTTON=Login')
    import StringIO
    b = StringIO.StringIO()
    c.setopt(pycurl.WRITEFUNCTION, b.write)
    c.perform()

Ahora le digo que reinicie

    c.setopt(c.URL, host+'reset.htm')
    c.perform()
    return b.getvalue()

modem.py

Estos valores corresponden a la dirección, usuario y contraseña que hayan elegido

#!/usr/bin/env python
import pycurl
import re

host = 'http://ip-de-tu-router/'
user = 'usuario'
pw = 'contraseña'

Tomato tiene una medida de seguridad contra ataques cross-site-scripting o de inyección o no-se-qué, así que luego de loguearnos necesitamos buscar en el código fuente una clave que nos da:

def router_id():
    c = pycurl.Curl()
    c.setopt(c.USERPWD, user+':'+pw)
    c.setopt(c.URL, host)
    import StringIO
    b = StringIO.StringIO()
    c.setopt(pycurl.WRITEFUNCTION, b.write)

    c.perform()
    tid = re.search('_http_id=(TID[a-zA-Z0-9]{2,})',b.getvalue()).group(0)
    return tid

Esto simplemente genera una MAC al azar

def random_mac():
    import random
    mac = '00'
    for i in range(5):
        mac += ":" + "%2X" % random.randint(0,255)
    return mac

Y aquí hacemos el pedido de cambiar MAC, con las credenciales necesarias y la clave que tomamos antes

def set_mac(mac,httpid):
    c = pycurl.Curl()
    c.setopt(c.USERPWD, user+':'+pw)
    import urllib
    c.setopt(c.POSTFIELDS, '_service=*&mac_wan='+urllib.quote(mac)+
        '&mac_wl=&'+httpid)
    c.setopt(c.URL, host+'tomato.cgi')
    import StringIO
    b = StringIO.StringIO()
    c.setopt(pycurl.WRITEFUNCTION, b.write)
    c.perform()

Configuración de JDownloader

Una vez que tenemos los scripts guardados en algún lugar, hay que configurar JDownloader para que ejecute ipnueva.py cuando quiera reconectarse. En Ajustes, vamos a Reconexión y Router -> Externo. En el campo Comando, ingresar la ruta a ipnueva.py o buscarlo con el botón Seleccionar. Luego hay que marcar el botón de Reconexión automática en la barra de herramientas.

Anuncios

Etiquetas: , , , , ,

Una respuesta to “Script para renovar la IP con Tomato y módem Motorola SBV5120”

  1. Hector Gonzalez Says:

    Oye muchas gracias por este aporte, me ha servido de mucho!

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s


A %d blogueros les gusta esto: