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