diff --git a/tools/fill_domain_ltd_by_prefix.py b/tools/fill_domain_ltd_by_prefix.py new file mode 100644 index 0000000..309beb3 --- /dev/null +++ b/tools/fill_domain_ltd_by_prefix.py @@ -0,0 +1,66 @@ +"""Remplit servers.domain_ltd par convention SANEF (2eme lettre du hostname). + +Regle: + v[p|i]* -> sanef.groupe (prod/integration) + v[r|t|d]* -> sanef-rec.fr (recette/test/dev) + +Applique UNIQUEMENT aux serveurs dont domain_ltd est vide (NULL ou ''). + +Usage: + python tools/fill_domain_ltd_by_prefix.py [--dry-run] +""" +import os +import argparse +from sqlalchemy import create_engine, text + +DATABASE_URL = os.getenv("DATABASE_URL_DEMO") or os.getenv("DATABASE_URL") \ + or "postgresql://patchcenter:PatchCenter2026!@localhost:5432/patchcenter_demo" + +RULES = { + "p": "sanef.groupe", + "i": "sanef.groupe", + "r": "sanef-rec.fr", + "t": "sanef-rec.fr", + "d": "sanef-rec.fr", +} + + +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("--dry-run", action="store_true") + args = parser.parse_args() + + engine = create_engine(DATABASE_URL) + print(f"[INFO] DB: {DATABASE_URL.split('@')[-1]}") + conn = engine.connect().execution_options(isolation_level="AUTOCOMMIT") + + rows = conn.execute(text(""" + SELECT id, hostname FROM servers + WHERE (domain_ltd IS NULL OR domain_ltd = '') + ORDER BY hostname + """)).fetchall() + print(f"[INFO] {len(rows)} serveurs sans domain_ltd") + + updated = skipped = 0 + for r in rows: + h = (r.hostname or "").lower() + if len(h) < 2 or h[0] != "v": + skipped += 1 + continue + domain = RULES.get(h[1]) + if not domain: + skipped += 1 + continue + if args.dry_run: + print(f" DRY: {r.hostname:25s} -> {domain}") + else: + conn.execute(text("UPDATE servers SET domain_ltd=:d WHERE id=:sid"), + {"d": domain, "sid": r.id}) + updated += 1 + + conn.close() + print(f"\n[DONE] Maj: {updated} | Skip (hors regle): {skipped}") + + +if __name__ == "__main__": + main()