Files
SecureCheck/securecheck/system_info.py
2026-04-05 18:56:26 +02:00

61 lines
1.6 KiB
Python

from __future__ import annotations
import os
import pwd
import shutil
from dataclasses import dataclass
from pathlib import Path
@dataclass(frozen=True)
class SystemInfo:
distro_id: str
pretty_name: str
package_manager: str
target_user: str
target_home: Path
target_uid: int
target_gid: int
def _read_os_release() -> dict[str, str]:
values: dict[str, str] = {}
release_file = Path("/etc/os-release")
if not release_file.exists():
return values
for line in release_file.read_text(encoding="utf-8").splitlines():
if "=" not in line or line.startswith("#"):
continue
key, value = line.split("=", 1)
values[key] = value.strip().strip('"')
return values
def detect_package_manager() -> str:
for candidate in ("apt-get", "dnf", "yum", "pacman"):
if shutil.which(candidate):
return candidate
return "unknown"
def resolve_target_user() -> tuple[str, Path, int, int]:
user_name = os.environ.get("SUDO_USER") or os.environ.get("USER") or "root"
user_info = pwd.getpwnam(user_name)
return user_name, Path(user_info.pw_dir), user_info.pw_uid, user_info.pw_gid
def detect_system() -> SystemInfo:
values = _read_os_release()
package_manager = detect_package_manager()
user_name, user_home, uid, gid = resolve_target_user()
return SystemInfo(
distro_id=values.get("ID", "unknown"),
pretty_name=values.get("PRETTY_NAME", "Linux"),
package_manager=package_manager,
target_user=user_name,
target_home=user_home,
target_uid=uid,
target_gid=gid,
)