Afin d’éviter de corrompre son système de fichiers et éviter des pannes hardware en cas de coupure de courant, l’UPS est essentiel. Même pour un petit serveur ou un PC. Il y en a déjà à partir de 80/90€. Dans mon cas, j’ai un EATON protection station 650. Voici comment configurer NUT pour un UPS USB sous Debian Wheezy.

Mise à jour décembre 2017 : A partir de Debian 9 des modifications sont à faire

Mise à jour mars 2018 : script de notification modifié afin d’avoir des notification push sur son smartphone via pushBullet 🙂

Mise à jour février 2023 : script de notification totalement revu pour les dépendances, ajout de notification Telegram et Pushover, ainsi qu’un rôle Ansible dont j’explique les détails dans l’article dédié. La partie installation de cet article reste toujours valable 🙂

Installation de nut

Cette installation est pour un serveur ayant l’UPS branché directement en USB ou en SNMP. Si vous avez 2 serveurs alimentés par l’UPS, j’explique également comment configurer un serveur nut slave. Dans ce cas, le serveur slave interroge le serveur NUT du serveur master (qui a l’UPS branché en USB).

Installation des outils :

apt-get install nut

Pour utiliser un UPS disposant d’une carte réseau avec SNMP configuré :

apt-get install nut-snmp

Chercher le bon driver :

less /usr/share/nut/driver.list

Configurer ups.conf pour un UPS relié en USB :

[home-nas-ups]
driver = usbhid-ups
port = auto
desc = "EATON Protection Station 650"

Configurer ups.conf pour un gros UPS qui dispose d’une carte réseau en SNMP :

[ups-bat2]
driver = snmp-ups
port = 10.1.2.3
community = monitor
#       mibs=appc
snmp_version=v2c
pollfreq=30
desc = "AEG Protect D. 3000"

Configurer upsd.conf pour un serveur en standalone :

LISTEN 127.0.0.1 3493

Configurer upsd.conf sur le master si on a plusieurs serveurs alimenté par l’UPS :

LISTEN 0.0.0.0 3493

Configurer upsd.users :

[admin]
password = *********
actions = SET
instcmds = ALL

[nutsoft]
password = *****
actions = FSD
upsmon master

Si vous avez 2 serveurs qui sont sur le même UPS, voici la configuration d’un accès pour le serveur slave à configurer dans le fichier upsd.users du master nut :

[nutslave]
password = **********
upsmon slave

Script de notification d’évènement NUT par mail / SMS / push

J’ai créé un script de notification NUT sur Github afin d’être alerté d’un évènement sur l’UPS par mail ou sms. Depuis mars 2018, par notification push sur son smartphone! Depuis le début d’année 2023, un article complet sur une mise à jour majeure du script est disponible avec de nouvelles notifications Push comme Telegram.

Il faut créer un compte sur le site de pushBullet et installer l’application Android. Elle existe aussi pour windows phone ou iPhone. Une fois loggé avec votre compte Google, allez dans Settings > Account > « Create Access Token ». Copiez le code apparu pour le mettre dans le fichier de configuration dans la variable « accessToken ».

Les notifications sont variables :

  • On peut très bien être averti uniquement par mail d’un soucis de déconnexion usb à l’UPS
  • Etre averti au passage sous batterie par mail, sms et push.
  • Etc

Le script envoi un mail à « alert ». On crée donc un alias dans /etc/aliases :

alert: 

Et on applique la configuration avec la commande :

newaliases

Intégration du script de notification

Pour intégrer le script de notification dans la configurer de NUT, il faut modifier le fichier upsmon.conf du master :

RUN_AS_USER nut
MONITOR home-nas-ups@localhost:3493 1 nutsoft ***** master
NOTIFYCMD /usr/local/bin/nutNotify.sh
#multiple instances running simultaneously

NOTIFYMSG ONLINE "ONLINE %s"
NOTIFYMSG ONBATT "ONBATT %s"
NOTIFYMSG LOWBATT "LOWBATT %s"
NOTIFYMSG FSD "FSD %s"
NOTIFYMSG COMMBAD "COMMBAD %s"
NOTIFYMSG COMMOK "COMMOK %s"
NOTIFYMSG SHUTDOWN "SHUTDOWN %s"
NOTIFYMSG REPLBATT "REPLBATT %s"
NOTIFYMSG NOCOMM "NOCOMM %s"

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

#NOTIFYMSG type message

POWERDOWNFLAG /var/lib/nutsoft/killpower
#POWERDOWNFLAG /var/tmp/killpower
#Dans la doc :
#POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD "/sbin/shutdown -h +0"

FINALDELAY 2
MINSUPPLIES 1
RBWARNTIME 604800
NOCOMMWARNTIME 21600

POLLFREQ 15
POLLFREQALERT 30
HOSTSYNC 15
DEADTIME 45

Voici une configuration pour un serveur slave de upsmon.conf

RUN_AS_USER nutsoft
MONITOR ups-bat2@localhost 1 nutsoft ***** master
NOTIFYCMD /usr/local/bin/nutNotify.sh
#multiple instances running simultaneously

NOTIFYMSG ONLINE "ONLINE %s"
NOTIFYMSG ONBATT "ONBATT %s"
NOTIFYMSG LOWBATT "LOWBATT %s"
NOTIFYMSG FSD "FSD %s"
NOTIFYMSG COMMBAD "COMMBAD %s"
NOTIFYMSG COMMOK "COMMOK %s"
NOTIFYMSG SHUTDOWN "SHUTDOWN %s"
NOTIFYMSG REPLBATT "REPLBATT %s"
NOTIFYMSG NOCOMM "NOCOMM %s"

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

#NOTIFYMSG type message

POWERDOWNFLAG /var/lib/nutsoft/killpower
SHUTDOWNCMD "/sbin/shutdown -h +0"

FINALDELAY 2
MINSUPPLIES 1
RBWARNTIME 604800
NOCOMMWARNTIME 21600

POLLFREQ 30
POLLFREQALERT 60
HOSTSYNC 15
DEADTIME 15

Configurer nut.conf pour un seul serveur sur l’UPS :

MODE=standalone
UPSD_OPTIONS="-u root"    #car upsdrvctl a besoin d'être spécifié en root

En cas de serveur master et slave, éditer le fichier nut.conf sur le master :

MODE=netserver
UPSD_OPTIONS="-u root"

Opérations pour l’utilisateur spécifique :

  • créer fichier de log et modif user :
touch /var/log/nutNotify.log && chown nut:nut /var/log/nutNotify.log

UPS de test

Pour tester les scripts, implémentation et autre, on peut utiliser un driver de test : dummy-ups

Voici l’exemple qui permet de tester son script de notification par exemple :

[dummy]
driver = dummy-ups
port = evolution500.dev
desc = "dummy-ups in dummy mode"

[repeater]
driver = dummy-ups
port = ups@hostname
desc = "dummy-ups in repeater mode"

Explications :

Il faut bien comprendre que upsmon va exécuter le script notify avec l’argument adéquoit : passage sous batterie, restauration du secteur, batterie faible ou signal d’arrêt des serveurs

Lorsque le signale LOWBATT est reçu, le SHUTDOWNCMD est exécuté après le FINALDELAY. Par défaut le script init halt appelle le script « ups-monitor shutdown » qui appelle réellement le script d’init « nut shutdown ». Celui-ci vérifie que le fichier POWERDOWNFLAG existe et contient the « magic string » de nut (cela peut poser problème lors de test, faire attention). Ensuite, le script demande au gestionnaire de driver (upsdrvctl) d’envoyer le signal de shutdown à l’UPS avec un delay de 20 secondes par exemple (dépend des UPS).

Si besoin, modifier la ligne 165 « if $upsmon -K >/dev/null 2>&1 ; then » par « if [ 1 ] ; then », si l’on veut pouvoir créer ce flag soit même

Attention que le fichier POWERDOWNFLAG doit se trouver sur la partition racine p.e. car il est exécuté en dernier dans les scripts rc.0. Le mettre dans /tmp quand on a un tmpfs ne fonctionnera pas.

Pour plus d’informations, rendez-vous sur le site officiel de Nut.

Problèmes possibles

Cas 1 – mauvaise syntaxe

#upsmon
Network UPS Tools upsmon 2.4.3
Unable to use old-style MONITOR line without a username

Problème de ligne dans le fichier de configuration upsmon.conf attention au power value 1!!!

Cas 2 – driver ne démarre pas

Can't connect to UPS [home-nas-ups] (usbhid-ups-home-nas-ups): No such file or directory

Vérifier que le driver est bien chargé (besoin de lancer en root…) :

#upsdrvctl start
Network UPS Tools - UPS driver controller 2.4.3
Network UPS Tools - Generic HID driver 0.34 (2.4.3)
USB communication driver 0.31
Can't claim USB device [0463:ffff]: could not detach kernel driver from interface 0: Operation not permitted Driver failed to start (exit status=1)

Tester en root :

upsdrvctl -t -u root start

Aide du driver de l’UPS :

/lib/nut/usbhid-ups -h

Editer le fichier d’init, chercher la ligne « ! $upsdrvctl start » et remplacer par « ! $upsdrvctl -u root start »

 Problème 3 – driver non démarré automatiquement sur Squeeze

Si upsdrvctl ne se lance pas avec /etc/init.d/nut start sous Debian Squeeze, alors il s’agit peut-être d’un problème de droits.

# /etc/init.d/nut stop
Stopping Network UPS Tools: (driver(s) failed) upsd upsmon.

Essayer sans et avec les options root :

# /sbin/upsdrvctl start
Network UPS Tools - UPS driver controller 2.4.3
Network UPS Tools - Generic HID driver 0.37 (2.6.4)
USB communication driver 0.32
interrupt pipe disabled (add 'pollonly' flag to 'ups.conf' to get rid of this message)
Can't claim USB device [051d:0003]: could not detach kernel driver from interface 0: Operation not permitted
Driver failed to start (exit status=1)

# /sbin/upsdrvctl -u root start
Network UPS Tools - UPS driver controller 2.4.3
Network UPS Tools - Generic HID driver 0.37 (2.6.4)
USB communication driver 0.32
interrupt pipe disabled (add 'pollonly' flag to 'ups.conf' to get rid of this message)
Using subdriver: APC HID 0.95

Il faut donc éditer le script d’init, c’est pas propre, mais pas le choix :

# diff /tmp/nut /etc/init.d/nut
84c84
<           ! $upsdrvctl start >/dev/null 2>&1  &&  \
---
>           ! $upsdrvctl -u root start >/dev/null 2>&1  &&  \

Le driver est correctement chargé :

# /etc/init.d/nut start
Starting Network UPS Tools: driver(s) upsd upsmon.

Nut-cgi

installer le paquet :

apt-get install nut-cgi

Configurer le fichier hosts.conf :

MONITOR home-nas-ups@localhost:3493 "EATON Protection Station 650"

Configurer le fichier upsset.conf :

I_HAVE_SECURED_MY_CGI_DIRECTORY

Configuration pour Apache, éditer /etc/apache2/site-enable/000-default :

#ScriptAlias /nut/cgi-bin /usr/lib/cgi-bin/nut
ScriptAlias /cgi-bin/nut /usr/lib/cgi-bin/nut
<Directory /usr/lib/cgi-bin/nut>
AllowOverride AuthConfig
Options ExecCGI
Order allow,deny
Allow from all
</Directory>

Alias /nut /usr/share/nut/www
<Directory /usr/share/nut/www >
Options None
AllowOverride None
Order allow,deny
allow from all
</Directory>

Configuration pour Lighttpd, éditer /etc/lighttpd/lighttpd.conf :

alias.url = ( "/nut/cgi-bin" => "/usr/lib/cgi-bin/nut" )
alias.url += ( "/cgi-bin/nut" => "/usr/lib/cgi-bin/nut" )
alias.url += ( "/nut" => "/usr/share/nut/www" )

Commandes utiles

  • upscmd : interragir avec l’UPS commande
  • désactiver temporairement le beeper : upscmd -u admin -p ‘jeypErjEm!ogIm9’ ups-antenne beeper.mute
  • upsrw : set UPS variables
  • upsc : CLi pour monitorer l’ups
Summary
NUT - parler à son UPS - notifications mails/push et arrêt propre du système
Article Name
NUT - parler à son UPS - notifications mails/push et arrêt propre du système
Description
NUT permet de parler à son UPS pour éteindre proprement son serveur ou son NAS en cas de coupure de courant. Un script notifie par mails push.
Author