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")
|
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
|
# subprocess._ENV
|
||||||
ENV = Mapping[str, str]
|
ENV = Mapping[str, str]
|
||||||
ProcessIO = int | IO[Any] | None
|
ProcessIO = int | IO[Any] | None
|
||||||
@@ -138,16 +157,36 @@ def setuid(user : UserType = UserType.HOST_USER):
|
|||||||
raise Exception("Unknown user type")
|
raise Exception("Unknown user type")
|
||||||
|
|
||||||
async def service_active(service_name : str) -> bool:
|
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
|
return res.returncode == 0
|
||||||
|
|
||||||
async def service_restart(service_name : str, block : bool = True) -> bool:
|
async def service_restart(service_name : str, block : bool = True) -> bool:
|
||||||
await run(["systemctl", "daemon-reload"])
|
match service_manager:
|
||||||
logger.info("Systemd reload done.")
|
case "systemd":
|
||||||
cmd = ["systemctl", "restart", service_name]
|
await run(["systemctl", "daemon-reload"])
|
||||||
|
logger.info("Systemd reload done.")
|
||||||
|
cmd = ["systemctl", "restart", service_name]
|
||||||
|
|
||||||
if not block:
|
if not block:
|
||||||
cmd.append("--no-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)
|
res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT)
|
||||||
return res.returncode == 0
|
return res.returncode == 0
|
||||||
@@ -157,7 +196,17 @@ async def service_stop(service_name : str) -> bool:
|
|||||||
# Service isn't running. pretend we stopped it
|
# Service isn't running. pretend we stopped it
|
||||||
return True
|
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)
|
res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT)
|
||||||
return res.returncode == 0
|
return res.returncode == 0
|
||||||
|
|
||||||
@@ -166,7 +215,17 @@ async def service_start(service_name : str) -> bool:
|
|||||||
# Service is running. pretend we started it
|
# Service is running. pretend we started it
|
||||||
return True
|
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)
|
res, _, _ = await run(cmd, stdout=PIPE, stderr=STDOUT)
|
||||||
return res.returncode == 0
|
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