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

4.1 KiB
Raw Permalink Blame History

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 lensemble des métriques via :
    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 multiligne et lenvoie à Discord via jq + curl.

Prérequis

  • NUT (Network UPS Tools) installé et configuré.
  • Un UPS accessible sous lidentifiant eaton@localhost (adapter si besoin).
    Test rapide :
    upsc eaton@localhost | head -n 20
    
  • Accès HTTP sortant vers Discord.
  • jq installé (nécessaire pour sérialiser le JSON) :
    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 dUPS : 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) :
    install -m 0755 check-ups.sh /home/scripts/check-ups.sh
    
  2. Éditer et renseigner la variable WEBHOOK.
  3. Vérifier upsc :
    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

/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 :

*/30 * * * * /home/scripts/check-ups.sh
  • Pour historiser côté hôte :
    */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 dUPS, 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 laffichage si nécessaire.

🔒 Sécurité & impacts

  • Le script est lecture seule (pas darrêt/commande vers lUPS).
  • 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 denvoyer trop souvent le même statut si aucune variation.
  • Ajouter un seuil dalerte (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 denvoi avec jq -Rs si vous souhaitez forcer lescape multiligne comme vos autres scripts.

🗑️ Désinstallation

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