Set-OPS-Public/roles/serveur_loki/templates/sonde-frontiere.sh.j2
Daniel Allaire aab1bcc83a doc : rangee par lecteur, trois portes d'entree (architecture, setup, usage) et un index
README reduit au role du projet et au demarrage rapide. docs/architecture.md (schemas
Mermaid), docs/setup.md, docs/usage.md (154 cibles en 13 familles), docs/README.md (index).
Documents ranges en conception/, exploitation/, hebergement/, projet/ ; 598 chemins suivis.
QUICKSTART.md, SOLUTION.md, architecture-set-ops.md et la carte fondus puis retires.

Preuves : P48 lit l'index et conception/mecanismes.md ; les gardes parcourent docs/ sous-
dossiers compris (_documents) ; usage.md suit le Makefile dans les deux sens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:01:54 -04:00

54 lines
2.3 KiB
Django/Jinja

#!/bin/bash
# GENERE par Set-OPS (role serveur_loki). Ne pas editer a la main.
#
# SONDE « journaux-frontiere » — l'equipement qui voit TOUT parle-t-il encore ?
#
# Contrat : docs/conception/supervision-conception.md (API des greffons Nagios) — une ligne, 0/1/2.
# Mise en defaut PAR PARAMETRE : `serveur_loki_sonde_frontiere_etiquette` (nom inconnu).
#
# POURQUOI CETTE SONDE EXISTE, ET POURQUOI ELLE EST LA PLUS IMPORTANTE DU LOT.
#
# La destination syslog de la frontiere a pointe une VM de TENANT, rasee depuis. Une cible
# morte a arrete TOUTE la journalisation d'OPNsense pendant DIX JOURS, et rien ne l'a
# signale : le boitier fonctionnait, le pare-feu filtrait, les regles s'appliquaient — il
# n'ecrivait simplement plus nulle part. On ne l'a su qu'en allant chercher un evenement
# qui n'avait jamais ete ecrit.
#
# Remettre la destination sans poser cette garde, ce serait reconstruire la meme panne en
# esperant s'en souvenir. Un equipement muet ne se plaint pas.
set -uo pipefail
URL={{ serveur_loki_sonde_url }}
ETIQ="{{ serveur_loki_sonde_frontiere_etiquette }}"
FENETRE={{ serveur_loki_sonde_frontiere_fenetre }}
# ON DEMANDE A LOKI CE QU'IL A RECU, pas a la frontiere ce qu'elle croit avoir envoye.
# La destination est le seul juge : un emetteur qui « envoie » vers un trou noir se porte
# tres bien, et c'est exactement ce qui s'est passe.
rep=$(curl -sk --max-time 15 -G "${URL}/loki/api/v1/query" \
--data-urlencode "query=count_over_time({host=\"${ETIQ}\", job=\"syslog\"}[${FENETRE}])" \
2>/dev/null)
[[ -n "${rep}" ]] || { echo "Loki ne repond pas sur ${URL} — la sonde ne peut rien affirmer."; exit 3; }
n=$(printf '%s' "${rep}" | python3 -c '
import json, sys
try:
d = json.load(sys.stdin)
except Exception:
print("-1"); raise SystemExit
r = (d.get("data") or {}).get("result") or []
print(int(sum(float(x.get("value", [0, 0])[1]) for x in r)))
' 2>/dev/null)
: "${n:=-1}"
perf="lignes=${n} fenetre=${FENETRE}"
if (( n < 0 )); then
echo "Reponse illisible de Loki — impossible de dire si la frontiere journalise. | ${perf}"
exit 3
fi
if (( n == 0 )); then
echo "LA FRONTIERE NE JOURNALISE PLUS : aucune ligne de « ${ETIQ} » depuis ${FENETRE}. | ${perf}"
exit 2
fi
echo "Frontiere journalise : ${n} ligne(s) recue(s) en ${FENETRE}. | ${perf}"
exit 0