Files
gitlab-instance-0a899031_do…/web.py
Your Name 50b61d75fc s
2026-01-24 04:05:28 +00:00

72 lines
1.9 KiB
Python

from fastapi import FastAPI
from fastapi.responses import FileResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
import subprocess
from pathlib import Path
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
# ---------------- 配置 ----------------
BOT_NAME = "hdmi" # PM2 进程名
BASE_DIR = Path(__file__).parent
# 允许前端跨域访问
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# 静态文件
app.mount("/static", StaticFiles(directory=BASE_DIR), name="static")
# ---------------- PM2 控制 ----------------
def pm2_cmd(cmd: str):
try:
out = subprocess.check_output(f"pm2 {cmd}", shell=True, stderr=subprocess.STDOUT, text=True)
return out
except subprocess.CalledProcessError as e:
return e.output
def read_log(log_type="out", lines=50):
log_file = BASE_DIR.parent / f".pm2/logs/{BOT_NAME}-{log_type}.log"
try:
with open(log_file, "r", encoding="utf-8") as f:
content = f.readlines()[-lines:]
return "".join(content)
except FileNotFoundError:
return f"未找到日志文件: {log_file}"
@app.get("/start")
def start():
out = pm2_cmd(f"start {BOT_NAME}")
return JSONResponse({"action": "start", "output": out})
@app.get("/stop")
def stop():
out = pm2_cmd(f"stop {BOT_NAME} --no-autorestart")
return JSONResponse({"action": "stop", "output": out})
@app.get("/restart")
def restart():
out = pm2_cmd(f"restart {BOT_NAME}")
return JSONResponse({"action": "restart", "output": out})
@app.get("/status")
def status():
status = pm2_cmd(f"status {BOT_NAME}")
log = read_log("out", 50)
error_log = read_log("error", 50)
return JSONResponse({
"status": status,
"recent_log": log,
"recent_error": error_log
})
# ---------------- HTML ----------------
@app.get("/")
def index():
return FileResponse(BASE_DIR / "index.html")