55 lines
2.3 KiB
Text
55 lines
2.3 KiB
Text
|
|
#!/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
|