diff --git a/full_updater/backend/scanner.py b/full_updater/backend/scanner.py index 420215e..a721c21 100644 --- a/full_updater/backend/scanner.py +++ b/full_updater/backend/scanner.py @@ -137,25 +137,39 @@ def lxc_is_running(vmid: str) -> bool: def scan_os(target: Target) -> str: - """Récupère le nom et la version de l'OS.""" - if target.is_host: - cmd = ["lsb_release", "-ds"] - else: - cmd = ["pct", "exec", target.target_id, "--", "lsb_release", "-ds"] - ok, stdout, _ = run_cmd(cmd, timeout=30) - if ok: - return stdout.strip() - # Fallback si lsb_release n'est pas installé - if target.is_host: - cmd = ["cat", "/etc/os-release"] - else: - cmd = ["pct", "exec", target.target_id, "--", "cat", "/etc/os-release"] - ok, stdout, _ = run_cmd(cmd, timeout=30) - if ok: - name = re.search(r'PRETTY_NAME="([^"]+)"', stdout) - if name: - return name.group(1) - return "OS inconnu" + """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 "" + + # 2. Récupérer le codename (bookworm, trixie...) + 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 "" + + # 4. Fallback sur lsb_release -rs si /etc/debian_version vide + if not version: + ok, ver_out, _ = run_cmd(prefix + ["lsb_release", "-rs"], timeout=30) + version = 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" + + # Construire le libellé final + if codename: + return f"{os_name} GNU/Linux {version} ({codename})" + return f"{os_name} GNU/Linux {version}" def ensure_debsecan_installed(is_host: bool, vmid: str = "") -> tuple[bool, str]: