This commit is contained in:
hhftechnologies 2024-11-26 17:37:02 +05:30
parent 1170088345
commit 230fbd0b8c
3 changed files with 323 additions and 218 deletions

View file

@ -0,0 +1,322 @@
#!/bin/bash
#-----------------------------------#
# VARIABLES #
#-----------------------------------#
this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/maintenance/crowdsec-removal.sh" # Replace with actual URL
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
# Determine the user (use the first argument if provided, otherwise fallback)
USER_TO_RUN_AS="${1:-$SUDO_USER}"
USER_HOME=$(eval echo ~$USER_TO_RUN_AS)
# Logging and backup 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 #
#-----------------------------------#
# Download and source the formatter with error handling
download_formatter() {
if [ ! -f "task_formatter.sh" ]; then
if ! wget "$formatter_url" --no-check-certificate -O task_formatter.sh > /dev/null 2>&1; then
echo "Error: Failed to download task_formatter.sh"
exit 1
fi
fi
if [ ! -f "task_formatter.sh" ]; then
echo "Error: task_formatter.sh not found after download attempt"
exit 1
fi
# Make the formatter executable
chmod +x task_formatter.sh
# Source the formatter with error checking
source ./task_formatter.sh || { echo "Error: Failed to source task_formatter.sh"; exit 1; }
# Check if print_header is available after sourcing
if ! declare -f print_header > /dev/null; then
echo "Error: print_header function not found after sourcing."
exit 1
fi
}
# Call the download_formatter function
download_formatter
#-----------------------------------#
# FUNCTIONS #
#-----------------------------------#
# Function to check if a command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to check if running as root
check_root() {
if [ "$(id -u)" -ne 0 ]; then
echo -e "Please run as root $CROSS_MARK"
exit 1
fi
echo -e "Running as root $CHECK_MARK"
return 0
}
# Function to create backup
create_backup() {
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
echo -e "Backup created at $BACKUP_DIR $CHECK_MARK"
return 0
}
# Function to check services
check_services() {
systemctl list-units --type=service --all | grep -i crowdsec | awk '{print $1}' > /tmp/crowdsec_services.tmp
if [ ! -s /tmp/crowdsec_services.tmp ]; then
echo -e "No CrowdSec services found $CHECK_MARK"
services=""
return 0
else
services=$(cat /tmp/crowdsec_services.tmp)
echo "Found CrowdSec services:"
cat /tmp/crowdsec_services.tmp
echo -e "Service check completed $CHECK_MARK"
return 0
fi
}
# Function to check packages
check_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
echo -e "Unable to determine package manager $CROSS_MARK"
return 1
fi
if [ ! -s /tmp/crowdsec_packages.tmp ]; then
echo -e "No CrowdSec packages found $CHECK_MARK"
packages=""
return 0
else
packages=$(cat /tmp/crowdsec_packages.tmp)
echo "Found CrowdSec packages:"
cat /tmp/crowdsec_packages.tmp
echo -e "Package check completed $CHECK_MARK"
return 0
fi
}
# Function to disable services
disable_services() {
if [ -z "$services" ]; then
echo -e "No CrowdSec services to disable $CHECK_MARK"
return 0
fi
local success=0
echo "$services" | while read -r service; do
if ! systemctl stop "$service" 2>/dev/null || ! systemctl disable "$service" 2>/dev/null; then
echo -e "Failed to disable $service $CROSS_MARK"
success=1
fi
done
if [ $success -eq 0 ]; then
echo -e "Services disabled successfully $CHECK_MARK"
return 0
else
echo -e "Some services failed to disable $CROSS_MARK"
return 1
fi
}
# Function to remove packages
remove_packages() {
if [ -z "$packages" ]; then
echo -e "No CrowdSec packages to remove $CHECK_MARK"
return 0
fi
local remove_cmd=""
local cleanup_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
echo -e "No supported package manager found $CROSS_MARK"
return 1
fi
local success=0
echo "$packages" | while read -r package; do
if ! $remove_cmd "$package"; then
echo -e "Failed to remove package: $package $CROSS_MARK"
success=1
fi
done
if ! $cleanup_cmd; then
echo -e "Failed to clean up dependencies $CROSS_MARK"
success=1
fi
if [ $success -eq 0 ]; then
echo -e "Packages removed successfully $CHECK_MARK"
return 0
else
echo -e "Some packages failed to remove $CROSS_MARK"
return 1
fi
}
# Function to remove configuration
remove_config() {
local config_dirs=(
"/etc/crowdsec"
"/var/lib/crowdsec"
"/usr/local/lib/crowdsec"
"/usr/share/crowdsec"
)
local success=0
for dir in "${config_dirs[@]}"; do
if [ -d "$dir" ]; then
if ! rm -rf "$dir" 2>/dev/null; then
echo -e "Failed to remove directory: $dir $CROSS_MARK"
success=1
fi
fi
done
if [ $success -eq 0 ]; then
echo -e "Configuration removed successfully $CHECK_MARK"
return 0
else
echo -e "Some configuration directories failed to remove $CROSS_MARK"
return 1
fi
}
# Remove created files on cleanup
cleanup_files() {
rm -f /tmp/crowdsec_services.tmp /tmp/crowdsec_packages.tmp
echo -e "Cleaned up temporary files $CHECK_MARK"
return 0
}
# Remove the script itself
remove_script() {
if [ -f "$0" ]; then
echo "Removing monitoring script..."
rm -- "$0"
fi
if [ -f "task_formatter.sh" ]; then
rm task_formatter.sh
fi
echo -e "Cleaned up $CHECK_MARK"
return 0
}
#-----------------------------------#
# MAIN LOGIC #
#-----------------------------------#
# Print header
print_header "$this_script_name" "$this_script_url"
echo -e "Running as User: $USER_TO_RUN_AS\nUser Home: $USER_HOME\n"
# Run with formatted output
if ! format_output check_root "Checking root privileges"; then
cleanup_files
success=1
fi
if ! format_output check_services "Checking CrowdSec services"; then
cleanup_files
success=1
fi
if ! format_output check_packages "Checking CrowdSec packages"; then
cleanup_files
success=1
fi
if [ -z "$services" ] && [ -z "$packages" ]; then
echo -e "No CrowdSec components found on your system $CHECK_MARK"
format_output cleanup_files "Cleaning up temporary files"
format_output remove_script "Removing script"
exit 0
fi
echo "What would you like to do?"
echo "1) Disable CrowdSec services"
echo "2) Remove CrowdSec packages"
echo "3) Remove everything (services, packages, and configuration)"
echo "4) Exit without changes"
read -r -p "Enter your choice (1-4): " choice
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 CrowdSec services"
format_output remove_packages "Removing CrowdSec packages"
format_output remove_config "Removing CrowdSec configuration"
;;
4)
echo -e "Exiting without changes $CHECK_MARK"
success=0
;;
*)
echo -e "Invalid choice $CROSS_MARK"
success=1
;;
esac
format_output cleanup_files "Cleaning up temporary files"
format_output remove_script "Removing script"
# Exit with appropriate status
exit $success

View file

@ -1,217 +0,0 @@
#!/bin/bash
# Run this script with:
# wget https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh && sudo bash master.sh
# Variables for URLs and script info
this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh"
this_script_name="HHF Script Management Tool"
BRANCH="main"
forgejo_url="git.hhf.technology"
repo_owner="hhf"
repo_name="script-management-cloudpanel"
# Colors for output formatting
COLOR_RED='\033[0;31m'
COLOR_GREEN='\033[0;32m'
COLOR_BLUE='\033[0;34m'
COLOR_RESET='\033[0m'
# Formatting functions
print_header() {
local script_name=$1
local script_url=$2
printf "\n${COLOR_GREEN}=== %s ===${COLOR_RESET}\n" "$script_name"
printf "${COLOR_BLUE}Script URL: %s${COLOR_RESET}\n\n" "$script_url"
}
format_output() {
local func=$1
local message=$2
printf "${COLOR_BLUE}%s...${COLOR_RESET}\n" "$message"
$func
printf "${COLOR_GREEN}Done!${COLOR_RESET}\n"
}
final_message() {
local script_name=$1
local success=$2
if [ $success -eq 0 ]; then
printf "\n${COLOR_GREEN}=== %s completed successfully ===${COLOR_RESET}\n" "$script_name"
else
printf "\n${COLOR_RED}=== %s failed with errors ===${COLOR_RESET}\n" "$script_name"
fi
}
# Check if the script is being run with sudo
if [ "$EUID" -eq 0 ]; then
ORIGINAL_USER=${SUDO_USER:-$(whoami)}
else
ORIGINAL_USER=$(whoami)
fi
# Function to check and install sudo if not present
install_sudo() {
if ! command which sudo &> /dev/null; then
echo "sudo is not installed. Installing sudo..."
if [ -x "$(command -v apt-get)" ]; then
apt-get update > /dev/null 2>&1 && apt-get install -y sudo > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
yum install -y sudo > /dev/null 2>&1
else
echo "Could not install sudo. Please install it manually."
exit 1
fi
fi
}
# Function to check and install curl if not present
install_curl() {
if ! command -v curl &> /dev/null; then
echo "curl is not installed. Installing curl..."
if [ -x "$(command -v apt-get)" ]; then
sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y curl > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
sudo yum install -y curl > /dev/null 2>&1
else
echo "Could not install curl. Please install it manually."
exit 1
fi
fi
}
# Function to check and install jq if not present
install_jq() {
if ! command -v jq &> /dev/null; then
echo "jq is not installed. Installing jq..."
if [ -x "$(command -v apt-get)" ]; then
sudo apt-get update > /dev/null 2>&1 && sudo apt-get install -y jq > /dev/null 2>&1
elif [ -x "$(command -v yum)" ]; then
sudo yum install -y jq > /dev/null 2>&1
else
echo "Could not install jq. Please install it manually."
exit 1
fi
fi
}
# Function to clean up temporary files in /tmp
cleanup_tmp_files() {
echo "Cleaning up temporary files..."
sudo rm -rf /tmp/$forgejo_url* > /dev/null 2>&1
echo "Temporary files cleaned."
}
remove_script() {
rm -- "$0" 2>/dev/null
}
# Function to fetch the list of scripts from the repository
fetch_scripts() {
# Forgejo/Gitea API endpoint for listing repository contents
scripts_recursive=$(curl -k -s "https://$forgejo_url/api/v1/repos/$repo_owner/$repo_name/contents?ref=$BRANCH" | jq -r '.[] | select(.type == "file" and .name and (.name | type == "string") and (.name | endswith(".sh"))) | .path')
echo "$scripts_recursive" | sort -u
}
# Function to download and run a selected script
run_script() {
local script_path=$1
local encoded_script_path=$(echo "$script_path" | sed 's/\//%2F/g')
local script_name=$(basename "$script_path")
local url="https://$forgejo_url/$repo_owner/$repo_name/raw/branch/$BRANCH/$script_path"
# If verbose mode, print the URL
if [[ "$verbose" == "true" ]]; then
echo "Requesting URL: $url"
fi
# Create necessary directories for the script
mkdir -p "/tmp/$(dirname "$script_path")"
# Make the request and capture the HTTP status code
http_status=$(curl -k -sL -w "%{http_code}" -o "/tmp/$script_path" "$url")
# If verbose mode, print the HTTP status code
if [[ "$verbose" == "true" ]]; then
echo "Request completed with status code: $http_status"
fi
if [[ "$http_status" == "200" ]]; then
chmod +x "/tmp/$script_path"
sudo bash "/tmp/$script_path" "$ORIGINAL_USER"
else
echo "Failed to download script: $script_name (HTTP status code: $http_status)"
fi
}
# Main function to display the script selection menu and run the selected scripts
run_scripts() {
printf "${COLOR_GREEN}Fetching list of available scripts from Forgejo repository...${COLOR_RESET}\n"
scripts=$(fetch_scripts)
if [ -z "$scripts" ]; then
printf "${COLOR_RED}No scripts found in the repository.${COLOR_RESET}\n"
exit 1
fi
while true; do
printf "${COLOR_BLUE}\nAvailable scripts:${COLOR_RESET}\n"
select script in $scripts "Quit"; do
if [ "$script" == "Quit" ]; then
break 2
elif [ -n "$script" ]; then
printf "${COLOR_BLUE}You selected $script. Running script...${COLOR_RESET}\n"
run_script "$script"
break
else
printf "${COLOR_RED}Invalid selection. Please try again.${COLOR_RESET}\n"
fi
done
printf "${COLOR_BLUE}Would you like to run more scripts? (y/n)${COLOR_RESET}\n"
read -r choice
if [[ "$choice" != "y" ]]; then
break
fi
done
}
# Main script logic
clear
# Check for verbose flag
verbose="false"
if [[ "$1" == "-v" ]]; then
verbose="true"
fi
# Print header
print_header "$this_script_name" "$this_script_url"
# Initialize success flag
success=0
install_sudo
install_curl
install_jq
run_scripts
# Cleanup created files
cleanup_tmp_files
# Clean up the master script
format_output remove_script "Cleaning up"
# Print final message
final_message() {
local script_name=$1
local success=$2
if [[ $success -eq 0 ]]; then
log "${CHECK_MARK} $script_name completed successfully."
else
log "${CROSS_MARK} $script_name encountered errors."
fi
}
# Exit with appropriate status
exit $success

View file

@ -5,7 +5,7 @@
# Variables for URLs and script info
this_script_url="https://git.hhf.technology/hhf/script-management-cloudpanel/raw/branch/main/master.sh"
this_script_name="Forgejo Script Management Tool"
this_script_name="HHF Script Management Tool"
BRANCH="main"
forgejo_url="git.hhf.technology"