Surveillance onduleur avec NUT (Network UPS Tools) (FreeBSD)

cooper

Chevalier Jedi
Membre Confirmé
28 Octobre 2022
179
50
78
48
Ile-De-France
Professionnel
Non
Hello all,

Petit tutoriel sur l'installation et la configuration de nut permettant de gérer et surveiller un onduleur (ici un Eaton 3S 850), ayant le bon goût d'utiliser un BSD pour son Nas (ici FreeBSD) 😜

1. Installation​

Installer nut depuis les paquets :
Bash:
pkg install nut

On vérifie que l'onduleur est connecté et vu par le système :
Bash:
sudo dmesg | grep ugen
ugen0.1: <Intel XHCI root HUB> at usbus0
ugen0.2: <American Megatrends Inc. Virtual Hub> at usbus0
ugen0.3: <American Megatrends Inc. Virtual Ethernet> at usbus0
ugen0.4: <American Megatrends Inc. Virtual Keyboard and Mouse> at usbus0
ugen0.5: <EATON Eaton 3S> at usbus0

On s'assure que nut voit et trouve l'onduleur ainsi que le pilote utilisé :
Bash:
sudo nut-scanner -U
Scanning USB bus.
[nutdev-usb1]
    driver = "usbhid-ups"
    port = "auto"
    vendorid = "0463"
    productid = "FFFF"
    product = "Eaton 3S"
    serial = "Blank"
    vendor = "EATON"
    # bus = "000"
    # device = "005"
    # busport = "006"

Si l'onduleur n'est pas trouvé, vérifier la liste des onduleurs supportés :
  1. Dans /usr/local/etc/nut/driver.list
  2. En se rendant à https://networkupstools.org/stable-hcl.html



2. Choisir le mode de fonctionnement​

Éditer /usr/local/etc/nut/nut.conf :
Code:
MODE=standalone

NB. Le mode standalone = la machine gère directement l’onduleur local.



3. Déclaration de l’onduleur​

Dans /usr/local/etc/nut/ups.conf :
Code:
[eaton3s]
driver = usbhid-ups
port = auto
desc = "Eaton 3S USB"

On définit sur quelle(s) interface(s) et port nut va écouter.
Dans /usr/local/etc/nut/upsd.conf :
Code:
LISTEN 127.0.0.1 3493
LISTEN ::1 3493

Tester la détection :
Bash:
upsc eaton3s@localhost

NB. Les informations comme l’état (OL = On Line, OB = On Battery), le niveau de batterie, etc. s'affichent.

Afficher le statut de l'onduleur :
Bash:
upsc eaton3s@localhost ups.status

Résultats de la sortie :
  • Résultat attendu : OL (On Line).
  • Débrancher la prise secteur de l’onduleur → passe à OB (On Battery).



4. Définir les utilisateurs NUT​

Dans /usr/local/etc/nut/upsd.users :
Code:
[nut-admin]
password = nutpass
actions = SET
instcmds = ALL
upsmon primary

NB. Remplacer nutpass par le mot de passe de son choix.



5. Configuration du démon de surveillance​

Dans /usr/local/etc/nut/upsmon.conf :
Code:
MONITOR eaton3s@localhost 1 nut-admin nutpass primary
SHUTDOWNCMD "logger -t upsmon.conf \"SHUTDOWNCMD calling /sbin/shutdown to shut down system\" ; /sbin/shutdown -h now"
POWERDOWNFLAG /var/db/nut/killpower
NOTIFYMSG ONLINE "UPS %s: On line power."
NOTIFYMSG ONBATT "UPS %s: On battery."
NOTIFYMSG LOWBATT "UPS %s: Battery is low."
NOTIFYMSG REPLBATT "UPS %s: Battery needs to be replaced."
NOTIFYMSG FSD "UPS %s: Forced shutdown in progress."
NOTIFYMSG SHUTDOWN "Auto logout and shutdown proceeding."
NOTIFYMSG COMMOK "UPS %s: Communications (re-)established."
NOTIFYMSG COMMBAD "UPS %s: Communications lost."
NOTIFYMSG NOCOMM "UPS %s: Not available."
NOTIFYMSG NOPARENT "upsmon parent dead, shutdown impossible."
NOTIFYCMD /opt/local/bin/nut-notify.sh
NOTIFYFLAG ONLINE SYSLOG+EXEC
NOTIFYFLAG ONBATT SYSLOG+EXEC
NOTIFYFLAG LOWBATT SYSLOG+EXEC
NOTIFYFLAG REPLBATT SYSLOG+EXEC
NOTIFYFLAG FSD SYSLOG
NOTIFYFLAG SHUTDOWN SYSLOG+EXEC
NOTIFYFLAG COMMOK SYSLOG+EXEC
NOTIFYFLAG COMMBAD SYSLOG+EXEC
NOTIFYFLAG NOCOMM SYSLOG+EXEC
NOTIFYFLAG NOPARENT SYSLOG+EXEC
NOTIFYFLAG CAL SYSLOG+EXEC
NOTIFYFLAG NOTCAL SYSLOG+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5

NB. Ces lignes disent à upsmon quoi faire quand l’onduleur change d’état (logs, mails, arrêt, etc.).



6. Script de notification​

Créer /opt/local/bin/nut-notify.sh :
Bash:
#!/bin/sh
#
# Script de notification NUT
# Paramètres passés par upsmon :
# $1 = UPS@host (ex: eaton3s@localhost)
# $2 = événement (ex: ONBATT, ONLINE, etc.)
#

UPS="$1"
EVENT="$2"
LOGTAG="nut-notify"
EMAIL="user@example.net"
HOSTNAME=`hostname`

case $EVENT in
    ONBATT)
        logger -t "$LOGTAG" "ALERTE: $UPS est sur batterie"
        echo "UPS $UPS est sur batterie !" \
            | mail -s "ALERTE UPS: $HOSTNAME sur batterie" $EMAIL
        ;;
    ONLINE)
        logger -t "$LOGTAG" "INFO: $UPS est de retour sur secteur"
        echo "UPS $UPS est de retour sur secteur." \
            | mail -s "INFO UPS: Secteur rétabli pour $HOSTNAME" $EMAIL
        ;;
    LOWBATT)
        logger -t "$LOGTAG" "ALERTE UPS: Batterie faible sur $UPS."
        echo "UPS $UPS a sa batterie faible" \
            | mail -s "ALERTE UPS: Batterie faible pour $HOSTNAME" $EMAIL
        ;;
    REPLBATT)
        logger -t "$LOGTAG" "ALERTE UPS: Remplacer la batterie de $UPS."
        echo "UPS Remplacer la batterie de $UPS" \
            | mail -s "ALERTE UPS: Remplacer la batterie pour $HOSTNAME" $EMAIL
        ;;
    SHUTDOWN)
        logger -t "$LOGTAG" "ALERTE UPS: Batterie $UPS presque épuisée. Extinction système."
        echo "UPS Batterie $UPS presque épuisée. Extinction système." \
            | mail -s "ALERTE UPS: Batterie presque épuisée. Extinction du système $HOSTNAME" $EMAIL
        ;;
    *)
        MSG="EVENEMENT: $UPS -> $EVENT sur $HOSTNAME"
        logger -t "$LOGTAG" "$MSG"
        echo "$MSG" | mail -s "INFO UPS: $UPS -> $EVENT sur $HOSTNAME" $EMAIL
         ;;
esac

exit 0

Changer le propriétaire et groupe du script shell et le rendre exécutable :
Bash:
chown root:nut /opt/local/bin/nut-notify.sh
chmod 750 /opt/local/bin/nut-notify.sh



7. Activation des services​

Ajouter dans /etc/rc.conf :
Code:
nut_enable="YES"
nut_upsmon_enable="YES"
nut_upslog_enable="YES"
nut_upslog_ups="eaton3s@localhost"

Puis démarrer le daemon nut, le service d'historique upslog et le moniteur de l'ups upsmon:
Bash:
service nut start
service nut_upslog start
service nut_upsmon start



8. Vérification et tests​

Communication :​

Bash:
upsc eaton3s@localhost

Simulation d’événement :
Bash:
/opt/local/bin/nut-notify.sh eaton3s@localhost ONBATT

Simulation de coupure critique :
Bash:
upsmon -c fsd

NB. Cela doit déclencher le SHUTDOWNCMD (arrêt de la machine proprement).




9. Chronologie des évènements​

  • L’UPS est détecté (upsc renvoie des valeurs).
  • Les événements s’affichent dans /var/log/messages.
  • Les mails d’alerte arrivent.
  • Le système s’arrête proprement quand la batterie est basse (écriture du fichier d'extinction /var/db/nut/killpower contrôlant l'arrêt propre du système)



En résumé rapide

Elément​
Emplacement​
Commande​
Choix du mode de fonctionnement de nut/usr/local/etc/nut/nut.conf
Déclaration de l'onduleur connecté à la machine/usr/local/etc/nut/ups.confupsc eaton3s@localhost
Configuration du démon et interfaces d'écoute/usr/local/etc/nut/upsd.conf
Utilisateurs gérant nut/usr/local/etc/nut/upsd.users
Configuration du démon de surveillance/usr/local/etc/nut/upsmon.conf
Script de surveillance et envoi d'alertes/opt/local/bin/nut-notify.shnut-notify.sh (inclure dans $PATH /opt/local/bin)
Communication avec l'upsupsc eaton3s@localhost
Simulation d'évènementnut-notify.sh eaton3s@localhost ONBATT
Simulation de coupure critiqueupsmon -c fsd
Ficher d'extinction du système produit par nut/var/db/nut/killpower
Liste des onduleurs et pilotes gérés par nut/usr/local/etc/nut/driver.list



Commandes utilisées

Commande​
Rôle​
Emplacement​
Manuel​
pkgGestionnaire de paquets/usr/sbin/pkghttps://man.freebsd.org/cgi/man.cgi?pkg
serviceGestion des services/usr/sbin/servicehttps://man.freebsd.org/cgi/man.cgi?service
dmesgMessages du kernel/sbin/dmesghttps://man.freebsd.org/cgi/man.cgi?dmesg
grepFiltre de recherches/bin/grephttps://man.freebsd.org/cgi/man.cgi?grep
shShell/bin/shhttps://man.freebsd.org/cgi/man.cgi?sh
upscClient nut/usr/local/bin/upschttps://man.freebsd.org/cgi/man.cgi?upsc
upsdDémon nut/usr/local/sbin/upsdhttps://man.freebsd.org/cgi/man.cgi?upsd
upslogEcriture des historiques de nut/usr/local/bin/upsloghttps://man.freebsd.org/cgi/man.cgi?upslog
upsmonMoniteur/contrôleur d'actions de nut/urs/local/sbin/upsmonhttps://man.freebsd.org/cgi/man.cgi?upsmon
nut-scannerAffichage des onduleurs vus par nut/usr/local/bin/nut-scannerhttps://man.freebsd.org/cgi/man.cgi?nut-scanner