Dernière modification le 15 février 2023 à 16:21 heures
APCUPSD est un logiciel open source qui permet de monitorer et de gérer un onduleur APC (UPS) sur une machine Ubuntu. Il permet de suivre en temps réel l’état de l’onduleur, de la batterie et de l’alimentation électrique, ainsi que de mettre en place des actions en cas de panne de courant ou de faiblesse de la batterie. APCUPSD sous Ubuntu peut être configuré pour envoyer des notifications par mail en cas de changement d’état de l’onduleur, ce qui peut être particulièrement utile pour protéger les données et le matériel informatique en cas de coupure de courant imprévue.
Étapes de la mise en oeuvre
Étape 1: Connexion de l’UPS au serveur
La procédure de connexion décrite ici est celle que j’ai utilisée pour connecter mon APC Back-UPS “Essential” BE850G2-FR à mon serveur Ubuntu principal à l’aide du câble RJ45-USB fourni avec mon UPS.

- allumez l’UPS
- connectez le côté RJ45 dans le port marqué USB de l’onduleur
- connectez ensuite le côté USB dans un port USB libre de votre serveur
- dans un terminal, tapez la commande
sudo lsusb
- et vérifiez la présence d’une ligne similaire à celle-ci:
Bus 003 Device 005: ID 051d:0002 American Power Conversion Uninterruptible Power Supply
- la présence d’une telle ligne signifie que votre UPS est bien connecté à votre serveur. Si ce n’était pas le cas, vérifiez que vous utilisez bien le bon câble prévu à cet effet et référez-vous au manuel d’installation fourni avec votre UPS.
Étape 2: Installation du logiciel APCUPSD sous Ubuntu 22.04
Voici comment installer le logiciel APCUPSD sous Ubuntu 22.04 :
- Assurez-vous d’avoir branché votre UPS APC à votre ordinateur et de l’avoir allumé.
- Ouvrez un terminal et installez le paquet APCUPSD en tapant la commande suivante :
sudo apt-get install apcupsd
Étape 3: Configuration de APCUPSD
Pour une configuration standard (un UPS – un serveur) il faut adapter les valeurs suivantes dans le fichier de configuration /etc/apcupsd/apcupsd.conf
- UPSNAME pour entrer un nom d’UPS
- UPSTYPE qui par défaut devrait être usb
- DEVICE le nom du dévice de connexion
- BATTERYLEVEL le niveau de la batterie avant réaction (défaut 5%)
- MINUTES le nombre de minutes avant réaction (défaut 3)
sudo nano /etc/apcupsd/apcupsd.conf
UPSNAME monAPCups UPSTYPE usb DEVICE BATTERYLEVEL 25 MINUTES 10
- Dans le cas d’une connexion USB on peut laisser le paramètre DEVICE à blanc
- J’ai également changé le BATTERYLEVEL à 25 et les MINUTES à 10 pour anticiper la réaction de l’UPS et laisser plus de temps à APCUPSD pour accomplir différentes tâches comme par exemple, envoyer des mails.
- Il faut alors signaler au daemon que la confirmation est terminée. Pour cela il il faut éditer le fichier /etc/default/apcupsd et changer la valeur du paramètre ISCONFIGURED
sudo nano /etc/default/apcupsd ISCONFIGURED=yes
Étape 4: Lancer le daemon APCUPSD
- Une fois l’installation terminée, vous pouvez démarrer le daemon APCUPSD en tapant la commande suivante
sudo service apcupsd start
- Pour démarrer le daemon lors du boot, tapez la commande suivante :
sudo service apcupsd enable
- Pour tester le bon fonctionnement du daemon APCUPSD utiliser la commande suivantes :
sudo service apcupsd status
user@ubuntu:~$ sudo systemctl status apcupsd ● apcupsd.service - UPS power management daemon Loaded: loaded (/lib/systemd/system/apcupsd.service; enabled; vendor prese> Active: active (running) since Sat 2023-01-07 16:51:32 CET; 6min ago Docs: man:apcupsd(8) Process: 1664 ExecStartPre=/lib/apcupsd/prestart (code=exited, status=0/SUC> Process: 1691 ExecStart=/sbin/apcupsd (code=exited, status=0/SUCCESS) Main PID: 1693 (apcupsd) Tasks: 3 (limit: 76933) Memory: 1.0M CPU: 48ms CGroup: /system.slice/apcupsd.service └─1693 /sbin/apcupsd Jan 07 16:51:32 ubuntu systemd[1]: Starting UPS power management daemon... Jan 07 16:51:32 ubuntu systemd[1]: apcupsd.service: Can't open PID file /run/> Jan 07 16:51:32 ubuntu apcupsd[1693]: apcupsd 3.14.14 (31 May 2016) debian st> Jan 07 16:51:32 ubuntu apcupsd[1693]: NIS server startup succeeded Jan 07 16:51:32 ubuntu systemd[1]: Started UPS power management daemon. lines 1-18/18 (END)
- En cas de modifications ultérieures dans apcupsd.conf, n’oubliez pas de relancer le daemon.
sudo service apcupsd restart
Étape 5: Utilisation en ligne de commande
Pour avoir un aperçu de l’état actuel de votre UPS, y compris la tension de sortie, la charge et l’état de la batterie, il vous suffit de taper la commande suivante:
apcaccess status
Et voici un exemple résultat:
user@ubuntu:~$ apcaccess APC : 001,036,0877 DATE : 2023-01-07 16:52:10 +0100 HOSTNAME : ubuntu VERSION : 3.14.14 (31 May 2016) debian UPSNAME : monAPCups CABLE : USB Cable DRIVER : USB UPS Driver UPSMODE : Stand Alone STARTTIME: 2023-01-07 16:51:32 +0100 MODEL : Back-UPS ES 850G2 STATUS : ONLINE LINEV : 232.0 Volts LOADPCT : 14.0 Percent BCHARGE : 100.0 Percent TIMELEFT : 31.0 Minutes MBATTCHG : 25 Percent MINTIMEL : 10 Minutes MAXTIME : 0 Seconds SENSE : Medium LOTRANS : 180.0 Volts HITRANS : 266.0 Volts ALARMDEL : 30 Seconds BATTV : 13.6 Volts LASTXFER : Automatic or explicit self test NUMXFERS : 0 TONBATT : 0 Seconds CUMONBATT: 0 Seconds XOFFBATT : N/A SELFTEST : NO STATFLAG : 0x05000008 SERIALNO : 5B2135T21883 BATTDATE : 2021-09-05 NOMINV : 230 Volts NOMBATTV : 12.0 Volts NOMPOWER : 520 Watts FIRMWARE : 938.a2 .I USB FW:a END APC : 2023-01-07 16:52:27 +0100 user@ubuntu:~$
Voici les informations d’état les plus intéressantes :
STATUS :
indique l’alimentation.ONLINE
signifie que l’on fonctionne sur le secteur.ONBATT
signifie que l’on fonctionne sur batterie etCHARGING
indique que la batterie se recharge.LOADPCT :
indique le pourcentage de charge de l’UPS. Dans ce cas, l’UPS nous indique qu’il utilise14.0%
de sa capacité.BCHARGE : 100.0 Percent
indique l’état de charge de la batterie.TIMELEFT : 31.0 Minutes
indique une estimation du temps restant de fonctionnement en mode batterie, en tenant compte de la charge de l’UPS et de l’état de la batterie.
Étape 6: Mails de monitoring personnalisés
Dans le répertoire /etc/apcupsd/ se trouvent les fichiers batch scripts qui seront exécutés lors des différentes actions mises en œuvre par votre UPS.
. ├── apccontrol ├── apcupsd.conf ├── changeme ├── commfailure ├── commok ├── doshutdown ├── hosts.conf ├── killpower ├── multimon.conf ├── offbattery ├── onbattery └── ups-monitor
Les principaux scripts sont:
- changeme est appelé lorsqu’il est temps de changer la batterie de votre UPS
- commfailure est appelé lors de la perte de communication avec votre UPS
- commok est appelé lorsque la communication avec votre UPS est rétablie
- doshutdown script appelé juste avant d’éteindre votre serveur
- offbattery est appelé lorsque le courant 220V est rétabli
- onbattery est appelé lors de la perte du courant 220V et au passage sous batterie
Pour envoyer des mails de monitoring personnalisés scripts, il vous suffit d’adapter chacun de ces scripts et d’y inclure l’envoi d’un mail.
Pour envoyer des mails depuis un script, nous allons utiliser SSMTP et SendMail comme décrit dans mon article Envoyer des mails en français via la ligne de commande dans Ubuntu 22.04
Marche à suivre pour personnaliser les scripts
- se rendre dans le répertoire /etc/apcupsd
cd /etc/apcupsd
- faire un copie de sauvegarde du script originel
sudo cp <script> <script>.first
- créer une copie test du fichier et entrer les actions personnalisées.
sudo nano <script>.sh
- rendre le script exécutable
sudo chmod u+x <script>.sh
- tester le script en command line
./<script>.sh
- lorsque le script est au point, remplacer le script originel par votre copie personnalisée fonctionnelle.
sudo cp <script>.sh <script>
Contenu de mes fichiers de monitoring
commfailure
#!/bin/sh # MSG="Perte de la communication avec l'UPS $1" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM exit 0
commok
#!/bin/sh # MSG="La communication avec l'UPS $1 est de retour" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM exit 0
onbattery
#!/bin/sh # MSG="Perte de l'alimentation 220V !!! l'UPS $1 est sur batterie" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM exit 0
offbattery
#!/bin/sh # MSG="L'alimentation 220V est de retour pour l'UPS $1" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM exit 0
changeme
#!/bin/sh # MSG="Il est temps de changer la batterie de l'UPS $1" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM exit 0
Étape 7: tests des scripts en temps réel
Les scripts les plus faciles à tester en temps réel sont commfailure et commok: il suffit de débrancher et de rebrancher le câble de communication de la prise USB de votre serveur (ou de votre UPS).
Pour tester onbattery et offbattery il suffira de débrancher et de rebrancher la prise 220V sans attendre un arrêt complet de votre serveur. Cela prend quelques minutes, le temps de vérifier la bonne réception du mail de monitoring.
Pour tester le processus au complet, il faut débrancher la prise 220V et attendre le temps nécessaire pour que la mise à l’arrêt de votre serveur soit complète. Cela peut prendre de 10 à 15 minutes ou plus selon l’état de charge de la batterie de votre UPS.
Bonus1: comment arrêter proprement des machines virtuelles avant le shutdown du serveur
Si comme moi, vous avez installé des machines virtuelles avec qemu/KVM, il est bon de stopper proprement ces VMs avant de laisser apcupsd faire le shutdown de votre serveur.
Pour ce faire nous allons personnaliser le fichier /etc/apsupsd/doshutdown
mon fichier doshutdown
#!/bin/sh WALL=wall VMS=`virsh list | awk '{print $2}' | tail -n +2` echo "shutdown des VMs KVM ..." | ${WALL} for VM in $VMS ; do virsh shutdown $VM > /dev/null 2>&1 & echo "shutdown de la machine $VM" | ${WALL} sleep 30 done sleep 60 echo "fin du shutdown des VMs..." | ${WALL} echo "envoi d'un mail et shutdown du serveur..." | ${WALL} MSG="Shutdown de votre serveur" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" # ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM sleep 30 exit 0
Bonus 2: S’assurer que apcupsd est démarré au boot
Pour s’assurer que apcupsd est bien démarré au redémarrage de notre serveur, nous allons créer un script qui va s’exécuter lors du boot.
- créer un fichier service pour system dans /etc/systemd/system
sudo nano /etc/systemd/system/apcupsd-started.service
[Unit] After=apcupsd.service [Service] ExecStart=/usr/local/bin/apcupsd-started.sh [Install] WantedBy=default.target
- créer un script exécutable qui va envoyer un mail de confirmation dans /usr/local/bin
sudo nano /usr/local/bin/apcupsd-started.sh
#!/bin/sh MSG="apcupsd s'est bien mis en route" FROM="adresse mail de l'expéditeur" TO="adresse mail du destinataire" BATTERY=`apcaccess status | awk '/BCHARGE/ {print $3,$4}'` # ( echo From: $FROM echo To: $TO echo Subject: "$MSG" echo 'MIME-Version: 1.0' echo 'Content-Type: text/html; charset="ISO 8859-15"' echo 'Content-Disposition: inline' echo "<br />" echo $MSG echo "<br />" echo "Dernier shutdown:" echo "<br />" last -x shutdown | head -1 | awk '{printf "%s<br />", $0}' echo "<br />" echo "Dernier reboot:" echo "<br />" last -x reboot | head -1 | awk '{printf "%s<br />", $0}' echo "<br />" echo "Derniers Events de l'UPS:" echo "<br />" tail /var/log/apcupsd.events | tac | awk '{printf "%s<br />", $0}' echo "<br />" echo "Niveau de la batterie: "$BATTERY echo "<br />" echo "Statut complet de l'UPS:" echo "<br />" apcaccess status | awk '{printf "%s<br />", $0}' echo "<br />" )| sudo -u nobody /usr/sbin/sendmail -t -f $FROM
- changer les permissions des deux scripts de manière adéquate
sudo chmod 744 /usr/local/bin/apcupsd-started.sh sudo chmod 664 /etc/systemd/system/apcups-started.service
- activer le service
sudo systemctl daemon-reload sudo systemctl enable apcupsd-started.service
Lors du prochain rebot du serveur, le service va envoyer un mail confirmant que le daemon apcupsd a bien été démarré.
Liens Utiles
Note importante
Pour que votre serveur redémarre automatiquement lors de la réapparition du courant 220V, il faut adapter la configuration d’un ‘AC power back’ dans le bios de votre serveur. Consultez le manuel de votre carte mère.
Dans mon cas (carte mère AORUS X570) cela se trouve dans Advanced mode – Platform Power – AC BACK.