feat(strategy_manager): 添加策略自动启动的白名单管理
实现全面的白名单管理系统,支持策略自动启动: - 添加 WhitelistManager 类用于持久化白名单配置存储 - 将白名单功能集成到 StrategyManager 核心模块 - 添加用于白名单 CRUD 操作的 REST API 端点 - 通过 start.py 创建用于白名单管理的 CLI 命令 - 更新前端 UI,添加白名单状态指示器和批量操作功能 - 实现每日 08:58 的自动启动调度 - 为白名单操作添加配置验证和日志记录 同时添加项目文档: - 代码格式规则(缩进、行长度、导入、命名) - 文件、变量、常量、函数、类的命名规范 - 受限制文件和目录的保护规则
This commit is contained in:
@@ -6,6 +6,7 @@ import logging
|
||||
from collections import deque
|
||||
from pathlib import Path
|
||||
|
||||
from contextlib import asynccontextmanager
|
||||
from fastapi import FastAPI, HTTPException, Query
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import FileResponse
|
||||
@@ -63,7 +64,7 @@ def get_git_commit_info():
|
||||
logger.warning(f"无法获取 Git 提交信息: {e}")
|
||||
return "获取 Git 信息失败"
|
||||
|
||||
# ================== 定时任务逻辑 (保持不变) ==================
|
||||
# ================== 定时任务逻辑 ==================
|
||||
|
||||
def scheduled_restart_task():
|
||||
"""
|
||||
@@ -94,10 +95,39 @@ def scheduled_restart_task():
|
||||
logger.info("⏰ [定时任务] 自动重启流程结束")
|
||||
|
||||
|
||||
# ================== FastAPI 事件钩子 (保持不变) ==================
|
||||
def scheduled_whitelist_auto_start():
|
||||
"""
|
||||
定时任务:白名单自动启动
|
||||
仅在 08:58 执行
|
||||
"""
|
||||
logger.info("⏰ [白名单定时任务] 触发白名单自动启动...")
|
||||
|
||||
@app.on_event("startup")
|
||||
async def start_scheduler():
|
||||
results = manager.auto_start_whitelist_strategies()
|
||||
|
||||
if not results:
|
||||
logger.info("⏰ [白名单定时任务] 今天已执行过或无需启动")
|
||||
return
|
||||
|
||||
success_count = sum(1 for v in results.values() if v)
|
||||
fail_count = len(results) - success_count
|
||||
|
||||
logger.info(f"⏰ [白名单定时任务] 完成: 成功 {success_count}, 失败 {fail_count}")
|
||||
|
||||
for name, success in results.items():
|
||||
if success:
|
||||
logger.info(f"✅ [白名单定时任务] {name} 启动成功")
|
||||
else:
|
||||
logger.error(f"❌ [白名单定时任务] {name} 启动失败")
|
||||
|
||||
|
||||
# ================== FastAPI 生命周期事件 (使用 lifespan 替代废弃的 on_event) ==================
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
"""
|
||||
FastAPI 生命周期管理器,替代废弃的 @app.on_event 装饰器
|
||||
"""
|
||||
# 原有重启任务 (08:58, 20:58)
|
||||
scheduler.add_job(
|
||||
scheduled_restart_task,
|
||||
CronTrigger(hour=8, minute=58),
|
||||
@@ -110,13 +140,29 @@ async def start_scheduler():
|
||||
id="restart_evening",
|
||||
replace_existing=True
|
||||
)
|
||||
|
||||
# 新增:白名单自动启动任务(仅 08:58)
|
||||
scheduler.add_job(
|
||||
scheduled_whitelist_auto_start,
|
||||
CronTrigger(hour=8, minute=58),
|
||||
id="whitelist_auto_start",
|
||||
replace_existing=True
|
||||
)
|
||||
|
||||
scheduler.start()
|
||||
logger.info("📅 定时任务调度器已启动 (计划时间: 08:58, 20:58)")
|
||||
logger.info("📅 定时任务调度器已启动")
|
||||
logger.info(" - 重启任务: 08:58, 20:58")
|
||||
logger.info(" - 白名单自动启动: 08:58")
|
||||
|
||||
yield
|
||||
|
||||
@app.on_event("shutdown")
|
||||
async def stop_scheduler():
|
||||
# 应用关闭时执行
|
||||
scheduler.shutdown()
|
||||
logger.info("📅 定时任务调度器已关闭")
|
||||
|
||||
|
||||
# ================== 初始化 ==================
|
||||
app = FastAPI(title="策略控制台", lifespan=lifespan)
|
||||
|
||||
|
||||
# ================== API 路由 ==================
|
||||
@@ -168,9 +214,66 @@ def get_logs(name: str, lines: int = Query(50, le=500)):
|
||||
raise HTTPException(500, f"读取日志失败: {e}")
|
||||
|
||||
|
||||
# ================== 静态文件挂载 (保持不变) ==================
|
||||
# 注意: 这里的路径是示例,请确保它与你的项目结构匹配
|
||||
# 假设你的HTML文件在 "frontend/" 目录下
|
||||
# ================== 白名单管理 API ==================
|
||||
|
||||
@app.get("/api/whitelist")
|
||||
def get_whitelist():
|
||||
"""获取白名单列表"""
|
||||
whitelist = manager.whitelist_manager.get_all()
|
||||
auto_start_status = manager.whitelist_manager.get_auto_start_status()
|
||||
return {
|
||||
"whitelist": whitelist,
|
||||
"auto_start_status": auto_start_status
|
||||
}
|
||||
|
||||
|
||||
@app.post("/api/whitelist/{name}/add")
|
||||
def add_to_whitelist(name: str):
|
||||
"""添加策略到白名单"""
|
||||
if manager.add_to_whitelist(name):
|
||||
return {"success": True, "message": f"已添加到白名单: {name}"}
|
||||
raise HTTPException(400, f"添加失败,策略可能已存在: {name}")
|
||||
|
||||
|
||||
@app.post("/api/whitelist/{name}/remove")
|
||||
def remove_from_whitelist(name: str):
|
||||
"""从白名单移除策略"""
|
||||
if manager.remove_from_whitelist(name):
|
||||
return {"success": True, "message": f"已从白名单移除: {name}"}
|
||||
raise HTTPException(400, f"移除失败,策略可能不在白名单中: {name}")
|
||||
|
||||
|
||||
@app.post("/api/whitelist/{name}/enable")
|
||||
def enable_in_whitelist(name: str):
|
||||
"""启用白名单中的策略"""
|
||||
if manager.set_whitelist_enabled(name, True):
|
||||
return {"success": True, "message": f"已启用: {name}"}
|
||||
raise HTTPException(400, f"操作失败,策略可能不在白名单中: {name}")
|
||||
|
||||
|
||||
@app.post("/api/whitelist/{name}/disable")
|
||||
def disable_in_whitelist(name: str):
|
||||
"""禁用白名单中的策略"""
|
||||
if manager.set_whitelist_enabled(name, False):
|
||||
return {"success": True, "message": f"已禁用: {name}"}
|
||||
raise HTTPException(400, f"操作失败,策略可能不在白名单中: {name}")
|
||||
|
||||
|
||||
@app.post("/api/whitelist/auto-start")
|
||||
def trigger_auto_start():
|
||||
"""手动触发白名单自动启动(用于测试)"""
|
||||
results = manager.auto_start_whitelist_strategies()
|
||||
return {
|
||||
"success": True,
|
||||
"results": results,
|
||||
"count": len(results),
|
||||
"success_count": sum(1 for v in results.values() if v),
|
||||
"fail_count": sum(1 for v in results.values() if not v)
|
||||
}
|
||||
|
||||
|
||||
# ================== 静态文件挂载 ==================
|
||||
# 服务前端构建文件
|
||||
app.mount("/static", StaticFiles(directory="frontend/dist"), name="static")
|
||||
|
||||
@app.get("/")
|
||||
|
||||
Reference in New Issue
Block a user