summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/decky_loader/localplatform/localplatformlinux.py77
-rw-r--r--dist/plugin_loader-prerelease.openrc13
-rw-r--r--dist/plugin_loader-release.openrc13
3 files changed, 94 insertions, 9 deletions
diff --git a/backend/decky_loader/localplatform/localplatformlinux.py b/backend/decky_loader/localplatform/localplatformlinux.py
index 21993e4c..2d153e68 100644
--- a/backend/decky_loader/localplatform/localplatformlinux.py
+++ b/backend/decky_loader/localplatform/localplatformlinux.py
@@ -8,6 +8,25 @@ from ..enums import UserType
logger = logging.getLogger("localplatform")
+def _get_service_manager() -> str:
+ try:
+ if isinstance(os.getenv("LINUX_SERVICE_MANAGER"), str): return os.getenv("LINUX_SERVICE_MANAGER") # pyright: ignore[reportReturnType]
+ 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 00000000..aa649043
--- /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 00000000..5190a8b9
--- /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
+}