mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 00:58:34 +00:00
feat: comprehensive module system and database management improvements
This commit introduces major enhancements to the module installation system, database management, and configuration handling for AzerothCore deployments. ## Module System Improvements ### Module SQL Staging & Installation - Refactor module SQL staging to properly handle AzerothCore's sql/ directory structure - Fix SQL staging path to use correct AzerothCore format (sql/custom/db_*/*) - Implement conditional module database importing based on enabled modules - Add support for both cpp-modules and lua-scripts module types - Handle rsync exit code 23 (permission warnings) gracefully during deployment ### Module Manifest & Automation - Add automated module manifest generation via GitHub Actions workflow - Implement Python-based module manifest updater with comprehensive validation - Add module dependency tracking and SQL file discovery - Support for blocked modules and module metadata management ## Database Management Enhancements ### Database Import System - Add db-guard container for continuous database health monitoring and verification - Implement conditional database import that skips when databases are current - Add backup restoration and SQL staging coordination - Support for Playerbots database (4th database) in all import operations - Add comprehensive database health checking and status reporting ### Database Configuration - Implement 10 new dbimport.conf settings from environment variables: - Database.Reconnect.Seconds/Attempts for connection reliability - Updates.AllowedModules for module auto-update control - Updates.Redundancy for data integrity checks - Worker/Synch thread settings for all three core databases - Auto-apply dbimport.conf settings via auto-post-install.sh - Add environment variable injection for db-import and db-guard containers ### Backup & Recovery - Fix backup scheduler to prevent immediate execution on container startup - Add backup status monitoring script with detailed reporting - Implement backup import/export utilities - Add database verification scripts for SQL update tracking ## User Import Directory - Add new import/ directory for user-provided database files and configurations - Support for custom SQL files, configuration overrides, and example templates - Automatic import of user-provided databases and configs during initialization - Documentation and examples for custom database imports ## Configuration & Environment - Eliminate CLIENT_DATA_VERSION warning by adding default value syntax - Improve CLIENT_DATA_VERSION documentation in .env.template - Add comprehensive database import settings to .env and .env.template - Update setup.sh to handle new configuration variables with proper defaults ## Monitoring & Debugging - Add status dashboard with Go-based terminal UI (statusdash.go) - Implement JSON status output (statusjson.sh) for programmatic access - Add comprehensive database health check script - Add repair-storage-permissions.sh utility for permission issues ## Testing & Documentation - Add Phase 1 integration test suite for module installation verification - Add comprehensive documentation for: - Database management (DATABASE_MANAGEMENT.md) - Module SQL analysis (AZEROTHCORE_MODULE_SQL_ANALYSIS.md) - Implementation mapping (IMPLEMENTATION_MAP.md) - SQL staging comparison and path coverage - Module assets and DBC file requirements - Update SCRIPTS.md, ADVANCED.md, and troubleshooting documentation - Update references from database-import/ to import/ directory ## Breaking Changes - Renamed database-import/ directory to import/ for clarity - Module SQL files now staged to AzerothCore-compatible paths - db-guard container now required for proper database lifecycle management ## Bug Fixes - Fix module SQL staging directory structure for AzerothCore compatibility - Handle rsync exit code 23 gracefully during deployments - Prevent backup from running immediately on container startup - Correct SQL staging paths for proper module installation
This commit is contained in:
139
scripts/bash/repair-storage-permissions.sh
Executable file
139
scripts/bash/repair-storage-permissions.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/bin/bash
|
||||
# Normalize permissions across storage/ and local-storage/ so host processes
|
||||
# (and CI tools) can read/write module metadata without manual chown.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||||
ENV_FILE="$PROJECT_ROOT/.env"
|
||||
TEMPLATE_FILE="$PROJECT_ROOT/.env.template"
|
||||
|
||||
usage(){
|
||||
cat <<'EOF'
|
||||
Usage: repair-storage-permissions.sh [options]
|
||||
|
||||
Ensures common storage directories are writable by the current host user.
|
||||
|
||||
Options:
|
||||
--path <dir> Additional directory to fix (can be passed multiple times)
|
||||
--silent Reduce output (only errors/warnings)
|
||||
-h, --help Show this help message
|
||||
EOF
|
||||
}
|
||||
|
||||
read_env(){
|
||||
local key="$1" default="$2" env_path="$ENV_FILE" value=""
|
||||
if [ -f "$env_path" ]; then
|
||||
value="$(grep -E "^${key}=" "$env_path" | tail -n1 | cut -d'=' -f2- | tr -d '\r')"
|
||||
fi
|
||||
if [ -z "$value" ] && [ -f "$TEMPLATE_FILE" ]; then
|
||||
value="$(grep -E "^${key}=" "$TEMPLATE_FILE" | tail -n1 | cut -d'=' -f2- | tr -d '\r')"
|
||||
fi
|
||||
if [ -z "$value" ]; then
|
||||
value="$default"
|
||||
fi
|
||||
printf '%s\n' "$value"
|
||||
}
|
||||
|
||||
silent=0
|
||||
declare -a extra_paths=()
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
--path)
|
||||
shift
|
||||
[ $# -gt 0 ] || { echo "Missing value for --path" >&2; exit 1; }
|
||||
extra_paths+=("$1")
|
||||
;;
|
||||
--silent)
|
||||
silent=1
|
||||
;;
|
||||
-h|--help)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1" >&2
|
||||
usage
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
log(){ [ "$silent" -eq 1 ] || echo "$*"; }
|
||||
warn(){ echo "⚠️ $*" >&2; }
|
||||
|
||||
resolve_path(){
|
||||
local path="$1"
|
||||
if [[ "$path" != /* ]]; then
|
||||
path="${path#./}"
|
||||
path="$PROJECT_ROOT/$path"
|
||||
fi
|
||||
printf '%s\n' "$(cd "$(dirname "$path")" 2>/dev/null && pwd 2>/dev/null)/$(basename "$path")"
|
||||
}
|
||||
|
||||
ensure_host_writable(){
|
||||
local target="$1"
|
||||
[ -n "$target" ] || return 0
|
||||
mkdir -p "$target" 2>/dev/null || true
|
||||
[ -d "$target" ] || { warn "Path not found: $target"; return 0; }
|
||||
|
||||
local uid gid
|
||||
uid="$(id -u)"
|
||||
gid="$(id -g)"
|
||||
|
||||
if chown -R "$uid":"$gid" "$target" 2>/dev/null; then
|
||||
:
|
||||
elif command -v docker >/dev/null 2>&1; then
|
||||
local helper_image
|
||||
helper_image="$(read_env ALPINE_IMAGE "alpine:latest")"
|
||||
if ! docker run --rm -u 0:0 -v "$target":/workspace "$helper_image" \
|
||||
sh -c "chown -R ${uid}:${gid} /workspace" >/dev/null 2>&1; then
|
||||
warn "Failed to adjust ownership for $target"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
warn "Cannot adjust ownership for $target (docker unavailable)"
|
||||
return 1
|
||||
fi
|
||||
|
||||
chmod -R ug+rwX "$target" 2>/dev/null || true
|
||||
return 0
|
||||
}
|
||||
|
||||
STORAGE_PATH="$(read_env STORAGE_PATH "./storage")"
|
||||
LOCAL_STORAGE_PATH="$(read_env STORAGE_PATH_LOCAL "./local-storage")"
|
||||
|
||||
declare -a targets=(
|
||||
"$STORAGE_PATH"
|
||||
"$STORAGE_PATH/modules"
|
||||
"$STORAGE_PATH/modules/.modules-meta"
|
||||
"$STORAGE_PATH/backups"
|
||||
"$STORAGE_PATH/logs"
|
||||
"$STORAGE_PATH/lua_scripts"
|
||||
"$STORAGE_PATH/install-markers"
|
||||
"$STORAGE_PATH/client-data"
|
||||
"$STORAGE_PATH/config"
|
||||
"$LOCAL_STORAGE_PATH"
|
||||
"$LOCAL_STORAGE_PATH/modules"
|
||||
"$LOCAL_STORAGE_PATH/client-data-cache"
|
||||
"$LOCAL_STORAGE_PATH/source"
|
||||
"$LOCAL_STORAGE_PATH/images"
|
||||
)
|
||||
|
||||
targets+=("${extra_paths[@]}")
|
||||
|
||||
declare -A seen=()
|
||||
for raw in "${targets[@]}"; do
|
||||
[ -n "$raw" ] || continue
|
||||
resolved="$(resolve_path "$raw")"
|
||||
if [ -n "${seen[$resolved]:-}" ]; then
|
||||
continue
|
||||
fi
|
||||
seen["$resolved"]=1
|
||||
log "🔧 Fixing permissions for $resolved"
|
||||
ensure_host_writable "$resolved"
|
||||
done
|
||||
|
||||
log "✅ Storage permissions refreshed"
|
||||
Reference in New Issue
Block a user