Set-OPS-Public/scripts/ma_forge.py
Daniel Allaire 8574b7b540 wiki : chaque runner publie pour SA forge
J allais centraliser — un controleur poussant vers N forges, un temoin portant
une liste. Ca aurait demande un acces sur chaque forge depuis un seul poste, et
fait du temoin un fait global que personne ne detient.

Le modele suit la ligne du reste : chacun sert les siens. Sans WIKI_REMOTE,
l adresse se derive du nom que le plan monte expose pour serveur_forgejo.

Deux notions a ne pas confondre : la forge AMONT ou l on LIT le genome, et MA
forge ou l on SERT les siens. Le runner d un locataire lit chez son hebergeur et
sert chez lui.

WIKI_REMOTE l emporte toujours : le poste du mainteneur n est le runner d aucun
ecosysteme et publie vers le domicile public du projet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Crgis8CxCWkAGFA1ecBz3q
2026-09-14 14:26:29 -04:00

79 lines
3.4 KiB
Python
Executable file

#!/usr/bin/env python3
"""L'adresse du wiki de MA forge — celle de l'ecosysteme monte.
CHAQUE RUNNER PUBLIE POUR SA FORGE (decide le 2026-09-14).
La premiere idee etait qu'un controleur pousse vers plusieurs forges, avec un temoin
portant une liste. Elle CENTRALISAIT : un seul poste aurait eu besoin d'un acces sur
chaque forge, et le temoin serait devenu un fait global que personne ne detient.
Le modele retenu suit la ligne du reste du systeme — les voutes, les runners, les
sauvegardes : **chacun sert les siens**. Le runner du site publie sur la forge du site ;
celui d'un locataire sur la forge de ce locataire. Un employe de TechnoLibre lit la forge
de TechnoLibre, pas celle de son hebergeur.
DEUX NOTIONS A NE PAS CONFONDRE, et c'est ce qui a rendu le sujet trouble :
la forge AMONT (`serveur_ops_forge_amont`) ou je LIS le genome
MA forge (derivee ici) ou je SERS les miens
Le runner d'un locataire lit sur la forge du SITE et sert sur la SIENNE. Les deux adresses
different, et le wiki appartient a la seconde.
CE QUI N'EST PAS DERIVABLE, ET C'EST DIT PLUTOT QUE DEVINE : le poste du mainteneur n'est
le runner d'aucun ecosysteme. Il publie vers le domicile PUBLIC du projet, qui n'est la
forge d'aucun plan. La, `WIKI_REMOTE` reste explicite — et il l'emporte toujours.
"""
from __future__ import annotations
import sys
from pathlib import Path
RACINE = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(RACINE / "scripts"))
def ma_forge() -> tuple[str | None, str]:
"""(url du wiki, explication). `None` quand rien n'est derivable."""
try:
from inventory_rules import charger_applications, instance_courante
except Exception as e:
return None, f"moteur illisible ({e.__class__.__name__})"
inst = instance_courante()
if not inst:
return None, "aucune instance montee"
# `charger_applications` VEUT UN CHEMIN, pas rien. L'appeler sans argument levait un
# `TypeError` que le `except` transformait en « plan illisible » — un message poli pour
# une faute de programmation. Le voila nomme.
try:
apps = (charger_applications(Path(inst) / "plan" / "applications.yml")
or {}).get("applications") or {}
except (OSError, ValueError) as e:
return None, f"plan illisible ({e.__class__.__name__})"
# LE NOM DU SERVICE, PAS CELUI DE LA MACHINE. Un FQDN expose survit au demenagement du
# service ; `forge-01` non. C'est la meme regle que partout ailleurs dans ce depot.
for nom, app in (apps.items() if isinstance(apps, dict) else []):
if str((app or {}).get("groupe")) != "serveur_forgejo":
continue
exposes = (app or {}).get("expose") or []
if not exposes:
return None, "`serveur_forgejo` est au plan mais n'expose aucun nom"
fqdn = str(exposes[0])
depot = RACINE.name.lower()
return (f"ssh://git@{fqdn}/genome/{depot}.wiki.git",
f"forge de l'ecosysteme monte ({Path(inst).resolve().name}), exposee en {fqdn}")
return None, f"{Path(inst).resolve().name} ne declare aucun `serveur_forgejo`"
if __name__ == "__main__":
url, pourquoi = ma_forge()
if url:
print(url)
print(f"note : {pourquoi}", file=sys.stderr)
raise SystemExit(0)
print(f"note : pas de forge derivable — {pourquoi}", file=sys.stderr)
raise SystemExit(1)