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