Skip to content
Open
73 changes: 64 additions & 9 deletions backend/decky_loader/localplatform/localplatformlinux.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

logger = logging.getLogger("localplatform")

service_manager = _get_service_manager()

# subprocess._ENV
ENV = Mapping[str, str]
ProcessIO = int | IO[Any] | None
Expand All @@ -16,6 +18,19 @@ async def run(args: list[str], stdin: ProcessIO = DEVNULL, stdout: ProcessIO = P
proc_stdout, proc_stderr = await proc.communicate()
return (proc, proc_stdout, proc_stderr)

def _get_service_manager() -> str:
try:
link = os.path.realpath("/sbin/init")
service = os.path.basename(link)
match service_manager:
case "openrc-init":
return "openrc"
case _:
return service
except:
# As it's the most common, default to Systemd
return "systemd"

# Get the user id hosting the plugin loader
def _get_user_id() -> int:
return pwd.getpwnam(_get_user()).pw_uid
Expand Down Expand Up @@ -138,16 +153,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
Expand All @@ -157,7 +192,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

Expand All @@ -166,7 +211,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

Expand Down
13 changes: 13 additions & 0 deletions dist/plugin_loader-prerelease.openrc
Original file line number Diff line number Diff line change
@@ -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
}
13 changes: 13 additions & 0 deletions dist/plugin_loader-release.openrc
Original file line number Diff line number Diff line change
@@ -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
}
Loading