mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-08-03 13:27:01 +03:00
feat: add OpenRC (Gentoo) + svcmgr check (Linux) (#927)
Co-authored-by: AAGaming <aagaming@riseup.net>
This commit is contained in:
@@ -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:
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
Vendored
+13
@@ -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
|
||||
}
|
||||
Vendored
+13
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user