#!/bin/bash ##################################################################################### # FreePBX 17 Uninstall Script # This script removes FreePBX 17 and all its components installed by the official # installation script. # # WARNING: This will remove ALL FreePBX data, configurations, and databases! # Make sure to backup any important data before running this script. ##################################################################################### set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # Logging setup LOG_FILE="/var/log/freepbx-uninstall.log" BACKUP_DIR="/var/backups/freepbx-uninstall-$(date +%Y%m%d-%H%M%S)" # Check for root privileges if [[ $EUID -ne 0 ]]; then echo -e "${RED}This script must be run as root${NC}" exit 1 fi # Initialize logging init_logging() { mkdir -p "$(dirname "$LOG_FILE")" touch "$LOG_FILE" echo "===================================================================================" >> "$LOG_FILE" echo "FreePBX 17 Uninstallation started at $(date)" >> "$LOG_FILE" echo "Script executed by: $(whoami)" >> "$LOG_FILE" echo "System: $(uname -a)" >> "$LOG_FILE" echo "===================================================================================" >> "$LOG_FILE" } # Function to safely remove packages with dependency checking safe_package_removal() { local packages=("$@") local packages_to_remove=() local packages_with_deps=() log_message "Analyzing packages for safe removal..." echo "PACKAGE_ANALYSIS_START" >> "$LOG_FILE" for package in "${packages[@]}"; do # Check if package is installed first if ! dpkg -l | grep -q "^ii.*$package" 2>/dev/null; then log_message "Package '$package' is not installed - skipping" continue fi echo "Analyzing package: $package" if check_package_dependencies "$package"; then packages_to_remove+=("$package") echo "SAFE_TO_REMOVE: $package" >> "$LOG_FILE" else packages_with_deps+=("$package") echo "HAS_DEPENDENCIES: $package" >> "$LOG_FILE" fi done echo "PACKAGE_ANALYSIS_END" >> "$LOG_FILE" # Show summary if [[ ${#packages_to_remove[@]} -gt 0 ]]; then echo -e "${GREEN}Safe to remove (no dependencies):${NC}" printf '%s\n' "${packages_to_remove[@]}" echo "" fi if [[ ${#packages_with_deps[@]} -gt 0 ]]; then echo -e "${YELLOW}Packages with dependencies (need confirmation):${NC}" printf '%s\n' "${packages_with_deps[@]}" echo "" read -p "Do you want to remove packages with dependencies? (y/N): " remove_deps if [[ "$remove_deps" =~ ^[Yy]$ ]]; then packages_to_remove+=("${packages_with_deps[@]}") echo "USER_CONFIRMED_DEPENDENCY_REMOVAL" >> "$LOG_FILE" else log_warning "Skipping packages with dependencies" echo "USER_DECLINED_DEPENDENCY_REMOVAL" >> "$LOG_FILE" fi fi # Remove approved packages if [[ ${#packages_to_remove[@]} -gt 0 ]]; then log_message "Removing approved packages..." echo "REMOVING_PACKAGES: ${packages_to_remove[*]}" >> "$LOG_FILE" for package in "${packages_to_remove[@]}"; do log_message "Removing package: $package" echo "REMOVING: $package" >> "$LOG_FILE" apt-get purge -y "$package" >> "$LOG_FILE" 2>&1 || { log_error "Failed to remove package: $package" echo "FAILED_REMOVAL: $package" >> "$LOG_FILE" } done else log_message "No packages approved for removal" echo "NO_PACKAGES_REMOVED" >> "$LOG_FILE" fi } check_proxmox() { if dpkg -l | grep -q "proxmox-ve" || [[ -f /etc/pve/local/pve-ssl.pem ]] || systemctl list-units | grep -q "pveproxy"; then echo -e "${RED}⚠️ PROXMOX DETECTED ⚠️${NC}" echo -e "${YELLOW}This system appears to be running Proxmox VE!${NC}" echo "" echo "FreePBX and Proxmox share some common packages (Apache2, Fail2ban, etc.)" echo "Removing these packages could break your Proxmox installation!" echo "" echo "This script has been modified to be more careful with shared packages," echo "but there's still some risk involved." echo "" read -p "Do you understand the risks and want to continue? (y/N): " continue_proxmox if [[ "$continue_proxmox" != "y" && "$continue_proxmox" != "Y" ]]; then log_message "Uninstallation cancelled due to Proxmox detection." exit 0 fi echo -e "${YELLOW}Proceeding with Proxmox-safe mode...${NC}" echo "" return 0 fi return 1 } # Function to log messages log_message() { local message="$1" echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] $message${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] INFO: $message" >> "$LOG_FILE" } log_warning() { local message="$1" echo -e "${YELLOW}[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $message${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] WARNING: $message" >> "$LOG_FILE" } log_error() { local message="$1" echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $message${NC}" echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: $message" >> "$LOG_FILE" } # Function to check package dependencies before removal check_package_dependencies() { local package="$1" local dependencies log_message "Checking dependencies for package: $package" echo "Checking dependencies for package: $package" >> "$LOG_FILE" # Check what depends on this package dependencies=$(apt-cache rdepends --installed "$package" 2>/dev/null | grep -v "^$package$" | grep -v "Reverse Depends:" | sed 's/^ //' | sort -u) if [[ -n "$dependencies" ]]; then log_warning "Package '$package' has the following dependencies:" echo "$dependencies" | while read -r dep; do if [[ -n "$dep" ]]; then echo " - $dep" echo " DEPENDENCY: $dep" >> "$LOG_FILE" fi done echo "" return 1 # Has dependencies else log_message "Package '$package' has no dependencies - safe to remove" echo "Package '$package' - no dependencies found" >> "$LOG_FILE" return 0 # No dependencies fi } # Function to create automatic backup create_backup() { log_message "Creating automatic backup before uninstallation..." echo "Creating backup in: $BACKUP_DIR" >> "$LOG_FILE" mkdir -p "$BACKUP_DIR" # Backup important directories and files backup_items=( "/etc/asterisk" "/etc/freepbx" "/var/lib/asterisk" "/var/www/html" "/etc/apache2/sites-available" "/etc/apache2/sites-enabled" "/etc/ssl/openssl.cnf" "/etc/gai.conf" "/root/.screenrc" "/etc/vim/vimrc.local" "/etc/apt/sources.list" "/etc/apt/sources.list.d" "/etc/apt/preferences.d" "/etc/apt/apt.conf.d" "/etc/postfix/main.cf" "/etc/default/tftpd-hpa" "/etc/default/chrony" ) for item in "${backup_items[@]}"; do if [[ -e "$item" ]]; then log_message "Backing up: $item" echo "BACKUP: $item" >> "$LOG_FILE" # Create directory structure in backup backup_path="$BACKUP_DIR$item" mkdir -p "$(dirname "$backup_path")" if [[ -d "$item" ]]; then cp -r "$item" "$backup_path" 2>/dev/null || true else cp "$item" "$backup_path" 2>/dev/null || true fi fi done # Backup package list log_message "Backing up package lists..." dpkg --get-selections > "$BACKUP_DIR/packages-before-uninstall.txt" apt list --installed > "$BACKUP_DIR/apt-list-before-uninstall.txt" 2>/dev/null # Backup service status systemctl list-units --type=service --state=active > "$BACKUP_DIR/services-before-uninstall.txt" # Create restore instructions cat > "$BACKUP_DIR/RESTORE_INSTRUCTIONS.txt" << EOF FreePBX Uninstall Backup Created: $(date) ===================================== This backup contains: - Configuration files from /etc/asterisk, /etc/freepbx, etc. - Web files from /var/www/html - Apache configurations - System configuration files - Package lists before uninstallation - Service status before uninstallation To restore files: 1. Stop relevant services 2. Copy files from this backup to their original locations 3. Restart services 4. Reinstall packages if needed using packages-before-uninstall.txt WARNING: Always check file permissions and ownership after restore! Backup location: $BACKUP_DIR Log file: $LOG_FILE EOF # Set proper permissions chmod -R 600 "$BACKUP_DIR" chmod 644 "$BACKUP_DIR/RESTORE_INSTRUCTIONS.txt" log_message "Backup completed successfully!" log_message "Backup location: $BACKUP_DIR" echo "BACKUP_COMPLETED: $BACKUP_DIR" >> "$LOG_FILE" } # Function to confirm action confirm_action() { echo -e "${RED}" echo "===============================================================================" echo " ⚠️ DANGER ZONE ⚠️" echo "===============================================================================" echo "This script will COMPLETELY REMOVE FreePBX 17 and all related components!" echo "" echo "This includes:" echo "• FreePBX application and all modules" echo "• Asterisk and all its components" echo "• All databases (including call records, configurations, etc.)" echo "• All user accounts and settings" echo "• All audio files and recordings" echo "• All custom configurations" echo "" echo "⚠️ ALL DATA WILL BE PERMANENTLY LOST! ⚠️" echo "===============================================================================" echo -e "${NC}" echo "" echo "A complete backup will be created automatically before any changes." echo "Backup location: $BACKUP_DIR" echo "Log file: $LOG_FILE" echo "" echo "USER_CONFIRMATION_REQUESTED" >> "$LOG_FILE" read -p "Are you absolutely sure you want to continue? Type 'YES' to proceed: " confirm if [[ "$confirm" != "YES" ]]; then log_message "Uninstallation cancelled by user." echo "USER_CANCELLED_UNINSTALL" >> "$LOG_FILE" exit 0 fi echo "" log_warning "Starting uninstallation in 5 seconds... Press Ctrl+C to cancel!" echo "USER_CONFIRMED_UNINSTALL" >> "$LOG_FILE" echo "COUNTDOWN_START" >> "$LOG_FILE" for i in {5..1}; do echo "Starting in $i seconds..." sleep 1 done echo "COUNTDOWN_END - STARTING_UNINSTALL" >> "$LOG_FILE" } # Function to stop and disable services stop_services() { log_message "Stopping FreePBX and related services..." echo "SERVICE_STOP_START" >> "$LOG_FILE" services=("freepbx" "asterisk" "apache2" "mariadb" "fail2ban" "postfix" "tftpd-hpa" "chrony" "redis-server") for service in "${services[@]}"; do if systemctl is-active --quiet "$service" 2>/dev/null; then log_message "Stopping $service..." echo "STOPPING_SERVICE: $service" >> "$LOG_FILE" systemctl stop "$service" >> "$LOG_FILE" 2>&1 || { log_warning "Failed to stop $service" echo "FAILED_TO_STOP: $service" >> "$LOG_FILE" } else echo "SERVICE_NOT_ACTIVE: $service" >> "$LOG_FILE" fi if systemctl is-enabled --quiet "$service" 2>/dev/null; then log_message "Disabling $service..." echo "DISABLING_SERVICE: $service" >> "$LOG_FILE" systemctl disable "$service" >> "$LOG_FILE" 2>&1 || { log_warning "Failed to disable $service" echo "FAILED_TO_DISABLE: $service" >> "$LOG_FILE" } else echo "SERVICE_NOT_ENABLED: $service" >> "$LOG_FILE" fi done echo "SERVICE_STOP_END" >> "$LOG_FILE" } # Function to remove FreePBX packages remove_freepbx_packages() { log_message "Removing FreePBX packages..." echo "FREEPBX_PACKAGE_REMOVAL_START" >> "$LOG_FILE" # Core FreePBX packages freepbx_packages=( "freepbx17" "sangoma-pbx17" "sysadmin17" "ioncube-loader-82" ) log_message "Removing core FreePBX packages with dependency checking..." safe_package_removal "${freepbx_packages[@]}" # Remove Asterisk packages log_message "Removing Asterisk packages..." asterisk_packages=($(dpkg -l | grep "asterisk" | awk '{print $2}')) if [[ ${#asterisk_packages[@]} -gt 0 ]]; then echo "Found Asterisk packages: ${asterisk_packages[*]}" >> "$LOG_FILE" safe_package_removal "${asterisk_packages[@]}" else log_message "No Asterisk packages found" fi # Remove DAHDI packages if installed log_message "Checking for DAHDI packages..." dahdi_packages=($(dpkg -l | grep -E "(dahdi|libpri|wanpipe)" | awk '{print $2}')) if [[ ${#dahdi_packages[@]} -gt 0 ]]; then log_message "Found DAHDI packages: ${dahdi_packages[*]}" echo "Found DAHDI packages: ${dahdi_packages[*]}" >> "$LOG_FILE" safe_package_removal "${dahdi_packages[@]}" else log_message "No DAHDI packages found" fi echo "FREEPBX_PACKAGE_REMOVAL_END" >> "$LOG_FILE" } # Function to remove other installed packages remove_other_packages() { log_message "Removing other packages installed by FreePBX installer..." echo "OTHER_PACKAGES_REMOVAL_START" >> "$LOG_FILE" # SAFE packages that are unlikely to be used by Proxmox safe_packages_to_remove=( "sox" "mpg123" "lame" "sngrep" "tftpd-hpa" "xinetd" "php8.2-cli" "php8.2-common" "php8.2-curl" "php8.2-gd" "php8.2-mysql" "php8.2-xml" "php8.2-zip" "php8.2-mbstring" "php8.2-intl" "php8.2-bz2" "php8.2-ldap" "php8.2-sqlite3" "php8.2-bcmath" "php8.2-soap" "php8.2-ssh2" "php8.2-redis" "php-pear" "odbc-mariadb" "unixodbc" "python3-mysqldb" "python-is-python3" "mailutils" "easy-rsa" "openvpn" "incron" ) # POTENTIALLY DANGEROUS packages that might be used by Proxmox dangerous_packages=( "apache2" "fail2ban" "redis-server" "mariadb-server" "mariadb-client" "nodejs" "npm" "postfix" "iptables-persistent" "avahi-daemon" "avahi-utils" "libnss-mdns" "haproxy" "ffmpeg" ) # Remove safe packages without asking log_message "Removing FreePBX-specific packages (safe to remove)..." echo "REMOVING_SAFE_PACKAGES" >> "$LOG_FILE" safe_package_removal "${safe_packages_to_remove[@]}" echo -e "${RED}⚠️ PROXMOX WARNING ⚠️${NC}" echo -e "${YELLOW}The following packages might be used by Proxmox:${NC}" printf '%s\n' "${dangerous_packages[@]}" echo "" echo -e "${RED}Removing these packages could break your Proxmox installation!${NC}" echo -e "${YELLOW}Since FreePBX was never started, these packages are probably safe to keep.${NC}" echo "" read -p "Do you want to analyze potentially dangerous packages for removal? (y/N): " analyze_dangerous if [[ "$analyze_dangerous" =~ ^[Yy]$ ]]; then echo -e "${RED}Analyzing dangerous packages with dependency checking...${NC}" echo "ANALYZING_DANGEROUS_PACKAGES" >> "$LOG_FILE" sleep 2 safe_package_removal "${dangerous_packages[@]}" log_message "Dangerous packages analysis completed." else log_message "Keeping potentially dangerous packages for Proxmox compatibility." echo "KEEPING_DANGEROUS_PACKAGES_FOR_PROXMOX" >> "$LOG_FILE" fi echo "OTHER_PACKAGES_REMOVAL_END" >> "$LOG_FILE" } # Function to remove users and groups remove_users_groups() { log_message "Removing asterisk user and group..." if id "asterisk" &>/dev/null; then userdel asterisk 2>/dev/null || true fi if getent group asterisk &>/dev/null; then groupdel asterisk 2>/dev/null || true fi } # Function to remove directories and files remove_directories() { log_message "Removing FreePBX directories and files..." echo "DIRECTORY_REMOVAL_START" >> "$LOG_FILE" directories_to_remove=( "/var/log/pbx" "/var/lib/asterisk" "/etc/asterisk" "/tftpboot" "/var/www/html" "/etc/freepbx*" "/var/lib/freepbx" "/var/spool/asterisk" "/usr/src/freepbx" "/etc/openvpn/easyrsa3" "/var/lib/php/session" ) for dir in "${directories_to_remove[@]}"; do if [[ -d "$dir" ]] || [[ -f "$dir" ]] || [[ -L "$dir" ]]; then log_message "Removing: $dir" echo "REMOVING_DIRECTORY: $dir" >> "$LOG_FILE" rm -rf "$dir" 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to remove: $dir" echo "FAILED_TO_REMOVE: $dir" >> "$LOG_FILE" } else echo "NOT_FOUND: $dir" >> "$LOG_FILE" fi done # Remove scripts created by FreePBX installer scripts_to_remove=( "/usr/bin/post-apt-run" "/usr/bin/kernel-check" ) for script in "${scripts_to_remove[@]}"; do if [[ -f "$script" ]]; then log_message "Removing script: $script" echo "REMOVING_SCRIPT: $script" >> "$LOG_FILE" rm -f "$script" 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to remove script: $script" echo "FAILED_TO_REMOVE_SCRIPT: $script" >> "$LOG_FILE" } else echo "SCRIPT_NOT_FOUND: $script" >> "$LOG_FILE" fi done echo "DIRECTORY_REMOVAL_END" >> "$LOG_FILE" } # Function to clean up configuration files cleanup_configs() { log_message "Cleaning up configuration files..." echo "CONFIG_CLEANUP_START" >> "$LOG_FILE" # Be very careful with openssl.cnf as Proxmox uses SSL certificates if grep -q "FreePBX 17 changes" /etc/ssl/openssl.cnf 2>/dev/null; then echo -e "${YELLOW}⚠️ SSL Configuration Warning ⚠️${NC}" echo "FreePBX modified /etc/ssl/openssl.cnf which is used by Proxmox for SSL certificates." echo "Restoring original settings might affect Proxmox web interface." echo "" echo "OPENSSL_CONFIG_MODIFIED_BY_FREEPBX" >> "$LOG_FILE" read -p "Do you want to restore original SSL configuration? (y/N): " restore_ssl if [[ "$restore_ssl" =~ ^[Yy]$ ]]; then log_message "Restoring original openssl.cnf..." echo "RESTORING_OPENSSL_CONFIG" >> "$LOG_FILE" sed -i '/# FreePBX 17 changes - begin/,/# FreePBX 17 changes - end/d' /etc/ssl/openssl.cnf 2>&1 | tee -a "$LOG_FILE" sed -i 's/^openssl_conf = default_conf$/openssl_conf = openssl_init/' /etc/ssl/openssl.cnf 2>&1 | tee -a "$LOG_FILE" log_warning "SSL configuration restored - you may need to restart Proxmox services." echo "OPENSSL_CONFIG_RESTORED" >> "$LOG_FILE" else log_message "Keeping FreePBX SSL configuration for Proxmox compatibility." echo "KEEPING_FREEPBX_OPENSSL_CONFIG" >> "$LOG_FILE" fi else echo "OPENSSL_CONFIG_NOT_MODIFIED" >> "$LOG_FILE" fi # Restore original gai.conf (safer) if grep -q "^precedence ::ffff:0:0/96 100" /etc/gai.conf 2>/dev/null; then log_message "Restoring original gai.conf..." echo "RESTORING_GAI_CONFIG" >> "$LOG_FILE" sed -i 's/^precedence ::ffff:0:0\/96 100/#precedence ::ffff:0:0\/96 100/' /etc/gai.conf 2>&1 | tee -a "$LOG_FILE" echo "GAI_CONFIG_RESTORED" >> "$LOG_FILE" else echo "GAI_CONFIG_NOT_MODIFIED" >> "$LOG_FILE" fi # Remove FreePBX changes from .screenrc (safe) if [[ -f /root/.screenrc ]] && grep -q "FreePBX 17 changes" /root/.screenrc; then log_message "Cleaning up .screenrc..." echo "CLEANING_SCREENRC" >> "$LOG_FILE" sed -i '/# FreePBX 17 changes - begin/,/# FreePBX 17 changes - end/d' /root/.screenrc 2>&1 | tee -a "$LOG_FILE" echo "SCREENRC_CLEANED" >> "$LOG_FILE" else echo "SCREENRC_NOT_MODIFIED" >> "$LOG_FILE" fi # Remove FreePBX changes from vimrc.local (safe) if [[ -f /etc/vim/vimrc.local ]] && grep -q "FreePBX 17 changes" /etc/vim/vimrc.local; then log_message "Cleaning up vimrc.local..." echo "CLEANING_VIMRC" >> "$LOG_FILE" sed -i '/\" FreePBX 17 changes - begin/,/\" FreePBX 17 changes - end/d' /etc/vim/vimrc.local 2>&1 | tee -a "$LOG_FILE" echo "VIMRC_CLEANED" >> "$LOG_FILE" else echo "VIMRC_NOT_MODIFIED" >> "$LOG_FILE" fi # Remove apt configuration files (safe) config_files_to_remove=( "/etc/apt/apt.conf.d/00freepbx" "/etc/apt/apt.conf.d/80postaptcmd" "/etc/apt/apt.conf.d/05checkkernel" "/etc/apt/preferences.d/99sangoma-fpbx-repository" ) for config in "${config_files_to_remove[@]}"; do if [[ -f "$config" ]]; then log_message "Removing config file: $config" echo "REMOVING_CONFIG: $config" >> "$LOG_FILE" rm -f "$config" 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to remove config: $config" echo "FAILED_TO_REMOVE_CONFIG: $config" >> "$LOG_FILE" } else echo "CONFIG_NOT_FOUND: $config" >> "$LOG_FILE" fi done echo "CONFIG_CLEANUP_END" >> "$LOG_FILE" } # Function to remove repositories remove_repositories() { log_message "Removing FreePBX repositories..." # Remove GPG key apt-key del "9641 7C6E 0423 6E0A 986B 69EF DE82 7447 3C8D 0E52" 2>/dev/null || true rm -f /etc/apt/trusted.gpg.d/freepbx.gpg # Remove repository entries if [[ -f /etc/apt/sources.list.d/freepbx17-prod-bookworm.list ]]; then rm -f /etc/apt/sources.list.d/freepbx17-prod-bookworm.list fi if [[ -f /etc/apt/sources.list.d/freepbx17-dev-bookworm.list ]]; then rm -f /etc/apt/sources.list.d/freepbx17-dev-bookworm.list fi # Remove from sources.list if added there sed -i '/deb.*freepbx\.org/d' /etc/apt/sources.list 2>/dev/null || true } # Function to remove databases remove_databases() { echo -e "${RED}⚠️ DATABASE WARNING ⚠️${NC}" echo -e "${YELLOW}Do you want to remove MariaDB/MySQL databases?${NC}" echo "" echo "Since FreePBX was never started, it probably didn't create any databases." echo "However, if you have other applications using MariaDB (including Proxmox)," echo "removing databases could break them!" echo "" echo "Options:" echo "1) Keep all databases (RECOMMENDED for Proxmox systems)" echo "2) Remove only FreePBX-related databases (if any exist)" echo "3) Remove ALL databases (DANGEROUS - could break Proxmox!)" echo "" read -p "Choose option (1/2/3): " db_option case $db_option in 2) log_message "Looking for FreePBX databases to remove..." if systemctl is-active --quiet mariadb 2>/dev/null; then # Try to remove only FreePBX databases mysql -e "DROP DATABASE IF EXISTS asterisk;" 2>/dev/null || true mysql -e "DROP DATABASE IF EXISTS freepbx;" 2>/dev/null || true log_message "FreePBX-specific databases removed (if they existed)." else log_message "MariaDB is not running - no databases to remove." fi ;; 3) echo -e "${RED}This will delete ALL databases on this system!${NC}" read -p "Are you absolutely sure? Type 'DELETE ALL' to confirm: " confirm_delete if [[ "$confirm_delete" == "DELETE ALL" ]]; then log_message "Removing ALL databases..." if systemctl is-active --quiet mariadb 2>/dev/null; then systemctl stop mariadb fi rm -rf /var/lib/mysql/* 2>/dev/null || true log_message "All databases removed." else log_message "Database removal cancelled." fi ;; *) log_message "Keeping all databases (recommended for Proxmox)." ;; esac } # Function to clean up package cache and autoremove final_cleanup() { log_message "Performing final cleanup..." echo "FINAL_CLEANUP_START" >> "$LOG_FILE" # Unhold packages that might have been held log_message "Removing package holds..." echo "REMOVING_PACKAGE_HOLDS" >> "$LOG_FILE" apt-mark unhold sangoma-pbx17 nodejs node-* freepbx17 2>&1 | tee -a "$LOG_FILE" || true # Remove orphaned packages log_message "Removing orphaned packages..." echo "REMOVING_ORPHANED_PACKAGES" >> "$LOG_FILE" apt-get autoremove -y --purge 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to remove orphaned packages" echo "FAILED_ORPHAN_REMOVAL" >> "$LOG_FILE" } # Clean package cache log_message "Cleaning package cache..." echo "CLEANING_PACKAGE_CACHE" >> "$LOG_FILE" apt-get autoclean 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to clean package cache" echo "FAILED_CACHE_CLEAN" >> "$LOG_FILE" } # Update package list log_message "Updating package list..." echo "UPDATING_PACKAGE_LIST" >> "$LOG_FILE" apt-get update 2>&1 | tee -a "$LOG_FILE" || { log_error "Failed to update package list" echo "FAILED_PACKAGE_UPDATE" >> "$LOG_FILE" } # Create post-cleanup package list for comparison log_message "Creating post-cleanup package list..." dpkg --get-selections > "${BACKUP_DIR}/packages-after-uninstall.txt" 2>&1 | tee -a "$LOG_FILE" || true apt list --installed > "${BACKUP_DIR}/apt-list-after-uninstall.txt" 2>&1 | tee -a "$LOG_FILE" || true log_message "Final cleanup completed." echo "FINAL_CLEANUP_END" >> "$LOG_FILE" } # Function to restore system state restore_system_state() { log_message "Restoring system to original state..." # Uncomment CD-ROM repository if it was commented out if grep -q "^#deb cdrom" /etc/apt/sources.list; then log_message "Restoring CD-ROM repository..." sed -i '/^#deb cdrom/s/^#//' /etc/apt/sources.list fi # Reset debconf selections that were set during installation echo "iptables-persistent iptables-persistent/autosave_v4 boolean false" | debconf-set-selections echo "iptables-persistent iptables-persistent/autosave_v6 boolean false" | debconf-set-selections log_message "System restoration completed." } # Main execution main() { # Initialize logging first init_logging log_message "FreePBX 17 Uninstallation Script Started" log_message "Log file: $LOG_FILE" log_message "Backup will be created in: $BACKUP_DIR" # Check if Proxmox is installed first check_proxmox confirm_action # Create backup before making any changes create_backup stop_services remove_freepbx_packages remove_other_packages remove_users_groups remove_directories cleanup_configs remove_repositories remove_databases restore_system_state final_cleanup log_message "FreePBX 17 has been removed from the system!" if dpkg -l | grep -q "proxmox-ve"; then echo "" echo -e "${YELLOW}⚠️ PROXMOX SYSTEM DETECTED ⚠️${NC}" echo "Please check Proxmox web interface (https://your-ip:8006) to ensure" echo "it's still working properly after this uninstallation." echo "" echo "If you experience issues with Proxmox, you may need to:" echo "• Restart Proxmox services: systemctl restart pveproxy pvedaemon" echo "• Reinstall any accidentally removed packages" echo "• Restore from backup: $BACKUP_DIR" echo "" log_message "Proxmox compatibility warnings displayed to user" fi log_message "Consider rebooting the system to ensure all changes take effect." echo "" echo -e "${GREEN}===============================================================================${NC}" echo -e "${GREEN} FreePBX 17 Uninstallation Complete!${NC}" echo -e "${GREEN}===============================================================================${NC}" echo "" echo "The system has been restored with Proxmox-safe settings." echo "Some packages may have been preserved to maintain system stability." echo "" echo -e "${GREEN}Important files:${NC}" echo "• Complete log: $LOG_FILE" echo "• Backup location: $BACKUP_DIR" echo "• Restore instructions: $BACKUP_DIR/RESTORE_INSTRUCTIONS.txt" echo "" echo "Consider rebooting the system: sudo reboot" echo "" # Final log entry echo "===================================================================================" >> "$LOG_FILE" echo "FreePBX 17 Uninstallation completed at $(date)" >> "$LOG_FILE" echo "Backup location: $BACKUP_DIR" >> "$LOG_FILE" echo "===================================================================================" >> "$LOG_FILE" log_message "Uninstallation process completed successfully!" } # Run the main function main "$@"