Pantallas informativas (V): Informes de estado y actualizaciones

Es importante también saber qué es lo que pasa en nuestras Raspberry. Como comentábamos en la presentación de este proyecto, las pantallas estarán alejadas unas de otras y no podremos estar pendientes de si el fichero que hemos subido se está reproduciendo o no, necesitamos que la Raspberry “nos lo diga”.

La información nos la mandará la Raspbery por mail, para ello ha de instalarse el programa Mutt y el proceso para hacerlo con Gmail está descrito en esta entrada:

Mandando correos desde Raspberry con Mutt

Tal como pone en la entrada, se puede adaptar a otros servidores de correo de forma relativamente fácil.

Test

Bien, pues a partir de aquí damos por hecho que Mutt está instalado y funciona correctamente y comenzamos con un script para pedir información a la Raspberry y que nos diga:

      • Ficheros que tiene en el directorio para reproducir
      • IP
      • Fecha y hora de la última actualización

Vamos a comenzar creando un fichero de texto vacío en el home de pi en la Raspberry al que vamos a llamar report.txt

Y ahora preparamos el siguiente script:

#!/bin/bash	
printf "Test de funcionamiento\n\nArchivos en directorio:\n\n" > /home/pi/report.txt
ls /home/pi/Videos >> /home/pi/report.txt
printf "\nIp: " >> /home/pi/report.txt
hostname -I >> /home/pi/report.txt
mutt -s "Test Pantalla" [email protected] < /home/pi/report.txt

En la primera instrucción borramos el contenido de report.txt y le colocamos un par de líneas de introducción.

Las siguientes líneas irán añadiendo al fichero los siguientes datos:

    • Listado de ficheros en el directorio Videos
    • IP de la Raspberry (obtenida con hostname -I)

Y tras ello enviará el contenido del fichero report.txt al correo que hayamos puesto.

En este caso hemos llamado al fichero report01.sh así que probamos que funcione:

bash report01.sh

Comprobamos que a la dirección de correo que hayamos puesto en el script nos llega el mail con el listado del directorio y la IP y si todo ha ido bien seguimos. Retomaremos este script luego para añadirle lo referente a la última actualización que vamos a ver tras el siguiente apartado.

Cambio de IP

Antes de ir con el tema de las actualizaciones vamos a realizar otro script que será el que nos avise cuando haya un cambio de IP. Este script se ejecutará con crontab cada 15 minutos. El contenido es el siguiente:

El script se apoya en dos ficheros de texto que colocaremos en el home de pi de la Raspberry: ip.old e ip.new

Vemos que primero almacenamos en una variable el nombre de nuestra Raspberry. En la variable $correo tendremos que cambiar lo que hay por nuestro correo electrónico, igual que antes. Luego almacenamos la IP en ip.new y por último comparamos el contenido del fichero ip.new con ip.old y si hay alguna diferencia volcamos el contenido de ip.new en ip.old y mandamos un correo con la nueva IP

Aquí el código:

#!/bin/bash
#Guardamos en variables el nombre del hostname y el correo
nombrepantalla=$(hostname)
correo="[email protected]"
#Comprobamos la IP que tenemos asignada y la metemos al fichero new
hostname -I > /home/pi/ip.new
#Calculamos si hay diferencia pero sin salida
diff /home/pi/ip.new /home/pi/ip.old > /dev/null 2>&1
#Si hay alguna diferencia $? será 1, si fueran iguales será 0
if [ $? -eq 1 ]
then
	cat ip.new > ip.old
	mutt -s "Cambio IP $nombrepantalla" $correo < /home/pi/ip.new
fi

Llamaremos a este script: queip.sh

Actualizaciones

En la entrada II vimos la sincronización de carpetas e hicimos un script muy sencillo que llamamos actualiza.sh, ahora que la Raspberry puede mandar correos toca vitaminarlo, lo dejamos así:

Este script, como vemos, se apoya también en tres nuevos ficheros de texto que igual que antes colocaremos en /home/pi en la Raspberry, son los ficheros videos.new, videos.old y actualizacion.txt

Igual que como hemos hecho antes con la IP, aquí toca colocar nuestro correo electrónico y la IP del servidor, como vimos en la entrada II

En la línea 10 comprobaremos si la sincronización ha dado algún error o no y fijaremos el valor a dos variables que usaremos más adelante.

Antes de la sincronización hacemos un ls de Videos y después de la sincronización otro, ambos los guardamos en videos.old y videos.new respectivamente y en la línea 22 comparamos con diff -q ambos ficheros. La opción -q de diff nos va a decir si son o no son diferentes, así, en la línea 25 comprobamos tanto si los ficheros son diferentes como si ha habido algún error en la actualización, así, sólo mandaremos un correo si se ha actualizado algo o bien si no se ha podido actualizar, en el resto de casos, cuando no haya nada que actualizar y la conexión no haya devuelto un error, no se mandará correo.

En la línea 35 vemos que la fecha y hora de la actualización la guardaremos en el fichero actualizacion.txt que nos servirá para cuando pidamos un test.

Para el envío del correo nos apoyamos en el fichero report.txt comentado al inicio de esta entrada y ahora volveremos a ella, antes el código de actualiza.sh:

#!/bin/bash
#Guardamos en variables el nombre del hostname y el correo
nombrepantalla=$(hostname)
correo="[email protected]"
#Copiamos el contenido de la carpeta al archivo videos.old
ls /home/pi/Videos > /home/pi/videos.old
#Sincronizamos
rsync --delete -rtvu --timeout=60 -e "ssh -i /home/pi/.ssh/miclave" [email protected]:/home/pi/datos/pantallas/ /home/pi/Videos/
#Comprobamos si la sincronización ha dado errores o no
if [ $? -eq 0 ]
then
	resultado="Actualización correcta"
	resul="si"
else
	resultado="Error de actualización"
	resul="no"
fi
#Ahora volvemos a copiar el contenido de Videos, pero esta vez
#lo hacemos en el archivo videos.new
ls /home/pi/Videos > /home/pi/videos.new
#Y comparamos el contenido de los dos archivos
diff -q /home/pi/videos.old /home/pi/videos.new > /dev/null
#Si el contenido de los archivos es distinto
#O si se ha producido un error en la sincronización de carpetas
if [ $? -ne 0 ] || [ $resul = "no" ]
#Entonces mandamos el oportuno correo
then
	hostname -I > /home/pi/ip.new
	cp /home/pi/ip.new /home/pi/ip.old
	printf "$resultado de $nombrepantalla\n\nArchivos en directorio:\n\n" > /home/pi/report.txt
	ls /home/pi/Videos >> /home/pi/report.txt
	printf "\nIp: " >> /home/pi/report.txt
	cat /home/pi/ip.new >> /home/pi/report.txt
	printf "\nActualizado a: " >> /home/pi/report.txt
	date > actualizacion.txt
	cat /home/pi/actualizacion.txt >> /home/pi/report.txt
	mutt -s "$resultado de archivos $nombrepantalla" $correo < /home/pi/report.txt
fi

Volvemos a test

Ahora que ya hemos visto los informes sobre cambio de IP y las actualizaciones, volvemos al script de inicio y lo dejamos así:

Hemos añadido poca cosa, tan sólo el contenido del fichero actualizacion.txt para que nos diga la fecha y hora de la última actualización de contenidos ahora que ya tenemos lo anterior programado.

Podemos probar este script, pero sólo será una prueba pues su uso se integrará en el scrip principal, en proyecta.sh, no obstante ahí va:

#!/bin/bash	
printf "Test de funcionamiento\n\nArchivos en directorio:\n\n" > /home/pi/report.txt
ls /home/pi/Videos >> /home/pi/report.txt
printf "\nIp: " >> /home/pi/report.txt
hostname -I >> /home/pi/report.txt
printf "\nActualizado a: " >> /home/pi/report.txt
cat /home/pi/actualizacion.txt >> /home/pi/report.txt
mutt -s "Test Pantalla" [email protected] < /home/pi/report.txt

Modificando proyecta.sh

Es aquí cuando tenemos que integrar el “test de funcionamiento” en el script principal, y lo vamos a hacer así:

Comenzamos poniendo al principio una variable que almacene nuestro correo electrónico.

Y ahora, en un elif, si en el directorio Videos metemos un fichero que se llame test.txt (la extensión en realidad da lo mismo, pero mejor hacer un txt vacío) se ejecutará el código.

Vemos que lo hemos variado un poco, poniendo la variable $nombrepantalla y el correo también va por variable.

Una vez que nos envíe el correo borrará el fichero de la Raspberry.

Dos consideraciones: Esto afecta a todas las pantallas (a todas las Raspberrys) que estemos controlando, así que si tenemos cuatro, cada una nos enviará un correo. También habrá que estar atento a borrar el fichero text.txt del servidor, pues si no a la siguiente actualización lo volverían a cargar y de nuevo nos enviarían otros tantos correos.

El código que “de momento” va teniendo el script proyecta.sh es el siguiente:

#!/bin/bash
#Establecemos en estas variables:
#El nombre de la pantalla a gestionar
#El correo donde mandar los informes
nombrepantalla=$(hostname)
longitud=${#nombrepantalla}
correo="[email protected]"
ejecuta="bucle"
#Ocultamos el cursor
echo -e "\e[?1;0;0c"
clear
#Ejecutamos el bucle mientras $ejecuta sea "bucle"
while [ $ejecuta = "bucle" ]
do
#Refrescamos el directorio
cd .
#Recorremos el directorio
for file in /home/pi/Videos/*
do
#Metemos en variable el nombre y la extensión
extension="${file##*.}"
filename=$(basename $file)
fname="${filename%.*}"
#A continuación usaremos nombres de archivo que reservaremos para ejecutar diversas acciones
#Si el nombre coincide con el nombre de la pantalla pararemos el bucle
#borraremos el fichero y luego ejecutaremos la acción relacionada
if [ $fname = $nombrepantalla ]
	then
		ejecuta=$extension
		rm $file
		break
#Si el fichero comienza por XXX pero a continuación no se encuentra el nombre
#de la pantalla, lo ignoraremos.
elif [ ${fname:0:3} = "XXX" ] && [ ${fname:3:$longitud} != $nombrepantalla ]
	then
		:
#Si el nombre del fichero es test preparamos un informe que nos diga
#los ficheros que contiene el directorio, IP y la hora de actualización
elif [ $fname = 'test' ]
	then
		printf "Test de $nombrepantalla\n\nArchivos en directorio:\n\n" > /home/pi/report.txt
		ls /home/pi/Videos >> /home/pi/report.txt
		printf "\nIp: " >> /home/pi/report.txt
		hostname -I >> /home/pi/report.txt
		printf "\nActualizado a: " >> /home/pi/report.txt
		cat /home/pi/actualizacion.txt >> /home/pi/report.txt
		mutt -s "Test $nombrepantalla" $correo < /home/pi/report.txt
		rm $file
#A partir de aquí suponemos que ya son ficheros para proyectar
#Si el fichero tiene extensión jpg lo mostramos en pantalla la duración establecida
elif [ $extension = 'jpg' ]
	then
		clear
		fim $file -a -c '{sleep 20;quit;};'
		clear
#En cualquier otro caso asumimos que se trata de un video y lo reproducimos
#Por defecto, al ser pantallas informativas,
#reproduciremos el vídeo sin sonido
#Si queremos sonido basta con poner al final del nombre de archivo AAA justo antes del punto de la extensión
else
	if [ ${fname: -3} = "AAA" ]
	then
		omxplayer  -b --blank --aspect-mode letterbox "$file" > /dev/null
	else
		omxplayer  -b --blank --aspect-mode letterbox --vol -6000 "$file" > /dev/null
	fi
fi
done
done
#Si salimos del bucle puede ser por algún fichero del tipo
#nombrepantalla.extensión y la extensión la tenemos en variable ejecuta
#La extensión deberá ser 001, 002, etc y según sea se ejecutará lo siguiente:
#Si es 001 apagamos la Raspberry
if [ $ejecuta = '001' ]
then
	sudo shutdown -h now
#Si es 002 reiniciamos:
elif [ $ejecuta = '002' ]
then
	sudo shutdown -r now
#Si es 003 borramos
elif [ $ejecuta = '003' ]
then
	clear
#En cualquier otro caso termina el script y borramos la pantalla
else
	clear
fi
#Podemos ir añadiendo las condiciones que queramos con elif
#Debemos evitar los ficheros de imagen y video con el nombre de la pantalla
#o el script se detendrá

Ficheros tratados en esta entrada

Ficheros de texto en /home/pi

    • ip.new: de texto, lo creamos vacío, sirve para saber si cambia la IP
    • ip.old: de texto, lo creamos vacío, sirve para saber si cambia la IP
    • videos.new: de texto, lo creamos vacío, sirve para controlar las actualizaciones
    • videos.old: de texto, lo creamos vacío, sirve para controlar las actualizaciones
    • actualizacion.txt: de texto, lo creamos vacío, sirve para controlar las actualizaciones
    • report.txt: de texto, lo creamos vacío, contendrá el cuerpo de los email

Scripts

    • queip.sh: controla los cambios de IP
    • actualiza.sh: sincroniza el contenido de las carpetas
    • proyecta.sh: (continuación): script principal

Otros ficheros

    • test.txt: de texto, lo creamos vacío, sirve para pedir un test a las Raspberrys, se ha de subir a la carpeta origen del servidor

Deja un comentario

No está permitida la inserción de ningún dato de carácter personal (mail, tef...). Cualquier comentario que los contenga será editado o eliminado.

Por favor, si dejas un comentario pon cualquier nombre para poderme dirigir a ti pero que no te identifique

17 − ocho =

El comentario es totalmente privado. No se almacena la IP