mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 00:58:34 +00:00
326 lines
12 KiB
Bash
326 lines
12 KiB
Bash
#!/bin/bash
|
||
|
||
# ==============================================
|
||
# AzerothCore Service Status Script
|
||
# ==============================================
|
||
# This script displays the current status of all AzerothCore services
|
||
# Usage: ./status.sh [--watch] [--logs]
|
||
|
||
set -e
|
||
|
||
# Change to the project root directory (parent of scripts directory)
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
|
||
cd "$PROJECT_ROOT"
|
||
|
||
# Colors for output
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
BLUE='\033[0;34m'
|
||
MAGENTA='\033[0;35m'
|
||
CYAN='\033[0;36m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Options
|
||
WATCH_MODE=false
|
||
SHOW_LOGS=false
|
||
LOG_LINES=5
|
||
|
||
# Parse command line arguments
|
||
while [[ $# -gt 0 ]]; do
|
||
case $1 in
|
||
--watch|-w)
|
||
WATCH_MODE=true
|
||
shift
|
||
;;
|
||
--logs|-l)
|
||
SHOW_LOGS=true
|
||
shift
|
||
;;
|
||
--lines)
|
||
LOG_LINES="$2"
|
||
shift 2
|
||
;;
|
||
-h|--help)
|
||
echo "AzerothCore Service Status Script"
|
||
echo ""
|
||
echo "Usage: $0 [OPTIONS]"
|
||
echo ""
|
||
echo "OPTIONS:"
|
||
echo " --watch, -w Watch mode - continuously update status"
|
||
echo " --logs, -l Show recent log entries for each service"
|
||
echo " --lines N Number of log lines to show (default: 5)"
|
||
echo " --help, -h Show this help message"
|
||
echo ""
|
||
echo "EXAMPLES:"
|
||
echo " $0 Show current status"
|
||
echo " $0 --watch Continuously monitor status"
|
||
echo " $0 --logs Show status with recent logs"
|
||
exit 0
|
||
;;
|
||
*)
|
||
echo "Unknown option: $1"
|
||
echo "Use --help for usage information"
|
||
exit 1
|
||
;;
|
||
esac
|
||
done
|
||
|
||
# Function to print status with color
|
||
print_status() {
|
||
local level=$1
|
||
local message=$2
|
||
local timestamp=$(date '+%H:%M:%S')
|
||
|
||
case $level in
|
||
"SUCCESS"|"HEALTHY")
|
||
printf "${GREEN}✅ [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
"WARNING"|"UNHEALTHY")
|
||
printf "${YELLOW}⚠️ [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
"ERROR"|"FAILED")
|
||
printf "${RED}❌ [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
"INFO")
|
||
printf "${BLUE}ℹ️ [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
"HEADER")
|
||
printf "${MAGENTA}🚀 [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
*)
|
||
printf "${CYAN}📋 [%s] %s${NC}\n" "$timestamp" "$message"
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# Function to get container status with health
|
||
get_container_status() {
|
||
local container_name=$1
|
||
local status=""
|
||
local health=""
|
||
local uptime=""
|
||
|
||
if docker ps -a --format "table {{.Names}}" | grep -q "^${container_name}$"; then
|
||
status=$(docker inspect --format='{{.State.Status}}' "$container_name" 2>/dev/null || echo "unknown")
|
||
health=$(docker inspect --format='{{.State.Health.Status}}' "$container_name" 2>/dev/null || echo "no-health-check")
|
||
uptime=$(docker inspect --format='{{.State.StartedAt}}' "$container_name" 2>/dev/null | xargs -I {} date -d {} '+%H:%M:%S' 2>/dev/null || echo "unknown")
|
||
|
||
# Format status with color
|
||
case "$status" in
|
||
"running")
|
||
if [ "$health" = "healthy" ]; then
|
||
printf "${GREEN}●${NC} Running (healthy) - Started: %s\n" "$uptime"
|
||
elif [ "$health" = "unhealthy" ]; then
|
||
printf "${RED}●${NC} Running (unhealthy) - Started: %s\n" "$uptime"
|
||
elif [ "$health" = "starting" ]; then
|
||
printf "${YELLOW}●${NC} Running (starting) - Started: %s\n" "$uptime"
|
||
else
|
||
printf "${GREEN}●${NC} Running - Started: %s\n" "$uptime"
|
||
fi
|
||
;;
|
||
"exited")
|
||
local exit_code=$(docker inspect --format='{{.State.ExitCode}}' "$container_name" 2>/dev/null || echo "unknown")
|
||
if [ "$exit_code" = "0" ]; then
|
||
printf "${YELLOW}●${NC} Exited (0) - Completed successfully\n"
|
||
else
|
||
printf "${RED}●${NC} Exited (%s) - Failed\n" "$exit_code"
|
||
fi
|
||
;;
|
||
"restarting")
|
||
printf "${YELLOW}●${NC} Restarting - Started: %s\n" "$uptime"
|
||
;;
|
||
"paused")
|
||
printf "${YELLOW}●${NC} Paused - Started: %s\n" "$uptime"
|
||
;;
|
||
"created")
|
||
printf "${CYAN}●${NC} Created (not started)\n"
|
||
;;
|
||
*)
|
||
printf "${RED}●${NC} %s\n" "$status"
|
||
;;
|
||
esac
|
||
else
|
||
printf "${RED}●${NC} Not found\n"
|
||
fi
|
||
}
|
||
|
||
# Function to show service logs
|
||
show_service_logs() {
|
||
local container_name=$1
|
||
local service_display_name=$2
|
||
|
||
if docker ps -a --format "table {{.Names}}" | grep -q "^${container_name}$"; then
|
||
printf " ${CYAN}📄 Recent logs:${NC}\n"
|
||
docker logs "$container_name" --tail "$LOG_LINES" 2>/dev/null | sed 's/^/ /' || printf " ${YELLOW}(no logs available)${NC}\n"
|
||
echo ""
|
||
fi
|
||
}
|
||
|
||
# Function to display service status
|
||
display_service_status() {
|
||
local container_name=$1
|
||
local service_display_name=$2
|
||
local description=$3
|
||
|
||
printf "${CYAN}%-20s${NC} " "$service_display_name"
|
||
get_container_status "$container_name"
|
||
|
||
# Show image name if container exists
|
||
if docker ps -a --format "table {{.Names}}" | grep -q "^${container_name}$"; then
|
||
local image_name=$(docker inspect --format='{{.Config.Image}}' "$container_name" 2>/dev/null || echo "unknown")
|
||
printf " ${CYAN}🏷️ Image: $image_name${NC}\n"
|
||
fi
|
||
|
||
if [ "$SHOW_LOGS" = true ]; then
|
||
show_service_logs "$container_name" "$service_display_name"
|
||
fi
|
||
}
|
||
|
||
# Function to get database info
|
||
get_database_info() {
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-mysql$"; then
|
||
local db_count=$(docker exec ac-mysql mysql -u root -pazerothcore123 -e "SHOW DATABASES;" 2>/dev/null | grep -E "^(acore_|mysql|information_schema|performance_schema)" | wc -l || echo "0")
|
||
local user_count=$(docker exec ac-mysql mysql -u root -pazerothcore123 -D acore_auth -e "SELECT COUNT(*) FROM account;" 2>/dev/null | tail -1 || echo "0")
|
||
printf " ${CYAN}📊 Databases: $db_count | User accounts: $user_count${NC}\n"
|
||
fi
|
||
}
|
||
|
||
# Function to get client data progress
|
||
get_client_data_progress() {
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-client-data$"; then
|
||
local last_progress=$(docker logs ac-client-data --tail 1 2>/dev/null | grep "Progress" || echo "")
|
||
if [ -n "$last_progress" ]; then
|
||
printf " ${CYAN}📊 $last_progress${NC}\n"
|
||
fi
|
||
fi
|
||
}
|
||
|
||
# Function to get enabled modules info
|
||
get_enabled_modules() {
|
||
printf "${CYAN}%-20s${NC} " "Enabled Modules"
|
||
|
||
# Check if modules are enabled by looking for environment files
|
||
local modules_enabled=false
|
||
local module_count=0
|
||
local modules_list=""
|
||
|
||
if [ -f "docker-compose-azerothcore-modules.env" ] || [ -f "docker-compose-azerothcore-modules-custom.env" ]; then
|
||
# Check for playerbots module
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-modules$"; then
|
||
if docker logs ac-modules 2>/dev/null | grep -q "playerbot\|playerbots"; then
|
||
modules_list="playerbots"
|
||
module_count=$((module_count + 1))
|
||
modules_enabled=true
|
||
fi
|
||
fi
|
||
|
||
# Check for eluna module
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-eluna$"; then
|
||
if [ -n "$modules_list" ]; then
|
||
modules_list="$modules_list, eluna"
|
||
else
|
||
modules_list="eluna"
|
||
fi
|
||
module_count=$((module_count + 1))
|
||
modules_enabled=true
|
||
fi
|
||
fi
|
||
|
||
if [ "$modules_enabled" = true ]; then
|
||
printf "${GREEN}●${NC} $module_count modules active\n"
|
||
printf " ${CYAN}📦 Modules: $modules_list${NC}\n"
|
||
else
|
||
printf "${YELLOW}●${NC} No modules enabled\n"
|
||
fi
|
||
}
|
||
|
||
# Main status display function
|
||
show_status() {
|
||
# Capture all output to a temp file, then display at once
|
||
local temp_file=$(mktemp)
|
||
|
||
{
|
||
print_status "HEADER" "AZEROTHCORE SERVICE STATUS"
|
||
echo ""
|
||
|
||
# Database Layer
|
||
printf "${MAGENTA}=== DATABASE LAYER ===${NC}\n"
|
||
display_service_status "ac-mysql" "MySQL Database" "Core database server"
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-mysql$"; then
|
||
get_database_info
|
||
fi
|
||
display_service_status "ac-backup" "Backup Service" "Database backup automation"
|
||
display_service_status "ac-db-init" "DB Initializer" "Database initialization (one-time)"
|
||
display_service_status "ac-db-import" "DB Import" "Database import (one-time)"
|
||
echo ""
|
||
|
||
# Services Layer
|
||
printf "${MAGENTA}=== SERVICES LAYER ===${NC}\n"
|
||
display_service_status "ac-authserver" "Auth Server" "Player authentication"
|
||
display_service_status "ac-worldserver" "World Server" "Game world simulation"
|
||
display_service_status "ac-client-data" "Client Data" "Game data download/extraction"
|
||
if docker ps --format "table {{.Names}}" | grep -q "^ac-client-data$"; then
|
||
get_client_data_progress
|
||
fi
|
||
echo ""
|
||
|
||
# Support Services
|
||
printf "${MAGENTA}=== SUPPORT SERVICES ===${NC}\n"
|
||
display_service_status "ac-modules" "Module Manager" "Server module management"
|
||
display_service_status "ac-eluna" "Eluna Engine" "Lua scripting engine"
|
||
display_service_status "ac-post-install" "Post-Install" "Configuration automation"
|
||
echo ""
|
||
|
||
# Enabled Modules
|
||
printf "${MAGENTA}=== MODULE STATUS ===${NC}\n"
|
||
get_enabled_modules
|
||
echo ""
|
||
|
||
# Network and ports
|
||
printf "${MAGENTA}=== NETWORK STATUS ===${NC}\n"
|
||
if docker network ls | grep -q azerothcore; then
|
||
printf "${CYAN}%-20s${NC} ${GREEN}●${NC} Network 'azerothcore' exists\n" "Docker Network"
|
||
else
|
||
printf "${CYAN}%-20s${NC} ${RED}●${NC} Network 'azerothcore' missing\n" "Docker Network"
|
||
fi
|
||
|
||
# Check if auth server port is accessible
|
||
if docker ps --format "table {{.Names}}\t{{.Ports}}" | grep ac-authserver | grep -q "3784"; then
|
||
printf "${CYAN}%-20s${NC} ${GREEN}●${NC} Port 3784 (Auth) exposed\n" "Auth Port"
|
||
else
|
||
printf "${CYAN}%-20s${NC} ${RED}●${NC} Port 3784 (Auth) not exposed\n" "Auth Port"
|
||
fi
|
||
|
||
# Check if world server port is accessible
|
||
if docker ps --format "table {{.Names}}\t{{.Ports}}" | grep ac-worldserver | grep -q "8215"; then
|
||
printf "${CYAN}%-20s${NC} ${GREEN}●${NC} Port 8215 (World) exposed\n" "World Port"
|
||
else
|
||
printf "${CYAN}%-20s${NC} ${RED}●${NC} Port 8215 (World) not exposed\n" "World Port"
|
||
fi
|
||
|
||
echo ""
|
||
printf "${CYAN}Last updated: $(date '+%Y-%m-%d %H:%M:%S')${NC}\n"
|
||
|
||
if [ "$WATCH_MODE" = true ]; then
|
||
echo ""
|
||
print_status "INFO" "Press Ctrl+C to exit watch mode"
|
||
fi
|
||
} > "$temp_file"
|
||
|
||
# Clear screen and display all content at once
|
||
clear 2>/dev/null || printf '\033[2J\033[H'
|
||
cat "$temp_file"
|
||
rm "$temp_file"
|
||
}
|
||
|
||
# Main execution
|
||
if [ "$WATCH_MODE" = true ]; then
|
||
while true; do
|
||
show_status
|
||
sleep 3
|
||
done
|
||
else
|
||
show_status
|
||
fi |