mirror of
https://github.com/uprightbass360/AzerothCore-RealmMaster.git
synced 2026-01-13 00:58:34 +00:00
add comprehensive service status monitoring script
Features: - Real-time status of all AzerothCore services - Container health, uptime, and port information - Database and user account statistics - Client data download progress - Watch mode for continuous monitoring - Optional log display for troubleshooting - Color-coded status indicators Usage: ./scripts/status.sh [--watch] [--logs]
This commit is contained in:
267
scripts/status.sh
Executable file
267
scripts/status.sh
Executable file
@@ -0,0 +1,267 @@
|
||||
#!/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
|
||||
echo "${GREEN}●${NC} Running (healthy) - Started: $uptime"
|
||||
elif [ "$health" = "unhealthy" ]; then
|
||||
echo "${RED}●${NC} Running (unhealthy) - Started: $uptime"
|
||||
elif [ "$health" = "starting" ]; then
|
||||
echo "${YELLOW}●${NC} Running (starting) - Started: $uptime"
|
||||
else
|
||||
echo "${GREEN}●${NC} Running - Started: $uptime"
|
||||
fi
|
||||
;;
|
||||
"exited")
|
||||
local exit_code=$(docker inspect --format='{{.State.ExitCode}}' "$container_name" 2>/dev/null || echo "unknown")
|
||||
if [ "$exit_code" = "0" ]; then
|
||||
echo "${YELLOW}●${NC} Exited (0) - Completed successfully"
|
||||
else
|
||||
echo "${RED}●${NC} Exited ($exit_code) - Failed"
|
||||
fi
|
||||
;;
|
||||
"restarting")
|
||||
echo "${YELLOW}●${NC} Restarting - Started: $uptime"
|
||||
;;
|
||||
"paused")
|
||||
echo "${YELLOW}●${NC} Paused - Started: $uptime"
|
||||
;;
|
||||
"created")
|
||||
echo "${CYAN}●${NC} Created (not started)"
|
||||
;;
|
||||
*)
|
||||
echo "${RED}●${NC} $status"
|
||||
;;
|
||||
esac
|
||||
else
|
||||
echo "${RED}●${NC} Not found"
|
||||
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"
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
# Main status display function
|
||||
show_status() {
|
||||
clear 2>/dev/null || true
|
||||
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 ""
|
||||
|
||||
# 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
|
||||
}
|
||||
|
||||
# Main execution
|
||||
if [ "$WATCH_MODE" = true ]; then
|
||||
while true; do
|
||||
show_status
|
||||
sleep 3
|
||||
done
|
||||
else
|
||||
show_status
|
||||
fi
|
||||
Reference in New Issue
Block a user