Files
wecom_it_smart_desk/scripts/setup_integrations.py
T

183 lines
6.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# =============================================================================
# 外部系统集成 — 凭据配置脚本
# =============================================================================
# 用法:
# 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())