refactor: SSH配置完全封装到UniversalDataFetcher

变更内容:

1. UniversalDataFetcher 新增方法:
   - get_ssh_config_from_env(): 从环境变量读取 SSH 配置
   - from_env(): 工厂方法,自动读取环境变量创建实例
   - get_ssh_status(): 返回 SSH 状态信息字典

2. flask_server.py 简化:
   - 移除 get_ssh_config() 函数(18行)
   - 移除 ssh_config 全局变量
   - get_fetcher() 使用 from_env()
   - / 和 /health 路由使用 get_ssh_status()

架构改进:
- SSH 配置逻辑完全封装在 UniversalDataFetcher
- flask_server.py 只依赖 fetcher 接口
- 减少 24 行重复代码
This commit is contained in:
2026-05-23 21:20:43 +08:00
parent 0f4295a144
commit b7f7a756b6
2 changed files with 63 additions and 33 deletions

View File

@@ -41,6 +41,42 @@ class UniversalDataFetcher:
- 对内:各资产类型独立方法,职责单一
"""
@staticmethod
def get_ssh_config_from_env() -> Optional[Dict]:
"""
从环境变量获取 SSH 配置
Returns:
SSH 配置字典或 None
"""
enabled = os.getenv('SSH_ENABLED', 'false').lower() == 'true'
if not enabled:
return None
return {
"enabled": True,
"host": os.getenv('SSH_HOST', ''),
"port": int(os.getenv('SSH_PORT', '22')),
"username": os.getenv('SSH_USERNAME', ''),
"key_path": os.getenv('SSH_KEY_PATH', 'hk_ecs.pem'),
"local_port": int(os.getenv('SSH_LOCAL_PORT', '1080')),
}
@classmethod
def from_env(cls, **kwargs) -> 'UniversalDataFetcher':
"""
从环境变量创建实例
Args:
**kwargs: 其他初始化参数use_cache, cache_dir 等)
Returns:
UniversalDataFetcher 实例
"""
ssh_config = cls.get_ssh_config_from_env()
return cls(ssh_config=ssh_config, **kwargs)
def __init__(
self,
ssh_config: Optional[Dict] = None,
@@ -103,6 +139,23 @@ class UniversalDataFetcher:
self._tunnel = None
self._tunnel_started = False
def get_ssh_status(self) -> Dict:
"""
获取 SSH 隧道状态
Returns:
SSH 状态信息字典
"""
enabled = self.ssh_config.get('enabled', False)
return {
"status": "enabled" if enabled else "disabled",
"host": self.ssh_config.get('host', '') if enabled else '',
"port": self.ssh_config.get('port', 22) if enabled else None,
"tunnel_started": self._tunnel_started,
"required_types": [t.value for t in self.SSH_REQUIRED_TYPES],
"description": "港美股/加密货币数据获取需要 SSH 隧道",
}
# ============================================================
# 统一入口(自动路由)
# ============================================================