Table des matières
APC Back-UPS et NUT
Fonctionne aussi avec un MGE Ellipse 1000
, et surement beaucoup d'autres !
Et oui, un standard existe pour communiquer avec les onduleurs
~~READMORE~~
USB
Brancher
# dmesg ... [26752.706766] usb 5-1.2: new low-speed USB device number 3 using ehci_hcd [26752.847648] usb 5-1.2: New USB device found, idVendor=051d, idProduct=0002 [26752.847653] usb 5-1.2: New USB device strings: Mfr=3, Product=1, SerialNumber=2 [26752.847656] usb 5-1.2: Product: Back-UPS CS 500 FW:808.q10 .I USB FW:q10 [26752.847658] usb 5-1.2: Manufacturer: American Power Conversion [26752.847661] usb 5-1.2: SerialNumber: XXXXXXXXXXX [26753.235213] generic-usb 0003:051D:0002.0004: hiddev0,hidraw3: USB HID v1.10 Device [American Power Conversion Back-UPS CS 500 FW:808.q10 .I USB FW:q10 ] on usb-0000:00:1a.0-1.2/input0
# lsusb ... Bus 005 Device 003: ID 051d:0002 American Power Conversion Uninterruptible Power Supply ...
Autre exemple avec un “MGE Ellipse 1000” :
[514899.446409] usb 1-2: new low-speed USB device number 3 using xhci_hcd
[514899.988925] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514900.154186] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514900.223771] xhci_hcd 0000:00:14.0: WARN: transfer error on endpoint [514900.223998] usb 1-2: New USB device found, idVendor=0463, idProduct=ffff [514900.224001] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=4 [514900.224004] usb 1-2: Product: ELLIPSE [514900.224147] usb 1-2: ep 0x81 - rounding interval to 128 microframes, ep desc says 160 microframes [514900.224241] xhci_hcd 0000:00:14.0: WARN: transfer error on endpoint [514900.224251] usb 1-2: can't set config #1, error -71 [514900.224294] usb 1-2: USB disconnect, device number 3 [514900.224442] xhci_hcd 0000:00:14.0: Slot 2 endpoint 2 not removed from BW list! [514900.523966] usb 1-2: new low-speed USB device number 4 using xhci_hcd [514901.068419] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514901.234358] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514901.508793] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514901.709663] xhci_hcd 0000:00:14.0: WARN: short transfer on control ep [514901.709929] usb 1-2: New USB device found, idVendor=0463, idProduct=ffff [514901.709933] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=4 [514901.709936] usb 1-2: Product: ELLIPSE [514901.709938] usb 1-2: Manufacturer: MGE UPS SYSTEMS [514901.709941] usb 1-2: SerialNumber: XXXXXXXX [514901.710106] usb 1-2: ep 0x81 - rounding interval to 128 microframes, ep desc says 160 microframes [514905.209178] generic-usb 0003:0463:FFFF.0004: hiddev0,hidraw3: USB HID v1.00 Device [MGE UPS SYSTEMS ELLIPSE] on usb-0000:00:14.0-2/input0 ...
$ lsusb ... Bus 001 Device 004: ID 0463:ffff MGE UPS Systems UPS ...
Nut
installer
# aptitude install nut
start
Quelques tests simple pour commencer…
Editer /etc/nut/ups.conf
afin d'avoir:
[myups] driver = usbhid-ups port = auto desc = "APC Back-UPS CS 500"
Test:
# 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 [051d:0002]: could not detach kernel driver from interface 0: Operation not permitted Driver failed to start (exit status=1)
Oups!? Problème de droit sans doute. Mais quoi ? Une idée de là: http://forum.excito.net/viewtopic.php?f=9&t=2748&sid=a81b3646bdbe7af70746c44bb77b01f7&start=15
Alors refaire un test en ajoutant une modif dans /etc/nut/ups.conf
:
user=root [myups] driver = usbhid-ups port = auto desc = "APC Back-UPS 500 CS"
Re-test:
# 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 Using subdriver: APC HID 0.95
Ok. Mais on ne va pas laisser root
# upsdrvctl stop
Donc, modifier la conf udef…
En fait: il suffit de debrancher et rebrancher le cable USB |
En effet, “nut” vient avec sa propre conf pour udev
qui est là dedans:
/lib/udev/rules.d/52-nut-usbups.rules
Mais si vous avez brancher le cable USB *avant* d'installer nut
, alors les droits sur le périphérique USB ne sont pas attribué à nut
.
D'où l'erreur.
Donc bref:
# 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 Using subdriver: APC HID 0.95
Ça marche.
upscmd et upsc
Pour que l'on puisse monitorer l'etat de l'onduleur, il faut un dameon “nut” qui fonctionne avec les bons droits.
Alors, dans /etc/nut/upsd.conf
, ajouter:
LISTEN 127.0.0.1
Dans /etc/nut/upsd.users
, ajouter:
[user] password = secret actions = SET instcmds = ALL upsmon master
Où “secret” est un mot de passe secret!
Dans /etc/nut/nut.conf
, modifier pour avoir:
MODE=standalone
Demarrer le daemon:
# /etc/init.d/nut start
On peut maintenant interroger le bouzin:
# upscmd -l myups Instant commands supported on UPS [myups]: beeper.disable - Disable the UPS beeper beeper.enable - Enable the UPS beeper beeper.mute - Temporarily mute the UPS beeper beeper.off - Obsolete (use beeper.disable or beeper.mute) beeper.on - Obsolete (use beeper.enable) load.off - Turn off the load immediately load.off.delay - Turn off the load with a delay (seconds) shutdown.reboot - Shut down the load briefly while rebooting the UPS shutdown.stop - Stop a shutdown in progress test.battery.start.deep - Start a deep battery test test.battery.start.quick - Start a quick battery test test.battery.stop - Stop the battery test test.panel.start - Start testing the UPS panel test.panel.stop - Stop a UPS panel test
On peut avoir une idée de la charge actuelle:
# upsc myups battery.charge 100
Où une vue d'ensemble:
# upsc myups battery.charge: 100 battery.charge.low: 10 battery.charge.warning: 50 battery.date: 2012/02/14 battery.mfr.date: 2012/02/14 battery.runtime: 3765 battery.runtime.low: 120 battery.temperature: 29.2 battery.type: PbAc battery.voltage: 13.5 battery.voltage.nominal: 12.0 device.mfr: American Power Conversion device.model: Back-UPS CS 500 device.serial: XXXXXXXXXXXXXX device.type: ups driver.name: usbhid-ups driver.parameter.pollfreq: 30 driver.parameter.pollinterval: 2 driver.parameter.port: auto driver.version: 2.4.3 driver.version.data: APC HID 0.95 driver.version.internal: 0.34 input.sensitivity: medium input.transfer.reason: input voltage out of range input.voltage: 228.0 input.voltage.nominal: 230 output.voltage: 230.0 output.voltage.nominal: 230.0 ups.beeper.status: enabled ups.delay.shutdown: 20 ups.firmware: 808.q10 .I ups.firmware.aux: q10 ups.load: 0.0 ups.mfr: American Power Conversion ups.mfr.date: 2012/02/14 ups.model: Back-UPS CS 500 ups.productid: 0002 ups.serial: XXXXXXXXXXXXX ups.status: OL ups.test.result: No test initiated ups.timer.reboot: 0 ups.timer.shutdown: -1 ups.vendorid: 051d
upsmon
Pour finir, il faut un daemon qui monitor l'état de l'onduleur, et effectue une action (“shutdown”) selon l'etat de l'onduleur.
Pour faire simple, il suffit d'ajouter la ligne suivante dans /etc/nut/upsmon.conf
:
MONITOR myups@localhost 1 user secret master
# /etc/init.d/nut restart
# /etc/init.d/nut status Checking status of Network UPS Tools upsd is running. upsmon is running.
Et voila. Si le courant coupe et que la charge descend en dessous d'un certain seuil, la commande “shutdown” est executé.
killpower
Note: pour tester un situation d'arrêt, taper la commande: upsmon -c fsd
En théorie, l'ideal serait d'eteindre l'onduleur et aussi le PC dessus:
Au retour du courant, l'ensemble ce remet en service.
Pour cela, il faut :
- soit eteindre l'onduleur.
- soit ne pas eteindre le PC !
Comment ça devrait ce passer :
- upsmon detecte un seuil critique : il ordonne l'arret au systeme.
- les scriptes system prennent le controle pour tout arreter
- dans le script
/etc/init.d/halt
, on appelle le scripte/etc/init.d/ups-monitor poweroff
- dans
ups-monitor
, on va éteindre l'onduleur ! - et attendre…
- et finalement rendre la main à
/etc/init.d/halt
qui poursuit l'arret.
En fait, l'onduleur n'est *jamais* éteind.
La commande /sbin/upsdrvctl shutdown
est pourtant executé pour cela.
Mais, je pense, que la gestion de l'USB étant down , plus aucun message ne peut remonter jusqu'à l'onduleur.
Est-ce un mal ?
Non. Parce qu'un test m'a montré que lorsqu'on éteind l'onduleur “APC Back-UPS CS 500” , et bien : il s'eteind, et il le reste.
Alors quel intérêt ?
solution 1
Il est alors préférable d'ignorer cette absence d'extinction, mais d'ajouter dans le fichier /etc/nut/nut.conf
, ceci:
POWEROFF_WAIT=1800
Ce qui veut dire: Attendre 1800 secondes (30 minutes!) .
Dans ces 30 minutes, que va t'il se passer ?
L'onduleur va s'eteindre … ou pas ?
S'il ne s'eteind pas, la procédure d'arret va se poursuivre, et le PC sera arreté !
Donc: mauvaise solution.
en fait, je me suis trompé (? ou pas?) mais le scripte reboot le PC au lieu de l'eteindre: mais j'ai un sérieux doute. |
solution 2
Re-ecrire simplement la fonction “halt” de /etc/init.d/halt
:
Pour cela, rien de trés compliqué, il suffit de modifier /etc/default/halt
comme ceci:
# Default behaviour of shutdown -h / halt. Set to "halt" or "poweroff". HALT=poweroff # TJ ------- halt() { if [ -f /etc/killpower ]; then /bin/echo "Kill Power... sleep..." /bin/sleep 1800 /sbin/reboot $@ else /sbin/halt $@ fi } # ----------
En fait, ça fait le job comme cela:
- si le fichier “killpower” existe, alors on est en phase d'arret critique
- Alors attendre 30 minutes
- Aprés ce lapse de temps: rebooter.
Voila.
client nut
Pour installer un client nut, il faut d'abord préparer le serveur (le “master”) .
master
Sur le “master” , ajouter un compte “user” dans /etc/nut/upsd.users
, par exemple:
[nutslave] password = smallsecret upsmon slave
Si besoin, toujours sur le “master”, ouvrir les connexions sur l'ensemble des reseaux:
Donc, modifier /etc/nut/upsd.conf
pour avoir, par exemple:
LISTEN 0.0.0.0
Voir les “ACL” a la fin. |
# /etc/init.d/nut restart
client
ou “slave”.
Sur le client, installer nut:
# aptitude install nut
Modifier /etc/nut/nut.conf
pour avoir :
MODE=netclient
Puis, editer /etc/nut/upsmon.conf
avec par exemple:
MONITOR myups@<IP_DU_MAITRE> 1 nutslave smallsecret slave
Et enfin:
# /etc/init.d/nut restart
Voila: le “slave” se connecte au “master” .
ACL
Il n'y a plus d'ACL et la doc de NUT est toujours aussi mal foutu et ne dit pas plus que:
Si nut est compilé avec libwrapper , alors il faut utiliser les fichier /etc/hosts.allow
et /etc/hosts.deny
.
Ensuite, la doc de nut est inexploitable. lol
Vérifions:
# ldd `which upsd` | grep libwrap libwrap.so.0 => /lib/libwrap.so.0 (0x00007fdcd5631000)
Donc, aprés maintes recherche et des tests etranges:
On autorise les “user” (déclaré dans userd.conf
) comme ceci:
Dans /etc/hosts.allow
:
upsd : user@reseau , user@reseau2, etc... : ALLOW
Dans /etc/hosts.deny
, mettre simplement:
upsd : ALL : DENY
J'ai un peu de mal a comprendre ce qui fonctionne ou pas….
Concrètement, dans /etc/hosts.allow
, on peut avoir:
upsd: user@127.0.0.0/8 , user@10.10.10.0/24 : ALLOW upsd: nutslave@10.10.10.10/32 : ALLOW
Et ensuite, redemarrer nut
(à la louze!!!!!!!!!!) :
# /etc/init.d/nut restart
Et ensuite, vérifier bien dans les logs que les connexions s'etablissent…
Toutefois, impossible (sauf iptables
) de bloquer l'usage de la commande upsc