From af313557ddc129fa81dfc5d8936a00b3b1a45201 Mon Sep 17 00:00:00 2001 From: Nose Date: Fri, 23 Jan 2026 03:10:40 -0800 Subject: [PATCH] f --- scripts/run_client.py | 79 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 2 deletions(-) diff --git a/scripts/run_client.py b/scripts/run_client.py index 05833e8..e272b26 100644 --- a/scripts/run_client.py +++ b/scripts/run_client.py @@ -375,9 +375,9 @@ def install_service_systemd( if os.name != "nt" and hasattr(os, "geteuid") and os.geteuid() == 0: print( - "Running as root; systemd user services aren’t available. Falling back to cron @reboot." + "Running as root; installing system-wide systemd service instead." ) - return install_service_cron( + return install_service_systemd_system( service_name, repo_root, venv_py, @@ -456,6 +456,81 @@ def install_service_systemd( return False +def install_service_systemd_system( + service_name: str, + repo_root: Path, + venv_py: Path, + headless: bool = True, + detached: bool = True, + pull: bool = False, + workspace_root: Optional[Path] = None, +) -> bool: + try: + systemctl = shutil.which("systemctl") + if not systemctl: + print( + "systemctl not available; falling back to crontab @reboot (if present)." + ) + return install_service_cron( + service_name, + repo_root, + venv_py, + headless, + detached, + pull=pull, + workspace_root=workspace_root, + ) + + unit_dir = Path("/etc/systemd/system") + service_file = unit_dir / f"{service_name}.service" + unit_dir.mkdir(parents=True, exist_ok=True) + + local_helper = repo_root / "run_client.py" + if not local_helper.exists(): + local_helper = repo_root / "scripts" / "run_client.py" + target_script = local_helper if local_helper.exists() else Path(__file__).resolve() + + exec_args = f'"{venv_py}" "{target_script}" --detached ' + if headless: + exec_args += "--headless " + if pull: + exec_args += "--pull " + exec_args += f'--repo-root "{repo_root}" ' + + content = ( + "[Unit]\n" + "Description=Medios-Macina Client (system service)\n" + "After=network.target\n\n" + "[Service]\n" + "Type=simple\n" + f"ExecStart={exec_args}\n" + f"WorkingDirectory={repo_root}\n" + "Restart=on-failure\n" + "Environment=PYTHONUNBUFFERED=1\n" + "[Install]\n" + "WantedBy=multi-user.target\n" + ) + service_file.write_text(content, encoding="utf-8") + + for cmd in [ + [systemctl, "daemon-reload"], + [systemctl, "enable", "--now", f"{service_name}.service"], + ]: + subprocess.run(cmd, check=True) + + print(f"system-wide systemd service '{service_name}' enabled and started.") + return True + except subprocess.CalledProcessError as exc: + print("Failed to install system-wide service:", exc) + return False + except PermissionError as exc: + print("Permission denied while writing systemd unit:", exc) + return False + except Exception as exc: + print("system-wide install error:", exc) + return False + + def uninstall_service_systemd(service_name: str) -> bool: try: systemctl = shutil.which("systemctl")