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:
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