Cambios en la vigilancia

Como ya he comentado en otros post (I, II, III y sobre envío de pruebas), en los que publiqué (o mejor dicho, hice un full-disclosure) sobre el sistema de vigilancia que tengo en casa, basado en Motion.

Tras los cambios en la placa base, por algún motivo, la viejuna Logiteck QuickCam me tumba el servidor al tratar usarla, así que, ahora estoy de prestado con una Philips (¡gracias Antonio!) que va muy bien y, puestos a cambiar, ¿por qué no también el sistema de vigilancia?.

Tras mirar que Motion llevaba años sin nuevos desarrollos (aunque en los últimos meses se han puesto las pilas), me decidí por ZoneMinder después de que Carlos, un compañero del trabajo, me lo enseñara con calma. Este software ya lo conocía, pero con todo el desarrollo que había hecho y la integración con bluetooth que tenía en Motion, me daba mucha pereza cambiar.

Las características que tiene son:

  • Interfaz en PHP: Me permite integrarlo como una web más dentro de Apache.
  • Acceso “Anywhere”: Ya no me es necesario usar el CGIProxy, simplificando el acceso.
  • Streaming o Stills: Desde la interfaz web puedo ver en tiempo real qué sucede, bien en “vídeo” o las fotos fijas.
  • Filtros: Puedes definir qué clase de eventos o con qué puntuación generar una alerta, de tal modo que evito los petardeos que me daba Motion con los cambios de luz (aunque lo tenía bastante bien configurado)
  • Upload: Envía tanto avisos por e-mail, con la URL para comprobar el evento que ha lanzado la alerta, como la subida a un server externo, para salvaguardar las evidencias.
  • Zonas: Dentro de una imagen, puedes definir zonas, de tal modo que sólo tenga en cuenta qué sucede en dicha parte de la imagen.

La verdad es que por ahora estoy muy contento con el cambio. Ya me he vuelto a currar los scripts para integrarlo con el Bluetooth al igual que Motion, por lo que tengo sus funciones cubiertas, además de mejoradas. Creo que la migración ha concluído con éxito.

¿Cómo tener tu MTA en casa y no ser bloqueado en el intento?

Siguiendo al hilo de los post sobre Motion, las imágenes salen de casa a través del correo. En un principio, con una configuración básica de Postfix no había mayor problema.

El problema ha surgido con el tiempo: los ISP y demás se han puesto un poco duros con el spam (se suele decir que en condiciones “normales”, el 97% del tráfico de email que recibe un MTA es Spam), así que, si te ven que envías correo con una IP dinámica (las típicas de cualquier ADSL) te meten en el mismo saco (pagamos justos por pecadores… o mejor dicho, redes botnets y demás “Inter-fauna”).

Para ello, sólo me ha quedado la opción de tener un “relayhost” (o smarthost), de tal modo que no realizaré la entrega de correo directamente al MTA destino, sino que usaré el de Gmail para que él, con mejor reputación que yo (que debo aparecer en todas las RBL’s), envíe el correo.

Para ello, usaré Postfix con el siguiente añadido en el fichero main.cf:

       relayhost = smtp.gmail.com:587
       smtp_use_tls = yes
       smtp_sasl_tls_security_options = $smtp_sasl_security_options
       smtp_sasl_tls_verified_security_options = $smtp_sasl_security_options
       smtp_sasl_auth_enable = yes
       smtp_sasl_password_maps = hash:/etc/postfix/password
       smtp_sasl_security_options =

Y donde el fichero /etc/postfix/password tendrá:

       #cat password
       smtp.gmail.com  CUENTA@GMAIL.COM:PASSWORD

No podemos olvidarnos que ese fichero:

1) Contiene en CLARO el usuario y password de una cuenta gmail (ojo con los permisos que le damos)

2) Tendremos que hacer un postmap para que se convierta en “password.db” (el típico fichero de postfix)

Como supongo que podréis imaginar, ¿todo el correo sale con CUENTA@GMAIL.COM como origen?. Sí pero no, es decir, como YO genero los correo con los scripts de Motion (o lo que me dé la gana), puedo poner el “mail from” que quiera, eso sí, la cuenta origen será la misma…

Detección de Movimiento (y III)

Ya hemos configurado Motion, nos envía alertas, pone las evidencias con un time-stamp y a salvo… ¿qué más nos puede hacer falta?.

Muy sencillo: ¿cómo lo activo?, ¿cada vez que salgo de casa me tengo que hacer root y ejecutar /etc/init.d/motion start?… Eso es mucho rollo, necesito algo automático.

Desde el principio, tengo un par de combinaciones secretas de teclas (en gnome, con el gconf_editor… buscad por ahí), una para activarlo y otra para desactivarlo. Evidentemente, la activación tiene un retardo, para que me dé tiempo a salir de casa sin prisa.

Este sistema, era útil, pero, necesitaba que todavía lo fuese más, es decir, activación automática. Sin embargo, ¿y la desactivación?. Prefiero que sea manual. Si alguien, mediante algún tipo de coacción (navaja en el cuello, pistola en la sien…) entra conmigo a casa, tendré evidencias de este suceso.

¿Cómo hago para activarlo automáticamente?… muy fácil, ¿qué es lo que siempre que sales de casa llevas encima?… ¿el móvil quizas?. A día de hoy, hasta los móviles más chapuceros tienen bluetooth… ¡ya lo tengo todo!

La idea es la siguiente: el móvil siempre tiene el bluetooth activado pero oculto, para que no me lo vean por “ahí”, pero, ¿entonces cómo interactúo con él?

Como la MAC bluetooth es conocida por mi (hcitool scan, eso sí, con el móvil visible sólo para esto) al igual que el “nombre” que le tengo puesto, consultando directamente a la MAC (hcitool info MAC) me dará ciertos datos, así que, tengo un sistema simple de detectar si están los móviles.

#!/bin/bash
MACS=( MAC_BT_DEL_MOVIL1 MAC_BT_DEL_MOVIL2 …. )
IDS=( NOMBRE_MOVIL1 NOMBRE_MOVIL2 …. )
INDICE=0
ESTA_EL_MOVIL=0
MOVILES=0
QUIEN_ESTA=
###########################

ELEMENTOS=${#MACS[@]}

while [ “$INDICE” -lt “$ELEMENTOS” ]
do
ESTA_EL_MOVIL=`hcitool info ${MACS[$INDICE]} 2>/dev/null | grep -v “Requesting information …” | grep ${IDS[$INDICE]} | wc -l`
if [ $ESTA_EL_MOVIL -gt 0 ]
then
let “MOVILES = $MOVILES + 1”
# echo “Detectado móvil ${IDS[$INDICE]}”
QUIEN_ESTA[$INDICE]=${IDS[$INDICE]}
else
QUIEN_ESTA[$INDICE]=”nadie”
fi

let “INDICE = $INDICE + 1”
done

if [ $MOVILES -eq 0 ]
then
#Como no hay móviles, encendemos la alarma
logger “Enciendo la camara porque no hay nadie en casa”
# echo $MOVILES
beep -f 880 -l 100 -r 10 -d 100
/etc/init.d/motion start
else
logger “Estan en casa ${QUIEN_ESTA[0]} y ${QUIEN_ESTA[1]}”
fi
exit 0;

Bueno, creo que ya lo tenemos todo… cualquier sugerencia, mejor de los scripts será bienvenida.

P.S: Los scripts son GNU y como se suele decir, no me responsabilizo. Llevo un par de años usándolos (unos más que otros según he ido actualizando) y hasta ahora sin problemas.

P.S.2: Lo sé, picar código no es lo mío y es posible que haya barbaridades en los scripts, pero una vez más, a mi me funcionan.

Detección de Movimiento (II)

Ya tenemos instalado Motion, nos genera chorrocientas imágenes cada vez que hay un cambio, pero, siguen en local y no tenemos ni idea cuándo pasa algo.

Para solucionar esto, se me ocurrió usar un directorio para las fotos y vídeos nuevos que genera. Dicho directorio será limpiado cada vez que arranque, para evitar tener morralla que no sirve. Para ello, el inicio lo he modificado del siguiente modo:

#!/bin/bash
#
# motion      Capturador de movimiento por webcam
#
# chkconfig: 2345 90 30
# description: Montion es un programa para capturar movimiento con
#              dispositivos v4l.
# processname: motion
# config: /etc/motion/motion.conf

start() {

ACTIVO=`ps -ef | grep motion | grep -v grep | grep -v init | wc -l`
if [ $ACTIVO == 0 ]
then
#    echo “Motion NO Esta activo”

RUTA=”RUTA A LAS FOTOS NUEVAS”
RUTA2=”RUTA AL DIRECTORIO DE BACKUP/LIMPIEZA”
VIEJAS=-2
FOTO=0

LISTA=`ls -tr $RUTA/ | cut -d  -f1`

for i in $LISTA
do
if [ “$i” == “foto.jpg” ]
then
FOTO=1
fi

if [ !$FOTO ]
then
if [ “$1” != “foto.jpg” ]
then
VIEJAS=`expr $VIEJAS + 1`
fi
fi

done

if [ $VIEJAS -gt 0 ]
then
FOTOS_VIEJAS=`ls -tr $RUTA/20* | head -n $VIEJAS | cut -d  -f1`

for i in $FOTOS_VIEJAS
do

mv $i $RUTA2
#echo “-a $i ” >> $TEMPORAL

done
fi

#ACTIVO=`ps -ef | grep motion | grep -v grep | wc -l`

#if [ !$ACTIVO ]
#then
/usr/bin/motion
echo “1” > /tmp/sms
fi
exit 1

}

stop() {

pkill motion

exit 1

}

backup() {

VIEJAS=-2
FOTO=0

LISTA=`ls -tr $RUTA/ | cut -d  -f1`

for i in $LISTA
do
if [ “$i” == “foto.jpg” ]
then
FOTO=1
fi

if [ !$FOTO ]
then
if [ “$1” != “foto.jpg” ]
then
VIEJAS=`expr $VIEJAS + 1`
fi
fi

done

if [ $VIEJAS -gt 0 ]
then
FOTOS_VIEJAS=`ls -tr $RUTA/20* | head -n $VIEJAS | cut -d  -f1`

for i in $FOTOS_VIEJAS
do

mv $i $RUTA2
#echo “-a $i ” >> $TEMPORAL

done
fi

exit 1
}

case “$1” in
start)
start
;;
stop)
stop
backup
;;
backup)
backup
;;
restart)
stop
start
;;
*)
echo “Usage: motion {start|stop|restart|backup}”
exit 1
esac

Con un directorio que sé que está vacío en cada nueva ejecución, sólo tengo que periódicamente comprobar si aparecen nuevas fotos, o lo que es lo mismo, se genera un “evento” (provocando las fotos y vídeos).

Bien, ya sabemos detectar eventos, pero, ¿cómo me avisan?. Para ello, el aviso será a una cuenta de correo electrónico, en el que además, adjuntamos las fotos. Esto tiene tres ventajas:

a) Sacamos las evidencias fuera del servidor, así que, si sufrimos un robo o incendio, tendremos seguridad de no perder esos valiosos datos.

b) De algún modo, podremos certificar, gracias al servidor externo de correo, un time-stamp, que, con un buen peritaje, no creo que un Juez se niegue a aceptarlo.

c) Un modo rudimentario de alertas, aunque por e-mail, lo que no es inmediato, pero en determinados entornos puede que no nos quede otra.

Vale, ya he sacado las fotos fuera, pero, ¿y las alertas?. Para ello, generalmente los operadores de telefonía móvil suelen dar una cuenta de correo asociada a un número de móvil, de tal modo que te das de alta en ese servicio (gratuito en todos los casos que conozco) y cuando te llega un mail el operador, envía un SMS con, al menos, el remitente y sin coste alguno. Antiguamente también enviaban el subject, pero eso lo convertía en una forma interesante de recibir SMS gratis.

Para todo ello, tengo un script en el crontab que hace todo esto:

#!/bin/bash
#Definimos las variables
RUTA=”RUTA CON LAS IMÁGENES NUEVAS”
REMITENTE=”DIRECCIÓN DE EMAIL QUE GENERA LAS ALERTAS”
MENSAJE=”SUBJECT DEL EMAIL”
TEMPORAL=”/tmp/VARIABLE_TEMPORAL”
DESTINATARIOS=( CORREO1@DOMINIO CORREO2@DOMINIO …)
COMODIN=”foto.jpg”
SMS=”/tmp/sms”
UMBRAL=10
#EJECUCION
###############################

COMPRUEBA=`echo $EMAIL`
if [ “$COMPRUEBA” != “$REMITENTE” ]
then
export EMAIL=”$REMITENTE”
fi

#export

LISTA=`ls -tr $RUTA/ | cut -d  -f1`
NUEVAS=-1
TOKEN=`cat $SMS`

for i in $LISTA
do
if [ “$i” == “$COMODIN” ]
then
FOTO=1
fi

if [ $FOTO ]
then
NUEVAS=`expr $NUEVAS + 1`
fi

done

if [ $NUEVAS -gt 0 ]
then
FOTOS_NUEVAS=`ls -tr $RUTA/20* | tail -n $NUEVAS | cut -d  -f1`

for i in $FOTOS_NUEVAS
do
echo “-a $i ” >> $TEMPORAL
done

ADJUNTOS=`cat $TEMPORAL`

rm -f $TEMPORAL

ELEMENTOS=${#DESTINATARIOS[@]}
INDICE=0

while [ “$INDICE” -lt “$ELEMENTOS” ]
do
echo “$MENSAJE” | mutt -s “$MENSAJE” $ADJUNTOS ${DESTINATARIOS[$INDICE]}
logger “Envio mail a ${DESTINATARIOS[$INDICE]}”
let “INDICE = $INDICE + 1”
done

logger “ALERTA: DETECTADO MOVIMIENTO”

ULTIMA=`ls -tr $RUTA/20* | tail -n 1 | cut -d  -f1`
cp $ULTIMA $RUTA/foto.jpg -f

#Si hay mas de 8 fotos, enviamos SMS
if [ $NUEVAS -gt 8 ]
then

TOKEN=`expr $TOKEN + 1`
echo “$TOKEN” > $SMS

if [ $TOKEN -eq 1 ]
then
echo “$MENSAJE” | mutt -s “$MENSAJE” $CORREO
logger “SMS: SE ENVIA SMS”
fi
fi

fi

Bueno, con esto ya tenemos casi todo… ¿o no?

Detección de Movimiento (I)

Como ya sabéis algunos, en casa tengo un sistema de detección de movimiento con alertas.

Al comienzo de venir a vivir al piso de alquiler, como el portero tenía también las llaves, sospechaba que pudiese entrar, como pasó una vez para “quitarme” un ambientador a pilas que tenía… el hombre se excusaba en que pensaba que era del casero.

Con estos antecedentes, tenía claro que necesitaba algo que me avisase si algo pasa, así que, me puse manos a la obra.

Antiguamente, usaba Camorama con Apache, lo que permitía refrescar cada cierto tiempo una imagen en un servidor web. Este sistema, para ver un nido de pájaros puede estar bien, o para ver si hay nieve en la sierra, o mi habitación como hacía, pero no es válido para vigilar.

Busqué, por aquel entonces, algún software que detectase movimiento con una webcam (básicamente, que capturase una imagen, capturase otra pasado cierto tiempo y que haga un resta). Realmente no es complejo hacerlo, pero, ya había alguien que lo había hecho: Motion.

Motion está bien, no es tan completo como otras soluciones actuales, pero hace un par de años no encontré nada mejor.

Tiene dos formas de configurarse: a pelo, editando el fichero de configuración motion.conf, o bien, si consigues que arranque, a través de la interfaz web en el puerto 8082.

Una vez que está arrancado me surgió un problema: ¿cómo hago que me avise?