Monitorear UPS con NUT


Nut se encuentra disponible en los repositorios de paquetes de Ubuntu. Para instalarlo ejecutamos el siguiente comando
sudo apt-get install nut

 
Luego, debemos comprobar que se ha creado el usuario y grupo nut
sudo id nut
uid=108(nut) gid=119(nut) groups=119(nut) 

Modificar el fichero /etc/nut/ups.conf, que define el driver para conectarse a la UPS y la directivas de seguridad a aplicar.

Nut ofrece en su página oficial un listado con los drivers que se deben utilizar para la mayoría de las UPSs aquí. En el caso de que nuestro modelo no se encontrase en la lista probar con el driver de un modelo similar.  
sudo nano /etc/nut/nut.conf
En mi caso, que la UPS es una Liebert PowerSure Proactive 1000, añado las siguientes lineas al archivo
[liebert]
    driver = usbhid-ups
    port = auto
    desc = "UPS en Servidor X"
Recargar la configuración de acceso a los dispositivos USB

sudo udevadm control --reload-rules
sudo udevadm trigger
Ahora si ejecutamos
sudo upsdrvctl start

tendremos que ver algo como

Network UPS Tools - UPS driver controller 2.6.4
Network UPS Tools - Generic HID driver 0.37 (2.6.4)
USB communication driver 0.32
Using subdriver: Belkin HID 0.15


El siguiente paso es configurar los servicios upsd y upsmon. El primero se comunica con upsdrvctl y actúa como servidor, mientras que el segundo se comunica con upsd y se encarga de monitorizar el estado de la UPS y apagar la máquina cuando se recibe un evento de perdida de luz.

Nuestra UPS sólo puede notificar la pérdida de luz a una única máquina (master) pero en cambio varias máquinas pueden estar conectadas a la UPS (slaves). Por tanto tiene que haber alguna forma de que las máquinas esclavas tengan conocimiento de la pérdida de luz.
 
En /etc/nut/upsd.conf indicamos sobre que interfaz y puerto esta escuchando el servicio. Por defecto, upsd, esta escuchando en el puerto 3493 del interfaz local. Como en nuestro caso no tenemos que dar un servicio remoto a otras máquinas no tocaremos nada de este fichero.

 
A parte del puerto de escucha también hay que configurar los usuarios y permisos para acceder a él (/etc/nut/upsd.user).
sudo nano /etc/nut/upsd.users

[root]
password=t3st
actions = SET
instcmds = ALL

[upsmon]
password=pass
upsmon master
upsmon slave

En este caso hemos creado un usuario root con todos los permisos de acceso y un usuario upsmon que será utilizado por el servicio upsmon para acceder como master o slave.


A continuación nos toca configurar upsmon (/etc/nut/upsmon.conf). De todas las opciones posibles sólo vamos a destacar las tres más importantes:

sudo nano /etc/nut/upsmon.conf

agregar la siguiente configuración

MONITOR liebert@localhost 1 upsmon pass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /bin/upssched-cmd
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower

NOTIFYFLAG ONLINE    SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG LOWBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG FSD        SYSLOG+WALL+EXEC
NOTIFYFLAG COMMOK    SYSLOG+WALL+EXEC
NOTIFYFLAG COMMBAD    SYSLOG+WALL+EXEC
NOTIFYFLAG SHUTDOWN    SYSLOG+WALL+EXEC
NOTIFYFLAG REPLBATT    SYSLOG+WALL+EXEC
NOTIFYFLAG NOCOMM    SYSLOG+WALL+EXEC
NOTIFYFLAG NOPARENT    SYSLOG+WALL+EXEC

RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5
 
Configurar los servicios para que inicien cuando arranque la máquina. Creamos un fichero /etc/default/nut

sudo nano /etc/default/nut

START_UPSD=yes
START_UPSMON=yes

y editamos /etc/nut/nut.conf
 
sudo nano /etc/nut/nut.conf

MODE=standalone

En este caso estamos configurando Nut para que upsd sólo acepte conexiones locales. Si estuviéramos en un entorno con máquinas esclavas (upsmon slave) este modo no serviría y el correcto sería netserver.


Modificar el archivo upssched.conf

sudo nano /etc/nut/upssched.conf

y agregar lo siguiente 

CMDSCRIPT /bin/upssched-cmd
PIPEFN /var/run/nut/upssched/upssched.pipe
LOCKFN /var/run/nut/upssched/upssched.lock

AT COMMOK * EXECUTE notify
AT COMMBAD * EXECUTE notify
AT REPLBATT * EXECUTE notify
AT NOCOMM * EXECUTE notify
AT FSD * EXECUTE forced-shutdown
AT NOPARENT * EXECUTE notify
AT SHUTDOWN * EXECUTE notify
AT ONLINE * CANCEL-TIMER shutdown
AT ONLINE * EXECUTE resume
AT ONBATT * START-TIMER shutdown 60000
AT ONBATT * EXECUTE shutdown-warning
AT LOWBATT * START-TIMER shutdown
AT LOWBATT * EXECUTE shutdown-warning
Hay un archivo llamado upssched-cmd ubicado en /bin/ que se encarga de realizar las acciones configuradas en los anteriores archivos, como por ejemplo ejecutar el apagado del servidor en caso de que estemos bajos de batería o notificar en el syslog los diferentes eventos que están ocurriendo.
sudo nano /bin/upssched-cmd 

#!/bin/sh

case "${NOTIFYTYPE}" in
ONLINE)
_notifymessage="UPS ${UPSNAME} - Equipo funcionando con la luz electrica";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
ONBATT)
_notifymessage="UPS ${UPSNAME} - Corte en el suministro electrico, el sistema funciona con bateria. CUIDADO";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
LOWBATT)
_notifymessage="UPS ${UPSNAME} - Bateria baja";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
FSD)
_notifymessage="UPS ${UPSNAME}: - Forzando el apagado del equipo";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
COMMOK)
_notifymessage="La comunicacion con el UPS ${UPSNAME} se ha establecido correctamente";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
COMMBAD)
_notifymessage="La comunicacion con el UPS ${UPSNAME} se ha PERDIDO, ERROR.";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;
upsdrvctl start salicru;;
SHUTDOWN)
_notifymessage="Finalizando sesion y apagando el equipo.";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
REPLBATT)
_notifymessage="UPS ${UPSNAME} - The battery needs to be replaced!";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
NOCOMM)
_notifymessage="UPS ${UPSNAME} - El UPS no esta disponible";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;
upsdrvctl start salicru;;
NOPARENT)
_notifymessage="No se puede apagar automaticamente el servidor, se necesita
intervencion del administrador.";
echo ${_notifymessage} | mail -s "SAI" destinatario_email@gmail.com;;
esac

case "${1}" in
shutdown-warning)

_message="${_notifymessage}.
Apagado inminente en ${_shutdowntimer} segundos.";;

shutdown)
_message="${_notifymessage}.
Se inicia el apagado del equipo.";
shutdown -p now ${_message};;

resume)
_message="${_notifymessage}.
Apagado cancelado.";;

forced-shutdown)
_message="${_notifymessage}.
Apagado forzado inminente en 100 minutos.";
shutdown -h 100;;

notify)
_message="${_notifymessage}";;

*)
_message="Unknown command: ${1}";
esac

# Write message to syslo
logger -t upssched-cmd "${_message}"

Correr los siguientes comandos para recargar la configuracion

sudo udevadm control --reload-rules
sudo udevadm trigger
sudo upsdrvctl stop
sudo upsdrvctl start
sudo /etc/init.d/ups-monitor start


Reiniciar el equipo

sudo reboot



Todos los logs se guardan en syslog, por tanto podemos hacer un simple tail para obtener las últimas líneas de información del sistema para detectar problemas en el arranque u otros avisos:

sudo tail /var/log/syslog




Hay un archivo llamado upssched-cmd ubicado en /bin/ que se encarga de realizar las acciones configuradas en los anteriores archivos, como por ejemplo ejecutar el apagado del servidor en caso de que estemos bajos de batería o notificar en el syslog los diferentes eventos que están ocurriendo.ivo extra ubicado llamado upssched-cmd ubicado en /bin/ que se encarga de realizar las acciones configuradas en los anteriores archivos, como por ejemplo ejecutar el apagado del servidor en caso de que estemos bajos de batería o notificar en el syslog los diferentes eventos que están ocurriendo en el SAI.
La ruta de este archivo (que es fundamental para una buena configuración) está en /bin/upssched-cmd, procedemos a editarlo con nuestro editor de archivos favorito con el siguiente contenido:
- See more at: http://www.redeszone.net/raspberry-pi/como-configurar-nut-network-ups-tools-en-raspbian-para-controlar-un-sai/#sthash.i8qh08Kz.dpuf

Comentarios

  1. Muy buen tutorial, sencillo, conciso y completo, aunque como norma de cortesía es bueno dar reconocimiento a quien nos ayudó a obtener la información que transmitimos, en este caso aquí hay unos enlaces cuyo contenido se asemeja a este:
    https://www.adictosaltrabajo.com/tutoriales/nut/ y
    https://www.adictosaltrabajo.com/tutoriales/nut-events/
    por cierto ambos escritos en 2011. Saludos.

    ResponderBorrar

Publicar un comentario