diff --git a/backend/decky_loader/localplatform/localplatformlinux.py b/backend/decky_loader/localplatform/localplatformlinux.py index 21993e4c4..2e2f3a155 100644 --- a/backend/decky_loader/localplatform/localplatformlinux.py +++ b/backend/decky_loader/localplatform/localplatformlinux.py @@ -8,6 +8,25 @@ logger = logging.getLogger("localplatform") +def _get_service_manager() -> str: + try: + if isinstance(os.getenv("LINUX_SERVICE_MANAGER"), str): return os.getenv("LINUX_SERVICE_MANAGER") + link = os.path.realpath("/sbin/init") + if not link: raise Exception("This Linux installation doesn't have /sbin/init.") + service = os.path.basename(link) + match service: + case "openrc-init": + return "openrc" + case _: + if service != "init": return service + # Non-supervised or highly non-standard Linux installation + return "no_init" + except: + # As it's the most common, default to Systemd + return "systemd" + +service_manager = _get_service_manager() + # subprocess._ENV ENV = Mapping[str, str] ProcessIO = int | IO[Any] | None @@ -138,16 +157,36 @@ def setuid(user : UserType = UserType.HOST_USER): raise Exception("Unknown user type") async def service_active(service_name : str) -> bool: - res, _, _ = await run(["systemctl", "is-active", service_name], stdout=DEVNULL, stderr=DEVNULL) + match service_manager: + case "systemd": + cmd = ["systemctl", "is-active", service_name] + case "openrc": + cmd = ["rc-service"] + if _get_effective_user_id() != 0: cmd.append("--user") + cmd.append(service_name) + cmd.append("status") + case _: + return True # Stub unsupported services + + res, _, _ = await run(cmd, stdout=DEVNULL, stderr=DEVNULL) return res.returncode == 0 async def service_restart(service_name : str, block : bool = True) -> bool: - await run(["systemctl", "daemon-reload"]) - logger.info("Systemd reload done.") - cmd = ["systemctl", "restart", service_name] - - if not block: - cmd.append("--no-block") + match service_manager: + case "systemd": + await run(["systemctl", "daemon-reload"]) + logger.info("Systemd reload done.") + cmd = ["systemctl", "restart", service_name] + + if not block: + cmd.append("--no-block") + case "openrc": + cmd = ["rc-service"] + if _get_effective_user_id() != 0: cmd.append("--user") + cmd.append(service_name) + cmd.append("restart") + case _: + return True # Stub unsupported services res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT) return res.returncode == 0 @@ -157,7 +196,17 @@ async def service_stop(service_name : str) -> bool: # Service isn't running. pretend we stopped it return True - cmd = ["systemctl", "stop", service_name] + match service_manager: + case "systemd": + cmd = ["systemctl", "stop", service_name] + case "openrc": + cmd = ["rc-service"] + if _get_effective_user_id() != 0: cmd.append("--user") + cmd.append(service_name) + cmd.append("stop") + case _: + return True # Stub unsupported services + res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT) return res.returncode == 0 @@ -166,7 +215,17 @@ async def service_start(service_name : str) -> bool: # Service is running. pretend we started it return True - cmd = ["systemctl", "start", service_name] + match service_manager: + case "systemd": + cmd = ["systemctl", "start", service_name] + case "openrc": + cmd = ["rc-service"] + if _get_effective_user_id() != 0: cmd.append("--user") + cmd.append(service_name) + cmd.append("start") + case _: + return True # Stub unsupported services + res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT) return res.returncode == 0 diff --git a/dist/plugin_loader-prerelease.openrc b/dist/plugin_loader-prerelease.openrc new file mode 100644 index 000000000..aa649043c --- /dev/null +++ b/dist/plugin_loader-prerelease.openrc @@ -0,0 +1,13 @@ +#!/sbin/openrc-run + +export UNPRIVILEGED_PATH="${HOMEBREW_FOLDER}" +export PRIVILEGED_PATH="${HOMEBREW_FOLDER}" +export LOG_LEVEL="DEBUG" + +supervisor=supervise-daemon +directory="${HOMEBREW_FOLDER}/services" +command="${HOMEBREW_FOLDER}/services/PluginLoader" + +depend() { + need net +} diff --git a/dist/plugin_loader-release.openrc b/dist/plugin_loader-release.openrc new file mode 100644 index 000000000..5190a8b92 --- /dev/null +++ b/dist/plugin_loader-release.openrc @@ -0,0 +1,13 @@ +#!/sbin/openrc-run + +export UNPRIVILEGED_PATH="${HOMEBREW_FOLDER}" +export PRIVILEGED_PATH="${HOMEBREW_FOLDER}" +export LOG_LEVEL="INFO" + +supervisor=supervise-daemon +directory="${HOMEBREW_FOLDER}/services" +command="${HOMEBREW_FOLDER}/services/PluginLoader" + +depend() { + need net +}