diff --git a/assets-import.tar.gz b/assets-import.tar.gz new file mode 100644 index 0000000..e7544b3 Binary files /dev/null and b/assets-import.tar.gz differ diff --git a/scripts/deploy/import-assets.py b/scripts/deploy/import-assets.py new file mode 100644 index 0000000..990cfbb --- /dev/null +++ b/scripts/deploy/import-assets.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 +"""SafeSight 初始资产导入脚本 +将 edge 项目 configs 目录下的模板/场景/覆盖层导入管理端数据库 +用法: sudo python3 import-assets.py /tmp/configs +""" +import sys, os, json, sqlite3 +from datetime import datetime, timezone + +def main(): + configs_dir = sys.argv[1] if len(sys.argv) > 1 else "/tmp/configs" + db_path = "/opt/safesightd/data/app.db" + + if not os.path.isfile(db_path): + print(f"错误: 数据库文件不存在: {db_path}") + sys.exit(1) + + conn = sqlite3.connect(db_path) + now = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + kinds = [ + ("templates", "templates", ["name", "description", "body_json", "created_at", "updated_at"]), + ("profiles", "profiles", ["name", "primary_template_name", "business_name", "description", "body_json", "created_at", "updated_at"]), + ("overlays", "overlays", ["name", "description", "body_json", "created_at", "updated_at"]), + ] + + print("========== SafeSight 资产导入 ==========") + print(f"数据库: {db_path}") + print(f"配置源: {configs_dir}\n") + + for dir_name, table, cols in kinds: + src_dir = os.path.join(configs_dir, dir_name) + if not os.path.isdir(src_dir): + print(f" ⚠ 目录不存在: {src_dir}") + continue + + count = 0 + for fname in sorted(os.listdir(src_dir)): + if not fname.endswith(".json"): + continue + fpath = os.path.join(src_dir, fname) + name = fname[:-5] # remove .json + + with open(fpath, "r", encoding="utf-8") as f: + body = f.read() + + placeholders = ", ".join(["?" for _ in cols]) + col_names = ", ".join(cols) + + if table == "templates": + values = [name, "", body, now, now] + elif table == "overlays": + values = [name, "", body, now, now] + else: # profiles + values = [name, "", "", "", body, now, now] + + try: + conn.execute( + f"INSERT OR IGNORE INTO {table} ({col_names}) VALUES ({placeholders})", + values, + ) + count += 1 + print(f" ✓ {dir_name.rstrip('s')}: {name}") + except Exception as e: + print(f" ✗ {name}: {e}") + + conn.commit() + if count > 0: + print(f" → 导入 {count} 个\n") + + conn.close() + print("========== 导入完成 ==========") + print("\n请执行: sudo systemctl restart safesightd") + +if __name__ == "__main__": + main() diff --git a/scripts/deploy/import-assets.sh b/scripts/deploy/import-assets.sh new file mode 100644 index 0000000..f219c6c --- /dev/null +++ b/scripts/deploy/import-assets.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# SafeSight 初始资产导入脚本 +# 将 edge 项目 configs 目录下的模板/场景/覆盖层导入管理端数据库 +# 用法: sudo bash import-assets.sh + +set -e + +DB="/opt/safesightd/data/app.db" +CONFIGS_DIR="${1:-/tmp/configs}" + +if [ ! -f "$DB" ]; then + echo "错误: 数据库文件不存在: $DB" + exit 1 +fi + +if [ ! -d "$CONFIGS_DIR/templates" ]; then + echo "错误: configs 目录不存在: $CONFIGS_DIR" + echo "请先把 edge 项目的 configs/templates configs/profiles configs/overlays 复制到 $CONFIGS_DIR" + exit 1 +fi + +NOW=$(date -u +"%Y-%m-%dT%H:%M:%SZ") +T=0; P=0; O=0 + +import_json() { + local table="$1" name="$2" file="$3" + # 使用 base64 编码绕过 JSON 中的特殊字符问题 + local b64=$(cat "$file" | base64 -w0) + sqlite3 "$DB" "INSERT OR IGNORE INTO ${table} (name, description, body_json, created_at, updated_at) + VALUES ('${name}', '', CAST(X'$(echo -n "$b64" | base64 -d | xxd -p -c0 | tr -d '\n')' AS TEXT), '${NOW}', '${NOW}');" +} + +echo "========== SafeSight 资产导入 ==========" +echo "数据库: $DB" +echo "配置源: $CONFIGS_DIR" +echo "" + +# 导入模板 +for f in "$CONFIGS_DIR/templates"/*.json; do + [ -f "$f" ] || continue + name=$(basename "$f" .json) + import_json "templates" "$name" "$f" + echo " ✓ 模板: $name" + ((T++)) +done + +# 导入场景 +for f in "$CONFIGS_DIR/profiles"/*.json; do + [ -f "$f" ] || continue + name=$(basename "$f" .json) + import_json "profiles" "$name" "$f" + echo " ✓ 场景: $name" + ((P++)) +done + +# 导入覆盖层 +for f in "$CONFIGS_DIR/overlays"/*.json; do + [ -f "$f" ] || continue + name=$(basename "$f" .json) + import_json "overlays" "$name" "$f" + echo " ✓ 覆盖层: $name" + ((O++)) +done + +echo "" +echo "========== 导入完成 ==========" +echo "模板: $T 场景: $P 覆盖层: $O" +echo "" +echo "请执行: sudo systemctl restart safesightd"