From df2a5774025a54deb0ad4588ea702c5a3e2d6958 Mon Sep 17 00:00:00 2001 From: kodi Date: Sat, 28 Feb 2026 13:00:20 +0100 Subject: [PATCH] refactor(api): move system endpoints into app_system router --- control/app.py | 38 +------------------------------- control/app_system.py | 51 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/control/app.py b/control/app.py index a80c82d..fa23611 100644 --- a/control/app.py +++ b/control/app.py @@ -5,7 +5,7 @@ from app_pods import init_pods_router from app_containers import init_containers_router, start_stats_poller from app_networks import init_networks_router from app_system import init_system_router -from fastapi import FastAPI, HTTPException +from fastapi import FastAPI import requests_unixsocket from common import ( _systemctl as _common_systemctl, @@ -24,10 +24,6 @@ async def _startup_stats_poller(): def _systemctl(cmd): return _common_systemctl(cmd, run) -def _run_systemctl_action(action: str, unit: str): - cmd = ["systemctl", "--user", action, unit] - return _systemctl(cmd) - # --- ROUTERS --- # Images API lives in dedicated modules to keep this file from growing further. app.include_router(init_system_router(SESSION, PODMAN_API_BASE, WORKLOADS_DIR)) @@ -48,38 +44,6 @@ app.include_router(init_pods_router( )) -@app.post("/daemon-reload") -def api_daemon_reload(): - try: - code, out = _systemctl(["systemctl", "--user", "daemon-reload"]) - return { - "cmd": "systemctl --user daemon-reload", - "exit": code, - "output": out, - } - except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) - - -@app.post("/{action}/{unit}") -def api_action(action: str, unit: str): - if action not in ("status", "start", "stop", "restart"): - raise HTTPException(status_code=400, detail="Invalid action") - cmd = ["systemctl", "--user", action, unit] - code, out = _run_systemctl_action(action, unit) - return {"cmd": " ".join(cmd), "exit": code, "output": out} - - -@app.post("/api//") -def legacy_api_action(action: str, unit: str): - # legacy flask-like path; keep behavior (even if not used by index.html) - if action not in ("status", "start", "stop", "restart"): - return {"error": "Invalid action"}, 400 - cmd = ["systemctl", "--user", action, unit] - code, out = _run_systemctl_action(action, unit) - return {"cmd": " ".join(cmd), "exit": code, "output": out} - - def run(cmd): try: result = subprocess.run(cmd, capture_output=True, text=True, check=False) diff --git a/control/app_system.py b/control/app_system.py index 50787b2..b442741 100644 --- a/control/app_system.py +++ b/control/app_system.py @@ -1,8 +1,11 @@ import os import subprocess -from fastapi import APIRouter -from common import _podman_get_json as _common_podman_get_json +from fastapi import APIRouter, HTTPException +from common import ( + _podman_get_json as _common_podman_get_json, + _systemctl as _common_systemctl, +) def init_system_router(session, podman_api_base: str, workloads_dir: str) -> APIRouter: @@ -65,4 +68,48 @@ def init_system_router(session, podman_api_base: str, workloads_dir: str) -> API "api_raw_sample": api_containers[0] if isinstance(api_containers, list) and api_containers else api_containers, } + def run(cmd): + try: + result = subprocess.run(cmd, capture_output=True, text=True, check=False) + output = (result.stdout or "") + (result.stderr or "") + return result.returncode, output.strip() + except Exception as e: + return 1, str(e) + + def _systemctl(cmd): + return _common_systemctl(cmd, run) + + def _run_systemctl_action(action: str, unit: str): + cmd = ["systemctl", "--user", action, unit] + return _systemctl(cmd) + + @router.post("/daemon-reload") + def api_daemon_reload(): + try: + code, out = _systemctl(["systemctl", "--user", "daemon-reload"]) + return { + "cmd": "systemctl --user daemon-reload", + "exit": code, + "output": out, + } + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + @router.post("/api//") + def legacy_api_action(action: str, unit: str): + # legacy flask-like path; keep behavior (even if not used by index.html) + if action not in ("status", "start", "stop", "restart"): + return {"error": "Invalid action"}, 400 + cmd = ["systemctl", "--user", action, unit] + code, out = _run_systemctl_action(action, unit) + return {"cmd": " ".join(cmd), "exit": code, "output": out} + + @router.post("/{action}/{unit}") + def api_action(action: str, unit: str): + if action not in ("status", "start", "stop", "restart"): + raise HTTPException(status_code=400, detail="Invalid action") + cmd = ["systemctl", "--user", action, unit] + code, out = _run_systemctl_action(action, unit) + return {"cmd": " ".join(cmd), "exit": code, "output": out} + return router