5.8 KiB
5.8 KiB
Alerte autonomie UPS (NUT) avec notification Discord
⏱️ Objectif
Surveiller l’autonomie restante (battery.runtime en secondes) d’un UPS exposé par NUT (upsc).
- Si l’autonomie < 300 s, envoie une alerte Discord (une seule fois tant que la condition persiste), logue l’événement, puis désactive les alertes suivantes via un fichier d’état.
- Quand l’autonomie remonte ≥ 300 s, le fichier d’état est réinitialisé afin de pouvoir renvoyer une future alerte si ça rechute.
🧩 Fonctionnement (résumé)
- Récupère les métriques via :
Les champs utilisés sont :
upsc eaton@localhostups.status,battery.runtime,battery.charge,device.model. - Si
battery.runtime < 300:- Si aucun envoi précédent (fichier
/tmp/ups-runtime-alert.sentabsent) → envoi d’un message Discord + journalisation dans/var/log/ups-shutdown.log, puis création du fichier d’état. - Si le fichier d’état existe, aucune alerte supplémentaire n’est envoyée (anti-spam).
- Si aucun envoi précédent (fichier
- Si
battery.runtime ≥ 300:- Suppression du fichier d’état (reset), ce qui réautorise une alerte lors d’une future baisse.
✅ Prérequis
- NUT (Network UPS Tools) installé et configuré (service
upsd+upscfonctionnel). - Un UPS déclaré et accessible sous le nom
eaton@localhost(adapter si besoin).
Test rapide :upsc eaton@localhost | head -n 20 - Accès HTTP sortant vers l’URL Discord Webhook.
jqpour sérialiser le JSON. (Le script présupposejqprésent.)
🔧 Variables (dans le script)
| Variable | Par défaut | Description |
|---|---|---|
WEBHOOK |
https://discord.com/api/webhooks/... |
URL du Discord Webhook (remplacer par la vôtre). |
LOGFILE |
/var/log/ups-shutdown.log |
Fichier log des alertes envoyées. |
STATEFILE |
/tmp/ups-runtime-alert.sent |
Flag pour éviter les alertes répétées tant que la condition persiste. |
ℹ️ Le seuil est fixe à 300 secondes dans ce script. Adaptez la ligne
if [[ "$RUNTIME" -lt 300 ]]; thenpour modifier la valeur.
📦 Installation
- Copier le script :
install -m 0755 check-ups-runtime.sh /home/scripts/check-ups-runtime.sh - Éditer la variable
WEBHOOKavec votre URL. - Créer le répertoire de log si besoin :
touch /var/log/ups-shutdown.log
💡 Votre organisation utilise
/home/scriptscomme dossier de référence.
▶️ Utilisation manuelle
/home/scripts/check-ups-runtime.sh
- Si
upscrenvoie une autonomie< 300, une alerte est envoyée une seule fois (puisqueSTATEFILEest créé). - Quand l’autonomie repasse au-dessus, l’alerte est réarmable.
⏱️ Planification (cron)
Exemple : toutes les minutes (recommandé pour une alerte quasi temps réel) :
* * * * * /home/scripts/check-ups-runtime.sh
- Le système de flag (
STATEFILE) empêche l’inondation d’alertes. - Redirigez vers un log si vous souhaitez historiser l’exécution :
* * * * * /home/scripts/check-ups-runtime.sh >> /var/log/check-ups-runtime.cron.log 2>&1
🔔 Format de la notification Discord
Message court, compatible avec la limite 2000 caractères :
⏱ <hostname> — ⚠️ Autonomie critique UPS à <date>
🔋 Batterie : <battery.charge> %
⏳ Autonomie : <battery.runtime> sec
🖥️ Modèle : <device.model>
- Envoi via
jq -n --arg contentpuiscurl -H "Content-Type: application/json".
🧪 Vérifications & tests
- NUT en place :
systemctl status nut-server nut-monitor 2>/dev/null || true upsc eaton@localhost | egrep 'ups.status|battery.runtime|battery.charge|device.model' - Alerte unique :
- Simulez un runtime bas (test réel en débranchant le secteur est à vos risques).
- Lancez le script plusieurs fois : une seule alerte doit partir tant que
STATEFILEexiste.
- Reset :
- Quand
battery.runtimeremonte ≥ 300, vérifiez la suppression deSTATEFILE.
- Quand
⚠️ Évitez de débrancher le secteur sur un système de production sans procédure d’exploitation validée.
🧰 Dépannage
- Aucune sortie
upsc:- Vérifier la config NUT, le nom d’UPS (
eaton@localhost), les droits d’accès.
- Vérifier la config NUT, le nom d’UPS (
- Pas d’alerte Discord :
- Vérifier
WEBHOOK, DNS/réseau sortant, et consulterLOGFILE.
- Vérifier
- Alerte non réarmable :
- Supprimer manuellement le flag :
rm -f /tmp/ups-runtime-alert.sent.
- Supprimer manuellement le flag :
🔒 Sécurité & impacts
- Lecture seule des métriques NUT (aucune action de shutdown).
- La fréquence cron et le seuil doivent refléter vos contraintes d’exploitation.
- Le log
/var/log/ups-shutdown.logpeut contenir des horodatages d’événements sensibles : gérez les accès.
✨ Améliorations suggérées (optionnelles)
- Rendre le seuil configurable via variable d’environnement (ex.
RUNTIME_THRESHOLD, défaut 300). - Ajouter un cooldown chronométré (ex. ne pas renvoyer plus d’une alerte toutes les X minutes même après reset).
- Ajouter l’état secteur (
input.voltage,ups.load, etc.) dans le message. - Joindre le journal en pièce jointe (méthode
curl -F) si vous souhaitez conserver le log côté Discord.
🗑️ Désinstallation
crontab -e # retirer l'entrée si ajoutée
rm -f /home/scripts/check-ups-runtime.sh /tmp/ups-runtime-alert.sent /var/log/check-ups-runtime.log
📄 Licence
Utilisation interne. Adapter selon votre politique de sécurité.