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 #
#-----------------------------------#
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"
formatter_url="https://git.hhf.technology/hhf/TaskFormatter/raw/branch/main/bash_task_formatter/task_formatter.sh"
scriptname=$0
# Script version
VERSION="2.0.0"
# Initialize success flag
success=0
@ -19,10 +16,6 @@ success=0
USER_TO_RUN_AS="${1:-$SUDO_USER}"
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 #
#-----------------------------------#
@ -61,342 +54,150 @@ download_formatter
# FUNCTIONS #
#-----------------------------------#
# Trap errors and interrupts
trap 'error_handler $? $LINENO' ERR
trap 'cleanup' EXIT
trap 'interrupt_handler' INT TERM
# Function to handle errors
error_handler() {
local exit_code=$1
local line_number=$2
log_message "ERROR" "Error $exit_code occurred on line $line_number"
cleanup
exit "$exit_code"
# Function to check if CrowdSec is installed
check_crowdsec_installed() {
if command -v cscli >/dev/null 2>&1 || [ -d "/etc/crowdsec" ]; then
echo "CrowdSec installation detected"
return 0
else
echo "CrowdSec is not installed"
return 1
fi
}
# Function to handle interrupts
interrupt_handler() {
log_message "WARNING" "Script interrupted by user"
cleanup
exit 130
}
# 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"
# Function to stop CrowdSec services
stop_services() {
echo "Stopping CrowdSec services..."
systemctl stop crowdsec 2>/dev/null
systemctl stop crowdsec-firewall-bouncer 2>/dev/null
systemctl stop crowdsec-cloudflare-bouncer 2>/dev/null
echo -e "Services stopped $CHECK_MARK"
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() {
if [ -f "$0" ]; then
rm -f -- "$0"
echo "Deleted removal script..."
rm -- "$0"
fi
if [ -f "task_formatter.sh" ]; then
rm -f task_formatter.sh
rm task_formatter.sh
fi
echo -e "Cleaned up $CHECK_MARK"
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 #
#-----------------------------------#
# 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 "$this_script_name" "$this_script_url"
echo -e "Running as User: $USER_TO_RUN_AS\nUser Home: $USER_HOME\n"
# Check requirements
if ! format_output check_root "Checking root privileges"; then
cleanup
exit 1
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
# Check if CrowdSec is installed
if ! format_output check_crowdsec_installed "Checking CrowdSec Installation"; then
echo "CrowdSec is not installed. Nothing to remove."
format_output remove_script "Removing script"
exit 0
fi
# Interactive menu
log_message "INFO" "What would you like to do?"
echo "1) Disable CrowdSec services"
echo "2) Remove CrowdSec packages"
echo "3) Remove everything (services, packages, configuration, and repositories)"
echo "4) Exit without changes"
# Run the removal functions with formatted output
if ! format_output stop_services "Stopping CrowdSec Services"; then
success=1
fi
read -r -p "Enter your choice (1-4): " choice
if ! format_output remove_bouncers "Removing CrowdSec Bouncers"; then
success=1
fi
case $choice in
1) format_output disable_services "Disabling CrowdSec services" ;;
2) format_output remove_packages "Removing CrowdSec packages" ;;
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
if ! format_output remove_crowdsec "Removing CrowdSec Main Package"; then
success=1
fi
log_message "SUCCESS" "Operations completed successfully."
echo "Log file available at: $LOGFILE"
if ! format_output cleanup_crowdsec_files "Cleaning Up Remaining Files"; then
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 $success