feat: Add OS Compatibility Check module with package and version verification

This commit is contained in:
Developer
2026-03-19 19:57:08 -04:00
parent 2d9cc9a23f
commit e0a7991949
2 changed files with 604 additions and 0 deletions
+2
View File
@@ -149,6 +149,7 @@ show_main_menu() {
echo "" echo ""
echo -e " ${MAGENTA}1)${NC} 🏥 System Health Check - Full server diagnostics" 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}1a)${NC} 🖥️ Platform Health Check - Component & service status"
echo -e " ${MAGENTA}1b)${NC} 🔧 OS Compatibility Check - OS packages & version support"
echo "" echo ""
echo -e "${BOLD}Main Categories:${NC}" echo -e "${BOLD}Main Categories:${NC}"
echo "" echo ""
@@ -695,6 +696,7 @@ main() {
case $choice in case $choice in
1) run_module "diagnostics" "system-health-check.sh" ;; 1) run_module "diagnostics" "system-health-check.sh" ;;
1a) run_module "diagnostics" "platform-health-check.sh" ;; 1a) run_module "diagnostics" "platform-health-check.sh" ;;
1b) run_module "diagnostics" "os-compatibility-check.sh" ;;
2) handle_security_menu ;; 2) handle_security_menu ;;
3) handle_website_menu ;; 3) handle_website_menu ;;
4) handle_performance_menu ;; 4) handle_performance_menu ;;
+602
View File
@@ -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