Configurer et surveiller un onduleur avec NUT

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

Cet article est une ébauche. N'hésitez pas à contribuer ou à en discuter.

Ce tuto est destiné à vous aider à configurer (et surveiller) un onduleur sur une Debian.

Nous avons utilisés un onduleur PROLINK PRO850VU, connecté à l'ordinateur par un câble USB.

Intérêt

L'intérêt d'avoir un onduleur n'est plus à démontrer.

Pouvoir contrôler celui-ci et ordonner l'arrêt de votre machine en cas de coupure prolongée du secteur en est un autre. En effet, si la coupure de secteur dure trop longtemps et que vous videz la batterie de votre UPS (Uninterruptible Power Supply qui signifie alimentation sans interruption) avant d'avoir le temps d'éteindre votre machine, l'intérêt de l'onduleur est nul... Vous aurez tout juste gagné quelques minutes avant la coupure sauvage de votre système.

De plus NUT vous permettra aussi d'éteindre l'onduleur: une fois la machine arrêtée l'onduleur s’arrêtera complètement, évitant ainsi une décharge complète de(s) batterie(s).

Installation de NUT

Installation

Branchez le câble de communication (ici un cable USB) de l'onduleur et vérifiez qu'il est bien détecté

$ dmesg
... 
[60193.736139] usb 3-4: new low-speed USB device number 2 using xhci_hcd
[60193.762985] generic-usb 0003:0665:5161.0004: hiddev0,hidraw3: USB HID v1.00 Device [INNO TECH USB to Serial] on usb-0000:00:14.0-4/input0

Installez nut

# apt-get install nut
...
Les paquets supplémentaires suivants seront installés : 
 libupsclient1 nut-client nut-server
...

Configuration

Configurez votre onduleur: Il existe toute sorte de drivers, il faudra trouver le bon...

ls /lib/nut
apcsmart      belkin        bestuferrups  clone         everups     ivtscd        metasys      newmge-shut  powerpanel    solis          upscode2
apcsmart-old  belkinunv     bestups       clone-outlet  gamatronic  liebert       mge-shut     oneac        rhino         tripplite      usbhid-ups
bcmxcp        bestfcom      blazer_ser    dummy-ups     genericups  liebert-esp2  mge-utalk    optiups      richcomm_usb  tripplitesu    victronups
bcmxcp_usb    bestfortress  blazer_usb    etapro        isbmex      masterguard   microdowell  powercom     safenet       tripplite_usb

Ce fichier /usr/share/nut/driver.list contient une liste d'onduleurs et le driver qu'il faut utiliser.

Prolink n'est pas dans la liste (il ne doivent pas ouvrir les spécification de leur matériel...); Nous avons réussi à faire fonctionner notre PRO850VU avec le driver "blazer_usb"

Si vous n'êtes pas sur du port de communication, mettez le à: port = auto

# $editor /etc/nut/ups.conf
...
[apc]
       driver = blazer_usb
       port = /dev/ttyS0
       #port = auto
...

Ajoutez ensuite une règle à UDEV afin qu'il attribue ttyS0 (si c'est bien le port sur lequel est l'onduleur) au groupe nut:

# $editor /etc/udev/rules.d/99_nut-serialups.rules
KERNEL=="ttyS0", GROUP="nut"

Rafraichissez UDEV

udevadm trigger
udevadm control --reload-rules

Changez manuellement le groupe de ttyS0 (ce sera automatique au prochain demarrage):

chgrp nut /dev/ttyS0

Démarrez upsdrvctl afin de vérifier que votre configuration (dans ups.conf) est la bonne:

upsdrvctl start
Network UPS Tools - UPS driver controller 2.6.3
Network UPS Tools - Megatec/Q1 protocol USB driver 0.04 (2.6.3)
Supported UPS detected with mustek protocol
Vendor information unavailable
Battery runtime will not be calculated (runtimecal not set)

Configurez nut.conf

# $editor /etc/nut/nut.conf
MODE=standalone

Configuration pour upsmon:

# $editor /etc/nut/upsd.conf
LISTEN 127.0.0.1 3493
# $editor /etc/nut/upsd.users
[admin]
    password = motdepasse
    allowfrom = localhost
    upsmon master
    actions = SET
    instcmds = ALL

Configuration des alertes et actions

# $editor /etc/nut/upsmon.conf
# Network UPS Tools: example upsmon configuration
#
# This file contains passwords, so keep it secure.

MONITOR apc@localhost 1 admin motdepasse master
SHUTDOWNCMD "/sbin/shutdown -h now"
HOSTSYNC 15
POWERDOWNFLAG /etc/nut/killpower
FINALDELAY 5
NOTIFYCMD /sbin/upssched
NOTIFYMSG ONBATT "%s is on battery"
NOTIFYMSG ONLINE "%s is back online"
NOTIFYMSG LOWBATT "%s has a low battery!"
NOTIFYMSG SHUTDOWN "System is being shutdown!"

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

Configurons l'arrêt:

# $editor /etc/nut/upssched.conf
LOCKFN /var/lib/nut/upssched.lock
PIPEFN /var/lib/nut/upssched.pipe
CMDSCRIPT /bin/upssched-cmd
AT ONBATT * START-TIMER onbatt1 13
AT ONLINE * CANCEL-TIMER onbatt1
#AT ONBATT * START-TIMER earlyshutdown 30
#AT ONLINE * CANCEL-TIMER earlyshutdown
AT ONBATT * START-TIMER onbattwarn 30
AT ONLINE * CANCEL-TIMER onbattwarn

Le point important est de vérifier sur votre système si la fichier upssched-cmd existe et s'il se trouve à l'endroit que vous avez indiqué dans upssched.conf S'il n'existe pas:

touch /bin/upssched-cmd
chmod +x /bin/upssched-cmd

Préparez le démarrage automatique de upsd et upsmon (selon votre branche - Stable, Testing ou Unstable - il peut y avoir des variations dans les noms des scripts dans init.d)

# update-rc.d ups-monitor defaults
 Adding system startup for /etc/init.d/ups-monitor ...
   /etc/rc0.d/K20ups-monitor -> ../init.d/ups-monitor
   /etc/rc1.d/K20ups-monitor -> ../init.d/ups-monitor
   /etc/rc6.d/K20ups-monitor -> ../init.d/ups-monitor
   /etc/rc2.d/S20ups-monitor -> ../init.d/ups-monitor
   /etc/rc3.d/S20ups-monitor -> ../init.d/ups-monitor
   /etc/rc4.d/S20ups-monitor -> ../init.d/ups-monitor
   /etc/rc5.d/S20ups-monitor -> ../init.d/ups-monitor

Tests

Éteignez la machine, branchez l'onduleur et redémarrez:

/etc/init.d/ups-monitor restart && tail -f /var/log/syslog
 * Restarting Network UPS Tools                                                                                                                                           [ OK ] 
Dec  5 12:00:19 laurent upsd[2404]: ACL in upsd.conf is no longer supported - switch to LISTEN
Dec  5 12:00:19 laurent upsd[2404]: ACCEPT in upsd.conf is no longer supported - switch to LISTEN
Dec  5 12:00:19 laurent upsd[2404]: REJECT in upsd.conf is no longer supported - switch to LISTEN
Dec  5 12:00:19 laurent upsd[2404]: listening on 127.0.0.1 port 3493
Dec  5 12:00:19 laurent upsd[2404]: listening on ::1 port 3493
Dec  5 12:00:19 laurent upsd[2404]: Connected to UPS [apc]: blazer_usb-apc
Dec  5 12:00:19 laurent upsd[2404]: allowfrom in upsd.users is no longer used
Dec  5 12:00:19 laurent upsd[2405]: Startup successful
Dec  5 12:00:19 laurent upsmon[2407]: Startup successful
Dec  5 12:00:19 laurent upsd[2405]: User admin@127.0.0.1 logged into UPS [apc]
# /etc/init.d/ups-monitor status
Checking status of Network UPS Tools
 * upsd is running
 * upsmon is running
# upsc -l
apc

Vérification de l'état complet:

# /bin/upsc apc@localhost
battery.voltage: 13.10
battery.voltage.nominal: 12.0
beeper.status: enabled
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyS0
driver.version: 2.6.3
driver.version.internal: 0.04
input.current.nominal: 3.0
input.frequency: 49.6
input.frequency.nominal: 50
input.voltage: 232.8
input.voltage.fault: 232.8
input.voltage.nominal: 230
output.voltage: 234.9
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 9
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665

S'il manque la charge (comme c'est le cas ci-dessus, il faut préciser le minima et maxima du voltage de la batterie dans le fichier ups.conf:

[apc]
       driver = blazer_usb
       port = /dev/ttyS0
       default.battery.voltage.high = 14
       default.battery.voltage.low = 11
# /bin/upsc apc@localhost
battery.charge: 77
battery.voltage: 13.30
battery.voltage.high: 14
battery.voltage.low: 11
battery.voltage.nominal: 12.0
beeper.status: enabled
device.type: ups
driver.name: blazer_usb
driver.parameter.pollinterval: 2
driver.parameter.port: /dev/ttyS0
driver.version: 2.6.3
driver.version.internal: 0.04
input.current.nominal: 3.0
input.frequency: 49.6
input.frequency.nominal: 50
input.voltage: 237.0
input.voltage.fault: 234.9
input.voltage.nominal: 230
output.voltage: 234.9
ups.delay.shutdown: 30
ups.delay.start: 180
ups.load: 8
ups.productid: 5161
ups.status: OL
ups.type: offline / line interactive
ups.vendorid: 0665

Vérifions si la commande d'arrêt fonctionne (Attention cela va arrếter la machine immédiatement...)

# /sbin/upsmon -c fsd

Vérifions si le "timer" fonctionne (débranchez le cable d'alimentation de l'onduleur - Rebranchez le quand l'alerte est passé dans les logs):

# tail -f /var/log/daemon.log | grep upssched
Dec  5 15:23:33 sidlol upssched[28374]: Timer daemon started
Dec  5 15:23:33 sidlol upssched[28374]: New timer: earlyshutdown (120 seconds)
...
Dec  5 15:25:18 sidlol upssched[28374]: Cancelling timer: earlyshutdown
Dec  5 15:25:31 sidlol upssched[28374]: Timer queue empty, exiting

Et observons les messages (broadcast) dans une console:

Diffusion de message de nut@laurent
        (somewhere) at 15:25 ...

UPS apc@localhost on battery


Modifions le script-exemple (upssched-cmd) pour qu'il envoie la commande d’arrêt sur l'évènement onbattwarn:

#! /bin/sh
#
# This script should be called by upssched via the CMDSCRIPT directive.
# 
# Here is a quick example to show how to handle a bunch of possible
# timer names with the help of the case structure.
#
# This script may be replaced with another program without harm.
#
# The first argument passed to your CMDSCRIPT is the name of the timer
# from your AT lines.

case $1 in
        upsgone)
                logger -t upssched-cmd "The UPS has been gone for a while"
                ;;
        onbattwarn)
                logger -t upssched-cmd "Shutting down using: upsmon -c fsd"
                upsmon -c fsd
                ;;
        *)
                logger -t upssched-cmd "Unrecognized command: $1"
                ;;
esac

Vous pouvez bien sur lancer la commande (ou le script) que vous souhaitez, envoyer un mail ou un message d'alerte par ejabberd, stopper un programme, etc.

Exemple: Lancer le script /usr/local/bin/stoptout.sh avant d'éteindre votre machine:

ARRET="/usr/local/bin/stoptout.sh"
case $1 in
        upsgone)
                logger -t upssched-cmd "Systeme sur onduleur";;
        onbat30)
                logger -t upssched-cmd "Lancement script"
                $ARRET;;
        onbat60)
                logger -t upssched-cmd "Arret systeme avec: upsmon -c fsd"
                upsmon -c fsd;;
        *)
                logger -t upssched-cmd "Unrecognized command: $1";;
esac

Et bien sur, testez!

# tail -f /var/log/syslog
...
Dec  6 07:34:44 sidlol upsmon[3968]: apc@localhost is on battery
Dec  6 07:34:44 sidlol upssched[16976]: Timer daemon started
Dec  6 07:34:44 sidlol upssched[16976]: New timer: onbatt1 (13 seconds)
Dec  6 07:34:44 sidlol upssched[16976]: New timer: onbattwarn (120 seconds)
...
Dec  6 07:36:44 sidlol upssched[16976]: Event: onbattwarn
Dec  6 07:36:44 sidlol upssched-cmd: Shutting down using: upsmon -c fsd
Dec  6 07:36:44 sidlol upsmon[3968]: Signal 10: User requested FSD
Dec  6 07:36:44 sidlol upsd[3890]: Client admin@127.0.0.1 set FSD on UPS [apc]
Dec  6 07:36:44 sidlol upsmon[3968]: Executing automatic power-fail shutdown
Dec  6 07:36:44 sidlol upsmon[3968]: System is being shutdown!

Surveiller l'onduleur par le réseau

Vous avez deux (ou plus) machines connectées à votre ondueleur ? Vous pouvez utiliser NUT pour surveiller (via le réseau) l'onduleur sur celles-ci:

Sur le serveur (la machine connectée à l'onduleur qui va surveiller celui-ci) modifiez les fichiers suivants:

# $editor /etc/nut/upsd.conf
LISTEN 10.10.10.101 3493
# $editor /etc/nut/upsd.users
[slave]
        password = motdepasse
        allowfrom = slaves
        upsmon slave

Sur le client:

# $editor /etc/nut/upsmon.conf
MONITOR apc@10.10.10.101 1 slave motdepasse slave
SHUTDOWNCMD "/sbin/shutdown -h +0"
HOSTSYNC 15
POWERDOWNFLAG /etc/killpower
FINALDELAY 5
NOTIFYCMD /sbin/upssched
NOTIFYMSG ONBATT "%s is on battery"
NOTIFYMSG ONLINE "%s is back online"
NOTIFYMSG LOWBATT "%s has a low battery!"
NOTIFYMSG SHUTDOWN "System is being shutdown!"

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

Relancez ups-monitor (ou nut-client et nut-server) sur le serveur et sur le client. Votre client est prêt à recevoir les alertes du serveur et s'éteindre si nécessaire.

nut-cgi: Surveillance Web de votre onduleur dans un navigateur

#apt-get install nut-cgi
...
Les paquets supplémentaires suivants seront installés : 
  apache2 apache2-mpm-worker apache2-utils apache2.2-bin apache2.2-common libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap

Les dépendances sont importantes (Apache2). Si vous ne souhaitez pas installer Apache, préférez NUT-monitor

# $editor /etc/nut/hosts.conf
MONITOR apc@localhost "Local Prolink"
# $editor /etc/apache2/sites-available/apache-nut.conf
ScriptAlias /nut /usr/lib/cgi-bin/nut
<Directory /usr/lib/cgi-bin/nut>
       Deny from all
       Allow from 127.0.0.1 10.10.10.0
       AllowOverride None
       Options ExecCGI
</Directory>
# a2ensite apache-nut.conf && service apache2 restart
Enabling site apache-nut.conf.
To activate the new configuration, you need to run:
  service apache2 reload
 [ ok ] Restarting web server: apache2 ... waiting .

Vous devriez déjà avoir accès à la page Web de monitoring de nut:

Mais pas à la page de configuration...

Pour cela il faudra un peu de sécurité, sans quoi vous ne pourrez pas y accéder!

# $editor /usr/lib/cgi-bin/nut/.htaccess
<Files upsset.cgi>
       deny from all
       allow from localhost
</Files>
# $editor /etc/nut/upsset.conf
...

I_HAVE_SECURED_MY_CGI_DIRECTORY

nut-monitor: Surveillance Web de votre onduleur via un GUI

# apt-get install nut-monitor
...
Les paquets supplémentaires suivants seront installés : 
  python-nut

Sources

(en) Site officiel NUT - Network UPS Tools