ReLoad

Thierry Jaouen ~ WikiBlog
"Rien à foutre d'être lu, tant que je peux me relire."

Outils pour utilisateurs

Outils du site


blog:2012:09:07:apc_et_autres_avec_nut

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.

:!: FIXME 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

blog/2012/09/07/apc_et_autres_avec_nut.txt · Dernière modification : 2012/09/25 13:03 de thierry