Notificación de eventos en Nut
1. Introducción
En un primer tutorial de Nut (pichar aquí) vimos su instalación y configuración básica. Ahora veremos algo un poco más avanzado, configurar upsmon para que nos notifique ante eventos producidos por nuestra UPS o SAI.
Upsmon (servicio encargado de monitorizar la UPS) proporciona entre sus características un sistema de notificación de eventos ante diversas situaciones producidas en la UPS. Perdida/recuperación de corriente eléctrica, perdida/establecimiento de comunicación con la UPS, baja batería son algunos de ellos permitiéndonos estar totalmente informado ante un cambio de estado de nuestro sistema.
Por defecto, upsmon, notifica los eventos a través de: syslog (SYSLOG) y mensajes de consola a todos los usuarios del sistema (WALL) pero este comportamiento puede ser modificado a través de /etc/nut/upsmon.conf. Podremos individualizar el tipo de notificación de cada evento, es decir, puede que ciertos eventos sólo nos interesen que se registren en el syslog y que otros nos envíe un mensaje en tiempo real por email o SMS. Esto último podemos hacerlo gracias a que upsmon tiene, por decirlo de alguna manera, la posibilidad de añadir nuevas formas de notificación.
¿Cómo lo hace? Ejecutando un comando que previamente hemos configurado. Éste será invocado con un único parámetro que representa el mensaje del evento producido y dos variables de entorno: NOTIFYTYPE y UPSNAME que corresponde con el tipo de evento y el nombre de la UPS que ha generado el evento.
Aunque podríamos crear nuestro propio programa que se comportase o realizase determinadas tareas ante cambios de estado de nuestra UPS, Nut, ofrece ya una utilidad bastante potente al respecto llamada upssched (fichero de configuración /etc/nut/upssched.conf). Podremos utilizar timers, para que no se notifique de un evento si éste se ha restablecido en un periodo de tiempo. Va a quedar claro con un ejemplo; imaginaos que se va la luz y por tanto nuestra UPS entra en modo batería pero se restablece al cabo de los 5 segundos. Con los timers podemos indicar que no se notifique de ningún cambio de estado siempre que no perdure más de un intervalo de tiempo.
2. Entorno
Entorno utilizado para escribir este tutorial:
- Sistema Operativo: Ubuntu Server 64 bits
- Kernel: 2.6.35-22
- nut: 2.4.3
- UPS: Trust 1300VA
3. Activando la notificación de eventos en upsmon
Upsmon es capaz de notificar diez tipos de evento:
- ONLINE: recuperación de corriente eléctrica.
- ONBATT: pérdida de corriente eléctrica.
- LOWBATT: batería baja.
- FSD: apagado forzoso del sistema.
- COMMOK: comunicación establecida con la UPS.
- COMMBAD: comunicación perdida con la UPS.
- SHUTDOWN: el sistema se está apagando.
- REPLBATT: la batería debe ser cambiada.
- NOCOMM: no se puede conectar a la UPS para la monitorización.
- NOPARENT: el proceso que se ha lanzado para el apagado del sistema ha fallado.
En este tutorial vamos a configurar upsmon/upssched para que nos notifique por email de los eventos:
- pérdida/recuperación de luz (ONBATT y ONLINE).
- establecimiento/pérdida de comunicación con la UPS (COMMOK y COMMBAD).
Lo primero que tenemos que hacer es indicar el comando encargado de procesar los eventos producidos por la UPS. En nuestro caso utilizaremos upssched.
NOTIFYCMD /sbin/upssched
A continuación, establecemos el comportamiento que debe tener upsmon ante los diferentes eventos producidos. Los posibles valores son SYSLOG, WALL o EXEC que representan notificación a través del syslog, envío de un mensaje de consola a todos los usuarios o ejecución a través del comando establecido en la variable NOTIFYCMD, respectivamente.
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC NOTIFYFLAG LOWBATT SYSLOG+WALL+EXEC NOTIFYFLAG FSD YSLOG+WALL NOTIFYFLAG COMMOK SYSLOG+WALL+EXEC NOTIFYFLAG COMMBAD SYSLOG+WALL+EXEC NOTIFYFLAG SHUTDOWN SYSLOG+WALL NOTIFYFLAG REPLBATT SYSLOG+WALL+EXEC NOTIFYFLAG NOCOMM SYSLOG+WALL NOTIFYFLAG NOPARENT SYSLOG+WALL
Ahora sólo nos queda configurar upsched. Upsshed utiliza un fichero el cuál será realmente el responsable de procesar los eventos y realizar la tarea en concreto (que en nuestro caso es la de enviar un email). Pero podéis pensar por qué no configuramos nuestro fichero en upsmon y así evitamos utilizar upssched que únicamente es una especie de proxy. Pues realmente es porque el verdadero potencial de upssched es el uso de timers, es decir, tendremos la posibilidad de que si un evento no perdura más de un intervalo de tiempo upssched no ejecuta nuestro fichero de procesamiento de eventos.
Además de los TIMERS también tenemos la posibilidad de que cuando se produzca un evento se notifique inmediatamente del hecho usando el comando EXECUTE.
La nomenclatura que tendremos que utilizar en upssched es muy sencilla. Para los timers tenemos un comando para que comience el evento:
Y otro para inhabilitar el timer:
Por ejemplo, las líneas que tenemos que añadir en el caso de que si se recupera la luz antes de 10 segundos no se notifique de la perdida de esta sería:
AT ONLINE * CANCEL-TIMER ups-on-battery
En el caso de que utilicemos los timers tenemos que tener en cuenta que debemos configurar las variables PIPEFN y LOCKFN para que funcionen.
Para la ejecución inmediata es algo similar:
A continuación os nuestro un fichero de ejemplo:
CMDSCRIPT /var/adictos/ups/ups-send-mail.sh PIPEFN /var/run/nut/upssched/upssched.pipe LOCKFN /var/run/nut/upssched/upssched.lock AT ONBATT * START-TIMER ups-on-battery 10 AT COMBAD * START-TIMER ups-comunication-bad 10 AT ONLINE * CANCEL-TIMER ups-on-battery AT COMOK * CANCEL-TIMER ups-comunication-bad AT REPLBATT * EXECUTE ups-change_battery AT ONLINE * EXECUTE ups-back-on-line AT LOWBATT * EXECUTE ups-low-battery AT COMOK * EXECUTE ups-comunication-ok
Como habéis podido ver en la línea 1 cuando upssched tiene que notificar de un evento ejecutará el comando ups-send-mail.sh. Éste script recibirá como primer parámetro el nombre del evento configurado en upssched, es decir, on-battery, on-back-on-line, etc…
#!/bin/bash UPS_SCRIPT_DIR=/var/adictos/ups MAIL_DEST="" FSFREE_FILE="/tmp/fsfree.txt" MESSAGE_MAIL="" EVENT_TYPE=$1 case "$EVENT_TYPE" in ups-on-battery) MESSAGE_MAIL="UPS on battery" ;; ups-comunication-bad) MESSAGE_MAIL="Communications with UPS lost" ;; ups-change_battery) MESSAGE_MAIL="UPS battery needs to be replaced" ;; ups-back-on-line) MESSAGE_MAIL="UPS on line power" ;; ups-low-battery) MESSAGE_MAIL="UPS battery is low" ;; ups-comunication-ok) MESSAGE_MAIL="Communications with UPS established" ;; esac echo "$MESSAGE_MAIL" | mail -s "[UPS] Event $EVENT_TYPE de `uname -n`: " correo@correo.es
4 Conclusión
Como habéis podido ver la notificación de eventos con Nut es bastante sencilla de configurar. Desde Autentia siempre intentamos publicar tutoriales que os puedan ayudar a mejorar vuestro entorno de trabajo e intentar minimizar al máximos posibles problemas que puedan surgir en el mantenimiento de nuestro sistemas.
Hola,
Seguí los pasos de la guía y estoy utilizando upssched para la notificación de eventos. Funciona bien para todas las banderas, excepto en dos: FSD y SHUTDOWN. Si reemplazo upssched por un script personalizado y configuro las NOTIFYFLAG antes mencionadas en exec, si se disparan, por lo que me he dado cuenta que upsmon no está alertando a upssched de esos dos eventos específicos, sabes a qué se puede deber?
Saludos.
Hola Rodrigo,
Gracias por tu comentario. La verdad no se a que puede ser debido. El tutorial que estás leyendo hace ya bastante tiempo y puede que la versión que estes utilizando tenga un bug.
A lo mejor puedes ponerte en contacto con el desarrollador a ver si puede ser motivado por eso.