Script para ejecutar comandos en Openwrt con Mosquitto

hg556A-Mosquitto

Objetivo: Crear un script que ejecute comandos al recibir un mensaje.

Escenario:
Tendremos un servidor Mosquitto instalado en un router con Openwrt o público en Internet.

Tenemos uno o varios clientes escuchando un canal (Topic) llamado en nuestro ejemplo: router/input. En cuanto escucha por dicho topic el valor “apaga”, una webcam que está instalada en dicho router dejerá de funcionar. Acto seguido enviará por el canal (topic) router/output un mensaje de que se ha ejecutado la acción. Si recibe un valor “enciende”, la webcam vuelve a funcionar.

El diseño de dicho script sólo es un ejemplo. Podría hacerse que corte el wifi o que me diga a través del topic router/output cual es la potencia de la señal wifi existentes o cuantos equipos hay conectados al mismo. Las posibilidades son muchas.

La estructura del script es la siguiente (este script no es funcional sólo explica lo que se hace) uno funcional es el de más abajo:

#!/bin/sh
# Configuración del broker a escuchar.
broker="ip_or_domain_name"
port="1883"
topic_input="router/input"
topic_output="router/output"

#Ponemos el cliente de mosquitto escuchando
mosquitto_sub -t $topic_input -h $broker| while read value; do
 case $value in 
   "valor_1") # Ejecutamos comandos cuando recibimos valor 1 ;;                              
   "valor_2") # Ejecutamos comandos cuando recibimos valor 2 ;;
   "valor_3") # Ejecutamos comandos cuando recibimos valor 3 ;;
esac
done

He aquí este sencillo script:

#!/bin/sh
# Configuración del broker a escuchar.
broker="ip_or_domain_name"
port="1883"
topic_input="router/input"
topic_output="router/output"

#Ponemos el cliente de mosquitto escuchando
mosquitto_sub -t $topic_input -h $broker| while read value; do
        ts=$(date +%s)
case $value in 
   "apagar")
#--------------------------------------------------------------
     #Visualizamos en pantalla una alerta al recibir "apagar"
      echo "ALERTA: ${value} hora $ts";
     #Publicamos en el topico de salida mensaje de aviso 
      mosquitto_pub -t $topic_output -h $broker -m "Recibido {'valor':${value}, 'hora':${ts}}"
     #Ejecutamos la orden de parada de servicio de la webcam
      /etc/init.d/mjpg-streamer stop;;
#--------------------------------------------------------------
   "encender") 
      echo "ALERTA: ${value} hora $ts";
      mosquitto_pub -t $topic_output -h $broker -m "Recibido {'valor':${value}, 'hora':${ts}}"
      /etc/init.d/mjpg-streamer start;;
#--------------------------------------------------------------
esac
done

 

Para Linux el script funcionará perfectamente debiendo sólo cambiar al inicio:

#!/bin/sh

por

#!/bin/bash

A continuación veremos un script parecido pero que ejecuta en el equipo lo que queramos y devuelve en el topic router/output el resultado del comando. Puede resultar peligroso ya que ejecutado en un openwrt por defecto los comandos se ejecutan como root.

 
#!/bin/sh
# Configuración del broker a escuchar
broker="ip_or_domain_name"
port="1883"
topic_input="router/input"
topic_output="router/output"

#Ponemos el cliente de mosquitto escuchando
 mosquitto_sub -t $topic_input -h $broker| while read value; do
   var=$($value);
   #devuelve por el topic router/output el resultado del comando
   mosquitto_pub -t $topic_output -h $broker -m "$var";;
 done