Files
Linux-Server-Management-Too…/modules/diagnostics/platform-health-check.sh
T

385 lines
11 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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