80 lines
3.4 KiB
Python
80 lines
3.4 KiB
Python
|
|
#!/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)
|