From e0a799194939636dff66e612b802de54093dfc79 Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 19 Mar 2026 19:57:08 -0400 Subject: [PATCH] feat: Add OS Compatibility Check module with package and version verification --- launcher.sh | 2 + modules/diagnostics/os-compatibility-check.sh | 602 ++++++++++++++++++ 2 files changed, 604 insertions(+) create mode 100755 modules/diagnostics/os-compatibility-check.sh diff --git a/launcher.sh b/launcher.sh index 933a699..e09144a 100755 --- a/launcher.sh +++ b/launcher.sh @@ -149,6 +149,7 @@ show_main_menu() { echo "" echo -e " ${MAGENTA}1)${NC} 🏥 System Health Check - Full server diagnostics" echo -e " ${MAGENTA}1a)${NC} 🖥️ Platform Health Check - Component & service status" + echo -e " ${MAGENTA}1b)${NC} 🔧 OS Compatibility Check - OS packages & version support" echo "" echo -e "${BOLD}Main Categories:${NC}" echo "" @@ -695,6 +696,7 @@ main() { case $choice in 1) run_module "diagnostics" "system-health-check.sh" ;; 1a) run_module "diagnostics" "platform-health-check.sh" ;; + 1b) run_module "diagnostics" "os-compatibility-check.sh" ;; 2) handle_security_menu ;; 3) handle_website_menu ;; 4) handle_performance_menu ;; diff --git a/modules/diagnostics/os-compatibility-check.sh b/modules/diagnostics/os-compatibility-check.sh new file mode 100755 index 0000000..a98be8a --- /dev/null +++ b/modules/diagnostics/os-compatibility-check.sh @@ -0,0 +1,602 @@ +#!/bin/bash + +############################################################################# +# OS Compatibility Check Module +# Verifies OS-specific packages, compatibility, and version requirements +# Supports: CentOS, AlmaLinux, Rocky, CloudLinux, Ubuntu, Debian +############################################################################# + +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}" + +############################################################################# +# PACKAGE CHECK FUNCTIONS +############################################################################# + +package_installed() { + local package="$1" + + case "$SYS_OS_TYPE" in + centos|rhel|almalinux|rocky|cloudlinux) + rpm -q "$package" > /dev/null 2>&1 + ;; + ubuntu|debian) + dpkg -l | grep -q "^ii.*$package" || apt list --installed 2>/dev/null | grep -q "^$package/" + ;; + *) + return 1 + ;; + esac +} + +check_package() { + local package="$1" + local critical="${2:-0}" + + if package_installed "$package"; then + local version=$(get_package_version "$package") + echo "$PASS Package ${GREEN}${package}${NC} is installed (${version})" + return 0 + else + if [ "$critical" = "1" ]; then + echo "$FAIL Package ${RED}${package}${NC} is ${RED}MISSING${NC} (required)" + else + echo "$WARN Package ${YELLOW}${package}${NC} is not installed" + fi + return 1 + fi +} + +get_package_version() { + local package="$1" + + case "$SYS_OS_TYPE" in + centos|rhel|almalinux|rocky|cloudlinux) + rpm -q "$package" 2>/dev/null | sed "s/^${package}-//" || echo "unknown" + ;; + ubuntu|debian) + apt list --installed 2>/dev/null | grep "^${package}/" | awk '{print $2}' | head -1 || echo "unknown" + ;; + esac +} + +############################################################################# +# RHEL-BASED OS CHECKS +############################################################################# + +check_rhel_packages() { + echo "" + print_section "RHEL/CentOS Package Compatibility" + echo "" + + # Essential packages + check_package "gcc" 1 + check_package "curl" 1 + check_package "wget" 1 + check_package "git" 0 + + # Web server + if [ "$SYS_WEB_SERVER" = "apache" ]; then + check_package "httpd" 1 + elif [ "$SYS_WEB_SERVER" = "nginx" ]; then + check_package "nginx" 1 + fi + + # Database + if [ "$SYS_DB_TYPE" = "mysql" ]; then + check_package "mysql-server" 0 || check_package "mysql" 0 + elif [ "$SYS_DB_TYPE" = "mariadb" ]; then + check_package "mariadb-server" 1 + fi + + # PHP + if [ ${#SYS_PHP_VERSIONS[@]} -gt 0 ]; then + check_package "php-cli" 0 + check_package "php-common" 0 + fi + + # Additional tools + check_package "net-tools" 0 + check_package "bind-utils" 0 + check_package "openssh-server" 1 + + echo "" +} + +############################################################################# +# DEBIAN-BASED OS CHECKS +############################################################################# + +check_debian_packages() { + echo "" + print_section "Debian/Ubuntu Package Compatibility" + echo "" + + # Essential packages + check_package "build-essential" 1 + check_package "curl" 1 + check_package "wget" 1 + check_package "git" 0 + + # Web server + if [ "$SYS_WEB_SERVER" = "apache" ]; then + check_package "apache2" 1 + elif [ "$SYS_WEB_SERVER" = "nginx" ]; then + check_package "nginx" 1 + fi + + # Database + if [ "$SYS_DB_TYPE" = "mysql" ]; then + check_package "mysql-server" 1 + elif [ "$SYS_DB_TYPE" = "mariadb" ]; then + check_package "mariadb-server" 1 + fi + + # PHP + if [ ${#SYS_PHP_VERSIONS[@]} -gt 0 ]; then + check_package "php-cli" 0 + check_package "php-common" 0 + fi + + # Additional tools + check_package "net-tools" 0 + check_package "dnsutils" 0 + check_package "openssh-server" 1 + + echo "" +} + +############################################################################# +# CLOUDLINUX-SPECIFIC CHECKS +############################################################################# + +check_cloudlinux_packages() { + if [ "${SYS_CLOUDLINUX:-}" != "yes" ]; then + return + fi + + echo "" + print_section "CloudLinux-Specific Packages" + echo "" + + check_package "lve-utils" 0 + check_package "lvemanager" 0 + check_package "kernel-lve" 0 + check_package "cloudlinux-ssa" 0 + check_package "cloudlinux-admin" 0 + + # LVE CLI tool + if command_exists lvectl; then + echo "$PASS lvectl CLI is available" + else + echo "$WARN lvectl command not found (LVE management may be unavailable)" + fi + + # Check LVE status + if systemctl is-active --quiet lve-manager 2>/dev/null; then + echo "$PASS LVE Manager service is running" + else + echo "$WARN LVE Manager service is not running" + fi + + echo "" +} + +############################################################################# +# CONTROL PANEL-SPECIFIC CHECKS +############################################################################# + +check_cpanel_packages() { + if [ "$SYS_CONTROL_PANEL" != "cpanel" ]; then + return + fi + + echo "" + print_section "cPanel Package Dependencies" + echo "" + + # cPanel requires RHEL-based + if [[ ! "$SYS_OS_TYPE" =~ (centos|rhel|almalinux|rocky|cloudlinux) ]]; then + echo "$FAIL cPanel requires RHEL-based OS, found: ${RED}${SYS_OS_TYPE}${NC}" + return 1 + fi + + check_package "cpanel-liveupdate-exclude" 0 + check_package "ea-apache24" 0 + check_package "ea-php" 0 + + # cPanel version compatibility + local major_version=$(echo "$SYS_CONTROL_PANEL_VERSION" | cut -d. -f1) + if [ "$major_version" -lt 11 ]; then + echo "$FAIL cPanel version ${RED}${SYS_CONTROL_PANEL_VERSION}${NC} is out of support" + else + echo "$PASS cPanel version ${SYS_CONTROL_PANEL_VERSION} is supported" + fi + + echo "" +} + +check_plesk_packages() { + if [ "$SYS_CONTROL_PANEL" != "plesk" ]; then + return + fi + + echo "" + print_section "Plesk Package Dependencies" + echo "" + + # Plesk version compatibility + local major_version=$(echo "$SYS_CONTROL_PANEL_VERSION" | cut -d. -f1) + + if [ "$major_version" -lt 12 ]; then + echo "$FAIL Plesk version ${RED}${SYS_CONTROL_PANEL_VERSION}${NC} is out of support" + elif [ "$major_version" -lt 18 ]; then + echo "$WARN Plesk version ${YELLOW}${SYS_CONTROL_PANEL_VERSION}${NC} is nearing end of support" + else + echo "$PASS Plesk version ${GREEN}${SYS_CONTROL_PANEL_VERSION}${NC} is supported" + fi + + # Plesk requires specific packages + if [[ "$SYS_OS_TYPE" =~ (ubuntu|debian) ]]; then + check_package "plesk-core" 0 + elif [[ "$SYS_OS_TYPE" =~ (centos|rhel|almalinux|rocky) ]]; then + check_package "psa" 0 + fi + + echo "" +} + +check_interworx_packages() { + if [ "$SYS_CONTROL_PANEL" != "interworx" ]; then + return + fi + + echo "" + print_section "InterWorx Package Dependencies" + echo "" + + if [ -d "/opt/interworx" ]; then + echo "$PASS InterWorx installation directory found" + else + echo "$FAIL InterWorx installation directory ${RED}not found${NC}" + fi + + # InterWorx uses standard packages + check_package "openssl" 1 + check_package "perl" 0 + + echo "" +} + +############################################################################# +# OS VERSION COMPATIBILITY +############################################################################# + +check_os_version_support() { + echo "" + print_section "OS Version Support Status" + echo "" + + case "$SYS_OS_TYPE" in + centos) + case "$SYS_OS_VERSION" in + 7) echo "$WARN CentOS 7 is ${YELLOW}End of Life (June 2024)${NC}" ;; + 8) echo "$WARN CentOS 8 is ${YELLOW}End of Life (December 2021)${NC}" ;; + 9) echo "$PASS CentOS 9 is ${GREEN}supported until 2032${NC}" ;; + *) echo "$INFO CentOS $SYS_OS_VERSION version support unknown" ;; + esac + ;; + rhel) + case "$SYS_OS_VERSION" in + 7) echo "$WARN RHEL 7 is in ${YELLOW}limited support${NC}" ;; + 8) echo "$PASS RHEL 8 is in ${GREEN}standard support${NC}" ;; + 9) echo "$PASS RHEL 9 is in ${GREEN}standard support${NC}" ;; + *) echo "$INFO RHEL $SYS_OS_VERSION version support unknown" ;; + esac + ;; + almalinux|rocky) + case "$SYS_OS_VERSION" in + 8) echo "$PASS ${SYS_OS_TYPE^^} 8 is supported until 2029" ;; + 9) echo "$PASS ${SYS_OS_TYPE^^} 9 is supported until 2032" ;; + *) echo "$INFO ${SYS_OS_TYPE^^} $SYS_OS_VERSION version support unknown" ;; + esac + ;; + cloudlinux) + case "$SYS_OS_VERSION" in + 7) echo "$WARN CloudLinux 7 is in ${YELLOW}extended support${NC}" ;; + 8|9) echo "$PASS CloudLinux $SYS_OS_VERSION is ${GREEN}fully supported${NC}" ;; + *) echo "$INFO CloudLinux $SYS_OS_VERSION version support unknown" ;; + esac + ;; + ubuntu) + case "$SYS_OS_VERSION" in + 20.04) echo "$PASS Ubuntu 20.04 LTS supported until 2030" ;; + 22.04) echo "$PASS Ubuntu 22.04 LTS supported until 2032" ;; + 24.04) echo "$PASS Ubuntu 24.04 LTS supported until 2034" ;; + *) echo "$INFO Ubuntu $SYS_OS_VERSION support status unknown" ;; + esac + ;; + debian) + case "$SYS_OS_VERSION" in + 11) echo "$PASS Debian 11 supported until 2026" ;; + 12) echo "$PASS Debian 12 supported until 2028" ;; + *) echo "$INFO Debian $SYS_OS_VERSION support status unknown" ;; + esac + ;; + esac + + echo "" +} + +############################################################################# +# KERNEL & SYSTEM COMPATIBILITY +############################################################################# + +check_kernel_compatibility() { + echo "" + print_section "Kernel & System Compatibility" + echo "" + + local kernel=$(uname -r) + echo "$INFO Kernel version: $kernel" + + # Check for kernel modules + if [ -f /proc/sys/kernel/osrelease ]; then + local kernel_release=$(cat /proc/sys/kernel/osrelease) + echo "$INFO Kernel release: $kernel_release" + fi + + # Check virtualization/container + if grep -qi "hypervisor" /proc/cpuinfo 2>/dev/null; then + echo "$INFO Running in virtualized environment" + fi + + # Check for known incompatibilities + case "$SYS_OS_TYPE" in + centos) + if [ "$SYS_OS_VERSION" = "8" ] && [ "$SYS_CONTROL_PANEL" = "cpanel" ]; then + echo "$WARN CentOS 8 with cPanel requires migration path (CentOS Stream)" + fi + ;; + esac + + echo "" +} + +############################################################################# +# PACKAGE MANAGER COMPATIBILITY +############################################################################# + +check_package_manager() { + echo "" + print_section "Package Manager Status" + echo "" + + case "$SYS_OS_TYPE" in + centos|rhel|almalinux|rocky|cloudlinux) + if command_exists yum; then + echo "$PASS YUM package manager is available" + elif command_exists dnf; then + echo "$PASS DNF package manager is available" + else + echo "$FAIL No package manager found" + fi + + # Check for yum plugin conflicts + if [ -f /etc/yum.repos.d/epel.repo ]; then + echo "$PASS EPEL repository is configured" + fi + + # Check for remi repository (optional but common) + if [ -f /etc/yum.repos.d/remi.repo ]; then + echo "$INFO Remi repository is configured (for additional PHP versions)" + fi + ;; + + ubuntu|debian) + if command_exists apt; then + echo "$PASS APT package manager is available" + else + echo "$FAIL APT package manager not found" + fi + + # Check for PPA repositories + if [ -d /etc/apt/sources.list.d ]; then + local ppa_count=$(ls /etc/apt/sources.list.d/*.list 2>/dev/null | wc -l) + if [ "$ppa_count" -gt 0 ]; then + echo "$INFO $ppa_count PPA/custom repositories configured" + fi + fi + + # Check for Ondrej PPA (PHP) + if grep -q "ondrej/php" /etc/apt/sources.list* 2>/dev/null; then + echo "$INFO Ondrej PPA configured (for PHP versions)" + fi + ;; + esac + + echo "" +} + +############################################################################# +# CONTROL PANEL / OS COMPATIBILITY MATRIX +############################################################################# + +check_panel_os_compatibility() { + echo "" + print_section "Control Panel & OS Compatibility" + echo "" + + local compatible="1" + + case "$SYS_CONTROL_PANEL" in + cpanel) + if [[ ! "$SYS_OS_TYPE" =~ (centos|rhel|almalinux|rocky|cloudlinux) ]]; then + echo "$FAIL cPanel requires RHEL-based OS, but found: ${RED}${SYS_OS_TYPE}${NC}" + compatible="0" + else + echo "$PASS cPanel on ${SYS_OS_TYPE^^} is a ${GREEN}supported configuration${NC}" + fi + ;; + + plesk) + if [[ "$SYS_OS_TYPE" =~ (ubuntu|debian|centos|rhel|almalinux|rocky) ]]; then + echo "$PASS Plesk on ${SYS_OS_TYPE^^} is a ${GREEN}supported configuration${NC}" + else + echo "$FAIL Plesk on ${SYS_OS_TYPE^^} may not be officially supported" + compatible="0" + fi + ;; + + interworx) + if [[ ! "$SYS_OS_TYPE" =~ (centos|rhel|almalinux|rocky) ]]; then + echo "$WARN InterWorx on ${SYS_OS_TYPE^^} is ${YELLOW}not commonly used${NC}" + compatible="0" + else + echo "$PASS InterWorx on ${SYS_OS_TYPE^^} is a ${GREEN}supported configuration${NC}" + fi + ;; + + none) + echo "$PASS Standalone server (no control panel constraints)" + ;; + esac + + if [ "$compatible" = "0" ]; then + echo "" + echo "$WARN This combination may experience compatibility issues. Consider migration." + fi + + echo "" +} + +############################################################################# +# KNOWN ISSUES & RECOMMENDATIONS +############################################################################# + +check_known_issues() { + echo "" + print_section "Known Issues & Recommendations" + echo "" + + # CentOS 8 EOL warning + if [ "$SYS_OS_TYPE" = "centos" ] && [ "$SYS_OS_VERSION" = "8" ]; then + echo "$WARN CentOS 8 reached EOL on December 31, 2021" + echo " Recommend: Migrate to AlmaLinux 8, Rocky Linux 8, or CentOS Stream" + echo "" + fi + + # RHEL 7 EOL warning + if [ "$SYS_OS_TYPE" = "rhel" ] && [ "$SYS_OS_VERSION" = "7" ]; then + echo "$WARN RHEL 7 will reach EOL on June 30, 2024" + echo " Recommend: Plan upgrade to RHEL 8 or 9" + echo "" + fi + + # cPanel on Debian/Ubuntu + if [ "$SYS_CONTROL_PANEL" = "cpanel" ] && [[ "$SYS_OS_TYPE" =~ (ubuntu|debian) ]]; then + echo "$FAIL cPanel is NOT compatible with Debian/Ubuntu" + echo " This installation appears to be misconfigured" + echo "" + fi + + # Plesk version 17 and older + if [ "$SYS_CONTROL_PANEL" = "plesk" ]; then + local major_version=$(echo "$SYS_CONTROL_PANEL_VERSION" | cut -d. -f1) + if [ "$major_version" -lt 18 ]; then + echo "$WARN Plesk $major_version is out of support" + echo " Recommend: Upgrade to Plesk 18.0.50+ or newer" + echo "" + fi + fi + + # Multiple conflicting web servers + local web_count=0 + command_exists apache2 && ((web_count++)) + command_exists httpd && ((web_count++)) + command_exists nginx && ((web_count++)) + + if [ "$web_count" -gt 1 ]; then + echo "$WARN Multiple web servers detected on system" + echo " This may cause port conflicts (both trying to use port 80)" + echo "" + fi + + echo "" +} + +############################################################################# +# MAIN EXECUTION +############################################################################# + +main() { + clear + + print_banner "OS Compatibility Check" + echo "" + echo "Verifying OS packages, version support, and platform compatibility..." + echo "" + + # Show detected platform + echo -e "${BOLD}Detected Configuration:${NC}" + echo " OS: ${CYAN}${SYS_OS_TYPE^^}${NC} ${SYS_OS_VERSION}" + echo " Kernel: $(uname -r)" + echo " Control Panel: ${CYAN}${SYS_CONTROL_PANEL^^}${NC}" + echo "" + + # OS-specific package checks + case "$SYS_OS_TYPE" in + centos|rhel|almalinux|rocky|cloudlinux) + check_rhel_packages + ;; + ubuntu|debian) + check_debian_packages + ;; + esac + + # CloudLinux-specific + check_cloudlinux_packages + + # Control panel-specific checks + check_cpanel_packages + check_plesk_packages + check_interworx_packages + + # General compatibility checks + check_os_version_support + check_kernel_compatibility + check_package_manager + check_panel_os_compatibility + check_known_issues + + # Summary + echo "" + print_section "Summary" + echo "" + echo "Compatibility check complete. Review any ${RED}failures${NC}, ${YELLOW}warnings${NC}, or ${INFO}informational${NC} items above." + echo "" +} + +# Run if sourced or executed +if [ "${BASH_SOURCE[0]}" = "${0}" ]; then + main "$@" +fi