Linux et onduleur

A la faveur d’une coupure de courant je me suis rendu compte que les batteries de mon onduleur speex pp210 étaient nazes.


du coup mon serveur Poweredge T310 est tombé brutalement, heureusement sans conséquence facheuse. Ni une ni deux, j’ai commandé deux batteries en remplacement et j’ai configuré NUT comprendre Network UPS Tools sur mon serveur. J’ai d’abord essayé le package par défaut de ma mageia mais rien ne marchait finalement j’ai installé les tarballs de NUT avec la version 2.7.4 que j’ai compilé avec les options suivantes:

./configure --with-cgi --with-cgipath=/usr/local/apache2/cgi-bin --prefix=/usr/local --with-statepath=/var/state/ups --with-user=ups --with-group=ups --with-pidpath=/var/run/nut

voilà ce que ça donne avant de lancer la compilation

Configuration summary:
======================
build serial drivers: yes
build USB drivers: yes
build SNMP drivers: no
build neon based XML driver: no
enable Avahi support: no
build Powerman PDU client driver: no
build IPMI driver: no
build Mac OS X meta-driver: no
build i2c based drivers: no
enable SSL support: yes (OpenSSL)
enable libwrap (tcp-wrappers) support: yes
enable libltdl (Libtool dlopen abstraction) support: yes
build nut-scanner: yes
build CGI programs: yes
build and install documentation: no
build and install the development files: no

quant à mon onduleur, quand je le branche sur son port USB,

voilà ce que me remonte journalctl

mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: new low-speed USB device number 3 using ehci-pci
mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: New USB device found, idVendor=0665, idProduct=5161
mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: Product: USB to Serial
mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: Manufacturer: INNO TECH
mai 28 12:04:33 mana.kervao.fr kernel: usb 2-1.1: SerialNumber: 20100205
mai 28 12:04:33 mana.kervao.fr mtp-probe[5713]: checking bus 2, device 3: "/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1"
mai 28 12:04:33 mana.kervao.fr mtp-probe[5713]: bus: 2, device: 3 was not an MTP device
mai 28 12:04:33 mana.kervao.fr kernel: hidraw: raw HID events driver (C) Jiri Kosina
mai 28 12:04:33 mana.kervao.fr kernel: usbcore: registered new interface driver usbhid
mai 28 12:04:33 mana.kervao.fr kernel: usbhid: USB HID core driver
mai 28 12:04:33 mana.kervao.fr kernel: hid-generic 0003:0665:5161.0001: hiddev0,hidraw0: USB HID v1.00 Device [INNO TECH USB to Serial] on usb-0000:00:1d.0-1.1/input0

lsusb donne

Bus 002 Device 003: ID 0665:5161 Cypress Semiconductor USB to Serial

Le fichier spécial /dev/hidraw0 est automatiquement créé. A ce stade là j’ai créé un utilisateur et un groupe ups et je fais de donner les bons droits au fichier spécial en créant le fichier /etc/udev/rules.d/99_nut-serialups.rules qui va contenir

KERNEL=="hidraw0", GROUP="ups", MODE="0666"

maintenant on va faire en sorte que les répertoires (à créer éventuellement) /var/run/nut, /var/state/ups et /var/state/ups/upssched appartiennent à l’utilisateur ups et au groupe ups (droits 755).

On va maintenant créer les fichiers de configuration qu’on retrouve sous /usr/local/etc, on commence par ups.conf

[onduleur]
driver = blazer_usb
port = /dev/hidraw0
vendorid = 0665
productid = 5161
desc = "Sweex PP210"

A noter qu’on trouvera ici la liste des onduleurs reconnus. On passe maintenant à upsd.conf

MAXAGE 15
LISTEN 127.0.0.1 3493
MAXCONN 1024

ne pas oublier d’ouvrir le port TCP 3493 sous shorewall (ça vous évitera de perdre une heure comme moi à ne pas comprendre pourquoi la connexion était refusée). Et upsd.users

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

[upsmonitor]
password = userpass
upsmon master

nut.conf

MODE=standalone

et pour terminer upsmon.conf

RUN_AS_USER ups
MONITOR onduleur@localhost 1 upsmonitor userpass master
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h 0"
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

pour le détail des paramètres je vous invite à consulter la doc (copieuse) de NUT, à l’occasion je ferai une page sur mon site FUNIX pour synthétiser tout ça.

On peut maintenant si ça marche, on se connecte sur l’onduleur en tant que root en tapant

blazer_usb -a onduleur -D -u root

et voilà le résultat

Network UPS Tools - Megatec/Q1 protocol USB driver 0.12 (2.7.4)
0.000000 debug level is '1'
0.457449 Supported UPS detected with mustek protocol
0.649380 Vendor information read 1 failed
0.713380 Vendor information read 2 failed
0.777382 Vendor information read 3 failed
0.777401 Vendor information unavailable
0.777407 No values provided for battery high/low voltages in ups.conf

0.777426 Using 'guestimation' (low: 20.800000, high: 26.000000)!
0.777433 Battery runtime will not be calculated (runtimecal not set)

on peut essayer de se connecter en tant qu’utilisateur ups pour voir s’il n’y a pas de problème de droits en tapant

blazer_usb -a onduleur -D -u ups

une fois cette étape franchie, j’ai créé les fichiers suivants sous /usr/lib/systemd/system histoire que les daemons soient lancés automatiquement au démarrage et gérés par systemd. On commence par nut-driver.service

[Unit]
Description=Network UPS Tools - power device driver controller
After=local-fs.target network.target

[Service]
ExecStart=/usr/local/sbin/upsdrvctl start
ExecStop=/usr/local/sbin/upsdrvctl stop
Type=forking

[Install]
WantedBy=multi-user.target

nut-monitor.service

[Unit]
Description=Network UPS Tools - power device monitor and shutdown controller
After=local-fs.target network.target nut-server.service

[Service]
ExecStart=/usr/local/sbin/upsmon
Type=forking

[Install]
WantedBy=multi-user.target

et enfin nut-server.service

[Unit]
Description=Network UPS Tools - power devices information server
After=local-fs.target network.target nut-driver.service
Requires=nut-driver.service
Before=nut-monitor.service

[Service]
ExecStart=/usr/local/sbin/upsd
Type=forking

[Install]
WantedBy=multi-user.target

on veillera à activer ses nouveaux services en tapant

systemctl enable nut-driver
systemctl enable nut-monitor
systemctl enable nut-serveur

on y est presque ! On lance maintenant le premier daemon upsdrvctl qui contrôle l’interfaçage physique avec l’onduleur

systemctl enable nut-driver

et voilà la trace que nous donne journalctl

mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: Supported UPS detected with mustek protocol
mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: Vendor information unavailable
mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: No values provided for battery high/low voltages in ups.conf
mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: Using 'guestimation' (low: 20.800000, high: 26.000000)!
mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: Battery runtime will not be calculated (runtimecal not set)
mai 28 15:34:08 mana.kervao.fr blazer_usb[5799]: Startup successful
mai 28 15:34:08 mana.kervao.fr upsdrvctl[5792]: Network UPS Tools - UPS driver controller 2.7.4

on lance maintenant le deuxième daemon upds qui fait l’interface entre le daemon upsdrvctl et les clients

systemctl enable nut-server

et voilà la trace que nous donne journalctl

mai 28 17:04:02 mana.kervao.fr upsd[26712]: /var/state/ups is world readable
mai 28 17:04:02 mana.kervao.fr upsd[26712]: Connected to UPS [onduleur]: blazer_usb-onduleur
mai 28 17:04:02 mana.kervao.fr upsd[26714]: Startup successful
mai 28 17:04:02 mana.kervao.fr upsd[26712]: listening on 127.0.0.1 port 3493
mai 28 17:04:02 mana.kervao.fr upsd[26712]: /var/state/ups is world readable
mai 28 17:04:02 mana.kervao.fr upsd[26712]: Connected to UPS [onduleur]: blazer_usb-onduleur

il y a un petit mot bizarre car le répertoire /var/state/ups n’est pas à 777, on ignore donc. On lance maintenant nut-monitor qui permet d’interroger upsd pour connaître l’état de l’onduleur et surtout lancer les commandes spécifiques en fonction des évènements, en tapant

systemctl start nut-monitor

et voilà la trace que nous donne journalctl

mai 28 17:22:56 mana.kervao.fr upsmon[27356]: UPS: onduleur@localhost (master) (power value 1)
mai 28 17:22:56 mana.kervao.fr upsmon[27358]: Startup successful
mai 28 17:22:56 mana.kervao.fr upsmon[27356]: Using power down flag file /etc/killpower
mai 28 17:22:56 mana.kervao.fr upsd[26714]: User upsmonitor@127.0.0.1 logged into UPS [onduleur]

pour voir si tout fonctionne je tape simplement upsc -L qui renvoie

onduleur: Sweex PP210

maintenant on dispose d’un outil accessible via un navigateur, pour cela il faut disposer d’un serveur apache. On commence donc par déplacer les fichiers html qui sont sous /usr/local/html sous /usr/local/apache2/htdoc (ou n’importe où accessible via apache). On enlève bien sûr le sample à la fin du nom des fichiers. Le fichier /usr/local/etc/hosts.conf contiendra

MONITOR onduleur@localhost "mon onduleur"

on modifie également le fichier /usr/local/etc/upsset.conf qui contiendra

I_HAVE_SECURED_MY_CGI_DIRECTORY

on veillera à créer un fichier .htaccess sous /usr/local/apache2/cgi-bin permettant seulement aux machines du réseau local (192.168.0.X) de pouvoir accéder aux scripts CGI de NUT

<Files upsset.cgi>
deny from all
allow from 192.168.0.1/24
</Files>

dans le répertoire /usr/local/apache2/cgi-bin on trouve les scripts CGI upsimage.cgi, upsset.cgi et upsstats.cgi de de NUT. Et voilà ce que ça donne en cliquant sur Statistics

et en cliquant sur « mon onduleur »

dans Settings on a accès à certaines commandes (il faudra saisir préalablement le mot de passe admin défini sous upsd.users).

Maintenant y a plus qu’à tester ! Et c’est là que j’ai aperçu furtivement en débranchant la prise de l’onduleur le message suivant

mai 28 17:37:06 mana.kervao.fr upsmon[27359]: UPS onduleur@localhost on battery

Diffusion de message de ups@mana.kervao.fr (somewhere) (Sun May 28 17:37:06 201

sauf que mon onduleur est tombé dans la foulée ! Il faut que croire que je n’avais pas qu’un problème de batteries. Donc pour l’instant je n’ai pu valider totalement toute l’installation de NUT, il y aura sans doute un deuxième épisode après avoir investi dans un nouvel onduleur.

Laisser un commentaire