ui: avoid hangs (systemd-run no-block + timeouts for systemctl)

This commit is contained in:
beckline
2026-02-15 02:20:09 +03:00
parent 11a3eb1524
commit c287e98366

View File

@@ -917,13 +917,27 @@ RU: Применяет policy-rules и проверяет health. При оши
"systemd-run",
"--user",
"--scope",
"--no-block",
"--unit",
unit,
"--collect",
"--same-dir",
] + args
p = subprocess.run(run_cmd, capture_output=True, text=True, check=False)
try:
p = subprocess.run(
run_cmd,
capture_output=True,
text=True,
check=False,
timeout=6,
)
except subprocess.TimeoutExpired as e:
raise RuntimeError(
"systemd-run timed out (UI would freeze without this guard). "
"Try again or verify that systemd --user is responsive.\n\n"
f"command: {' '.join(run_cmd)}"
) from e
out = ((p.stdout or "") + (p.stderr or "")).strip()
if p.returncode != 0:
raise RuntimeError(f"systemd-run failed: {p.returncode}\n{out}".strip())
@@ -1154,14 +1168,19 @@ RU: Применяет policy-rules и проверяет health. При оши
return ""
def _systemctl_user(self, args: list[str]) -> tuple[int, str]:
cmd = ["systemctl", "--user"] + list(args or [])
try:
p = subprocess.run(
["systemctl", "--user"] + list(args or []),
cmd,
capture_output=True,
text=True,
check=False,
timeout=4,
)
out = ((p.stdout or "") + (p.stderr or "")).strip()
return int(p.returncode or 0), out
except subprocess.TimeoutExpired:
return 124, f"timeout running: {' '.join(cmd)}"
def _list_running_svpn_scopes(self) -> list[str]:
code, out = self._systemctl_user(