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
10 octobre 2021 at 16:03
Bonjour,
Merci pour ce tuto, il est assez bien détaillé,
cependant j’ai du mal à comprendre certains « users » :
– j’ai bien un dossier « /usr/share/nut/ » ou « /usr/share/nut/ », mais « nut » n’est pas un véritable user ?
– plus important, « nutsoft » n’est expliqué nulle part, en particulier le dossier « /var/lib/nutsoft/ » (et encore moins le fichier « killpower »), faut-il le créer ? ou remplacer le références dans le tutoriel par celui qui me permet de me logger sur la Pi ?
9 juillet 2015 at 23:32
Oups, désolé pour le doublon, je croyais avoir rencontré un problème lors de la première tentative d’envoi de message…
9 juillet 2015 at 17:52
J’ai enfin réussi grâce à vous, merci !!
Maintenant, je souhaite utiliser Nut-cgi mais j’utilise Nginx et je ne sais pas traduire les vhosts Apache vers Nginx et je ne trouve pas ces infos sur le net.
Pourriez-vous me donner le vhost Nginx pour que cela fonctionne en toute sécurité ?
Merci par avance…