#!/bin/bash # 三层架构检查脚本 echo "================================================================================ MarkBase 三层架构检查 ================================================================================ " USER_HOME=$(eval echo ~${SUDO_USER:-$USER}) SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" DATA_DIR="${SCRIPT_DIR}/data" echo "数据目录: ${DATA_DIR}" echo "" # 检查目录结构 echo "1. 检查目录结构" echo "--------------------------------------------------------------------------------" check_directory() { local dir=$1 local name=$2 if [ -d "$dir" ]; then echo "✅ ${name} 目录存在: ${dir}" local count=$(ls "$dir"/*.sqlite 2>/dev/null | wc -l | tr -d ' ') echo " 数据库数量: ${count}" if [ $count -gt 0 ]; then ls -lh "$dir"/*.sqlite 2>/dev/null | awk '{print " - " $9 " (" $5 ")"}' fi else echo "❌ ${name} 目录不存在: ${dir}" fi echo "" } check_directory "${DATA_DIR}/admin" "Admin Layer" check_directory "${DATA_DIR}/groups" "Group Layer" check_directory "${DATA_DIR}/users" "User Layer" # 检查 Admin 数据库表结构 echo "2. 检查 Admin 数据库表结构" echo "--------------------------------------------------------------------------------" ADMIN_DB="${DATA_DIR}/admin/admin.sqlite" if [ -f "$ADMIN_DB" ]; then echo "✅ Admin 数据库存在: ${ADMIN_DB}" echo "" # 检查必需表 REQUIRED_TABLES=("system_config" "users" "groups" "permissions" "audit_logs") for table in "${REQUIRED_TABLES[@]}"; do if sqlite3 "${ADMIN_DB}" "SELECT name FROM sqlite_master WHERE type='table' AND name='${table}';" | grep -q "${table}"; then echo " ✅ ${table} 表存在" else echo " ❌ ${table} 表不存在" fi done echo "" # 检查默认管理员 echo "默认管理员检查:" if sqlite3 "${ADMIN_DB}" "SELECT username, role FROM users WHERE username='admin';" | grep -q "admin"; then echo " ✅ 默认管理员存在" sqlite3 "${ADMIN_DB}" "SELECT username, role, status FROM users WHERE username='admin';" | awk -F'|' '{print " 用户: " $1 ", 角色: " $2 ", 状态: " $3}' else echo " ❌ 默认管理员不存在" fi echo "" # 检查系统配置 echo "系统配置检查:" local config_count=$(sqlite3 "${ADMIN_DB}" "SELECT COUNT(*) FROM system_config;") if [ $config_count -gt 0 ]; then echo " ✅ 系统配置已初始化 (${config_count} 项)" else echo " ❌ 系统配置未初始化" fi else echo "❌ Admin 数据库不存在" fi echo "" # 检查群组数据库 echo "3. 检查 Group 数据库" echo "--------------------------------------------------------------------------------" GROUP_DIR="${DATA_DIR}/groups" if [ -d "$GROUP_DIR" ]; then local group_count=$(ls "$GROUP_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ') if [ $group_count -gt 0 ]; then echo "✅ 找到 ${group_count} 个群组数据库" echo "" # 检查每个群组数据库 for db in "$GROUP_DIR"/*.sqlite; do if [ -f "$db" ]; then local group_name=$(basename "$db" .sqlite | sed 's/group_//') echo "群组: ${group_name}" # 检查必需表 local has_members=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='group_members';" 2>/dev/null) local has_files=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='group_files';" 2>/dev/null) if [ -n "$has_members" ]; then echo " ✅ group_members 表存在" else echo " ❌ group_members 表不存在" fi if [ -n "$has_files" ]; then echo " ✅ group_files 表存在" else echo " ❌ group_files 表不存在" fi echo "" fi done else echo "⚠️ 未找到群组数据库" fi else echo "❌ Groups 目录不存在" fi echo "" # 检查用户数据库 echo "4. 检查 User 数据库" echo "--------------------------------------------------------------------------------" USER_DIR="${DATA_DIR}/users" if [ -d "$USER_DIR" ]; then local user_count=$(ls "$USER_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ') if [ $user_count -gt 0 ]; then echo "✅ 找到 ${user_count} 个用户数据库" echo "" # 检查每个用户数据库 for db in "$USER_DIR"/*.sqlite; do if [ -f "$db" ]; then local username=$(basename "$db" .sqlite) echo "用户: ${username}" # 检查必需表 local has_history=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='search_history';" 2>/dev/null) local has_bookmarks=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='user_bookmarks';" 2>/dev/null) local has_files=$(sqlite3 "$db" "SELECT name FROM sqlite_master WHERE type='table' AND name='user_files';" 2>/dev/null) [ -n "$has_history" ] && echo " ✅ search_history 表存在" || echo " ❌ search_history 表不存在" [ -n "$has_bookmarks" ] && echo " ✅ user_bookmarks 表存在" || echo " ❌ user_bookmarks 表不存在" [ -n "$has_files" ] && echo " ✅ user_files 表存在" || echo " ❌ user_files 表不存在" echo "" fi done else echo "⚠️ 未找到用户数据库" fi else echo "❌ Users 目录不存在" fi echo "" # 检查数据库隔离 echo "5. 检查数据库隔离" echo "--------------------------------------------------------------------------------" # 检查是否有数据库在错误的位置 WRONG_DB=$(find "${DATA_DIR}" -maxdepth 1 -name "*.sqlite" 2>/dev/null) if [ -n "$WRONG_DB" ]; then echo "❌ 发现数据库在错误的位置 (应该在子目录中):" echo "$WRONG_DB" else echo "✅ 所有数据库都在正确的位置" fi echo "" # 检查权限 echo "6. 检查文件权限" echo "--------------------------------------------------------------------------------" if [ -f "$ADMIN_DB" ]; then local admin_perms=$(stat -f "%Lp" "$ADMIN_DB" 2>/dev/null || stat -c "%a" "$ADMIN_DB" 2>/dev/null) if [ "$admin_perms" = "600" ] || [ "$admin_perms" = "644" ]; then echo "✅ Admin 数据库权限正确: ${admin_perms}" else echo "⚠️ Admin 数据库权限可能不安全: ${admin_perms} (建议: 600 或 644)" fi else echo "❌ Admin 数据库不存在" fi echo "" # 总结 echo "================================================================================ 检查总结 ================================================================================ " # 统计 ADMIN_EXISTS=$([ -f "$ADMIN_DB" ] && echo "✅" || echo "❌") GROUP_COUNT=$(ls "$GROUP_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ') USER_COUNT=$(ls "$USER_DIR"/*.sqlite 2>/dev/null | wc -l | tr -d ' ') echo "Admin Layer: ${ADMIN_EXISTS}" echo "Group Layer: $( [ $GROUP_COUNT -gt 0 ] && echo "✅ ${GROUP_COUNT} 个群组" || echo "❌ 无群组")" echo "User Layer: $( [ $USER_COUNT -gt 0 ] && echo "✅ ${USER_COUNT} 个用户" || echo "❌ 无用户")" echo "" if [ -f "$ADMIN_DB" ] && [ $USER_COUNT -gt 0 ]; then echo "✅ 三层架构已初始化" echo "" echo "建议:" echo "1. 使用 user_tool 修改默认管理员密码" echo "2. 创建更多群组和用户" echo "3. 配置权限和访问控制" else echo "❌ 三层架构未完全初始化" echo "" echo "建议:" echo "1. 运行初始化脚本:" echo " ./scripts/init_three_layer_db.sh" echo "2. 或手动创建数据库:" echo " 参考 docs/MARKBASE_THREE_LAYER_ARCHITECTURE.md" fi echo "" echo "================================================================================ "