183 lines
6.5 KiB
Python
183 lines
6.5 KiB
Python
# =============================================================================
|
||
# 外部系统集成 — 凭据配置脚本
|
||
# =============================================================================
|
||
# 用法:
|
||
# 1. 在下方填入真实凭据(替换 <填入...> 占位符)
|
||
# 2. 保存文件
|
||
# 3. 运行:cd backend && python -m scripts.setup_integrations
|
||
#
|
||
# 说明:
|
||
# - 脚本会将凭据写入 system_configs 数据库表
|
||
# - 已存在的配置键会更新,不会重复插入
|
||
# - 运行后可在管理后台 → 系统集成 页面查看和测试连接
|
||
# - 此文件已在 .gitignore 中排除,凭据不会提交到 Git
|
||
# =============================================================================
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 火绒企业版 — AccessKey 认证模式
|
||
# --------------------------------------------------------------------------
|
||
# 在火绒管理后台 → 系统设置 → API管理 中创建 AccessKey
|
||
HUORONG = {
|
||
# 火绒管理后台的内网API地址(含协议和端口)
|
||
"base_url": "<填入火绒Base URL,如 http://huorong.oa.servyou-it.com/:8080>",
|
||
|
||
# AccessKey ID(在火绒后台创建API密钥时生成)
|
||
"access_key_id": "59O8K6NSUW",
|
||
|
||
# AccessKey Secret(创建时仅显示一次,请妥善保管)
|
||
"access_key_secret": "VXM7B878BDUN0P5P5KYC",
|
||
}
|
||
|
||
# --------------------------------------------------------------------------
|
||
# 联软LV7000 — 账号密码认证模式
|
||
# --------------------------------------------------------------------------
|
||
# 在联软管理后台 → 系统设置 → API管理 中创建API账号
|
||
LIANRUAN = {
|
||
# 联软管理后台的内网API地址(含协议和端口,默认端口30098)
|
||
"base_url": "<填入联软Base URL,如 http://192.168.x.x:30098>",
|
||
|
||
# API账号
|
||
"api_account": "<填入API账号>",
|
||
|
||
# API密码
|
||
"api_password": "<填入API密码>",
|
||
|
||
# 验证密钥(部分版本需要,无则留空字符串)
|
||
"validate_key": "",
|
||
}
|
||
|
||
|
||
# ==========================================================================
|
||
# 以下为脚本逻辑,无需修改
|
||
# ==========================================================================
|
||
|
||
import asyncio
|
||
import sys
|
||
import os
|
||
|
||
# 将 backend 目录加入 Python 路径,以便导入 app 模块
|
||
sys.path.insert(0, os.path.join(os.path.dirname(__file__), ".."))
|
||
|
||
from sqlalchemy import select
|
||
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
|
||
from sqlalchemy.orm import sessionmaker
|
||
|
||
|
||
async def upsert_config(
|
||
session: AsyncSession,
|
||
key: str,
|
||
value: str,
|
||
description: str,
|
||
) -> None:
|
||
"""插入或更新一条配置记录。
|
||
|
||
如果 key 已存在则更新 value,否则插入新记录。
|
||
|
||
Args:
|
||
session: 数据库异步会话
|
||
key: 配置键(如 integration_huorong_base_url)
|
||
value: 配置值
|
||
description: 配置说明
|
||
"""
|
||
# 动态导入,避免在模块级别触发 app 初始化
|
||
from app.models.system_config import SystemConfig
|
||
|
||
# 查询是否已存在该配置键
|
||
result = await session.execute(
|
||
select(SystemConfig).where(SystemConfig.config_key == key)
|
||
)
|
||
existing = result.scalar_one_or_none()
|
||
|
||
if existing:
|
||
# 已存在 → 更新值
|
||
existing.config_value = value
|
||
print(f" ✏️ 更新: {key}")
|
||
else:
|
||
# 不存在 → 插入新记录
|
||
new_config = SystemConfig(
|
||
config_key=key,
|
||
config_value=value,
|
||
description=description,
|
||
)
|
||
session.add(new_config)
|
||
print(f" ➕ 新增: {key}")
|
||
|
||
|
||
async def setup_huorong(session: AsyncSession) -> None:
|
||
"""将火绒凭据写入数据库。
|
||
|
||
Args:
|
||
session: 数据库异步会话
|
||
"""
|
||
# 检查是否还是占位符
|
||
if HUORONG["base_url"].startswith("<"):
|
||
print("⏭️ 火绒:跳过(凭据未填写)")
|
||
return
|
||
|
||
print("\n🔥 配置火绒企业版...")
|
||
prefix = "integration_huorong_"
|
||
|
||
await upsert_config(session, f"{prefix}base_url", HUORONG["base_url"], "火绒 Base URL")
|
||
await upsert_config(session, f"{prefix}access_key_id", HUORONG["access_key_id"], "火绒 AccessKey ID")
|
||
await upsert_config(session, f"{prefix}access_key_secret", HUORONG["access_key_secret"], "火绒 AccessKey Secret")
|
||
|
||
await session.commit()
|
||
print(" ✅ 火绒配置已保存")
|
||
|
||
|
||
async def setup_lianruan(session: AsyncSession) -> None:
|
||
"""将联软凭据写入数据库。
|
||
|
||
Args:
|
||
session: 数据库异步会话
|
||
"""
|
||
# 检查是否还是占位符
|
||
if LIANRUAN["base_url"].startswith("<"):
|
||
print("⏭️ 联软:跳过(凭据未填写)")
|
||
return
|
||
|
||
print("\n💻 配置联软LV7000...")
|
||
prefix = "integration_lianruan_"
|
||
|
||
await upsert_config(session, f"{prefix}base_url", LIANRUAN["base_url"], "联软 Base URL")
|
||
await upsert_config(session, f"{prefix}api_account", LIANRUAN["api_account"], "联软 API账号")
|
||
await upsert_config(session, f"{prefix}api_password", LIANRUAN["api_password"], "联软 API密码")
|
||
await upsert_config(session, f"{prefix}validate_key", LIANRUAN["validate_key"], "联软 验证密钥")
|
||
|
||
await session.commit()
|
||
print(" ✅ 联软配置已保存")
|
||
|
||
|
||
async def main() -> None:
|
||
"""脚本主入口:读取数据库连接 → 写入凭据配置。"""
|
||
# 从 .env 或环境变量获取数据库连接地址
|
||
# 优先使用同步驱动(psycopg2),因为此脚本不需要异步数据库操作
|
||
database_url = os.environ.get("DATABASE_URL", "")
|
||
|
||
# 如果是 postgresql:// 开头(同步驱动格式),转为 asyncpg 格式
|
||
if database_url.startswith("postgresql://"):
|
||
database_url = database_url.replace("postgresql://", "postgresql+asyncpg://", 1)
|
||
|
||
# 回退到本地开发默认值
|
||
if not database_url:
|
||
database_url = "postgresql+asyncpg://postgres:postgres@localhost:5432/it_smart_desk"
|
||
print(f"⚠️ 未设置 DATABASE_URL,使用默认值: {database_url}")
|
||
|
||
print(f"📦 数据库: {database_url.split('@')[-1]}") # 只显示主机部分,隐藏密码
|
||
|
||
# 创建异步引擎和会话工厂
|
||
engine = create_async_engine(database_url, echo=False)
|
||
async_session = sessionmaker(engine, class_=AsyncSession, expire_on_commit=False)
|
||
|
||
async with async_session() as session:
|
||
await setup_huorong(session)
|
||
await setup_lianruan(session)
|
||
|
||
# 关闭引擎连接池
|
||
await engine.dispose()
|
||
print("\n🎉 配置完成!请在管理后台 → 系统集成 中测试连接")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|