88 lines
2.8 KiB
Python
88 lines
2.8 KiB
Python
|
|
# =============================================================================
|
|||
|
|
# 企微IT智能服务台 — 火绒集成配置管理
|
|||
|
|
# =============================================================================
|
|||
|
|
# 说明:从系统配置表(system_configs)读取火绒 AccessKey/Secret/BaseUrl,
|
|||
|
|
# 构建火绒API客户端实例
|
|||
|
|
# =============================================================================
|
|||
|
|
|
|||
|
|
import logging
|
|||
|
|
from typing import Optional
|
|||
|
|
|
|||
|
|
from sqlalchemy import select
|
|||
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|||
|
|
|
|||
|
|
from app.models.system_config import SystemConfig
|
|||
|
|
from .client import HuorongClient
|
|||
|
|
from .exceptions import HuorongConfigError
|
|||
|
|
|
|||
|
|
logger = logging.getLogger(__name__)
|
|||
|
|
|
|||
|
|
# 火绒配置在 system_configs 表中的 key 前缀
|
|||
|
|
HUORONG_CONFIG_PREFIX = "integration_huorong_"
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def get_huorong_client(db: AsyncSession) -> HuorongClient:
|
|||
|
|
"""从系统配置表构建火绒API客户端。
|
|||
|
|
|
|||
|
|
读取 integration_huorong_ 前缀的配置项,构建 HuorongClient 实例。
|
|||
|
|
如果任何必填配置缺失,抛出 HuorongConfigError。
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
db: 数据库会话
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
HuorongClient: 已配置的火绒API客户端实例
|
|||
|
|
|
|||
|
|
Raises:
|
|||
|
|
HuorongConfigError: AccessKey ID/Secret/Base URL 任一缺失
|
|||
|
|
"""
|
|||
|
|
# 读取三个必填配置
|
|||
|
|
result = await db.execute(
|
|||
|
|
select(SystemConfig).where(
|
|||
|
|
SystemConfig.config_key.startswith(HUORONG_CONFIG_PREFIX)
|
|||
|
|
)
|
|||
|
|
)
|
|||
|
|
configs = list(result.scalars().all())
|
|||
|
|
|
|||
|
|
# 构建 key→value 映射
|
|||
|
|
config_map = {cfg.config_key: cfg.config_value for cfg in configs}
|
|||
|
|
|
|||
|
|
access_key_id = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_id", "")
|
|||
|
|
access_key_secret = config_map.get(f"{HUORONG_CONFIG_PREFIX}access_key_secret", "")
|
|||
|
|
base_url = config_map.get(f"{HUORONG_CONFIG_PREFIX}base_url", "")
|
|||
|
|
|
|||
|
|
# 校验必填项
|
|||
|
|
if not access_key_id or not access_key_secret or not base_url:
|
|||
|
|
missing = []
|
|||
|
|
if not access_key_id:
|
|||
|
|
missing.append("AccessKey ID")
|
|||
|
|
if not access_key_secret:
|
|||
|
|
missing.append("AccessKey Secret")
|
|||
|
|
if not base_url:
|
|||
|
|
missing.append("Base URL")
|
|||
|
|
raise HuorongConfigError(
|
|||
|
|
f"火绒集成配置不完整,缺失: {', '.join(missing)},请先在管理后台完成配置"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
return HuorongClient(
|
|||
|
|
access_key_id=access_key_id,
|
|||
|
|
access_key_secret=access_key_secret,
|
|||
|
|
base_url=base_url,
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
|
|||
|
|
async def is_huorong_configured(db: AsyncSession) -> bool:
|
|||
|
|
"""检查火绒集成是否已完整配置。
|
|||
|
|
|
|||
|
|
Args:
|
|||
|
|
db: 数据库会话
|
|||
|
|
|
|||
|
|
Returns:
|
|||
|
|
bool: 三项配置均存在且非空时返回 True
|
|||
|
|
"""
|
|||
|
|
try:
|
|||
|
|
client = await get_huorong_client(db)
|
|||
|
|
return bool(client.access_key_id and client.access_key_secret and client.base_url)
|
|||
|
|
except HuorongConfigError:
|
|||
|
|
return False
|