feat: /tui-command endepunkt — ekte shell-eksekvering med timeout og auth

This commit is contained in:
Chris Christiansen 2026-07-02 17:32:57 +00:00
parent bc8eb70c16
commit 638f69d335

31
main.py
View File

@ -1068,3 +1068,34 @@ if __name__ == "__main__":
import uvicorn
port = int(os.environ.get("PORT", 8080))
uvicorn.run(app, host="0.0.0.0", port=port)
class TuiCommandRequest(BaseModel):
command: str
timeout: int = 30
async def _tui_command(request: Request, req: TuiCommandRequest):
import asyncio, shlex
cmd = req.command.strip()
if not cmd:
return JSONResponse({"output": "", "exit_code": 1, "error": "Tom kommando"})
try:
proc = await asyncio.create_subprocess_shell(
cmd,
stdout=asyncio.subprocess.PIPE,
stderr=asyncio.subprocess.PIPE,
cwd="/home/chris.christiansen/OSVauco",
)
stdout, stderr = await asyncio.wait_for(proc.communicate(), timeout=req.timeout)
return JSONResponse({
"output": stdout.decode(errors="replace"),
"stderr": stderr.decode(errors="replace"),
"exit_code": proc.returncode,
})
except asyncio.TimeoutError:
return JSONResponse({"output": "", "stderr": f"Timeout etter {req.timeout}s", "exit_code": 124})
except Exception as e:
return JSONResponse({"output": "", "stderr": str(e), "exit_code": 1})
app.add_api_route("/tui-command", endpoint=require_auth(_tui_command), methods=["POST"])