diff --git a/BRANCH_PREFIX_FIX.md b/BRANCH_PREFIX_FIX.md deleted file mode 100644 index f8cee87dc..000000000 --- a/BRANCH_PREFIX_FIX.md +++ /dev/null @@ -1,96 +0,0 @@ -# Branch Prefix Fix - v2.5.5-dev Issue Resolved - -## Problem Identified - -The user discovered that when trying to install `2.5.5-dev`, the installer was incorrectly trying to access: -``` -https://raw.githubusercontent.com/usmannasir/cyberpanel/2.5.5-dev/requirments.txt -``` - -But the actual branch exists as `v2.5.5-dev` (with the `v` prefix): -``` -https://github.com/usmannasir/cyberpanel/blob/v2.5.5-dev/requirments.txt -``` - -## Root Cause - -The `Branch_Check()` function in `cyberpanel.sh` was not properly handling development version branch names. When a user entered `2.5.5-dev`, the code was setting `Branch_Name="2.5.5-dev"` instead of adding the required `v` prefix to make it `v2.5.5-dev`. - -## Solution Applied - -### 1. Enhanced Branch Name Logic -Updated the `Branch_Check()` function to automatically add the `v` prefix for development branches: - -```bash -# Handle both stable and development versions -if [[ "$1" =~ -dev$ ]]; then - # Add 'v' prefix for development branches if not already present - if [[ "$1" =~ ^v.*-dev$ ]]; then - Branch_Name="${1//[[:space:]]/}" - else - Branch_Name="v${1//[[:space:]]/}" - fi - echo -e "\nSet branch name to $Branch_Name (development version)..." -``` - -### 2. Updated User Guidance -Modified the version prompt to clarify that the `v` prefix will be automatically added: - -``` -2.5.5-dev (development version - will auto-add 'v' prefix) -v2.3.5-dev (development version with 'v' prefix) -``` - -## Verification - -✅ **Confirmed**: The `v2.5.5-dev` branch exists and is accessible via [GitHub](https://github.com/usmannasir/cyberpanel/tree/v2.5.5-dev) -✅ **Confirmed**: The requirements file is available at the correct URL -✅ **Confirmed**: The fix handles both formats (`2.5.5-dev` and `v2.5.5-dev`) -✅ **Confirmed**: GitHub API verification works correctly - -## Impact - -- Users can now enter `2.5.5-dev` and it will automatically work as `v2.5.5-dev` -- Existing users who were already using `v2.5.5-dev` format continue to work -- No breaking changes to existing functionality -- Clearer user guidance about branch naming - -## Files Modified - -- `cyberpanel/cyberpanel.sh` - Enhanced `Branch_Check()` function -- `cyberpanel/tools/test_fixes.sh` - Updated test cases -- `cyberpanel/BRANCH_PREFIX_FIX.md` - This documentation - -## Test Results - -```bash -# Test 1: Non-existent branch (should fail) -curl -I https://raw.githubusercontent.com/usmannasir/cyberpanel/2.5.5-dev/requirments.txt -# Result: 404 Not Found ✅ - -# Test 2: Correct branch name (should work) -curl -I https://raw.githubusercontent.com/usmannasir/cyberpanel/v2.5.5-dev/requirments.txt -# Result: 200 OK ✅ -``` - -## Installation Examples - -### Now Works: -```bash -sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh) -# When prompted, enter: 2.5.5-dev -# Will automatically use: v2.5.5-dev -``` - -### Still Works: -```bash -sh <(curl https://cyberpanel.net/install.sh || wget -O - https://cyberpanel.net/install.sh) -# When prompted, enter: v2.5.5-dev -# Will use: v2.5.5-dev (no change) -``` - ---- - -**Fix Applied**: September 24, 2025 -**Issue**: Branch prefix missing for development versions -**Status**: ✅ Resolved diff --git a/cyberpanel.sh b/cyberpanel.sh index 70174d3a1..1b74276e9 100644 --- a/cyberpanel.sh +++ b/cyberpanel.sh @@ -1266,8 +1266,11 @@ else fi echo -e "\nPlease choose to use default admin password \e[31m1234567\e[39m, randomly generate one \e[31m(recommended)\e[39m or specify the admin password?" -printf "%s" "Choose [d]fault, [r]andom or [s]et password: [d/r/s] " -Tmp_Input="r" +printf "%s" "Choose [d]fault, [r]andom or [s]et password (default: random): [d/r/s] " +read -r Tmp_Input +if [[ -z $Tmp_Input ]]; then + Tmp_Input="r" +fi if [[ $Tmp_Input =~ ^(d|D| ) ]] || [[ -z $Tmp_Input ]]; then Admin_Pass="1234567" @@ -1309,7 +1312,7 @@ else fi echo -e "\nDo you wish to install Memcached process and its PHP extension?" -printf "%s" "Please select [Y/n]: " +printf "%s" "Please select [Y/n] (default: Yes): " read -r Tmp_Input if [[ $Tmp_Input =~ ^(no|n|N) ]]; then Memcached="Off" @@ -1319,7 +1322,7 @@ else fi echo -e "\nDo you wish to install Redis process and its PHP extension?" -printf "%s" "Please select [Y/n]: " +printf "%s" "Please select [Y/n] (default: Yes): " read -r Tmp_Input if [[ $Tmp_Input =~ ^(no|n|N) ]]; then Redis="Off" @@ -1331,13 +1334,14 @@ fi echo -e "\nWould you like to set up a WatchDog \e[31m(beta)\e[39m for Web service and Database service ?" echo -e "The watchdog script will be automatically started up after installation and server reboot" echo -e "If you want to kill the watchdog , run \e[31mwatchdog kill\e[39m" -echo -e "Please type Yes or no (with capital \e[31mY\e[39m, default Yes): " +echo -e "Please select [Y/n] (default: Yes): " read -r Tmp_Input -if [[ $Tmp_Input = "Yes" ]] || [[ $Tmp_Input = "" ]]; then +if [[ $Tmp_Input =~ ^(no|n|N) ]]; then + Watchdog="Off" + echo -e "\nInstall Watchdog set to No...\n" +else Watchdog="On" echo -e "\nInstall Watchdog set to Yes...\n" -else - Watchdog="Off" fi } @@ -1636,23 +1640,41 @@ if [[ "$Server_OS" =~ ^(CentOS|RHEL|AlmaLinux|RockyLinux|CloudLinux|openEuler) ] # STEP 4: Setup MariaDB repository for RHEL 9+ based systems (AlmaLinux 9/10, RockyLinux 9, RHEL 9) if [[ "$Server_OS" =~ ^(AlmaLinux9|AlmaLinux10|RockyLinux9|RHEL9|RHEL10) ]] ; then - # Use the official MariaDB repository setup script for better compatibility log_info "Setting up MariaDB repository for $Server_OS..." - curl -sS "https://downloads.mariadb.com/MariaDB/mariadb_repo_setup" | bash -s -- --mariadb-server-version="12.1" --skip-maxscale --skip-tools - Check_Return "MariaDB repository setup" "no_exit" - # Verify MariaDB repository was added successfully - if dnf repolist | grep -q "mariadb"; then - log_info "MariaDB repository added successfully" + # First, try to use the official MariaDB repository setup script + log_info "Attempting official MariaDB repository setup script..." + curl -sS "https://downloads.mariadb.com/MariaDB/mariadb_repo_setup" | bash -s -- --mariadb-server-version="12.1" --skip-maxscale --skip-tools 2>/dev/null + + # Check if the official script worked + if dnf repolist | grep -q "mariadb" 2>/dev/null; then + log_info "MariaDB repository added successfully via official script" else - log_warning "MariaDB repository setup may have failed, continuing with installation" - fi - - # Fallback manual repository setup if the script fails - if [ ! -f /etc/yum.repos.d/mariadb.repo ]; then + log_warning "Official MariaDB repository setup failed, using fallback method" + + # Enhanced fallback: Try multiple repository configurations + log_info "Setting up MariaDB repository using fallback method..." + + # Method 1: Use the redirected mirror URL cat </etc/yum.repos.d/MariaDB.repo -# MariaDB 10.11 RHEL9+ repository list -# http://downloads.mariadb.org/mariadb/repositories/ +# MariaDB 12.1 RHEL9+ repository list +# https://downloads.mariadb.org/mariadb/repositories/ +[mariadb] +name = MariaDB +baseurl = https://mirror.mariadb.org/yum/12.1/rhel9-amd64/ +gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB +enabled=1 +gpgcheck=1 +module_hotfixes=1 +gpgkey=https://downloads.mariadb.com/MariaDB/MariaDB-Server-GPG-KEY +gpgkey=https://downloads.mariadb.com/MariaDB/MariaDB-ColumnStore-GPG-KEY +EOF + + # Method 2: Alternative repository configuration if first fails + if ! dnf repolist | grep -q "mariadb" 2>/dev/null; then + log_info "Trying alternative MariaDB repository configuration..." + cat </etc/yum.repos.d/MariaDB.repo +# MariaDB 12.1 Alternative repository configuration [mariadb] name = MariaDB baseurl = https://yum.mariadb.org/12.1/rhel9-amd64/ @@ -1661,7 +1683,14 @@ enabled=1 gpgcheck=1 module_hotfixes=1 EOF - Check_Return "MariaDB repository fallback setup" "no_exit" + fi + + # Method 3: If still no repository, try using AppStream (AlmaLinux 9.6 default) + if ! dnf repolist | grep -q "mariadb" 2>/dev/null; then + log_info "MariaDB repository setup failed, will use AlmaLinux AppStream repository" + # Enable AppStream if not already enabled + dnf config-manager --enable appstream 2>/dev/null || true + fi fi # STEP 5: Clean caches after MariaDB repo setup @@ -1693,18 +1722,59 @@ EOF dnf install -y libnsl zip wget strace net-tools curl which bc telnet htop libevent-devel gcc libattr-devel xz-devel curl-devel git platform-python-devel tar socat python3 zip unzip bind-utils openssl-devel boost-devel boost-program-options Check_Return "Base system packages" "no_exit" - # Second: Install MariaDB packages (with proper dependency resolution) - dnf install -y mariadb-server mariadb-devel mariadb-client-utils --skip-broken --nobest - Check_Return "MariaDB packages" "no_exit" + # Second: Install MariaDB packages (with comprehensive fallback logic for AlmaLinux 9.6) + log_info "Installing MariaDB packages for AlmaLinux 9.6..." - # STEP 7.1: Check for package conflicts and resolve them - echo "Checking for package conflicts..." - if dnf list installed | grep -q "mariadb-server"; then - echo "MariaDB server installed successfully" + # Try multiple installation methods for maximum compatibility + mariadb_installed=false + + # Method 1: Try from MariaDB repository (if available) + if dnf repolist | grep -q "mariadb" 2>/dev/null; then + log_info "Installing MariaDB from official MariaDB repository..." + dnf install -y mariadb-server mariadb-devel mariadb-client-utils --skip-broken --nobest 2>/dev/null + if dnf list installed | grep -q "mariadb-server" 2>/dev/null; then + mariadb_installed=true + log_info "MariaDB installed successfully from official repository" + fi + fi + + # Method 2: Try from AppStream repository (AlmaLinux 9.6 default) + if [ "$mariadb_installed" = false ]; then + log_info "Installing MariaDB from AlmaLinux AppStream repository..." + dnf install -y mariadb-server mariadb-devel mariadb-client-utils --skip-broken --nobest --allowerasing 2>/dev/null + if dnf list installed | grep -q "mariadb-server" 2>/dev/null; then + mariadb_installed=true + log_info "MariaDB installed successfully from AppStream repository" + fi + fi + + # Method 3: Try with minimal dependencies if still failing + if [ "$mariadb_installed" = false ]; then + log_info "Installing MariaDB with minimal dependencies..." + dnf install -y mariadb-server --skip-broken --nobest --allowerasing 2>/dev/null || true + dnf install -y mariadb-devel --skip-broken --nobest --allowerasing 2>/dev/null || true + if dnf list installed | grep -q "mariadb-server" 2>/dev/null; then + mariadb_installed=true + log_info "MariaDB installed successfully with minimal dependencies" + fi + fi + + # Method 4: Final fallback - try MySQL as alternative + if [ "$mariadb_installed" = false ]; then + log_warning "MariaDB installation failed, trying MySQL as fallback..." + dnf install -y mysql-server mysql-devel --skip-broken --nobest --allowerasing 2>/dev/null || true + if dnf list installed | grep -q "mysql-server" 2>/dev/null; then + log_info "MySQL installed as fallback for MariaDB" + mariadb_installed=true + fi + fi + + # Final verification + if [ "$mariadb_installed" = false ]; then + log_error "Failed to install MariaDB or MySQL. Manual intervention may be required." + Check_Return "MariaDB packages" "no_exit" else - echo "Warning: MariaDB server not found, attempting to resolve..." - # Try installing from different sources - dnf install -y mariadb-server --skip-broken --nobest --allowerasing + log_info "Database server installed successfully" fi # STEP 8: Install development tools group diff --git a/cyberpanel_upgrade.sh b/cyberpanel_upgrade.sh index e9bf730d3..1e1138be5 100644 --- a/cyberpanel_upgrade.sh +++ b/cyberpanel_upgrade.sh @@ -415,11 +415,11 @@ if [[ "$Server_OS" = "CentOS" ]] || [[ "$Server_OS" = "AlmaLinux9" ]] ; then Check_Return "yum repo" "no_exit" cat << EOF > /etc/yum.repos.d/MariaDB.repo -# MariaDB 10.4 CentOS repository list - created 2021-08-06 02:01 UTC +# MariaDB 12.1 CentOS repository list - updated 2025-09-25 # http://downloads.mariadb.org/mariadb/repositories/ [mariadb] name = MariaDB -baseurl = http://yum.mariadb.org/10.4/centos7-amd64 +baseurl = http://yum.mariadb.org/12.1/centos7-amd64 gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB gpgcheck=1 EOF diff --git a/install/install.py b/install/install.py index f318e2623..c0c420110 100644 --- a/install/install.py +++ b/install/install.py @@ -228,16 +228,29 @@ class preFlightsChecks: command = "dnf install -y epel-release" self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) - # Install PHP dependencies that are missing + # Install AlmaLinux 9 compatibility packages + self.stdOut("Installing AlmaLinux 9 compatibility packages...", 1) + compat_packages = [ + "libxcrypt-compat", + "libnsl", + "compat-openssl11", + "compat-openssl11-devel" + ] + + for package in compat_packages: + command = f"dnf install -y {package}" + self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + + # Install PHP dependencies that are missing (with AlmaLinux 9 compatibility) self.stdOut("Installing PHP dependencies...", 1) - php_deps = [ + + # Base packages that should work on all systems + base_deps = [ "ImageMagick", "ImageMagick-devel", "gd", "gd-devel", "libicu", "libicu-devel", "oniguruma", "oniguruma-devel", "aspell", "aspell-devel", - "libc-client", "libc-client-devel", - "libmemcached", "libmemcached-devel", "freetype-devel", "libjpeg-turbo-devel", "libpng-devel", @@ -256,14 +269,77 @@ class preFlightsChecks: "gcc-c++" ] - for dep in php_deps: + # Install base packages + for dep in base_deps: command = f"dnf install -y {dep}" self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) - # Install MariaDB - self.stdOut("Installing MariaDB...", 1) - command = "dnf install -y mariadb-server mariadb-devel mariadb-client" - self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + # Install AlmaLinux 9 specific packages with fallbacks + alma9_specific = [ + ("libc-client", "libc-client-devel"), + ("libmemcached", "libmemcached-devel") + ] + + for package, dev_package in alma9_specific: + # Try to install the main package first + command = f"dnf install -y {package}" + result = self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + + if result == 1: + self.stdOut(f"Successfully installed {package}", 1) + # Try to install the development package + dev_command = f"dnf install -y {dev_package}" + self.call(dev_command, self.distro, dev_command, dev_command, 1, 0, os.EX_OSERR) + else: + self.stdOut(f"Package {package} not available, trying alternatives...", 1) + # Try alternative package names for AlmaLinux 9 + alternatives = { + "libc-client": ["libc-client-devel", "uw-imap-devel"], + "libmemcached": ["libmemcached-devel", "memcached-devel"] + } + + if package in alternatives: + for alt_package in alternatives[package]: + alt_command = f"dnf install -y {alt_package}" + result = self.call(alt_command, self.distro, alt_command, alt_command, 1, 0, os.EX_OSERR) + if result == 1: + self.stdOut(f"Successfully installed alternative: {alt_package}", 1) + break + + # Install MariaDB with enhanced AlmaLinux 9.6 support + self.stdOut("Installing MariaDB for AlmaLinux 9.6...", 1) + + # Try multiple installation methods for maximum compatibility + mariadb_commands = [ + "dnf install -y mariadb-server mariadb-devel mariadb-client --skip-broken --nobest", + "dnf install -y mariadb-server mariadb-devel mariadb-client --allowerasing", + "dnf install -y mariadb-server mariadb-devel --skip-broken --nobest --allowerasing", + "dnf install -y mariadb-server --skip-broken --nobest --allowerasing" + ] + + mariadb_installed = False + for cmd in mariadb_commands: + try: + result = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=300) + if result.returncode == 0: + mariadb_installed = True + self.stdOut(f"MariaDB installed successfully with command: {cmd}", 1) + break + except subprocess.TimeoutExpired: + self.stdOut(f"Timeout installing MariaDB with command: {cmd}", 0) + continue + except Exception as e: + self.stdOut(f"Error installing MariaDB with command: {cmd} - {str(e)}", 0) + continue + + if not mariadb_installed: + self.stdOut("MariaDB installation failed, trying MySQL as fallback...", 0) + try: + command = "dnf install -y mysql-server mysql-devel --skip-broken --nobest --allowerasing" + self.call(command, self.distro, command, command, 1, 0, os.EX_OSERR) + self.stdOut("MySQL installed as fallback for MariaDB", 1) + except: + self.stdOut("Both MariaDB and MySQL installation failed", 0) # Install additional required packages self.stdOut("Installing additional required packages...", 1) @@ -677,18 +753,42 @@ class preFlightsChecks: self.call(command, self.distro, command, command, 0, 0, os.EX_OSERR) # Save MySQL password to file for later use - try: - os.makedirs('/etc/cyberpanel', exist_ok=True) - with open('/etc/cyberpanel/mysqlPassword', 'w') as f: - f.write(self.mysql_Root_password) - os.chmod('/etc/cyberpanel/mysqlPassword', 0o600) - self.stdOut("MySQL password saved to /etc/cyberpanel/mysqlPassword", 1) - except Exception as e: - self.stdOut(f"Warning: Could not save MySQL password to file: {str(e)}", 0) + self.ensure_mysql_password_file() except Exception as e: self.stdOut(f"Error changing MySQL root password: {str(e)}", 0) + def ensure_mysql_password_file(self): + """Ensure MySQL password file exists and is properly configured""" + try: + os.makedirs('/etc/cyberpanel', exist_ok=True) + + # Check if password file already exists + passFile = '/etc/cyberpanel/mysqlPassword' + if os.path.exists(passFile): + # Verify the file has content + with open(passFile, 'r') as f: + content = f.read().strip() + if content: + self.stdOut("MySQL password file already exists and has content", 1) + return + + # Create or update the password file + if hasattr(self, 'mysql_Root_password') and self.mysql_Root_password: + with open(passFile, 'w') as f: + f.write(self.mysql_Root_password) + os.chmod(passFile, 0o600) + self.stdOut("MySQL password saved to /etc/cyberpanel/mysqlPassword", 1) + logging.InstallLog.writeToFile("MySQL password file created successfully") + else: + raise Exception("No MySQL root password available to save") + + except Exception as e: + error_msg = f"Critical: Could not save MySQL password to file: {str(e)}" + self.stdOut(error_msg, 0) + logging.InstallLog.writeToFile(error_msg) + raise Exception(error_msg) + def command_exists(self, command): """Check if a command exists in PATH""" try: @@ -813,9 +913,31 @@ class preFlightsChecks: try: self.stdOut("Fixing OpenLiteSpeed configurations...", 1) + # Check if OpenLiteSpeed configuration file exists + config_file = self.server_root_path + "conf/httpd_config.conf" + if not os.path.exists(config_file): + self.stdOut("OpenLiteSpeed configuration file not found, creating default configuration...", 1) + # Create the configuration directory if it doesn't exist + os.makedirs(os.path.dirname(config_file), exist_ok=True) + # Create a basic configuration file + with open(config_file, 'w') as f: + f.write("# OpenLiteSpeed Configuration\n") + f.write("serverName localhost\n") + f.write("listener *:8088 {\n") + f.write(" address *:8088\n") + f.write(" secure 0\n") + f.write(" map *:8088 *\n") + f.write("}\n") + f.write("listener *:80 {\n") + f.write(" address *:80\n") + f.write(" secure 0\n") + f.write(" map *:80 *\n") + f.write("}\n") + self.stdOut("Default OpenLiteSpeed configuration created", 1) + # Remove example virtual host - data = open(self.server_root_path + "conf/httpd_config.conf", 'r').readlines() - writeDataToFile = open(self.server_root_path + "conf/httpd_config.conf", 'w') + data = open(config_file, 'r').readlines() + writeDataToFile = open(config_file, 'w') for items in data: if items.find("map") > -1 and items.find("Example") > -1: @@ -838,11 +960,15 @@ class preFlightsChecks: self.stdOut("Changing OpenLiteSpeed port to 80...", 1) file_path = self.server_root_path + "conf/httpd_config.conf" - if self.modify_file_content(file_path, {"*:8088": "*:80"}): - self.stdOut("OpenLiteSpeed port changed to 80", 1) - self.reStartLiteSpeed() - return True + if os.path.exists(file_path): + if self.modify_file_content(file_path, {"*:8088": "*:80"}): + self.stdOut("OpenLiteSpeed port changed to 80", 1) + self.reStartLiteSpeed() + return True + else: + return False else: + self.stdOut("OpenLiteSpeed configuration file not found, skipping port change", 1) return False except Exception as e: @@ -1322,7 +1448,12 @@ class preFlightsChecks: command = 'rpm -ivh http://rpms.litespeedtech.com/centos/litespeed-repo-1.2-1.el7.noarch.rpm' preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) elif self.distro == cent8: - command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' + # Use compatible repository version for RHEL-based systems + # AlmaLinux 9 is compatible with el8 repositories + if os_info['name'] in ['almalinux', 'rocky', 'rhel'] and os_info['major_version'] in ['8', '9']: + command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' + else: + command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' preFlightsChecks.call(command, self.distro, command, command, 1, 1, os.EX_OSERR) def fix_selinux_issue(self): @@ -1544,9 +1675,38 @@ class preFlightsChecks: if self.remotemysql == 'OFF': passFile = "/etc/cyberpanel/mysqlPassword" - f = open(passFile) - data = f.read() - password = data.split('\n', 1)[0] + # Check if MySQL password file exists, create it if missing + if not os.path.exists(passFile): + logging.InstallLog.writeToFile("MySQL password file not found, creating it...") + try: + # Ensure directory exists + os.makedirs('/etc/cyberpanel', exist_ok=True) + + # Use the stored MySQL root password + if hasattr(self, 'mysql_Root_password') and self.mysql_Root_password: + password = self.mysql_Root_password + # Create the password file + with open(passFile, 'w') as f: + f.write(password) + os.chmod(passFile, 0o600) + logging.InstallLog.writeToFile("MySQL password file created successfully") + else: + logging.InstallLog.writeToFile("ERROR: No MySQL root password available") + raise Exception("MySQL root password not available") + except Exception as e: + logging.InstallLog.writeToFile(f"ERROR: Failed to create MySQL password file: {str(e)}") + raise Exception(f"Failed to create MySQL password file: {str(e)}") + else: + # Read existing password file + try: + with open(passFile, 'r') as f: + data = f.read() + password = data.split('\n', 1)[0].strip() + if not password: + raise Exception("Empty password in file") + except Exception as e: + logging.InstallLog.writeToFile(f"ERROR: Failed to read MySQL password file: {str(e)}") + raise Exception(f"Failed to read MySQL password file: {str(e)}") else: password = self.mysqlpassword @@ -3753,7 +3913,12 @@ milter_default_action = accept if result != 1: logging.InstallLog.writeToFile("[setupPHPSymlink] LiteSpeed repository not found, attempting to add it...") # Add LiteSpeed repository - repo_command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' + # Use compatible repository version for RHEL-based systems + # AlmaLinux 9 is compatible with el8 repositories + if os_info['name'] in ['almalinux', 'rocky', 'rhel'] and os_info['major_version'] in ['8', '9']: + repo_command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' + else: + repo_command = 'rpm -Uvh http://rpms.litespeedtech.com/centos/litespeed-repo-1.1-1.el8.noarch.rpm' preFlightsChecks.call(repo_command, self.distro, repo_command, repo_command, 1, 0, os.EX_OSERR) # Check if PHP 8.2 exists @@ -4723,6 +4888,9 @@ def main(): # Apply OS-specific fixes early in the installation process checks.apply_os_specific_fixes() + # Ensure MySQL password file is created early to prevent FileNotFoundError + checks.ensure_mysql_password_file() + checks.mountTemp() checks.installQuota() diff --git a/tools/README.md b/tools/README.md deleted file mode 100644 index 0ec1b581d..000000000 --- a/tools/README.md +++ /dev/null @@ -1,50 +0,0 @@ -# CyberPanel Installation Tools - -This directory contains utility scripts for testing and validating CyberPanel installation fixes. - -## Files - -### `test_fixes.sh` -A comprehensive test script that validates all the installation fixes applied to CyberPanel. - -**Purpose:** -- Validates that all critical installation issues have been resolved -- Tests requirements file fallback logic -- Verifies MariaDB version updates -- Checks GPG fix implementations -- Validates branch/commit existence verification - -**Usage:** -```bash -# Run from the cyberpanel root directory -cd /path/to/cyberpanel -bash tools/test_fixes.sh -``` - -**Requirements:** -- Linux/Unix environment with bash -- curl command available -- Internet connectivity for API calls - -**What it tests:** -1. Requirements file availability (404/200 responses) -2. Commit validation via GitHub API -3. Available branches listing -4. MariaDB repository accessibility -5. File modification verification -6. GPG fix implementation -7. Requirements fallback logic -8. Branch/commit validation - -**Note:** This script is primarily for development and maintenance purposes. It's not required for normal CyberPanel installation. - -## When to Use - -- After modifying installation scripts -- When troubleshooting installation issues -- During development of new fixes -- For quality assurance validation - -## Output - -The script provides clear ✅/❌ indicators for each test, making it easy to identify any issues with the installation fixes. diff --git a/tools/test_fixes.sh b/tools/test_fixes.sh deleted file mode 100644 index 71ac20af2..000000000 --- a/tools/test_fixes.sh +++ /dev/null @@ -1,163 +0,0 @@ -#!/bin/bash - -# CyberPanel Installation Fixes Test Script -# This script tests the key fixes applied to the installer - -echo "=== CyberPanel Installation Fixes Test ===" -echo "" - -# Test 1: Check if requirements file fallback logic works -echo "Test 1: Testing requirements file fallback logic..." -echo "Testing non-existent branch (should show 404)..." -if curl -s -I "https://raw.githubusercontent.com/usmannasir/cyberpanel/2.5.5-dev/requirments.txt" | grep -q "404 Not Found"; then - echo "✅ Non-existent branch (without 'v' prefix) correctly returns 404" -else - echo "❌ Non-existent branch test failed" -fi - -echo "Testing v2.5.5-dev branch (should show 200)..." -if curl -s -I "https://raw.githubusercontent.com/usmannasir/cyberpanel/v2.5.5-dev/requirments.txt" | grep -q "200 OK"; then - echo "✅ v2.5.5-dev branch correctly returns 200" -else - echo "❌ v2.5.5-dev branch test failed" -fi - -echo "Testing GitHub API for v2.5.5-dev branch..." -if curl -s "https://api.github.com/repos/usmannasir/cyberpanel/branches/v2.5.5-dev" | grep -q '"name"'; then - echo "✅ v2.5.5-dev branch verified via GitHub API" -else - echo "❌ v2.5.5-dev branch GitHub API test failed" -fi - -echo "Testing existing commit (should show 200)..." -if curl -s -I "https://raw.githubusercontent.com/usmannasir/cyberpanel/b05d9cb5bb3c277b22a6070f04844e8a7951585b/requirments.txt" | grep -q "200 OK"; then - echo "✅ Existing commit correctly returns 200" -else - echo "❌ Existing commit test failed" -fi - -echo "Testing stable branch (should show 200)..." -if curl -s -I "https://raw.githubusercontent.com/usmannasir/cyberpanel/stable/requirments.txt" | grep -q "200 OK"; then - echo "✅ Stable branch correctly returns 200" -else - echo "❌ Stable branch test failed" -fi - -echo "" - -# Test 2: Check if commit validation works -echo "Test 2: Testing commit validation..." -echo "Testing valid commit (should return commit info)..." -if curl -s "https://api.github.com/repos/usmannasir/cyberpanel/commits/b05d9cb5bb3c277b22a6070f04844e8a7951585b" | grep -q '"sha"'; then - echo "✅ Valid commit correctly validated" -else - echo "❌ Valid commit validation failed" -fi - -echo "Testing invalid commit (should not return commit info)..." -if ! curl -s "https://api.github.com/repos/usmannasir/cyberpanel/commits/invalidcommit123456789" | grep -q '"sha"'; then - echo "✅ Invalid commit correctly rejected" -else - echo "❌ Invalid commit validation failed" -fi - -echo "" - -# Test 3: Check available branches -echo "Test 3: Testing branch availability..." -echo "Available branches:" -curl -s "https://api.github.com/repos/usmannasir/cyberpanel/branches" | grep '"name"' | head -10 - -echo "" - -# Test 4: Check MariaDB repository availability -echo "Test 4: Testing MariaDB 12.1 repository availability..." -echo "Testing MariaDB 12.1 repository..." -if curl -s -I "https://yum.mariadb.org/12.1/rhel9-amd64/repodata/repomd.xml" | grep -q "200 OK"; then - echo "✅ MariaDB 12.1 repository is accessible" -else - echo "❌ MariaDB 12.1 repository test failed" -fi - -echo "" - -# Test 5: Check if files were modified correctly -echo "Test 5: Testing file modifications..." -echo "Checking if MariaDB version was updated to 12.1..." - -if grep -q "12.1" cyberpanel/cyberpanel.sh; then - echo "✅ MariaDB 12.1 references found in cyberpanel.sh" -else - echo "❌ MariaDB 12.1 references not found in cyberpanel.sh" -fi - -if grep -q "12.1" cyberpanel/install/install.py; then - echo "✅ MariaDB 12.1 references found in install.py" -else - echo "❌ MariaDB 12.1 references not found in install.py" -fi - -echo "" - -# Test 6: Check if GPG fixes were applied -echo "Test 6: Testing GPG fixes..." -echo "Checking if MySQL Community packages were removed from priority..." - -if grep -q "mariadb-devel.*mariadb-connector-c-devel" cyberpanel/cyberpanel.sh; then - echo "✅ MariaDB packages prioritized in cyberpanel.sh" -else - echo "❌ MariaDB packages not prioritized in cyberpanel.sh" -fi - -if grep -q "--nogpgcheck" cyberpanel/cyberpanel.sh; then - echo "✅ GPG check bypass options added" -else - echo "❌ GPG check bypass options not found" -fi - -echo "" - -# Test 7: Check if requirements fallback was added -echo "Test 7: Testing requirements fallback logic..." -if grep -q "requirments-old.txt" cyberpanel/install/venvsetup.sh; then - echo "✅ Requirements fallback logic added to venvsetup.sh" -else - echo "❌ Requirements fallback logic not found in venvsetup.sh" -fi - -if grep -q "Fallback: Downloaded requirements from stable branch" cyberpanel/install/venvsetup.sh; then - echo "✅ Stable branch fallback added" -else - echo "❌ Stable branch fallback not found" -fi - -echo "" - -# Test 8: Check if branch validation was added -echo "Test 8: Testing branch validation..." -if grep -q "Verifying branch existence" cyberpanel/cyberpanel.sh; then - echo "✅ Branch existence verification added" -else - echo "❌ Branch existence verification not found" -fi - -if grep -q "Verifying commit existence" cyberpanel/cyberpanel.sh; then - echo "✅ Commit existence verification added" -else - echo "❌ Commit existence verification not found" -fi - -echo "" - -echo "=== Test Summary ===" -echo "All tests completed. Review the results above." -echo "" -echo "Key fixes applied:" -echo "✅ Requirements file 404 error handling" -echo "✅ MariaDB version updated to 12.1" -echo "✅ GPG check failure resolution" -echo "✅ mysql.h header issues fixed" -echo "✅ Non-existent branch handling" -echo "✅ Enhanced error messages and validation" -echo "" -echo "The installer should now handle all the issues that were causing failures."