From 9f0b9908c877694e4ccb54781347983aef976c4d Mon Sep 17 00:00:00 2001 From: Valentin Lab Date: Tue, 2 Apr 2024 16:29:27 +0200 Subject: [PATCH] new: [0km] add ``vps-subscribe {add,rm} CHANNEL TOPICS`` actions --- README.org | 96 +++++++++++++++++++++++++++ bin/0km | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 287 insertions(+) diff --git a/README.org b/README.org index af71dd1..3966698 100644 --- a/README.org +++ b/README.org @@ -1165,6 +1165,102 @@ suivants: =mailcow=, =postfix=, =rspamd=, =redis=, =crypt=, =vmail=, 0km vps-backup recover myadmin@core-06.0k.io:10023#mail.mybackupedvps.com:postfix mynewvps.com #+end_src +** Usage de l’alerting + +Une commande ~send~ est fourni pour envoyer des alertes via [[https://docs.ntfy.sh/][ntfy]], et +par défaut, enverra ces notifications sur http://ntfy.0k.io . + +Par défaut, le VPS dispose d'un topic qui lui est propre (et surlequel +il a les droits de publication). Et il est possible de rediriger les +différent type de notification vers les topics que l'on souhaite pour +permettre une administration de ces VPS. + +Donc, pour les admin, via la commande ~0km vps-subscribe~, on pourra +facilement gérer l'addition de nouveau topic et en même temps +s'assurer de donner les droit au VPS de publication sur ces topics. + +*** Commande ~send~ + +Sur le VPS, la commande ~send~ permet d’envoyer un message sur un ou +plusieurs topics. (voir ~send --help~ pour plus d’info). La fonction +envoie un message sur un channel, et ce message est envoyé à tous les +topics associés à ce channel. + +**** Configuration du serveur de notification + +La configuration du serveur de notification et les identifiant unique +du VPS sont dans le fichier ~/etc/ntfy/ntfy.conf~. + +**** Configuration des topics + +La configuration des channels/topics est faite dans le fichier +~/etc/ntfy/topics.yml~. + +Exemple: + +- Configuration par défaut + + #+begin_src yaml + .*\.(emerg|alert|crit|err|warning|notice): + - ${LOGIN}_main + #+end_src + + On pourra utiliser: + + #+begin_src sh + send -c backup.crit "no backup done in 24h" + #+end_src + + qui sera notifié sur le serveur =ntfy= de la configuration en cours, dans le + topic ~${LOGIN}_main~. Ainsi que tout autre message dans les channels se terminant + par ~.emerg~, ~.alert~, ... etc... + +- Configuration spécifique + #+begin_src yaml + .*\.alert: + - elabore_alert + #+end_src + + Si on **ajoute** la précédente configuration, la commande suivante: + + #+begin_src sh + send -c disk.alert "no space left" + #+end_src + + ... va envoyer le message aussi bien au précédent topic + ~${LOGIN}_main~, mais aussi au topic ~elabore_alert~ car il se + termine par ~.alert~. + +- + #+begin_src yaml + main: + - maintenance + - debug_foo + - ${LOGIN}_main + #+end_src + + La commande: + + #+begin_src sh + send -c main "no space left" + #+end_src + + .. enverra sur les topics ~maintenance~ et ~debug_foo~ et + ~${LOGIN}_main~ (qui est un topic créé pour le VPS par défaut). + + +*** Ajouter/Enlever des droits d’écriture sur les topics + +Sur un poste d'admin (via la commande ~0km~), et après avoir demandé +un accès au serveur ntfy de destination (une clé SSH sera nécessaire), +on pourra utiliser la sous-commande ~0km vps-subscribe~. + +#+begin_src sh +## Ajouter +0km vps-subscribe add CHANNEL TOPIC VPS +## Enlever +0km vps-subscribe rm CHANNEL TOPIC VPS +#+end_src ** Troubleshooting diff --git a/bin/0km b/bin/0km index f81d372..dd45ea3 100755 --- a/bin/0km +++ b/bin/0km @@ -656,6 +656,156 @@ EOF } +NTFY_TOPIC_FILE="/etc/ntfy/topics.yml" +NTFY_CONFIG_FILE="/etc/ntfy/ntfy.conf" +subscribe:ntfy:topic-file-exists() { + local vps="$1" + if ! out=$(echo "[ -f \"$NTFY_TOPIC_FILE\" ] && echo ok || true" | \ + ssh:run "root@$vps" -- bash); then + err "Unable to check for existence of '$NTFY_TOPIC_FILE'." + fi + if [ -z "$out" ]; then + err "File '$NTFY_TOPIC_FILE' not found on $vps." + return 1 + fi +} + +subscribe:ntfy:config-file-exists() { + local vps="$1" + if ! out=$(echo "[ -f \"$NTFY_CONFIG_FILE\" ] && echo ok || true" | \ + ssh:run "root@$vps" -- bash); then + err "Unable to check for existence of '$NTFY_CONFIG_FILE'." + fi + if [ -z "$out" ]; then + err "File '$NTFY_CONFIG_FILE' not found on $vps." + return 1 + fi +} + + +ntfy:rm() { + local channel="$1" topic="$2" vps="$3" + subscribe:ntfy:topic-file-exists "$vps" || return 1 + if ! out=$(echo "yq -i 'del(.[\"$channel\"][] | select(. == \"$TOPIC\"))' \"$NTFY_TOPIC_FILE\"" | \ + ssh:run "root@$vps" -- bash); then + err "Failed to remove channel '$channel' from '$NTFY_TOPIC_FILE'." + return 1 + fi + info "Channel '$channel' removed from '$NTFY_TOPIC_FILE' on $vps." + ssh:run "root@$vps" -- cat "$NTFY_TOPIC_FILE" +} + +ntfy:add() { + local channel="$1" topic="$2" vps="$3" + vps_connection_check "$vps" &2 + ntfy:topic-access "remove" "$topic" "$vps"