chore: initial baseline with P0-safety .gitignore
This commit is contained in:
@@ -0,0 +1,182 @@
|
||||
# =============================================================================
|
||||
# 外部系统集成 — 凭据配置脚本
|
||||
# =============================================================================
|
||||
# 用法:
|
||||
# 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())
|
||||
Reference in New Issue
Block a user