Notificación de eventos en Nut

2
8824

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:

AT TIPO_EVENTO NOMBRE_UPS START-TIMER NOMBRE_EVENTO INTERVALO_DE_TIEMPO

Y otro para inhabilitar el timer:

AT TIPO_EVENTO NOMBRE_UPS CANCEL-TIMER NOMBRE_EVENTO

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 ONBATT * START-TIMER ups-on-battery 10
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:

AT ONLINE * EXECUTE ups-back-on-line

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.

2 COMENTARIOS

  1. 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.

  2. 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.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad