129 lines
4.1 KiB
Markdown
129 lines
4.1 KiB
Markdown
# Statut *UPS* (NUT) avec notification Discord
|
||
|
||
⚡ **Objectif**
|
||
Interroger un **UPS** via **NUT** (`upsc`) et envoyer un **état synthétique** vers **Discord** (webhook) : modèle, charge batterie, autonomie, charge appliquée, tensions entrée/sortie, puissance, statut.
|
||
|
||
---
|
||
|
||
## 🧩 Fonctionnement (résumé)
|
||
1. Récupère l’ensemble des métriques via :
|
||
```bash
|
||
upsc eaton@localhost
|
||
```
|
||
2. Extrait les champs clefs (via `grep`/`awk`/`cut`) :
|
||
- `battery.charge`, `battery.runtime`, `ups.load`, `ups.status`, `input.voltage`, `output.voltage`, `ups.power`, `device.model`.
|
||
3. Compose un **message multi‑ligne** et l’envoie à **Discord** via `jq` + `curl`.
|
||
|
||
---
|
||
|
||
## ✅ Prérequis
|
||
- **NUT** (Network UPS Tools) installé et configuré.
|
||
- Un **UPS** accessible sous l’identifiant **`eaton@localhost`** (adapter si besoin).
|
||
Test rapide :
|
||
```bash
|
||
upsc eaton@localhost | head -n 20
|
||
```
|
||
- Accès **HTTP sortant** vers Discord.
|
||
- **`jq`** installé (nécessaire pour sérialiser le JSON) :
|
||
```bash
|
||
apt update && apt install -y jq
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 Variables (dans le script)
|
||
| Variable | Par défaut | Description |
|
||
|-----------|----------------------------------------|-------------|
|
||
| `WEBHOOK` | `https://discord.com/api/webhooks/...` | URL du **Discord Webhook** de destination. |
|
||
|
||
> ℹ️ Pour un autre nom d’UPS : remplacez `eaton@localhost` dans le script par votre identifiant NUT (ex. `ups@127.0.0.1`).
|
||
|
||
---
|
||
|
||
## 📦 Installation
|
||
1. Copier le script dans votre dépôt de scripts (ex. `/home/scripts`) :
|
||
```bash
|
||
install -m 0755 check-ups.sh /home/scripts/check-ups.sh
|
||
```
|
||
2. Éditer et **renseigner** la variable `WEBHOOK`.
|
||
3. Vérifier `upsc` :
|
||
```bash
|
||
upsc eaton@localhost | egrep 'battery.charge|battery.runtime|ups.load|ups.status|input.voltage|output.voltage|ups.power|device.model'
|
||
```
|
||
|
||
> 💡 Conformément à votre organisation, `/home/scripts` est le dossier de référence.
|
||
|
||
---
|
||
|
||
## ▶️ Utilisation manuelle
|
||
```bash
|
||
/home/scripts/check-ups.sh
|
||
```
|
||
- Envoie **immédiatement** un message d’état dans le canal Discord ciblé.
|
||
|
||
---
|
||
|
||
## ⏱️ Planification (cron) — état périodique
|
||
Exemple : **toutes les 30 minutes** :
|
||
```cron
|
||
*/30 * * * * /home/scripts/check-ups.sh
|
||
```
|
||
- Pour historiser côté hôte :
|
||
```cron
|
||
*/30 * * * * /home/scripts/check-ups.sh >> /var/log/check-ups.cron.log 2>&1
|
||
```
|
||
|
||
---
|
||
|
||
## 🔔 Format du message Discord
|
||
Exemple de payload :
|
||
```
|
||
** ⚡️ Status UPS ⚡️ **
|
||
🖥️ Modèle : <device.model>
|
||
🔋 Charge batterie : <battery.charge> %
|
||
⏳ Autonomie estimée : <battery.runtime> sec
|
||
⚡ Charge appliquée : <ups.load> %
|
||
🔌 Entrée : <input.voltage> V
|
||
⚡ Sortie : <output.voltage> V
|
||
🔋 Puissance : <ups.power> VA
|
||
💡 Statut UPS : <ups.status>
|
||
```
|
||
- Compatible avec la **limite 2000 caractères** ; le message reste concis.
|
||
|
||
---
|
||
|
||
## 🧰 Dépannage
|
||
- **Pas de sortie `upsc`** :
|
||
- Vérifier la **configuration NUT** (`upsd`, nom d’UPS, droits).
|
||
- **Rien dans Discord** :
|
||
- Vérifier `WEBHOOK`, réseau/DNS sortant, erreurs `curl`.
|
||
- **Champs vides** :
|
||
- Certains onduleurs ne fournissent pas `ups.power` ou `output.voltage`. Adaptez l’affichage si nécessaire.
|
||
|
||
---
|
||
|
||
## 🔒 Sécurité & impacts
|
||
- Le script est **lecture seule** (pas d’arrêt/commande vers l’UPS).
|
||
- Le webhook Discord est un **secret d’émission** : protégez le fichier, limitez les droits (`chmod 0755`, ou `0600` si vous stockez des secrets).
|
||
|
||
---
|
||
|
||
## ✨ Améliorations suggérées (optionnelles)
|
||
- Ajouter un **fichier d’état** pour éviter d’envoyer trop souvent le même statut si aucune variation.
|
||
- Ajouter un **seuil d’alerte** (ex. batterie < 40%, runtime < 600 s) avec un **cooldown**.
|
||
- Joindre un **fichier log** en pièce jointe (`curl -F`) pour archivage côté Discord.
|
||
- Uniformiser le style d’envoi avec `jq -Rs` si vous souhaitez forcer l’escape multiligne comme vos autres scripts.
|
||
|
||
---
|
||
|
||
## 🗑️ Désinstallation
|
||
```bash
|
||
crontab -e # retirer l'entrée si ajoutée
|
||
rm -f /home/scripts/check-ups.sh /var/log/check-ups.cron.log
|
||
```
|
||
|
||
---
|
||
|
||
## 📄 Licence
|
||
Utilisation interne. Adapter selon votre politique de sécurité.
|