diff --git a/tools/fill_domain_ltd_by_dns.py b/tools/fill_domain_ltd_by_dns.py index bdf24e4..bc3103d 100644 --- a/tools/fill_domain_ltd_by_dns.py +++ b/tools/fill_domain_ltd_by_dns.py @@ -10,6 +10,7 @@ Usage: """ import os import socket +import threading import argparse from sqlalchemy import create_engine, text @@ -26,13 +27,21 @@ SUFFIXES = [ def resolve(hostname, suffix, timeout): - """Retourne True si hostname.suffix resout en DNS.""" - socket.setdefaulttimeout(timeout) - try: - socket.gethostbyname(f"{hostname}.{suffix}") - return True - except (socket.gaierror, socket.timeout, OSError): - return False + """Retourne True si hostname.suffix resout en DNS, timeout via thread.""" + fqdn = f"{hostname}.{suffix}" + result = [False] + + def _do(): + try: + socket.gethostbyname(fqdn) + result[0] = True + except Exception: + result[0] = False + + t = threading.Thread(target=_do, daemon=True) + t.start() + t.join(timeout) + return result[0] def main(): @@ -53,11 +62,12 @@ def main(): print(f"[INFO] {len(rows)} serveurs sans domain_ltd") updated = skipped = 0 - for r in rows: + for i, r in enumerate(rows, 1): h = (r.hostname or "").strip() if not h: skipped += 1 continue + print(f" [{i}/{len(rows)}] Resolve {h}...", flush=True) found = None for suffix in SUFFIXES: if resolve(h, suffix, args.timeout): diff --git a/tools/tag_obsolete_os.py b/tools/tag_obsolete_os.py index aea9b73..58f29f7 100644 --- a/tools/tag_obsolete_os.py +++ b/tools/tag_obsolete_os.py @@ -23,9 +23,10 @@ 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" -# Patterns regex (case-insensitive) sur os_version indiquant un OS EOL +# OS deja en EOL complet (licence_support='obsolete') EOL_PATTERNS = [ - (r"red\s*hat.*(?:release\s+)?[567]\b", "RHEL 5/6/7"), + (r"red\s*hat.*(?:release\s+)?[56]\b", "RHEL 5/6"), + (r"red\s*hat.*(?:release\s+)?7\b", "RHEL 7 (EOL 2024-06)"), (r"centos.*(?:release\s+)?[5678]\b", "CentOS 5/6/7/8"), (r"oracle.*linux.*(?:release\s+)?[567]\b", "Oracle Linux 5/6/7"), (r"windows.*2003", "Windows 2003"), @@ -37,15 +38,24 @@ EOL_PATTERNS = [ (r"suse.*(?:enterprise.*)?(?:server.*)?(?:sp\d\s*)?1[01]\b", "SUSE 10/11"), ] +# OS avec support etendu (ELS) - licence_support='els' +ELS_PATTERNS = [ + # RHEL 7 est en ELS jusqu'en 2028 pour les clients payants + # On peut basculer certains vers ELS au lieu de obsolete au cas par cas +] + def classify(os_version): if not os_version: - return None + return (None, None) v = os_version.lower() + for pattern, label in ELS_PATTERNS: + if re.search(pattern, v): + return ("els", label) for pattern, label in EOL_PATTERNS: if re.search(pattern, v): - return label - return None + return ("obsolete", label) + return (None, None) def main(): @@ -70,28 +80,28 @@ def main(): by_label = {} for r in rows: - label = classify(r.os_version) - if not label: + target, label = classify(r.os_version) + if not target: stats["not_eol"] += 1 continue - if r.licence_support == "obsolete": + if r.licence_support == target: stats["already_obsolete"] += 1 continue - # Si deja 'active' ou 'els', on ne touche pas sauf --overwrite - if r.licence_support in ("active", "els") and not args.overwrite: + # Si deja 'active' et qu'on veut passer en obsolete/els, skip sauf --overwrite + if r.licence_support == "active" and not args.overwrite: stats["skipped_active"] += 1 if args.dry_run: print(f" SKIP (--overwrite pour forcer): {r.hostname:25s} " - f"[{r.licence_support}] {label} | {r.os_version[:60]}") + f"[active] -> {target} ({label}) | {r.os_version[:60]}") continue - by_label[label] = by_label.get(label, 0) + 1 + by_label[f"{target} - {label}"] = by_label.get(f"{target} - {label}", 0) + 1 if args.dry_run: - print(f" DRY: {r.hostname:25s} [{r.licence_support or 'NULL'}] -> obsolete " + print(f" DRY: {r.hostname:25s} [{r.licence_support or 'NULL'}] -> {target} " f"({label}) | {r.os_version[:60]}") else: - conn.execute(text("UPDATE servers SET licence_support='obsolete' WHERE id=:sid"), - {"sid": r.id}) + conn.execute(text("UPDATE servers SET licence_support=:t WHERE id=:sid"), + {"t": target, "sid": r.id}) stats["tagged"] += 1 conn.close()