summaryrefslogtreecommitdiff
path: root/backend/decky_loader/localplatform/localplatformlinux.py
diff options
context:
space:
mode:
authorNao <nyaomicalabretta@gmail.com>2026-07-14 04:16:34 +0200
committerGitHub <noreply@github.com>2026-07-13 22:16:34 -0400
commitdfaeb0beb3c441cd42adc432d560fd450af87c14 (patch)
tree3de41aed7e73e4f75681d918e89c0b37713541d8 /backend/decky_loader/localplatform/localplatformlinux.py
parent91abff7811c6db3a80c9426c0c9a0a247a3ada37 (diff)
downloaddecky-loader-dfaeb0beb3c441cd42adc432d560fd450af87c14.tar.gz
decky-loader-dfaeb0beb3c441cd42adc432d560fd450af87c14.zip
feat: add OpenRC (Gentoo) + svcmgr check (Linux) (#927)
Co-authored-by: AAGaming <aagaming@riseup.net>
Diffstat (limited to 'backend/decky_loader/localplatform/localplatformlinux.py')
-rw-r--r--backend/decky_loader/localplatform/localplatformlinux.py77
1 files changed, 68 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