Update README.md

This commit is contained in:
Ssyleric
2025-11-03 17:01:38 +01:00
committed by GitHub
parent a97e3b5a20
commit 38db399088

147
README.md
View File

@@ -1 +1,146 @@
# check-ups-runtime
# 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é.