This commit is contained in:
hhftechnologies 2024-11-27 18:06:56 +05:30
parent b36658a0ee
commit f25720eb42

View file

@ -4,14 +4,11 @@
# VARIABLES # # VARIABLES #
#-----------------------------------# #-----------------------------------#
this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/maintenance/crowdsec_removal.sh" this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/maintenance/crowdsec-removal.sh"
this_script_name="CrowdSec Removal Script" this_script_name="CrowdSec Removal Script"
formatter_url="https://git.hhf.technology/hhf/TaskFormatter/raw/branch/main/bash_task_formatter/task_formatter.sh" formatter_url="https://git.hhf.technology/hhf/TaskFormatter/raw/branch/main/bash_task_formatter/task_formatter.sh"
scriptname=$0 scriptname=$0
# Script version
VERSION="2.0.0"
# Initialize success flag # Initialize success flag
success=0 success=0
@ -19,10 +16,6 @@ success=0
USER_TO_RUN_AS="${1:-$SUDO_USER}" USER_TO_RUN_AS="${1:-$SUDO_USER}"
USER_HOME=$(eval echo ~$USER_TO_RUN_AS) USER_HOME=$(eval echo ~$USER_TO_RUN_AS)
# Logging setup
LOGFILE="/var/log/crowdsec_removal_$(date +%Y%m%d_%H%M%S).log"
BACKUP_DIR="/var/backup/crowdsec_$(date +%Y%m%d_%H%M%S)"
#-----------------------------------# #-----------------------------------#
# FORMATTER # # FORMATTER #
#-----------------------------------# #-----------------------------------#
@ -61,342 +54,150 @@ download_formatter
# FUNCTIONS # # FUNCTIONS #
#-----------------------------------# #-----------------------------------#
# Trap errors and interrupts # Function to check if CrowdSec is installed
trap 'error_handler $? $LINENO' ERR check_crowdsec_installed() {
trap 'cleanup' EXIT if command -v cscli >/dev/null 2>&1 || [ -d "/etc/crowdsec" ]; then
trap 'interrupt_handler' INT TERM echo "CrowdSec installation detected"
return 0
# Function to handle errors else
error_handler() { echo "CrowdSec is not installed"
local exit_code=$1 return 1
local line_number=$2 fi
log_message "ERROR" "Error $exit_code occurred on line $line_number"
cleanup
exit "$exit_code"
} }
# Function to handle interrupts # Function to stop CrowdSec services
interrupt_handler() { stop_services() {
log_message "WARNING" "Script interrupted by user" echo "Stopping CrowdSec services..."
cleanup systemctl stop crowdsec 2>/dev/null
exit 130 systemctl stop crowdsec-firewall-bouncer 2>/dev/null
} systemctl stop crowdsec-cloudflare-bouncer 2>/dev/null
echo -e "Services stopped $CHECK_MARK"
# Function to clean up temporary files
cleanup_files() {
# Remove temporary files if they exist
[ -f "/tmp/crowdsec_services.tmp" ] && rm -f "/tmp/crowdsec_services.tmp"
[ -f "/tmp/crowdsec_packages.tmp" ] && rm -f "/tmp/crowdsec_packages.tmp"
return 0 return 0
} }
# Function to remove the script # Function to remove CrowdSec bouncers
remove_bouncers() {
echo "Removing CrowdSec bouncers..."
# Remove firewall bouncer
if dpkg -l | grep -q crowdsec-firewall-bouncer; then
apt-get remove --purge -y crowdsec-firewall-bouncer >/dev/null 2>&1
fi
# Remove cloudflare bouncer
if dpkg -l | grep -q crowdsec-cloudflare-bouncer; then
apt-get remove --purge -y crowdsec-cloudflare-bouncer >/dev/null 2>&1
fi
# Remove bouncer configurations
rm -rf /etc/crowdsec/bouncers/ 2>/dev/null
echo -e "Bouncers removed $CHECK_MARK"
return 0
}
# Function to remove CrowdSec main package
remove_crowdsec() {
echo "Removing CrowdSec main package..."
# Remove the main package
apt-get remove --purge -y crowdsec >/dev/null 2>&1
# Remove repository configuration
rm -f /etc/apt/sources.list.d/crowdsec.list 2>/dev/null
echo -e "CrowdSec removed $CHECK_MARK"
return 0
}
# Function to clean up remaining files
cleanup_crowdsec_files() {
echo "Cleaning up remaining files..."
# Remove configuration directory
rm -rf /etc/crowdsec 2>/dev/null
# Remove data directory
rm -rf /var/lib/crowdsec 2>/dev/null
# Remove log directory
rm -rf /var/log/crowdsec 2>/dev/null
# Remove temporary files
rm -rf /tmp/crowdsec* 2>/dev/null
echo -e "Cleanup completed $CHECK_MARK"
return 0
}
# Remove the script itself
remove_script() { remove_script() {
if [ -f "$0" ]; then if [ -f "$0" ]; then
rm -f -- "$0" echo "Deleted removal script..."
rm -- "$0"
fi fi
if [ -f "task_formatter.sh" ]; then if [ -f "task_formatter.sh" ]; then
rm -f task_formatter.sh rm task_formatter.sh
fi fi
echo -e "Cleaned up $CHECK_MARK"
return 0 return 0
} }
# Main cleanup function
cleanup() {
format_output cleanup_files "Cleaning up temporary files"
format_output remove_script "Removing script"
}
# Function to check if a command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Enhanced logging function with formatter integration
log_message() {
local level=$1
local message=$2
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$timestamp] [$level] $message" >> "$LOGFILE"
case $level in
"INFO") log "$message" ;;
"WARNING") log "$message" ;;
"ERROR") log "$message" ;;
"SUCCESS") log "${CHECK_MARK} $message" ;;
esac
}
# Function to check system requirements
check_system_requirements() {
local missing_deps=()
# Check for required commands
for cmd in systemctl grep awk sed; do
if ! command_exists "$cmd"; then
missing_deps+=("$cmd")
fi
done
if [ ${#missing_deps[@]} -ne 0 ]; then
log_message "ERROR" "Missing required dependencies: ${missing_deps[*]}"
return 1
fi
return 0
}
# Function to check if running as root
check_root() {
if [ "$(id -u)" -ne 0 ]; then
log_message "ERROR" "Please run as root"
return 1
fi
return 0
}
# Function to create backup
create_backup() {
log_message "INFO" "Creating backup of CrowdSec configurations..."
mkdir -p "$BACKUP_DIR"
# Backup configuration files
if [ -d "/etc/crowdsec" ]; then
cp -r "/etc/crowdsec" "$BACKUP_DIR/"
fi
if [ -d "/var/lib/crowdsec" ]; then
cp -r "/var/lib/crowdsec" "$BACKUP_DIR/"
fi
# Backup service files
if [ -d "/etc/systemd/system" ]; then
find "/etc/systemd/system" -name "*crowdsec*" -exec cp {} "$BACKUP_DIR/" \;
fi
log_message "SUCCESS" "Backup created at $BACKUP_DIR"
return 0
}
# Enhanced service check function
check_services() {
log_message "INFO" "Checking for CrowdSec services..."
systemctl list-units --type=service --all | grep -i crowdsec | awk '{print $1}' > /tmp/crowdsec_services.tmp
if [ ! -s /tmp/crowdsec_services.tmp ]; then
log_message "SUCCESS" "No CrowdSec services found."
services=""
return 0
else
services=$(cat /tmp/crowdsec_services.tmp)
log_message "WARNING" "Found CrowdSec services:"
echo "$services" | while read -r service; do
log_message "INFO" "Found service: $service"
done
return 0
fi
}
# Enhanced package check function
check_packages() {
log_message "INFO" "Checking for CrowdSec packages..."
if command_exists dpkg; then
dpkg -l | grep -i crowdsec | awk '{print $2}' > /tmp/crowdsec_packages.tmp
elif command_exists rpm; then
rpm -qa | grep -i crowdsec > /tmp/crowdsec_packages.tmp
else
log_message "ERROR" "Unable to determine package manager."
return 1
fi
if [ ! -s /tmp/crowdsec_packages.tmp ]; then
log_message "SUCCESS" "No CrowdSec packages found."
packages=""
else
packages=$(cat /tmp/crowdsec_packages.tmp)
log_message "WARNING" "Found CrowdSec packages:"
echo "$packages" | while read -r package; do
log_message "INFO" "Found package: $package"
done
fi
return 0
}
# Enhanced service disable function
disable_services() {
log_message "INFO" "Disabling CrowdSec services..."
if [ -z "$services" ]; then
log_message "WARNING" "No CrowdSec services to disable."
return 0
fi
echo "$services" | while read -r service; do
systemctl stop "$service" 2>/dev/null
if [ $? -eq 0 ]; then
systemctl disable "$service" 2>/dev/null
log_message "SUCCESS" "Disabled $service"
else
log_message "ERROR" "Failed to stop $service"
return 1
fi
done
return 0
}
# Enhanced package removal function
remove_packages() {
log_message "INFO" "Removing CrowdSec packages..."
if [ -z "$packages" ]; then
log_message "WARNING" "No CrowdSec packages to remove."
return 0
fi
local remove_cmd=""
if command_exists apt-get; then
remove_cmd="apt-get remove --purge -y"
cleanup_cmd="apt-get autoremove -y"
elif command_exists yum; then
remove_cmd="yum remove -y"
cleanup_cmd="yum autoremove -y"
elif command_exists dnf; then
remove_cmd="dnf remove -y"
cleanup_cmd="dnf autoremove -y"
else
log_message "ERROR" "No supported package manager found."
return 1
fi
local failed=0
echo "$packages" | while read -r package; do
if $remove_cmd "$package"; then
log_message "SUCCESS" "Removed package: $package"
else
log_message "ERROR" "Failed to remove package: $package"
failed=1
fi
done
if [ $failed -eq 0 ] && $cleanup_cmd; then
log_message "SUCCESS" "Cleaned up dependencies"
return 0
fi
return 1
}
# Enhanced repository removal function
remove_apt_repos() {
log_message "INFO" "Removing CrowdSec repository entries..."
if ! command_exists apt-get; then
log_message "INFO" "System is not Debian/Ubuntu based, skipping repo removal"
return 0
fi
local repo_files=("/etc/apt/sources.list" "/etc/apt/sources.list.d/"*)
local failed=0
for file in "${repo_files[@]}"; do
if [ -f "$file" ] && grep -q "crowdsec" "$file"; then
if sed -i '/crowdsec/d' "$file"; then
log_message "SUCCESS" "Removed CrowdSec entry from $file"
else
log_message "ERROR" "Failed to remove CrowdSec entry from $file"
failed=1
fi
fi
done
if [ $failed -eq 0 ] && apt-get update >/dev/null 2>&1; then
log_message "SUCCESS" "APT repositories updated"
return 0
fi
return 1
}
# Enhanced configuration removal function
remove_config() {
log_message "INFO" "Removing CrowdSec configuration files..."
local config_dirs=(
"/etc/crowdsec"
"/var/lib/crowdsec"
"/usr/local/lib/crowdsec"
"/usr/share/crowdsec"
)
local failed=0
for dir in "${config_dirs[@]}"; do
if [ -d "$dir" ]; then
if rm -rf "$dir" 2>/dev/null; then
log_message "SUCCESS" "Removed directory: $dir"
else
log_message "ERROR" "Failed to remove directory: $dir"
failed=1
fi
fi
done
[ $failed -eq 0 ] && return 0 || return 1
}
#-----------------------------------# #-----------------------------------#
# MAIN LOGIC # # MAIN LOGIC #
#-----------------------------------# #-----------------------------------#
# Check if script is run as root
if [ "$EUID" -ne 0 ]; then
echo "Please run as root"
exit 1
fi
# Check if print_header function exists
if ! command -v print_header >/dev/null 2>&1; then
echo "Error: print_header function not found. Formatter may not be properly sourced."
exit 1
fi
# Print header # Print header
print_header "$this_script_name" "$this_script_url" print_header "$this_script_name" "$this_script_url"
echo -e "Running as User: $USER_TO_RUN_AS\nUser Home: $USER_HOME\n" echo -e "Running as User: $USER_TO_RUN_AS\nUser Home: $USER_HOME\n"
# Check requirements # Check if CrowdSec is installed
if ! format_output check_root "Checking root privileges"; then if ! format_output check_crowdsec_installed "Checking CrowdSec Installation"; then
cleanup echo "CrowdSec is not installed. Nothing to remove."
exit 1 format_output remove_script "Removing script"
fi
if ! format_output check_system_requirements "Checking system requirements"; then
cleanup
exit 1
fi
# Initialize log file
touch "$LOGFILE" || { echo "Cannot create log file"; exit 1; }
log_message "INFO" "Starting CrowdSec removal script v${VERSION}"
# Check current state
format_output check_services "Checking CrowdSec services"
format_output check_packages "Checking CrowdSec packages"
if [ -z "$services" ] && [ -z "$packages" ]; then
log_message "SUCCESS" "No CrowdSec components found on your system."
cleanup
exit 0 exit 0
fi fi
# Interactive menu # Run the removal functions with formatted output
log_message "INFO" "What would you like to do?" if ! format_output stop_services "Stopping CrowdSec Services"; then
echo "1) Disable CrowdSec services" success=1
echo "2) Remove CrowdSec packages" fi
echo "3) Remove everything (services, packages, configuration, and repositories)"
echo "4) Exit without changes"
read -r -p "Enter your choice (1-4): " choice if ! format_output remove_bouncers "Removing CrowdSec Bouncers"; then
success=1
fi
case $choice in if ! format_output remove_crowdsec "Removing CrowdSec Main Package"; then
1) format_output disable_services "Disabling CrowdSec services" ;; success=1
2) format_output remove_packages "Removing CrowdSec packages" ;; fi
3)
format_output create_backup "Creating backup"
format_output disable_services "Disabling services"
format_output remove_packages "Removing packages"
format_output remove_apt_repos "Removing repositories"
format_output remove_config "Removing configuration"
;;
4) log_message "INFO" "Exiting without changes."; cleanup; exit 0 ;;
*) log_message "ERROR" "Invalid choice."; cleanup; exit 1 ;;
esac
log_message "SUCCESS" "Operations completed successfully." if ! format_output cleanup_crowdsec_files "Cleaning Up Remaining Files"; then
echo "Log file available at: $LOGFILE" success=1
fi
format_output remove_script "Removing script"
# Check if final_message function exists
if ! command -v final_message >/dev/null 2>&1; then
echo "Error: final_message function not found. Formatter may not be properly sourced."
exit 1
fi
# Print final message
final_message "$this_script_name" "$success"
# Exit with appropriate status # Exit with appropriate status
exit $success exit $success