#!/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/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