La sede de Hispalinux (C/San Blas, 104, Zaragoza) es un local que no está permanentemente abierto. Unos cuantos socios tenemos llave y abrimos cuando podemos.
Hay personas a las que les gusta venir a estar un rato aquí, a tomar un café con otros socios, a navegar o a trastear con cualquier cosa. Sin embargo tienen que venir y “probar” a ver si está abierto, sin ninguna seguridad de encontrar a alguien aquí.
Hace tiempo hicimos una página web que indicaba si había alguien en la sede o no. Lo único que debía hacer el socio que abría es entrar en una página y mantenerla abierta. Un javascript se ocupaba de refrescar el estado y un php comprobaba si la IP era la del local. Sin embargo muchas veces se nos olvidaba abrir dicha página y aquello acabó cayendo en el olvido.
Como se ha vuelto a plantear el tema por la lista del local, he estado pensando en alguna solución automágica que indicase se hay gente en la sala sin que nadie tuviese que hacer nada. Se me ha ocurrido que desde el router del local (Tomato GNU/Linux) se podría comprobar periódicamente si había socios en la red local y avisar de ello vía twitter.
Lo que he hecho, por tanto, es un script para el router que se ejecuta cada 3 minutos, que examina la tabla de ARP y que en caso de encontrar socios recién conectados avise por twitter, y que además avise cuando estos se desconectan.
El único problema que me he encontrado es que el wget que lleva Tomato es bastante reducido, así que la parte de tuitear la he sacado a un servidor externo y la llamo por ssh, pero en un futuro se puede compilar un wget completo y ver si cabe en la partición jffs.
También he visto que los datos de /root no se guardan entre reinicios, así que las keys de ssh las he puesto también en jffs y las copio si no existen.
El script del router
#!/bin/sh
# Lista de hostnames de portátiles de socios:
COLEGAS="vfc-laptop, ubu-laptop, QueruMacBook, reclus"
REGEXP=$(echo $COLEGAS|tr -s ", " "|")
LISTA=$(echo $REGEXP|tr "|" "\n")
FSTATUS="/var/log/abierto.status"
ANTERIOR=$(cat $FSTATUS)
# Para llamar al script externo de tuitear:
TUITER="ssh -i /root/.ssh/id_rsa hlxzgz@miservidor.midom.com ./qtwitter.sh"
# Configurar ssh de root:
if [ ! -f /root/.ssh/known_hosts ]
then
echo "Configurando ssh..."
cp /jffs/ssh/* /root/.ssh/.
fi
/sbin/arp|grep -v "incomplete"|grep -E $REGEXP
if [ $? -eq 0 ]
then
NUM=$(/sbin/arp|grep -E $REGEXP|wc -l)
echo "> Hay ${NUM} socios conectados."
echo "ON" > /var/log/abierto.status
if [ "$ANTERIOR" == "OFF" ]
then
echo "> Antes no habia ninguno."
echo "> Notificando..."
$TUITER "Hay ${NUM} socio\(s\) en la sede."
fi
else
echo "> Ningun colega conectado."
echo "OFF" > /var/log/abierto.status
if [ "$ANTERIOR" == "ON" ]
then
echo "> Antes habia alguno."
echo "> Notificando..."
$TUITER "No hay socios en la sede."
fi
fi
exit 0
El script para tuitear desde consola
#!/bin/bash
# qtwitter.sh: Envía updates a Twitter desde bash. Necesita que
# 'wget' esté instalado.
# Copyright (C) 2007 Jorge Fuertes (queru@queru.org)
#
# Este programa es software libre: usted puede redistribuirlo
# y/o modificarlo bajo los términos de la Licencia Pública
# General GNU publicada por la Fundación para el Software
# Libre, ya sea la versión 3 de la Licencia, o (a su elección)
# cualquier versión posterior.
#
# Este programa se distribuye con la esperanza de que sea útil,
# pero SIN GARANTÍA ALGUNA; ni siquiera la garantía implícita
# MERCANTIL o de APTITUD PARA UN PROPÓSITO DETERMINADO.
# Consulte los detalles de la Licencia Pública General GNU para
# obtener una información más detallada.
#
# Debería haber recibido una copia de la Licencia Pública General
# GNU junto a este programa.
# En caso contrario, consulte http://www.gnu.org/licenses/
# Configuración:
# Su usuario y contraseña en twitter:
USUARIO="hlxzgz"
PASSWD="clave"
# Reintentos que queremos cuando twitter está en plan sucker:
RETRY=10
# Intervalo entre reintentos, en segundos:
INTER=5
# Bucle de envío con reintentos:
COUNTER=1
while [[ $COUNTER -lt $RETRY || $COUNTER -eq $RETRY ]]
do
# Wget hace todo el trabajo sucio:
echo -n "Enviando..."
wget --http-user=$USUARIO --http-password=$PASSWD \
http://twitter.com/statuses/update.xml \
--post-data="status=$*" -O - &> /dev/null
if [ $? -eq 0 ]
then
echo "OK"
exit 0
else
echo "FALLO"
let "COUNTER += 1"
echo "Fallo al enviar. Reintento \
($COUNTER/$RETRY) en $INTER segundos..."
sleep $INTER
fi
done
# Twitter es víctima de su propio éxito:
echo "Reintentos agotados ($RETRY). No se pudo enviar."
exit 1
El socio con llave
No tiene que hacer nada, simplemente abrir su portátil y ponerse a frikear, como siempre.
Para el usuario
El usuario simplemente debe mirar el twitter de hlxzgz, o suscribirse a él, para saber si hay socios dentro de la sede de Hispalinux.
Por hacer
Comprobar si la tabla de arp refresca lo suficientemente rápido, ajustarlo o buscar otro sistema.- Meter el tuiteador también dentro del router.
Quizá quitar el número de socios del aviso, ya que se avisa en cuanto se detecta uno y no se dice nada más hasta que no queda ninguno.- Separar la lista de hosts conocidos en un fichero aparte.
Cualquier bug o mejora será bienvenida.
Actualización h3>
Ahora tuitea también los cambios de número de socios en la red y controla si es 1 o más para poner el singular o plural correctamente en “socio/socios”.
#!/bin/sh
COLEGAS="vfc-laptop, ubu-laptop, QueruMacBook, reclus"
REGEXP=$(echo $COLEGAS|tr -s ", " "|")
LISTA=$(echo $REGEXP|tr "|" "\n")
FSTATUS="/var/log/abierto.status"
ANTERIOR=$(cat $FSTATUS)
TUITER="ssh -i /root/.ssh/id_rsa hlxzgz@simone.traci.es ./qtwitter.sh"
# Configurar ssh de root:
if [ ! -f /root/.ssh/known_hosts ]
then
echo "Configurando ssh..."
cp /jffs/ssh/* /root/.ssh/.
fi
/sbin/arp|grep -v "incomplete"|grep -E $REGEXP
if [ $? -eq 0 ]
then
NUM=$(/sbin/arp|grep -E $REGEXP|wc -l)
echo "> Hay ${NUM} socios conectados."
ACTUAL="ON:${NUM}"
echo $ACTUAL > /var/log/abierto.status
if [ "$ANTERIOR" != "$ACTUAL" ]
then
echo "> Hay cambios."
echo "> Notificando..."
if [ $NUM -lt 2 ]
then
$TUITER "Hay ${NUM} socio en la sede."
else
$TUITER "Hay ${NUM} socios en la sede."
fi
fi
else
echo "> Ningun colega conectado."
echo "OFF" > /var/log/abierto.status
if [ "$ANTERIOR" != "OFF" ]
then
echo "> Antes habia alguno."
echo "> Notificando..."
$TUITER "CERRADO: No hay socios en la sede."
fi
fi
exit 0








pues queda gracioso. Otra cosa es que el horario del twitter sea de fiar.
Si se te ocurre cualquier cosa para mejorarlo…
No es más fácil y tampoco atenta a la privacidad una cámara conectada a intenet emitiendo, por ejemplo a la altura de los pies?