mirror of https://github.com/Mai-with-u/MaiBot.git
104 lines
2.8 KiB
Python
104 lines
2.8 KiB
Python
"""
|
||
系统控制路由
|
||
|
||
提供系统重启、状态查询等功能
|
||
"""
|
||
|
||
import os
|
||
import time
|
||
from datetime import datetime
|
||
from fastapi import APIRouter, HTTPException
|
||
from pydantic import BaseModel
|
||
from src.config.config import MMC_VERSION
|
||
from src.common.logger import get_logger
|
||
|
||
router = APIRouter(prefix="/system", tags=["system"])
|
||
logger = get_logger("webui_system")
|
||
|
||
# 记录启动时间
|
||
_start_time = time.time()
|
||
|
||
|
||
class RestartResponse(BaseModel):
|
||
"""重启响应"""
|
||
|
||
success: bool
|
||
message: str
|
||
|
||
|
||
class StatusResponse(BaseModel):
|
||
"""状态响应"""
|
||
|
||
running: bool
|
||
uptime: float
|
||
version: str
|
||
start_time: str
|
||
|
||
|
||
@router.post("/restart", response_model=RestartResponse)
|
||
async def restart_maibot():
|
||
"""
|
||
重启麦麦主程序
|
||
|
||
请求重启当前进程,配置更改将在重启后生效。
|
||
注意:此操作会使麦麦暂时离线。
|
||
"""
|
||
import asyncio
|
||
|
||
try:
|
||
# 记录重启操作
|
||
logger.info("WebUI 触发重启操作")
|
||
|
||
# 定义延迟重启的异步任务
|
||
async def delayed_restart():
|
||
await asyncio.sleep(0.5) # 延迟0.5秒,确保响应已发送
|
||
# 使用 os._exit(42) 退出当前进程,配合外部 runner 脚本进行重启
|
||
# 42 是约定的重启状态码
|
||
logger.info("WebUI 请求重启,退出代码 42")
|
||
os._exit(42)
|
||
|
||
# 创建后台任务执行重启
|
||
asyncio.create_task(delayed_restart())
|
||
|
||
# 立即返回成功响应
|
||
return RestartResponse(success=True, message="麦麦正在重启中...")
|
||
except Exception as e:
|
||
raise HTTPException(status_code=500, detail=f"重启失败: {str(e)}") from e
|
||
|
||
|
||
@router.get("/status", response_model=StatusResponse)
|
||
async def get_maibot_status():
|
||
"""
|
||
获取麦麦运行状态
|
||
|
||
返回麦麦的运行状态、运行时长和版本信息。
|
||
"""
|
||
try:
|
||
uptime = time.time() - _start_time
|
||
|
||
# 尝试获取版本信息(需要根据实际情况调整)
|
||
version = MMC_VERSION # 可以从配置或常量中读取
|
||
|
||
return StatusResponse(
|
||
running=True, uptime=uptime, version=version, start_time=datetime.fromtimestamp(_start_time).isoformat()
|
||
)
|
||
except Exception as e:
|
||
raise HTTPException(status_code=500, detail=f"获取状态失败: {str(e)}") from e
|
||
|
||
|
||
# 可选:添加更多系统控制功能
|
||
|
||
|
||
@router.post("/reload-config")
|
||
async def reload_config():
|
||
"""
|
||
热重载配置(不重启进程)
|
||
|
||
仅重新加载配置文件,某些配置可能需要重启才能生效。
|
||
此功能需要在主程序中实现配置热重载逻辑。
|
||
"""
|
||
# 这里需要调用主程序的配置重载函数
|
||
# 示例:await app_instance.reload_config()
|
||
|
||
return {"success": True, "message": "配置重载功能待实现"}
|