385 lines
11 KiB
Bash
Executable File
385 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
#############################################################################
|
||
# Platform Health Check Module
|
||
# Verifies all detected platform components are running and healthy
|
||
# Works across all supported control panels and operating systems
|
||
#############################################################################
|
||
|
||
set -eo pipefail
|
||
|
||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
BASE_DIR="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
||
LIB_DIR="$BASE_DIR/lib"
|
||
|
||
# Load libraries
|
||
source "$LIB_DIR/common-functions.sh"
|
||
source "$LIB_DIR/system-detect.sh"
|
||
|
||
# Ensure system detection is complete
|
||
[ -z "${SYS_DETECTION_COMPLETE:-}" ] && initialize_system_detection
|
||
|
||
#############################################################################
|
||
# COLORS & FORMATTING
|
||
#############################################################################
|
||
|
||
PASS="${GREEN}✓${NC}"
|
||
FAIL="${RED}✗${NC}"
|
||
WARN="${YELLOW}⚠${NC}"
|
||
INFO="${CYAN}ℹ${NC}"
|
||
|
||
#############################################################################
|
||
# SERVICE STATUS FUNCTIONS
|
||
#############################################################################
|
||
|
||
check_service_running() {
|
||
local service_name="$1"
|
||
local systemctl_name="${2:-$service_name}"
|
||
|
||
if systemctl is-active --quiet "$systemctl_name" 2>/dev/null; then
|
||
echo "$PASS ${GREEN}${service_name}${NC} is running"
|
||
return 0
|
||
else
|
||
echo "$FAIL ${RED}${service_name}${NC} is NOT running"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
check_process_running() {
|
||
local process_name="$1"
|
||
local display_name="${2:-$process_name}"
|
||
|
||
if pgrep -x "$process_name" > /dev/null 2>&1; then
|
||
echo "$PASS ${GREEN}${display_name}${NC} process is running"
|
||
return 0
|
||
else
|
||
echo "$FAIL ${RED}${display_name}${NC} process is NOT running"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
check_port_listening() {
|
||
local port="$1"
|
||
local service="$2"
|
||
|
||
if netstat -tlnp 2>/dev/null | grep -q ":$port "; then
|
||
echo "$PASS Port ${GREEN}$port${NC} (${service}) is listening"
|
||
return 0
|
||
else
|
||
echo "$FAIL Port ${RED}$port${NC} (${service}) is NOT listening"
|
||
return 1
|
||
fi
|
||
}
|
||
|
||
#############################################################################
|
||
# PLATFORM-SPECIFIC HEALTH CHECKS
|
||
#############################################################################
|
||
|
||
check_cpanel_health() {
|
||
echo ""
|
||
print_section "cPanel Health"
|
||
echo ""
|
||
|
||
# Check cPanel services
|
||
check_process_running "cpanel" "cPanel daemon" || true
|
||
check_service_running "cpsrvd" "cPanel service" || true
|
||
|
||
# Check Apache
|
||
if [ "$SYS_WEB_SERVER" = "apache" ]; then
|
||
check_service_running "httpd" "Apache httpd" || check_service_running "apache2" "Apache" || true
|
||
fi
|
||
|
||
# Check MySQL/MariaDB
|
||
if [ "$SYS_DB_TYPE" != "none" ]; then
|
||
check_service_running "mysql" "MySQL/MariaDB" || check_service_running "mariadb" || true
|
||
fi
|
||
|
||
# Check DNS (BIND)
|
||
check_service_running "named" "BIND DNS" 2>/dev/null || echo "$INFO DNS not checked (may not be running locally)" || true
|
||
|
||
echo ""
|
||
}
|
||
|
||
check_plesk_health() {
|
||
echo ""
|
||
print_section "Plesk Health"
|
||
echo ""
|
||
|
||
# Check Plesk core services
|
||
check_process_running "sw-engine" "Plesk backend" || true
|
||
check_process_running "sw-cp-server" "Plesk control panel" || true
|
||
|
||
# Check web server
|
||
if [ "$SYS_WEB_SERVER" = "apache" ]; then
|
||
check_service_running "apache2" "Apache" || check_service_running "httpd" || true
|
||
elif [ "$SYS_WEB_SERVER" = "nginx" ]; then
|
||
check_service_running "nginx" "Nginx" || true
|
||
fi
|
||
|
||
# Check database
|
||
if [ "$SYS_DB_TYPE" != "none" ]; then
|
||
check_service_running "mysql" "MySQL" || check_service_running "mariadb" || true
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
check_interworx_health() {
|
||
echo ""
|
||
print_section "InterWorx Health"
|
||
echo ""
|
||
|
||
# Check InterWorx services
|
||
check_process_running "iworx" "InterWorx daemon" || true
|
||
check_process_running "iworx-httpd" "InterWorx HTTP daemon" || true
|
||
|
||
# Check NodeWorx API
|
||
if [ -x "/usr/bin/nodeworx" ]; then
|
||
echo "$PASS NodeWorx CLI is available"
|
||
fi
|
||
|
||
# Check web server
|
||
check_service_running "httpd" "Apache httpd" || true
|
||
|
||
# Check database
|
||
if [ "$SYS_DB_TYPE" != "none" ]; then
|
||
check_service_running "mysql" "MySQL" || check_service_running "mariadb" || true
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
check_standalone_health() {
|
||
echo ""
|
||
print_section "Standalone Server Health"
|
||
echo ""
|
||
|
||
# Check web server
|
||
if [ "$SYS_WEB_SERVER" = "apache" ]; then
|
||
check_service_running "httpd" "Apache httpd" || check_service_running "apache2" || true
|
||
elif [ "$SYS_WEB_SERVER" = "nginx" ]; then
|
||
check_service_running "nginx" "Nginx" || true
|
||
fi
|
||
|
||
# Check database
|
||
if [ "$SYS_DB_TYPE" != "none" ]; then
|
||
check_service_running "mysql" "MySQL" || check_service_running "mariadb" || true
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
#############################################################################
|
||
# FIREWALL HEALTH CHECKS
|
||
#############################################################################
|
||
|
||
check_firewall_health() {
|
||
echo ""
|
||
print_section "Firewall Status"
|
||
echo ""
|
||
|
||
case "$SYS_FIREWALL" in
|
||
csf)
|
||
check_process_running "lfd" "LFD (CSF)" || true
|
||
if [ -f "/etc/csf/csf.conf" ]; then
|
||
if grep -q "^TESTING = \"0\"" /etc/csf/csf.conf 2>/dev/null; then
|
||
echo "$PASS CSF is in ${GREEN}production mode${NC}"
|
||
else
|
||
echo "$WARN CSF is in ${YELLOW}testing mode${NC}"
|
||
fi
|
||
fi
|
||
;;
|
||
firewalld)
|
||
check_service_running "firewalld" "firewalld" || true
|
||
;;
|
||
ufw)
|
||
if ufw status 2>/dev/null | grep -q "Status: active"; then
|
||
echo "$PASS UFW is ${GREEN}active${NC}"
|
||
else
|
||
echo "$WARN UFW is ${YELLOW}inactive${NC}"
|
||
fi
|
||
;;
|
||
iptables)
|
||
local rule_count=$(iptables -L -n 2>/dev/null | grep -c "^Chain" || echo 0)
|
||
if [ "$rule_count" -gt 0 ]; then
|
||
echo "$PASS iptables has ${rule_count} chains configured"
|
||
else
|
||
echo "$WARN No iptables rules found"
|
||
fi
|
||
;;
|
||
*)
|
||
echo "$INFO No firewall detected"
|
||
;;
|
||
esac
|
||
|
||
echo ""
|
||
}
|
||
|
||
#############################################################################
|
||
# PHP HEALTH CHECKS
|
||
#############################################################################
|
||
|
||
check_php_health() {
|
||
echo ""
|
||
print_section "PHP Status"
|
||
echo ""
|
||
|
||
if [ ${#SYS_PHP_VERSIONS[@]} -eq 0 ]; then
|
||
echo "$WARN No PHP versions detected"
|
||
return
|
||
fi
|
||
|
||
for version in "${SYS_PHP_VERSIONS[@]}"; do
|
||
php_binary=$(command -v "php${version}" 2>/dev/null || command -v php 2>/dev/null || echo "")
|
||
if [ -x "$php_binary" ]; then
|
||
echo "$PASS PHP $version is available"
|
||
else
|
||
echo "$FAIL PHP $version binary not found"
|
||
fi
|
||
done
|
||
|
||
# Check PHP-FPM if installed
|
||
if command_exists php-fpm; then
|
||
if check_process_running "php-fpm" "PHP-FPM" 2>/dev/null; then
|
||
echo ""
|
||
else
|
||
echo "$WARN PHP-FPM is installed but not running"
|
||
fi
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
#############################################################################
|
||
# STORAGE & RESOURCE CHECKS
|
||
#############################################################################
|
||
|
||
check_storage() {
|
||
echo ""
|
||
print_section "Storage & Resources"
|
||
echo ""
|
||
|
||
# Disk usage
|
||
local root_usage=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
|
||
if [ "$root_usage" -gt 90 ]; then
|
||
echo "$FAIL Disk usage is ${RED}${root_usage}%${NC} (CRITICAL)"
|
||
elif [ "$root_usage" -gt 80 ]; then
|
||
echo "$WARN Disk usage is ${YELLOW}${root_usage}%${NC} (Warning)"
|
||
else
|
||
echo "$PASS Disk usage is ${GREEN}${root_usage}%${NC}"
|
||
fi
|
||
|
||
# Memory check
|
||
local mem_available=$(free -h | awk '/^Mem:/ {print $7}')
|
||
echo "$INFO Available Memory: $mem_available"
|
||
|
||
# Swap check
|
||
local swap_total=$(free -h | awk '/^Swap:/ {print $2}')
|
||
if [ "$swap_total" = "0B" ]; then
|
||
echo "$WARN No swap space configured"
|
||
else
|
||
local swap_used=$(free -h | awk '/^Swap:/ {print $3}')
|
||
echo "$INFO Swap: $swap_used / $swap_total"
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
#############################################################################
|
||
# CLOUDFLARE STATUS
|
||
#############################################################################
|
||
|
||
check_cloudflare_status() {
|
||
if [ "$SYS_CLOUDFLARE_ACTIVE" = "yes" ]; then
|
||
echo ""
|
||
print_section "CloudFlare"
|
||
echo ""
|
||
echo "$PASS CloudFlare integration is ${GREEN}active${NC}"
|
||
echo ""
|
||
fi
|
||
}
|
||
|
||
#############################################################################
|
||
# GENERAL SYSTEM CHECKS
|
||
#############################################################################
|
||
|
||
check_system_critical() {
|
||
echo ""
|
||
print_section "Critical System Checks"
|
||
echo ""
|
||
|
||
# Check if running as root
|
||
if [ "$EUID" -eq 0 ]; then
|
||
echo "$PASS Running as ${GREEN}root${NC}"
|
||
else
|
||
echo "$FAIL Not running as root - some checks may fail"
|
||
fi
|
||
|
||
# Check system date/time
|
||
if command_exists ntpstat; then
|
||
echo "$PASS NTP is available for time synchronization"
|
||
else
|
||
echo "$INFO NTP tools not installed (may still be synchronized)"
|
||
fi
|
||
|
||
# Check SSH
|
||
check_service_running "sshd" "SSH" || true
|
||
|
||
# Check mail service
|
||
if check_process_running "exim" "Exim" 2>/dev/null || check_process_running "postfix" "Postfix" 2>/dev/null; then
|
||
true
|
||
else
|
||
echo "$INFO Mail service not detected"
|
||
fi
|
||
|
||
echo ""
|
||
}
|
||
|
||
#############################################################################
|
||
# MAIN EXECUTION
|
||
#############################################################################
|
||
|
||
main() {
|
||
clear
|
||
|
||
print_banner "Platform Health Check"
|
||
echo ""
|
||
echo "Checking health of all detected services and components..."
|
||
echo ""
|
||
|
||
# Show detected platform
|
||
echo -e "${BOLD}Detected Platform:${NC}"
|
||
echo " Control Panel: ${CYAN}${SYS_CONTROL_PANEL^^}${NC} v${SYS_CONTROL_PANEL_VERSION}"
|
||
echo " OS: ${CYAN}${SYS_OS_TYPE^^}${NC} ${SYS_OS_VERSION}"
|
||
echo " Web Server: ${CYAN}${SYS_WEB_SERVER^^}${NC}"
|
||
echo " Database: ${CYAN}${SYS_DB_TYPE^^}${NC}"
|
||
echo ""
|
||
|
||
# Run platform-specific checks
|
||
case "$SYS_CONTROL_PANEL" in
|
||
cpanel) check_cpanel_health ;;
|
||
plesk) check_plesk_health ;;
|
||
interworx) check_interworx_health ;;
|
||
*) check_standalone_health ;;
|
||
esac
|
||
|
||
# Universal checks
|
||
check_system_critical
|
||
check_firewall_health
|
||
check_php_health
|
||
check_storage
|
||
check_cloudflare_status
|
||
|
||
# Summary
|
||
echo ""
|
||
print_section "Summary"
|
||
echo ""
|
||
echo "Health check complete. Review any ${RED}failures${NC} or ${YELLOW}warnings${NC} above."
|
||
echo ""
|
||
}
|
||
|
||
# Run if sourced or executed
|
||
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
|
||
main "$@"
|
||
fi
|