ubuntu

APCUPSD pour monitorer votre UPS APC avec des mails personnalisés sous Ubuntu 22.04 en 2024

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.

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.

É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.

Monitorer un UPS APC avec le daemon APCUPSD sous Ubuntu
  • 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 :

  1. Assurez-vous d’avoir branché votre UPS APC à votre ordinateur et de l’avoir allumé.
  2. 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 et CHARGING indique que la batterie se recharge.
  • LOADPCT : indique le pourcentage de charge de l’UPS. Dans ce cas, l’UPS nous indique qu’il utilise 14.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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *