diff --git a/full_updater/backend/scanner.py b/full_updater/backend/scanner.py index a721c21..27aee27 100644 --- a/full_updater/backend/scanner.py +++ b/full_updater/backend/scanner.py @@ -140,36 +140,45 @@ def scan_os(target: Target) -> str: """Récupère le nom, la version complète et le codename de l'OS.""" prefix = [] if target.is_host else ["pct", "exec", target.target_id, "--"] - # 1. Récupérer le nom (Debian, Ubuntu...) - ok, name_out, _ = run_cmd(prefix + ["lsb_release", "-is"], timeout=30) - os_name = name_out.strip() if ok else "" + # 1. Lire /etc/os-release pour VERSION_ID (ex: 12.9) et PRETTY_NAME + ok, osrel_out, _ = run_cmd(prefix + ["cat", "/etc/os-release"], timeout=30) + version_id = "" + pretty_name = "" + if ok: + ver_match = re.search(r'VERSION_ID="([^"]+)"', osrel_out) + if ver_match: + version_id = ver_match.group(1) + pretty_match = re.search(r'PRETTY_NAME="([^"]+)"', osrel_out) + if pretty_match: + pretty_name = pretty_match.group(1) - # 2. Récupérer le codename (bookworm, trixie...) + # 2. Récupérer le codename via lsb_release ok, code_out, _ = run_cmd(prefix + ["lsb_release", "-cs"], timeout=30) codename = code_out.strip() if ok else "" - # 3. Récupérer la version complète depuis /etc/debian_version (ex: 12.9) - ok, ver_out, _ = run_cmd(prefix + ["cat", "/etc/debian_version"], timeout=30) - version = ver_out.strip() if ok else "" + # 3. Fallback sur /etc/debian_version si VERSION_ID vide + if not version_id: + ok, ver_out, _ = run_cmd(prefix + ["cat", "/etc/debian_version"], timeout=30) + version_id = ver_out.strip() if ok else "" - # 4. Fallback sur lsb_release -rs si /etc/debian_version vide - if not version: + # 4. Fallback sur lsb_release -rs + if not version_id: ok, ver_out, _ = run_cmd(prefix + ["lsb_release", "-rs"], timeout=30) - version = ver_out.strip() if ok else "" + version_id = ver_out.strip() if ok else "" - # 5. Fallback sur /etc/os-release si tout le reste échoue - if not os_name or not version: - ok, osrel_out, _ = run_cmd(prefix + ["cat", "/etc/os-release"], timeout=30) - if ok: - pretty = re.search(r'PRETTY_NAME="([^"]+)"', osrel_out) - if pretty: - return pretty.group(1) - return "OS inconnu" + # 5. Récupérer le nom via lsb_release + ok, name_out, _ = run_cmd(prefix + ["lsb_release", "-is"], timeout=30) + os_name = name_out.strip() if ok else "" + + if not os_name and pretty_name: + return pretty_name + if not os_name or not version_id: + return pretty_name if pretty_name else "OS inconnu" # Construire le libellé final if codename: - return f"{os_name} GNU/Linux {version} ({codename})" - return f"{os_name} GNU/Linux {version}" + return f"{os_name} GNU/Linux {version_id} ({codename})" + return f"{os_name} GNU/Linux {version_id}" def ensure_debsecan_installed(is_host: bool, vmid: str = "") -> tuple[bool, str]: