14 de Octubre, 2005

Estado de los nodos

Anoche se puso en contacto conmigo Rubén para comentarme que mutoid (elxwifi) ya no podía seguir indicando el estado de los diferentes nodos de elxwifi.

Este listado de nodos es muy importante porque nos permite saber de un vistazo cómo está la red, pero depende de un nodo que tenga además acceso a Internet y mutoid ya no cumple ese requisito. Era momento para un hack :).

Y con toda la razón. Anoche lo vi muy claro, pero no estoy ahora seguro de que sea la mejor forma de hacerlo :P. Por ahora it just works.

En primera instancia no iba a instalarlo en blackshell porque este nodo no tiene una conexión a la red inalámbrica demasiado estable (por ahora, pronto scuba cambiará su hardware y mejorarán las condiciones). Si el nodo que verifica a los demás cae con frecuencia, se pierde efectividad en el invento :(.

La estrategia es simple: enviamos una petición ICMP del tipo ECHO_REQUEST (vamos, usando ping(8)), con un pequeño margen para el error (en radio es frecuente que se pierda el primero de la serie), y dejamos en un servidor web con acceso desde Internet una imagen asociada a esa dirección IP con una significado u otro según obtengamos respuesta o no.

#!/bin/sh

# conf: dónde van las imágenes
IMAGE_PATH="/var/www/htdocs/elxwifi"

# conf: IPs a verificar
IP_LIST="10.1.3.1 10.1.2.1 10.1.1.62 10.1.4.1 10.1.1.61 10.1.2.32\
 10.1.3.2 10.1.3.34 10.1.2.38"

# de aqui para abajo mejor no tocar nada
############################################################

IMAGE_OK="ok.png"
IMAGE_KO="ko.png"

function verifica
{
        try=0
        while [ $try -lt 5 ] && ! ping -c 1 $1 2>&1 > /dev/null; do
                try=$(($try+1))
        done

        # borramos la imagen vieja
        rm -f $1.png

        # link es bastante más eficiente que copiar
        if [ $try -lt 5 ]; then
                ln -s ok.png $1.png
        else
                ln -s ko.png $1.png
        fi
}

# ?r--r--r-- pero los links l-wx-wx-wx
umask 0444

# los links relativos para que no de problemas
# el chroot de Apache (OpenBSD ruls!)
cd $IMAGE_PATH

for ip in $IP_LIST; do
        # si queremos ejecutar en paralelo añadimos &
        verifica $ip
done

exit 1

# EOF

El script tampoco tiene nada del otro mundo. Verificamos hasta 5 pings, para evitar errores porque se pierdan los primeros paquetes, hasta desistir con ese nodo.

Esto puede hacer que si un nodo no está disponible restrase un poco la verificación del resto. Para evitar esa situación he metido en una función el código que hace la verificación de una dirección IP, y añadiendo un & al final de su invocación podemos comprobar todas las direcciones en paralelo y evitar así retrasos (que incluso pueden ser importantes si cae un punto de acceso y, en consecuencia, todos los nodos asociados a él).

Ahora solo resta añadir una línea a nuestro crontab para que se ejecute cada 15 minutos:

*/15 * * * * /home/usuario/bin/watchlink-sh

Notar que el script podría ser peligroso si le permitiéramos a un usuario dar la entrada a verifica (por las llamadas a rm y ln basadas en esa entrada). En tal caso habría que comprobar el dato para estar seguros que nos proporcionan una IP.

Anotación por Juan J. Martínez, clasificada en: scripting.

Hay 2 comentarios

Gravatar

Gracias Juanjo.
Ya veo que has realizado hasta los cambios en el wiki.
Estupendo... ya volvemos a tener estado de los nodos. Ahora lo que nos faltan son nodos :)

por Ruben, en 2005-10-14 09:09:17

Gravatar

A ver si se porta como un AP mayorcito ya y no nos deja tirados con tanta frecuencia, sino de poco va a valer que el faro de alejandría esté en blackshell ;)

por Juanjo, en 2005-10-14 09:11:50

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: