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?

4 thoughts on “Detección de Movimiento (II)

  1. En vez de revisar nuevas con tu script (que está muy bien), puedes usar las nuevas características del Kernel, y usar Inotify 🙂

    Así, además, te avisa en el momento, y no sólo a intervalos regulares. Los paquetes en Debian son “inotify-tools” y “inoticoming”.

    Jonás.

    Like

  2. ¡¡Publica tu cartera!! Ay, amigos, Alberto se niega a confesarlo, pero seguro que ya tiene el 53% de las acciones de ZoneMinder.

    xD

    Like

Leave a comment