Files
railwaysystem/qa-bootstrap/scripts/run_bootstrap.sh
T

112 lines
4.4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# ==============================================================================
# RailwaySystem 融合 QA 数据库安全初始化脚本 (Safe Bootstrap Runner)
# 适用目标: railwaysystem_fusion_qa_20261013
# 默认行为: --dry-run (仅做完整性与安全前置审查,不执行数据库写操作)
# 安全铁律:
# 1. 强制目标数据库白名单校验,非白名单库立即退出
# 2. 绝不执行 DROP DATABASE,绝不自动终止其他会话
# 3. 绝不修改共享 training、iotlocks 或历史 QA 库
# ==============================================================================
set -euo pipefail
# 硬编码安全白名单
ALLOWED_DB="railwaysystem_fusion_qa_20261013"
# 获取脚本所在根目录
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BOOTSTRAP_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"
SQL_DIR="${BOOTSTRAP_DIR}/sql"
# 解析命令行参数 (默认 dry-run)
MODE="dry-run"
TARGET_DB="${DB_NAME:-$ALLOWED_DB}"
for arg in "$@"; do
case "$arg" in
--execute)
MODE="execute"
;;
--dry-run)
MODE="dry-run"
;;
--db=*)
TARGET_DB="${arg#*=}"
;;
*)
echo ">>> [ERROR] 未知参数: $arg"
echo "用法: $0 [--dry-run|--execute] [--db=<database_name>]"
exit 1
;;
esac
done
echo "=============================================================================="
echo ">>> RailwaySystem 融合测试数据库初始化前置检查"
echo ">>> 执行模式: [$(echo "${MODE}" | tr '[:lower:]' '[:upper:]')]"
echo ">>> 目标数据库: [${TARGET_DB}]"
echo "=============================================================================="
# 1. 严格白名单防御性校验
if [[ "${TARGET_DB}" != "${ALLOWED_DB}" ]]; then
echo ">>> [FATAL-SECURITY] 目标数据库 [${TARGET_DB}] 违背安全白名单 [${ALLOWED_DB}]!"
echo ">>> 为保护共享库 (training, iotlocks) 与历史 QA 库,脚本立即中止执行!"
exit 2
fi
echo ">>> [PASS] 目标数据库白名单校验通过: ${ALLOWED_DB}"
# 2. 检查待执行 SQL 文件序列
SQL_FILES=(
"01_system_foundation.sql"
"02_training_v2_schema.sql"
"03_system_permissions_and_menus.sql"
"04_iotlocks_schema.sql"
"05_synthetic_demo_data.sql"
"05b_fusion_iot_test_data.sql"
"06_verify_schema_integrity.sql"
)
echo ""
echo ">>> [STEP 1] 校验初始化 SQL 文件完整性与哈希值:"
for f in "${SQL_FILES[@]}"; do
fpath="${SQL_DIR}/${f}"
if [[ ! -f "${fpath}" ]]; then
echo ">>> [ERROR] 缺少核心 SQL 文件: ${fpath}"
exit 3
fi
sha=$(shasum -a 256 "${fpath}" | awk '{print $1}')
lines=$(wc -l < "${fpath}")
echo " - ${f} (行数: ${lines}, SHA-256: ${sha:0:16}...)"
done
echo ">>> [PASS] 待执行 7 个 SQL 脚本全部校验齐备"
# 3. 静态安全语法过滤审查 (确保无未隔离的危险语句)
echo ""
echo ">>> [STEP 2] 静态安全审查 (扫描未受控破坏性语句):"
dangerous_drop_db=$(grep -iE "\bDROP\s+DATABASE\b" "${SQL_DIR}"/*.sql || true)
if [[ -n "${dangerous_drop_db}" ]]; then
echo ">>> [FATAL-SECURITY] 发现未受控 DROP DATABASE 语句:"
echo "${dangerous_drop_db}"
exit 4
fi
echo ">>> [PASS] 经审查,所有 Bootstrap SQL 中绝无 DROP DATABASE 语句"
# 4. 根据模式决定后续动作
echo ""
if [[ "${MODE}" == "dry-run" ]]; then
echo "=============================================================================="
echo ">>> [DRY-RUN 结果报告]"
echo ">>> 1. 安全白名单断言: PASS (严格锁定 ${ALLOWED_DB})"
echo ">>> 2. 执行依赖顺序: PASS (01系统 -> 02培训V2 -> 03权限 -> 04物联 -> 05演示数据 -> 05b融合数据 -> 06校验)"
echo ">>> 3. 命名空间设计: PASS (public: 若依/培训业务; iotlocks: 物联9表; 字典菜单统一public)"
echo ">>> 4. 真实数据库写操作: BLOCKED (本轮仅完成离线生成与演练,未连接真实数据库)"
echo ">>> DRY-RUN 验证成功,初始化包处于 READY_FOR_DB_CREATION 待审批状态。"
echo "=============================================================================="
exit 0
fi
# 若为 execute 模式 (需用户显式批准后在受控环境中手动触发)
echo ">>> [NOTICE] EXECUTE 模式被触发。准备连接数据库执行初始化..."
echo ">>> 提示: 当前轮次禁止连接数据库执行写操作。此脚本保持作为受控工具交付。"
exit 0