feat(strategy_manager): 添加策略自动启动的白名单管理
实现全面的白名单管理系统,支持策略自动启动: - 添加 WhitelistManager 类用于持久化白名单配置存储 - 将白名单功能集成到 StrategyManager 核心模块 - 添加用于白名单 CRUD 操作的 REST API 端点 - 通过 start.py 创建用于白名单管理的 CLI 命令 - 更新前端 UI,添加白名单状态指示器和批量操作功能 - 实现每日 08:58 的自动启动调度 - 为白名单操作添加配置验证和日志记录 同时添加项目文档: - 代码格式规则(缩进、行长度、导入、命名) - 文件、变量、常量、函数、类的命名规范 - 受限制文件和目录的保护规则
This commit is contained in:
@@ -12,6 +12,7 @@ import json # 确保导入json模块
|
||||
|
||||
# ==================== 动态路径配置 ====================
|
||||
from core.path_utils import add_project_root_to_path
|
||||
from core.whitelist_manager import WhitelistManager
|
||||
|
||||
# 添加项目根路径到sys.path
|
||||
PROJECT_ROOT = add_project_root_to_path()
|
||||
@@ -34,6 +35,10 @@ class StrategyManager:
|
||||
# 配置管理器日志
|
||||
self._setup_logger()
|
||||
|
||||
# 初始化白名单管理器
|
||||
self.whitelist_manager = WhitelistManager()
|
||||
self.logger.info("📋 白名单管理器已初始化")
|
||||
|
||||
self.strategies: Dict[str, Dict[str, Any]] = {}
|
||||
self.logger.info("🔄 正在加载策略配置...")
|
||||
self.load_strategies()
|
||||
@@ -109,15 +114,31 @@ class StrategyManager:
|
||||
self.logger.error("❌ 加载配置失败 %s: %s", config_file, e, exc_info=True)
|
||||
|
||||
def get_status(self) -> Dict[str, Any]:
|
||||
"""获取完整状态"""
|
||||
"""获取完整状态(包含白名单信息)"""
|
||||
self._refresh_status()
|
||||
return {
|
||||
|
||||
# 构建状态数据
|
||||
status = {
|
||||
"timestamp": datetime.now().isoformat(),
|
||||
"total": len(self.strategies),
|
||||
"running": sum(1 for s in self.strategies.values() if s["status"] == "running"),
|
||||
"strategies": self.strategies
|
||||
}
|
||||
|
||||
# 添加白名单信息到每个策略
|
||||
for name, info in status["strategies"].items():
|
||||
info["in_whitelist"] = self.whitelist_manager.is_in_whitelist(name)
|
||||
info["whitelist_enabled"] = self.whitelist_manager.is_enabled_in_whitelist(name)
|
||||
|
||||
# 添加自动启动状态
|
||||
auto_start_status = self.whitelist_manager.get_auto_start_status()
|
||||
status["whitelist_auto_start_today"] = auto_start_status["should_auto_start"]
|
||||
status["whitelist_last_date"] = auto_start_status["last_auto_start_date"]
|
||||
status["whitelist_total"] = auto_start_status["whitelist_count"]
|
||||
status["whitelist_enabled"] = auto_start_status["enabled_count"]
|
||||
|
||||
return status
|
||||
|
||||
def _refresh_status(self):
|
||||
"""刷新进程状态 - 双重验证"""
|
||||
for name, info in self.strategies.items():
|
||||
@@ -347,6 +368,121 @@ class StrategyManager:
|
||||
except Exception as e:
|
||||
self.logger.error("❌ 保存状态失败: %s", e, exc_info=True)
|
||||
|
||||
# ==================== 白名单管理方法 ====================
|
||||
|
||||
def add_to_whitelist(self, name: str) -> bool:
|
||||
"""
|
||||
添加策略到白名单
|
||||
|
||||
Args:
|
||||
name: 策略标识符
|
||||
|
||||
Returns:
|
||||
是否添加成功
|
||||
"""
|
||||
if name not in self.strategies:
|
||||
self.logger.error("❌ 策略不存在: %s", name)
|
||||
return False
|
||||
|
||||
if self.whitelist_manager.add(name, enabled=True):
|
||||
self.logger.info("✅ 添加到白名单: %s", name)
|
||||
self._save_status()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def remove_from_whitelist(self, name: str) -> bool:
|
||||
"""
|
||||
从白名单移除策略
|
||||
|
||||
Args:
|
||||
name: 策略标识符
|
||||
|
||||
Returns:
|
||||
是否移除成功
|
||||
"""
|
||||
if self.whitelist_manager.remove(name):
|
||||
self.logger.info("✅ 从白名单移除: %s", name)
|
||||
self._save_status()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def set_whitelist_enabled(self, name: str, enabled: bool) -> bool:
|
||||
"""
|
||||
设置策略在白名单中的启用状态
|
||||
|
||||
Args:
|
||||
name: 策略标识符
|
||||
enabled: 是否启用
|
||||
|
||||
Returns:
|
||||
是否设置成功
|
||||
"""
|
||||
if self.whitelist_manager.set_enabled(name, enabled):
|
||||
self.logger.info("✅ 设置白名单状态: %s -> %s", name, enabled)
|
||||
self._save_status()
|
||||
return True
|
||||
|
||||
return False
|
||||
|
||||
def auto_start_whitelist_strategies(self) -> Dict[str, bool]:
|
||||
"""
|
||||
自动启动白名单中所有未运行的策略
|
||||
一天只执行一次
|
||||
|
||||
Returns:
|
||||
Dict[str, bool]: 每个策略的启动结果
|
||||
"""
|
||||
if not self.whitelist_manager.should_auto_start_today():
|
||||
self.logger.info("⏰ 今天已经执行过自动启动,跳过")
|
||||
return {}
|
||||
|
||||
self.logger.info("🚀 开始执行白名单自动启动...")
|
||||
|
||||
results = {}
|
||||
whitelist = self.whitelist_manager.get_all()
|
||||
|
||||
for name, config in whitelist.items():
|
||||
if not config.get("enabled", True):
|
||||
self.logger.info("⏭️ 跳过禁用策略: %s", name)
|
||||
continue
|
||||
|
||||
if name not in self.strategies:
|
||||
self.logger.warning("⚠️ 策略不在系统中: %s", name)
|
||||
continue
|
||||
|
||||
# 检查是否已在运行
|
||||
if self._is_running(name):
|
||||
self.logger.info("✅ 策略已在运行: %s", name)
|
||||
results[name] = True
|
||||
continue
|
||||
|
||||
# 尝试启动
|
||||
self.logger.info("🚀 启动白名单策略: %s", name)
|
||||
success = self.start_strategy(name)
|
||||
|
||||
# 记录启动结果
|
||||
results[name] = success
|
||||
|
||||
if success:
|
||||
self.logger.info("✅ 白名单策略启动成功: %s", name)
|
||||
else:
|
||||
self.logger.error("❌ 白名单策略启动失败: %s", name)
|
||||
|
||||
# 更新日期
|
||||
self.whitelist_manager.update_last_auto_start_date(
|
||||
datetime.now().date().isoformat()
|
||||
)
|
||||
|
||||
# 统计结果
|
||||
success_count = sum(1 for v in results.values() if v)
|
||||
fail_count = len(results) - success_count
|
||||
|
||||
self.logger.info("📊 白名单自动启动完成: 成功 %d, 失败 %d", success_count, fail_count)
|
||||
|
||||
return results
|
||||
|
||||
|
||||
def print_status_table(status: Dict[str, Any]):
|
||||
"""格式化打印状态表格"""
|
||||
|
||||
Reference in New Issue
Block a user