Set-OPS-Public/roles/serveur_ops_site/templates/sonde-fabric.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

38 lines
1.8 KiB
Django/Jinja

#!/bin/bash
# GENERE par Set-OPS (role serveur_ops_site). Ne pas editer a la main.
#
# SONDE « fabric » — le pare-feu Proxmox, le SDN, la frontiere et les acces WireGuard
# disent-ils encore ce que le plan dit ?
#
# Contrat : docs/conception/supervision-conception.md — une ligne, 0/1/2/3. Elle ne JOUE pas les
# plans (trop lents pour une sonde) : elle lit le constat du minuteur
# `setops-conformite-fabric`. Un constat trop VIEUX est une panne a part entiere : sans
# lui, un minuteur mort laisserait la derniere bonne nouvelle au vert pour toujours.
set -uo pipefail
python3 - {{ serveur_ops_site_conformite_etat }} {{ serveur_ops_site_conformite_age_max_h }} <<'EOF'
import json, sys, time
etat, age_max = sys.argv[1], int(sys.argv[2])
try:
doc = json.load(open(etat))
except (OSError, ValueError):
print(f"Aucun constat lisible ({etat}) : le minuteur setops-conformite-fabric a-t-il tourne ?")
sys.exit(2)
age_h = (time.time() - doc["horodatage"]) / 3600
if age_h > age_max:
print(f"Constat PERIME : {age_h:.0f} h (seuil {age_max} h). Le minuteur ne mesure plus.")
sys.exit(2)
plans = doc["plans"]
illisibles = [p["plan"] for p in plans if p["rc"] != 0]
ecarts = [p for p in plans if p["rc"] == 0 and p["a_faire"] > 0]
perf = " ".join(f"{p['plan']}={p['a_faire'] if p['rc'] == 0 else -1}" for p in plans)
if illisibles:
print(f"Plan(s) illisible(s) : {', '.join(illisibles)} — la fabric n'a pas pu etre relue. | {perf}")
sys.exit(3)
if ecarts:
quoi = "; ".join(f"{p['plan']} : {p['a_faire']} ({(p['detail'] or ['?'])[0][:60]})" for p in ecarts)
print(f"ECART avec le plan — {quoi}. Relire le plan, puis appliquer ou corriger. | {perf}")
sys.exit(1)
print(f"Fabric conforme au plan ({len(plans)} plans, constat de {age_h * 60:.0f} min). | {perf}")
sys.exit(0)
EOF