100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
工作手机 SDK - 数据库初始化脚本
|
||
用途:创建 MongoDB 集合与索引
|
||
执行:cd sdk/app && python3 scripts/init_db.py
|
||
前置:MongoDB 已启动;若开启认证,需在 .env 中配置 MONGO_URI(含用户名密码)。
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
|
||
# 添加项目根目录
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
from pymongo import MongoClient
|
||
from pymongo.errors import CollectionInvalid
|
||
from config import settings
|
||
|
||
|
||
def init_database():
|
||
"""初始化 workphone_sdk 数据库"""
|
||
client = MongoClient(settings.MONGO_URI)
|
||
db = client[settings.MONGO_DB]
|
||
|
||
print(f"=== 初始化数据库: {settings.MONGO_DB} ===")
|
||
|
||
# devices
|
||
try:
|
||
db.create_collection("devices")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.devices.create_index("device_id", unique=True)
|
||
db.devices.create_index("status")
|
||
db.devices.create_index("last_heartbeat")
|
||
print("✅ devices 索引已创建")
|
||
|
||
# commands
|
||
try:
|
||
db.create_collection("commands")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.commands.create_index("device_id")
|
||
db.commands.create_index("created_at")
|
||
print("✅ commands 索引已创建")
|
||
|
||
# execution_logs(可选,与 device_manager 保持一致)
|
||
try:
|
||
db.create_collection("execution_logs")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.execution_logs.create_index([("device_id", 1), ("created_at", -1)])
|
||
db.execution_logs.create_index([("script", 1), ("action", 1)])
|
||
try:
|
||
db.execution_logs.create_index(
|
||
"created_at", expireAfterSeconds=7776000
|
||
) # 90天
|
||
except Exception as e:
|
||
print(f"⚠️ execution_logs TTL 索引: {e}")
|
||
print("✅ execution_logs 索引已创建")
|
||
|
||
# capture_data(抓包用,可选)
|
||
try:
|
||
db.create_collection("capture_data")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.capture_data.create_index([("device_id", 1), ("timestamp", -1)])
|
||
db.capture_data.create_index("package")
|
||
try:
|
||
db.capture_data.create_index(
|
||
"timestamp", expireAfterSeconds=604800
|
||
) # 7天
|
||
except Exception as e:
|
||
print(f"⚠️ capture_data TTL 索引: {e}")
|
||
print("✅ capture_data 索引已创建")
|
||
|
||
# messages(消息持久化,可选)
|
||
try:
|
||
db.create_collection("messages")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.messages.create_index([("device_id", 1), ("created_at", -1)])
|
||
db.messages.create_index([("platform", 1), ("direction", 1)])
|
||
print("✅ messages 索引已创建")
|
||
|
||
# api_keys(API 密钥管理,可选)
|
||
try:
|
||
db.create_collection("api_keys")
|
||
except CollectionInvalid:
|
||
pass
|
||
db.api_keys.create_index("key", unique=True)
|
||
db.api_keys.create_index("tenant_id")
|
||
print("✅ api_keys 索引已创建")
|
||
|
||
print("\n=== 数据库初始化完成 ===")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
init_database()
|