2017-04-13 - Registrando IPs de nuestros dispositivos en una hoja de cálculo en la nube

Dirección Seguimos dándole vueltas al tema de la dirección IP de los dispositivos. En ¿Quién está en mi red? abordábamos el problema desde el punto de vista del escaneo de la red.

Otra posibilidad es, claro, mirar el router y mirar los dispositivos conectados.

Sin embargo, para los dispositivos que tenemos controlados (y que nos interesan más) una posibilidad puede ser establecer un registro: cuando se conectan informan de que se han conectado, su IP, y los datos que consideremos relevantes.

Seguro que hay alguna forma canónica de hacer esto (o no, porque igual lo suyo sería tener un router que nos proporcione esta información de manera conveniente -pista: que no haga falta un navegador-) pero me pareció un buen ejercicio. Descubrí Google Spreadsheets and Python y me pareció una buena forma de intentarlo: los dispositivos podrían registrar en una hoja de cálculo los datos que nos interesen. Para la instalación y configuración básica se puede seguir ese documento. Después, tenemos que hacer un programita que recabe los datos y los almacene. El mío se basa en el ejemplo que puede verse allí.

En nuestro caso, obtendremos la IP con:

def getIp():
    return([l for l in ([ip for ip in socket.gethostbyname_ex(socket.gethostname())[2] if not ip.startswith("127.")][:1], [[(s.connect(('8.8.8.8', 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]]) if l][0][0])

En este caso seguimos lo que indicaban en Finding local IP addresses using Python’s stdlib, no comentaremos más.

Además guardamos el nombre de la máquina, que nos servirá para dar nombre a la pestaña de la hoja donde almacenaremos los datos:

    hostname = socket.gethostname()

Finalmente, ya sólo nos queda escribir en la hoja de cálculo:

    sheet_name = 'Registro IPs'

A continuación accedemos a la hoja de cálculo (cuidado con la gestión de credenciales, nosotros hemos almacenado en la variable client_secret el nombre del fichero donde están los datos necesarios:

    scope = ['https://spreadsheets.google.com/feeds']
    creds = ServiceAccountCredentials.from_json_keyfile_name(client_secret, scope)
    client = gspread.authorize(creds)
    
    sheet = client.open(sheet_name)

A continuación registramos la máquina. Si ya es una máquina conocida, simplemente accedemos a la pestaña correspondiente; si no, la creamos:

    try:
        worksheet = sheet.worksheet(hostname)
    except gspread.exceptions.WorksheetNotFound:
        worksheet = sheet.add_worksheet(hostname, 5, 5)

Finalmente, escribimos en la hoja, insertando una fila antes de la segunda (la idea es que la información más reciente estará arriba, más cerca para verla). Al añadir una fila tendremos un registro de conexiones.

El código (en su versión actual) se puede ver en scripts/registerIp.py.

En

podemos ver cómo se crea la pestaña y se rellenan los datos al invocar el programa.

Para mantener este registro podemos poner en /etc/rc.local una invocación al programa de manera que cuando se arranquen los distintos sistemas registren su presencia.

Escrito el 2017-04-13
Categorías: programación
Tags: programación python ip red dispositivos google spreadsheets