DNS fill timeout via thread + tag_obsolete_os supporte els/obsolete separement
This commit is contained in:
parent
7f6ccc763b
commit
9f4d7707ef
@ -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)
|
||||
"""Retourne True si hostname.suffix resout en DNS, timeout via thread."""
|
||||
fqdn = f"{hostname}.{suffix}"
|
||||
result = [False]
|
||||
|
||||
def _do():
|
||||
try:
|
||||
socket.gethostbyname(f"{hostname}.{suffix}")
|
||||
return True
|
||||
except (socket.gaierror, socket.timeout, OSError):
|
||||
return False
|
||||
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):
|
||||
|
||||
@ -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()
|
||||
|
||||
Loading…
Reference in New Issue
Block a user