Files
check-ups-runtime/README.md
2025-11-03 17:01:38 +01:00

147 lines
5.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Alerte autonomie *UPS* (NUT) avec notification Discord
⏱️ **Objectif**
Surveiller l**autonomie restante** (*battery.runtime* en secondes) dun **UPS** exposé par **NUT** (`upsc`).
- Si lautonomie **< 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 lautonomie remonte **≥ 300 s**, le fichier détat est **réinitialisé** afin de pouvoir renvoyer une future alerte si ça rechute.
---
## 🧩 Fonctionnement (résumé)
1. Récupère les métriques via :
```bash
upsc eaton@localhost
```
Les champs utilisés sont : `ups.status`, `battery.runtime`, `battery.charge`, `device.model`.
2. Si `battery.runtime < 300` :
- Si **aucun envoi précédent** (fichier `/tmp/ups-runtime-alert.sent` **absent**) → **envoi** dun 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 nest envoyée (anti-spam).
3. Si `battery.runtime ≥ 300` :
- **Suppression** du fichier détat (reset), ce qui réautorise une alerte lors dune future baisse.
---
## ✅ Prérequis
- **NUT** (Network UPS Tools) installé et configuré (service `upsd` + `upsc` fonctionnel).
- Un **UPS** déclaré et accessible sous le nom **`eaton@localhost`** (adapter si besoin).
Test rapide :
```bash
upsc eaton@localhost | head -n 20
```
- Accès **HTTP sortant** vers lURL **Discord Webhook**.
- **`jq`** pour sérialiser le JSON. (Le script présuppose `jq` pré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 ]]; then` pour modifier la valeur.
---
## 📦 Installation
1. Copier le script :
```bash
install -m 0755 check-ups-runtime.sh /home/scripts/check-ups-runtime.sh
```
2. Éditer la variable `WEBHOOK` avec votre URL.
3. Créer le répertoire de log si besoin :
```bash
touch /var/log/ups-shutdown.log
```
> 💡 Votre organisation utilise `/home/scripts` comme dossier de référence.
---
## ▶️ Utilisation manuelle
```bash
/home/scripts/check-ups-runtime.sh
```
- Si `upsc` renvoie une autonomie `< 300`, une alerte est envoyée **une seule fois** (puisque `STATEFILE` est créé).
- Quand lautonomie repasse au-dessus, lalerte est **réarmable**.
---
## ⏱️ Planification (cron)
Exemple : **toutes les minutes** (recommandé pour une alerte quasi temps réel) :
```cron
* * * * * /home/scripts/check-ups-runtime.sh
```
- Le système de **flag** (`STATEFILE`) empêche l**inondation dalertes**.
- Redirigez vers un log si vous souhaitez historiser lexécution :
```cron
* * * * * /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 content` puis `curl -H "Content-Type: application/json"`.
---
## 🧪 Vérifications & tests
1. **NUT en place** :
```bash
systemctl status nut-server nut-monitor 2>/dev/null || true
upsc eaton@localhost | egrep 'ups.status|battery.runtime|battery.charge|device.model'
```
2. **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 `STATEFILE` existe.
3. **Reset** :
- Quand `battery.runtime` remonte ≥ 300, vérifiez la **suppression** de `STATEFILE`.
> ⚠️ Évitez de débrancher le secteur sur un système de production sans procédure dexploitation validée.
---
## 🧰 Dépannage
- **Aucune sortie `upsc`** :
- Vérifier la **config NUT**, le nom dUPS (`eaton@localhost`), les droits daccès.
- **Pas dalerte Discord** :
- Vérifier `WEBHOOK`, DNS/réseau sortant, et consulter `LOGFILE`.
- **Alerte non réarmable** :
- Supprimer manuellement le flag : `rm -f /tmp/ups-runtime-alert.sent`.
---
## 🔒 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 dexploitation.
- Le log `/var/log/ups-shutdown.log` peut contenir des horodatages dévénements sensibles : gérez les accès.
---
## ✨ Améliorations suggérées (optionnelles)
- Rendre le **seuil configurable** via variable denvironnement (ex. `RUNTIME_THRESHOLD`, défaut 300).
- Ajouter un **cooldown** chronométré (ex. ne pas renvoyer plus dune 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
```bash
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é.