833 lines
30 KiB
Bash
833 lines
30 KiB
Bash
#!/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 "$@"
|