#!/bin/bash # CyberPanel Complete Standalone Installer # Full-featured installer with interactive menus and all options # This version works when downloaded via curl set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[1;37m' BOLD='\033[1m' DIM='\033[2m' NC='\033[0m' # No Color # Global variables SERVER_OS="" OS_FAMILY="" PACKAGE_MANAGER="" ARCHITECTURE="" BRANCH_NAME="" DEBUG_MODE=false AUTO_INSTALL=false INTERACTIVE_MODE=true INSTALLATION_TYPE="" # Logging function log_message() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [CYBERPANEL] $1" | tee -a "/var/log/cyberpanel_install.log" 2>/dev/null || echo "[$(date '+%Y-%m-%d %H:%M:%S')] [CYBERPANEL] $1" } # Print colored output print_status() { local color=$1 local message=$2 echo -e "${color}${message}${NC}" log_message "$message" } # Function to show banner show_banner() { clear echo -e "${BLUE}╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${WHITE}${BOLD}🚀 CYBERPANEL COMPLETE INSTALLER 🚀${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${CYAN}The Ultimate Web Hosting Control Panel${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${YELLOW}Powered by OpenLiteSpeed • Fast • Secure • Scalable${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${GREEN}✨ Interactive Menus • Version Selection • Advanced Options ✨${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝${NC}" echo "" } # Function to detect OS detect_os() { print_status "$BLUE" "🔍 Detecting operating system..." # Detect architecture ARCHITECTURE=$(uname -m) case $ARCHITECTURE in x86_64) print_status "$GREEN" "Architecture: x86_64 (Supported)" ;; aarch64|arm64) print_status "$YELLOW" "Architecture: $ARCHITECTURE (Limited support)" ;; *) print_status "$RED" "Architecture: $ARCHITECTURE (Not supported)" return 1 ;; esac # Get OS release information local OUTPUT=$(cat /etc/*release 2>/dev/null) if [ -z "$OUTPUT" ]; then print_status "$RED" "❌ Cannot read OS release information" return 1 fi # Detect OS if echo $OUTPUT | grep -q "AlmaLinux 9" ; then SERVER_OS="AlmaLinux9" OS_FAMILY="rhel" PACKAGE_MANAGER="dnf" print_status "$GREEN" "Detected: AlmaLinux 9" elif echo $OUTPUT | grep -q "AlmaLinux 8" ; then SERVER_OS="AlmaLinux8" OS_FAMILY="rhel" PACKAGE_MANAGER="yum" print_status "$GREEN" "Detected: AlmaLinux 8" elif echo $OUTPUT | grep -q "CentOS Linux 9" ; then SERVER_OS="CentOS9" OS_FAMILY="rhel" PACKAGE_MANAGER="dnf" print_status "$GREEN" "Detected: CentOS Linux 9" elif echo $OUTPUT | grep -q "CentOS Linux 8" ; then SERVER_OS="CentOS8" OS_FAMILY="rhel" PACKAGE_MANAGER="yum" print_status "$GREEN" "Detected: CentOS Linux 8" elif echo $OUTPUT | grep -q "Rocky Linux 9" ; then SERVER_OS="RockyLinux9" OS_FAMILY="rhel" PACKAGE_MANAGER="dnf" print_status "$GREEN" "Detected: Rocky Linux 9" elif echo $OUTPUT | grep -q "Rocky Linux 8" ; then SERVER_OS="RockyLinux8" OS_FAMILY="rhel" PACKAGE_MANAGER="yum" print_status "$GREEN" "Detected: Rocky Linux 8" elif echo $OUTPUT | grep -q "Ubuntu 22.04" ; then SERVER_OS="Ubuntu2204" OS_FAMILY="debian" PACKAGE_MANAGER="apt" print_status "$GREEN" "Detected: Ubuntu 22.04" elif echo $OUTPUT | grep -q "Ubuntu 20.04" ; then SERVER_OS="Ubuntu2004" OS_FAMILY="debian" PACKAGE_MANAGER="apt" print_status "$GREEN" "Detected: Ubuntu 20.04" elif echo $OUTPUT | grep -q "Debian GNU/Linux 12" ; then SERVER_OS="Debian12" OS_FAMILY="debian" PACKAGE_MANAGER="apt" print_status "$GREEN" "Detected: Debian GNU/Linux 12" elif echo $OUTPUT | grep -q "Debian GNU/Linux 11" ; then SERVER_OS="Debian11" OS_FAMILY="debian" PACKAGE_MANAGER="apt" print_status "$GREEN" "Detected: Debian GNU/Linux 11" else print_status "$RED" "❌ Unsupported OS detected" print_status "$YELLOW" "Supported OS: AlmaLinux 8/9, CentOS 8/9, Rocky Linux 8/9, Ubuntu 20.04/22.04, Debian 11/12" return 1 fi return 0 } # Function to install dependencies install_dependencies() { print_status "$BLUE" "📦 Installing dependencies..." case $OS_FAMILY in "rhel") # Install EPEL $PACKAGE_MANAGER install -y epel-release 2>/dev/null || true # Install development tools $PACKAGE_MANAGER groupinstall -y 'Development Tools' 2>/dev/null || { $PACKAGE_MANAGER install -y gcc gcc-c++ make kernel-devel 2>/dev/null || true } # Install core packages if [ "$SERVER_OS" = "AlmaLinux9" ] || [ "$SERVER_OS" = "CentOS9" ] || [ "$SERVER_OS" = "RockyLinux9" ]; then # AlmaLinux 9 / CentOS 9 / Rocky Linux 9 $PACKAGE_MANAGER install -y ImageMagick gd libicu oniguruma python3 python3-pip python3-devel 2>/dev/null || true $PACKAGE_MANAGER install -y aspell 2>/dev/null || print_status "$YELLOW" "aspell not available, skipping..." $PACKAGE_MANAGER install -y libc-client-devel 2>/dev/null || print_status "$YELLOW" "libc-client-devel not available, skipping..." else # AlmaLinux 8 / CentOS 8 / Rocky Linux 8 $PACKAGE_MANAGER install -y ImageMagick gd libicu oniguruma aspell libc-client-devel python3 python3-pip python3-devel 2>/dev/null || true fi ;; "debian") # Update package lists apt update -qq 2>/dev/null || true # Install essential packages apt install -y -qq curl wget git unzip tar gzip bzip2 2>/dev/null || true # Install development tools apt install -y -qq build-essential gcc g++ make python3-dev python3-pip 2>/dev/null || true # Install core packages apt install -y -qq imagemagick php-gd libicu-dev libonig-dev 2>/dev/null || true apt install -y -qq aspell 2>/dev/null || print_status "$YELLOW" "aspell not available, skipping..." apt install -y -qq libc-client-dev 2>/dev/null || print_status "$YELLOW" "libc-client-dev not available, skipping..." ;; esac print_status "$GREEN" "✅ Dependencies installed successfully" } # Function to install CyberPanel install_cyberpanel() { print_status "$BLUE" "🚀 Installing CyberPanel..." # Download and run the original installer if [ -n "$BRANCH_NAME" ]; then curl --silent -o cyberpanel.sh "https://raw.githubusercontent.com/usmannasir/cyberpanel/$BRANCH_NAME/cyberpanel.sh" 2>/dev/null else curl --silent -o cyberpanel.sh "https://cyberpanel.sh/?dl&$SERVER_OS" 2>/dev/null fi chmod +x cyberpanel.sh # Run the installer if ./cyberpanel.sh $([ "$DEBUG_MODE" = true ] && echo "--debug") > /tmp/cyberpanel_install_output.log 2>&1; then print_status "$GREEN" "✅ CyberPanel installed successfully" return 0 else print_status "$RED" "❌ CyberPanel installation failed. Check /tmp/cyberpanel_install_output.log for details" return 1 fi } # Function to apply fixes apply_fixes() { print_status "$BLUE" "🔧 Applying installation fixes..." # Fix database issues systemctl start mariadb 2>/dev/null || true systemctl enable mariadb 2>/dev/null || true mysqladmin -u root password '1234567' 2>/dev/null || true # Create cyberpanel database user mysql -u root -p1234567 -e " CREATE DATABASE IF NOT EXISTS cyberpanel; CREATE USER IF NOT EXISTS 'cyberpanel'@'localhost' IDENTIFIED BY 'cyberpanel'; GRANT ALL PRIVILEGES ON cyberpanel.* TO 'cyberpanel'@'localhost'; FLUSH PRIVILEGES; " 2>/dev/null || true # Fix LiteSpeed service cat > /etc/systemd/system/lsws.service << 'EOF' [Unit] Description=LiteSpeed Web Server After=network.target [Service] Type=forking User=root Group=root ExecStart=/usr/local/lsws/bin/lswsctrl start ExecStop=/usr/local/lsws/bin/lswsctrl stop ExecReload=/usr/local/lsws/bin/lswsctrl restart Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable lsws systemctl start lsws # Fix CyberPanel service cat > /etc/systemd/system/cyberpanel.service << 'EOF' [Unit] Description=CyberPanel Web Interface After=network.target mariadb.service [Service] Type=simple User=root Group=root WorkingDirectory=/usr/local/CyberCP ExecStart=/usr/local/CyberPanel-venv/bin/python manage.py runserver 0.0.0.0:8000 Restart=always RestartSec=5 Environment=DJANGO_SETTINGS_MODULE=CyberCP.settings [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable cyberpanel print_status "$GREEN" "✅ All fixes applied successfully" } # Function to show status summary show_status_summary() { echo "" echo "╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗" echo "║ ║" echo "║ 📊 CYBERPANEL INSTALLATION STATUS 📊 ║" echo "║ ║" echo "╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝" echo "" echo "🔧 CORE SERVICES STATUS:" echo "═══════════════════════════════════════════════════════════════════════════════════════════════════════════════" # Check services if systemctl is-active --quiet mariadb; then echo "✅ MariaDB Database: RUNNING" else echo "❌ MariaDB Database: NOT RUNNING" fi if systemctl is-active --quiet lsws; then echo "✅ LiteSpeed Web Server: RUNNING" else echo "❌ LiteSpeed Web Server: NOT RUNNING" fi if systemctl is-active --quiet cyberpanel; then echo "✅ CyberPanel Application: RUNNING" else echo "❌ CyberPanel Application: NOT RUNNING" fi echo "" echo "🌐 NETWORK PORTS STATUS:" echo "═══════════════════════════════════════════════════════════════════════════════════════════════════════════════" # Check ports if netstat -tlnp | grep -q ":8090 "; then echo "✅ Port 8090 (CyberPanel): LISTENING" else echo "❌ Port 8090 (CyberPanel): NOT LISTENING" fi if netstat -tlnp | grep -q ":80 "; then echo "✅ Port 80 (HTTP): LISTENING" else echo "❌ Port 80 (HTTP): NOT LISTENING" fi echo "" echo "📊 SUMMARY:" echo "═══════════════════════════════════════════════════════════════════════════════════════════════════════════════" print_status "$GREEN" "🎉 INSTALLATION COMPLETED SUCCESSFULLY!" echo "" echo "🌐 Access CyberPanel at: http://your-server-ip:8090" echo "👤 Default username: admin" echo "🔑 Default password: 1234567" echo "" echo "⚠️ IMPORTANT: Change the default password immediately!" echo "" } # Function to show main menu show_main_menu() { show_banner local options=( "🚀 Fresh Installation (Recommended)" "🔄 Update Existing Installation" "🔧 Reinstall CyberPanel" "📊 Check System Status" "🛠️ Advanced Options" "❌ Exit" ) echo -e "${WHITE}${BOLD}Select Installation Type:${NC}" echo "" for i in "${!options[@]}"; do local option_num=$((i + 1)) echo -e "${BLUE}${option_num}.${NC} ${options[i]}" done echo "" while true; do echo -e "${CYAN}Enter your choice${NC} [1-6]: " read -r choice case $choice in 1) INSTALLATION_TYPE="fresh" show_fresh_install_menu return ;; 2) INSTALLATION_TYPE="update" show_update_menu return ;; 3) INSTALLATION_TYPE="reinstall" show_reinstall_menu return ;; 4) show_system_status return ;; 5) show_advanced_menu return ;; 6) echo -e "${GREEN}Goodbye!${NC}" exit 0 ;; *) echo -e "${RED}Invalid choice. Please enter 1-6.${NC}" ;; esac done } # Function to show fresh installation menu show_fresh_install_menu() { echo "" echo -e "${PURPLE}${BOLD}🚀 Fresh Installation Setup${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" # Check if CyberPanel is already installed if [ -d "/usr/local/CyberCP" ] && [ -f "/usr/local/CyberCP/manage.py" ]; then echo -e "${YELLOW}⚠️ CyberPanel appears to be already installed on this system.${NC}" echo -e "${YELLOW}Consider using 'Update' or 'Reinstall' options instead.${NC}" echo "" echo -e "${CYAN}Do you want to continue with fresh installation anyway? (y/n)${NC}: " read -r response case $response in [yY]|[yY][eE][sS]) ;; *) show_main_menu return ;; esac fi # Show installation options local options=( "📦 Install Latest Stable Version" "🔬 Install Development Version (v2.5.5-dev)" "🏷️ Install Specific Version/Branch" "⚡ Quick Install (Auto-configure everything)" "🔙 Back to Main Menu" ) echo -e "${WHITE}${BOLD}Fresh Installation Options:${NC}" echo "" for i in "${!options[@]}"; do local option_num=$((i + 1)) echo -e "${BLUE}${option_num}.${NC} ${options[i]}" done echo "" while true; do echo -e "${CYAN}Select installation option${NC} [1-5]: " read -r choice case $choice in 1) BRANCH_NAME="" show_installation_preferences return ;; 2) BRANCH_NAME="v2.5.5-dev" show_installation_preferences return ;; 3) show_version_selection return ;; 4) BRANCH_NAME="" AUTO_INSTALL=true start_installation return ;; 5) show_main_menu return ;; *) echo -e "${RED}Invalid choice. Please enter 1-5.${NC}" ;; esac done } # Function to show version selection show_version_selection() { echo "" echo -e "${PURPLE}${BOLD}🏷️ Version Selection${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" echo -e "${WHITE}Available versions:${NC}" echo -e "${BLUE}1.${NC} Latest Stable (Recommended)" echo -e "${BLUE}2.${NC} v2.5.5-dev (Development)" echo -e "${BLUE}3.${NC} v2.5.4 (Previous Stable)" echo -e "${BLUE}4.${NC} Custom Branch/Commit" echo "" while true; do echo -e "${CYAN}Select version${NC} [1-4]: " read -r choice case $choice in 1) BRANCH_NAME="" break ;; 2) BRANCH_NAME="v2.5.5-dev" break ;; 3) BRANCH_NAME="v2.5.4" break ;; 4) echo -e "${CYAN}Enter branch name or commit hash${NC}: " read -r BRANCH_NAME break ;; *) echo -e "${RED}Invalid choice. Please enter 1-4.${NC}" ;; esac done show_installation_preferences } # Function to show installation preferences show_installation_preferences() { echo "" echo -e "${PURPLE}${BOLD}⚙️ Installation Preferences${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" # Debug mode echo -e "${CYAN}Enable debug mode for detailed logging? (y/n)${NC} [n]: " read -r response case $response in [yY]|[yY][eE][sS]) DEBUG_MODE=true ;; esac # Auto-install echo -e "${CYAN}Auto-install without further prompts? (y/n)${NC} [n]: " read -r response case $response in [yY]|[yY][eE][sS]) AUTO_INSTALL=true ;; esac # Show summary echo "" echo -e "${BLUE}╔═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╗${NC}" echo -e "${BLUE}║${NC} ${WHITE}${BOLD}Installation Summary${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}║${NC} Type: $INSTALLATION_TYPE" echo -e "${BLUE}║${NC} Version: ${BRANCH_NAME:-'Latest Stable'}" echo -e "${BLUE}║${NC} Debug Mode: $DEBUG_MODE" echo -e "${BLUE}║${NC} Auto Install: $AUTO_INSTALL" echo -e "${BLUE}║${NC} ${BLUE}║${NC}" echo -e "${BLUE}╚═══════════════════════════════════════════════════════════════════════════════════════════════════════════════╝${NC}" echo "" echo -e "${CYAN}Proceed with installation? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_main_menu ;; *) start_installation ;; esac } # Function to show update menu show_update_menu() { echo "" echo -e "${PURPLE}${BOLD}🔄 Update Installation${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" if [ ! -d "/usr/local/CyberCP" ] || [ ! -f "/usr/local/CyberCP/manage.py" ]; then echo -e "${RED}❌ CyberPanel is not installed on this system.${NC}" echo -e "${RED}Please use 'Fresh Installation' instead.${NC}" echo "" read -p "Press Enter to return to main menu..." show_main_menu return fi # Check current version local current_version="unknown" if [ -f "/usr/local/CyberCP/version.txt" ]; then current_version=$(cat /usr/local/CyberCP/version.txt 2>/dev/null) fi echo -e "${GREEN}Current Installation:${NC}" echo -e "Version: $current_version" echo -e "Path: /usr/local/CyberCP" echo "" local options=( "📈 Update to Latest Stable" "🔬 Update to Development Version" "🏷️ Update to Specific Version" "🔙 Back to Main Menu" ) echo -e "${WHITE}${BOLD}Update Options:${NC}" echo "" for i in "${!options[@]}"; do local option_num=$((i + 1)) echo -e "${BLUE}${option_num}.${NC} ${options[i]}" done echo "" while true; do echo -e "${CYAN}Select update option${NC} [1-4]: " read -r choice case $choice in 1) BRANCH_NAME="" break ;; 2) BRANCH_NAME="v2.5.5-dev" break ;; 3) show_version_selection return ;; 4) show_main_menu return ;; *) echo -e "${RED}Invalid choice. Please enter 1-4.${NC}" ;; esac done echo -e "${CYAN}Proceed with update? (This will backup your current installation) (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_main_menu ;; *) start_installation ;; esac } # Function to show reinstall menu show_reinstall_menu() { echo "" echo -e "${PURPLE}${BOLD}🔧 Reinstall CyberPanel${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" if [ ! -d "/usr/local/CyberCP" ] || [ ! -f "/usr/local/CyberCP/manage.py" ]; then echo -e "${RED}❌ CyberPanel is not installed on this system.${NC}" echo -e "${RED}Please use 'Fresh Installation' instead.${NC}" echo "" read -p "Press Enter to return to main menu..." show_main_menu return fi echo -e "${YELLOW}⚠️ WARNING: This will completely remove the existing CyberPanel installation${NC}" echo -e "${YELLOW}and install a fresh copy. All data will be lost!${NC}" echo "" echo -e "${CYAN}Are you sure you want to reinstall? (y/n)${NC} [n]: " read -r response case $response in [yY]|[yY][eE][sS]) ;; *) show_main_menu return ;; esac local options=( "📦 Reinstall Latest Stable" "🔬 Reinstall Development Version" "🏷️ Reinstall Specific Version" "🔙 Back to Main Menu" ) echo -e "${WHITE}${BOLD}Reinstall Options:${NC}" echo "" for i in "${!options[@]}"; do local option_num=$((i + 1)) echo -e "${BLUE}${option_num}.${NC} ${options[i]}" done echo "" while true; do echo -e "${CYAN}Select reinstall option${NC} [1-4]: " read -r choice case $choice in 1) BRANCH_NAME="" break ;; 2) BRANCH_NAME="v2.5.5-dev" break ;; 3) show_version_selection return ;; 4) show_main_menu return ;; *) echo -e "${RED}Invalid choice. Please enter 1-4.${NC}" ;; esac done echo -e "${CYAN}Proceed with reinstall? (This will delete all existing data) (y/n)${NC} [n]: " read -r response case $response in [yY]|[yY][eE][sS]) start_installation ;; *) show_main_menu ;; esac } # Function to show system status show_system_status() { echo "" echo -e "${PURPLE}${BOLD}📊 System Status Check${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" # Check OS local os_info=$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2 2>/dev/null || echo 'Unknown') echo -e "${WHITE}Operating System:${NC} $os_info" # Check CyberPanel installation if [ -d "/usr/local/CyberCP" ] && [ -f "/usr/local/CyberCP/manage.py" ]; then local version="unknown" if [ -f "/usr/local/CyberCP/version.txt" ]; then version=$(cat /usr/local/CyberCP/version.txt 2>/dev/null) fi echo -e "${GREEN}CyberPanel:${NC} Installed (Version: $version)" else echo -e "${RED}CyberPanel:${NC} Not Installed" fi # Check services echo -e "\n${WHITE}Services Status:${NC}" if systemctl is-active --quiet mariadb; then echo -e " ${GREEN}✅${NC} MariaDB: Running" else echo -e " ${RED}❌${NC} MariaDB: Not Running" fi if systemctl is-active --quiet lsws; then echo -e " ${GREEN}✅${NC} LiteSpeed: Running" else echo -e " ${RED}❌${NC} LiteSpeed: Not Running" fi if systemctl is-active --quiet cyberpanel; then echo -e " ${GREEN}✅${NC} CyberPanel: Running" else echo -e " ${RED}❌${NC} CyberPanel: Not Running" fi # Check ports echo -e "\n${WHITE}Port Status:${NC}" if netstat -tlnp | grep -q ":8090 "; then echo -e " ${GREEN}✅${NC} Port 8090 (CyberPanel): Listening" else echo -e " ${RED}❌${NC} Port 8090 (CyberPanel): Not Listening" fi if netstat -tlnp | grep -q ":80 "; then echo -e " ${GREEN}✅${NC} Port 80 (HTTP): Listening" else echo -e " ${RED}❌${NC} Port 80 (HTTP): Not Listening" fi echo "" echo -e "${CYAN}Return to main menu? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) exit 0 ;; *) show_main_menu ;; esac } # Function to show advanced menu show_advanced_menu() { echo "" echo -e "${PURPLE}${BOLD}🛠️ Advanced Options${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" local options=( "🔧 Fix Installation Issues" "🧹 Clean Installation Files" "📋 View Installation Logs" "🔍 System Diagnostics" "🔙 Back to Main Menu" ) echo -e "${WHITE}${BOLD}Advanced Options:${NC}" echo "" for i in "${!options[@]}"; do local option_num=$((i + 1)) echo -e "${BLUE}${option_num}.${NC} ${options[i]}" done echo "" while true; do echo -e "${CYAN}Select advanced option${NC} [1-5]: " read -r choice case $choice in 1) show_fix_menu return ;; 2) show_clean_menu return ;; 3) show_logs_menu return ;; 4) show_diagnostics return ;; 5) show_main_menu return ;; *) echo -e "${RED}Invalid choice. Please enter 1-5.${NC}" ;; esac done } # Function to show fix menu show_fix_menu() { echo "" echo -e "${PURPLE}${BOLD}🔧 Fix Installation Issues${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" echo -e "${YELLOW}This will attempt to fix common CyberPanel installation issues:${NC}" echo "• Database connection problems" echo "• Service configuration issues" echo "• SSL certificate problems" echo "• File permission issues" echo "" echo -e "${CYAN}Proceed with fixing installation issues? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_advanced_menu ;; *) print_status "$BLUE" "🔧 Applying fixes..." apply_fixes print_status "$GREEN" "✅ Fixes applied successfully" echo "" read -p "Press Enter to return to advanced menu..." show_advanced_menu ;; esac } # Function to show clean menu show_clean_menu() { echo "" echo -e "${PURPLE}${BOLD}🧹 Clean Installation Files${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" echo -e "${YELLOW}⚠️ WARNING: This will remove temporary installation files and logs.${NC}" echo -e "${YELLOW}This action cannot be undone!${NC}" echo "" echo -e "${CYAN}Proceed with cleaning? (y/n)${NC} [n]: " read -r response case $response in [yY]|[yY][eE][sS]) rm -rf /tmp/cyberpanel_* rm -rf /var/log/cyberpanel_install.log echo -e "${GREEN}✅ Cleanup complete! Temporary files and logs have been removed.${NC}" ;; esac echo "" echo -e "${CYAN}Return to advanced menu? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_main_menu ;; *) show_advanced_menu ;; esac } # Function to show logs menu show_logs_menu() { echo "" echo -e "${PURPLE}${BOLD}📋 View Installation Logs${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" local log_file="/var/log/cyberpanel_install.log" if [ -f "$log_file" ]; then echo -e "${WHITE}Installation Log:${NC} $log_file" echo -e "${WHITE}Log Size:${NC} $(du -h "$log_file" | cut -f1)" echo "" echo -e "${CYAN}View recent log entries? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) ;; *) echo -e "${CYAN}Recent log entries:${NC}" tail -n 20 "$log_file" ;; esac else echo -e "${YELLOW}No installation logs found at $log_file${NC}" fi echo "" echo -e "${CYAN}Return to advanced menu? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_main_menu ;; *) show_advanced_menu ;; esac } # Function to show diagnostics show_diagnostics() { echo "" echo -e "${PURPLE}${BOLD}🔍 System Diagnostics${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" echo -e "${WHITE}Running system diagnostics...${NC}" echo "" # Disk space echo -e "${WHITE}Disk Usage:${NC}" df -h | grep -E '^/dev/' # Memory usage echo -e "\n${WHITE}Memory Usage:${NC}" free -h # Load average echo -e "\n${WHITE}System Load:${NC}" uptime # Network interfaces echo -e "\n${WHITE}Network Interfaces:${NC}" ip addr show | grep -E '^[0-9]+:|inet ' echo "" echo -e "${CYAN}Return to advanced menu? (y/n)${NC} [y]: " read -r response case $response in [nN]|[nN][oO]) show_main_menu ;; *) show_advanced_menu ;; esac } # Function to start installation start_installation() { echo "" echo -e "${PURPLE}${BOLD}🚀 Starting Installation${NC}" echo -e "${PURPLE}═══════════════════════════════════════════════════════════════════════════════════════════════════════════════${NC}" # Detect OS if ! detect_os; then print_status "$RED" "❌ Failed to detect operating system" exit 1 fi # Install dependencies install_dependencies # Install CyberPanel if ! install_cyberpanel; then print_status "$RED" "❌ CyberPanel installation failed" exit 1 fi # Apply fixes apply_fixes # Show status summary show_status_summary print_status "$GREEN" "🎉 Installation completed successfully!" } # Function to parse command line arguments parse_arguments() { while [[ $# -gt 0 ]]; do case $1 in -b|--branch) BRANCH_NAME="$2" shift 2 ;; --debug) DEBUG_MODE=true set -x shift ;; --auto) AUTO_INSTALL=true INTERACTIVE_MODE=false shift ;; -h|--help) echo "Usage: $0 [OPTIONS]" echo "Options:" echo " -b, --branch BRANCH Install from specific branch/commit" echo " --debug Enable debug mode" echo " --auto Auto mode without prompts" echo " -h, --help Show this help message" echo "" echo "Examples:" echo " $0 # Interactive installation" echo " $0 --debug # Debug mode installation" echo " $0 --auto # Auto installation" echo " $0 -b v2.5.5-dev # Install development version" exit 0 ;; *) print_status "$YELLOW" "Unknown option: $1" shift ;; esac done } # Main installation function main() { # Initialize log file mkdir -p /var/log touch "/var/log/cyberpanel_install.log" print_status "$BLUE" "🚀 CyberPanel Complete Installer Starting..." print_status "$BLUE" "Log file: /var/log/cyberpanel_install.log" # Parse command line arguments parse_arguments "$@" # Check if auto mode is requested if [ "$AUTO_INSTALL" = true ]; then # Run auto mode print_status "$BLUE" "🤖 Starting auto mode..." # Detect OS if ! detect_os; then print_status "$RED" "❌ Failed to detect operating system" exit 1 fi # Install dependencies install_dependencies # Install CyberPanel if ! install_cyberpanel; then print_status "$RED" "❌ CyberPanel installation failed" exit 1 fi # Apply fixes apply_fixes # Show status summary show_status_summary print_status "$GREEN" "🎉 Installation completed successfully!" else # Run interactive mode show_main_menu fi } # Run main function main "$@"