брокеры бинарных опционов с минимальным депозитом
лучший интернет магазин одежды отзывы

Desde lejos no se ve

linux-python-logo

Hermoso domingo soleado, ideal para preparar unos mates con yerba mbopicua escuchar un random de algún CD de Las Pelotas y ponerse a programar ese problema que tanto te quita el sueño, que te hace caminar cabizbajo, con la mirada perdida y un peso inaguantable sobre las espaldas, donde cada paso dado sin resolverlo pesa más y más.

¿Cuál es mi problema?

No plasmar lo que imagino en mi cabeza en la cancha de fútbol, ese el drama de mi vida. También este otro:

Una PC instalada en campo -a 80 km de Santa Fe-, conectada a Internet mediante un enlace wifi de una escuela rural, se enciende en forma automática todas las noches todas y me envía un conjunto de datos sobre el estado de ciertas variables hidrológicas – ambientales. Resulta ser que venía todo perfecto por casi 2 meses hasta que nunca más se encendió. El auto-encendido se realizaba mediante la configuración de la BIOS, con lo cuál me es imposible resolverlo remotamente.

A sabiendas que no es un problema de alimentación, que no se quemó nada, debo suponer que por alguna razón que desconozco a la REP**ISIMA BIOS se le desconfiguró la opción de auto-encendido. Entonces mi solución viene dada por prenderla en forma remota usando el protocolo Wake On Lan (WOL). Ahora bien, ese Lan quiere decir eso, que tiene que ser desde la LAN, no desde Internet, donde estoy yo.

Por suerte, dejé en la escuela, un pequeño router de $150 con una versión de GNU/Linux embebido corriendo (openwrt) que forma parte de una VPN a la que puedo acceder desde donde sea si tengo mi notebook en mis manos. Una opción sería programar en el cron de este router que todos los días a una determinada hora envíe usando el WOL la señal de auto-encendido a la PC en el campo.

Eso andaría perfecto si el router tendría un reloj interno, entonces las 23hs del router son las 23hs del resto de Argentina, pero no es así, no lo tiene y atrasa más que TN. Entonces, qué carajo hago? Bueno,  puedo conectarme desde un servidor público a través de la VPN y mandarle a ejecutar un script que a su vez es el que le manda ese paquete mágico a través de la LAN a la PC en campo para que se prenda. Una vez que se enciende estamos todos felices y contentos.

Lo único que quisiera es que esto último se haga solo y no tenga que estar YO ejecutándolo. Entonces necesito hacer un programa que desde el servidor se conecte al router a las 23hs e interactúe ejecutando un script que haga lo que dije antes que tiene que hacer.

La receta lleva los 2 ingredientes siguientes:

  • Python
  • El módulo pyexpect

Usando pyexpect voy a conectarme desde el servidor usando ssh, y luego ejecuto el script getUP.sh, además todo lo que va pasando lo logueo. Lo hago así:

import pxssh
import logging

def main(logfilename, hostname, username, password, command, port='22'):
    logging.basicConfig(filename=logfilename,
         format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)

    try:
        s = pxssh.pxssh()
        s.login (hostname, username, password, port=port)
        logging.info(hostname+": login successfully" )

        s.sendline(command)
        logging.info(hostname + ' -> ' + command + ": command sent successfully")

        s.prompt()
        logging.info(hostname + ' -> ' + command + " has returned: "+s.before)
        s.logout()

    except pxssh.ExceptionPxssh, e:
        logging.error("pxssh failed: " + str(e))

if __name__ == "__main__":
    logfilename = 'logGetUpNC.log'
    hostname = '192.168.111.94'
    command = './getUP.sh'
    username = 'root'
    password = 'aca va la password'
    main(logfilename, hostname, username, password, command)

Como verán es muy simple el programa desarrollado, usé pxssh que es parte de pyexpect. Ahora, el script que está en el router con openwrt hace eso de mandar por la LAN el paquete mágico de encendido, utilizando el programa para tal fin llamado etherwake:

#!/bin/sh
etherwake -D -i br-lan 00:1C:C0:A7:F7:2D

Sí, ya se lo que estás pensando: ¿Por qué no actualizo regularmente la hora del router usando NTP y desde ahí lo enciendo cuando quiero, incluso si no hay Internet podés hacer tu autoencendido?

Qué querés que te diga, tenés razón, pero a esto ya lo sabía hacer y lo que acabo de escribir no, los domingo están hechos para aprender algo nuevo, no para repetir lo ya conocido. Tamos?

 

 

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.

Social Widgets powered by AB-WebLog.com.