diff --git a/maintenance/crowdsec_removal.sh b/maintenance/crowdsec_removal.sh new file mode 100644 index 0000000..17f5f2f --- /dev/null +++ b/maintenance/crowdsec_removal.sh @@ -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 \ No newline at end of file diff --git a/master-forgejo.sh b/master-forgejo.sh deleted file mode 100644 index 1fae718..0000000 --- a/master-forgejo.sh +++ /dev/null @@ -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 \ No newline at end of file diff --git a/master-gitlab.sh b/master-gitlab.sh index 7303471..1fae718 100644 --- a/master-gitlab.sh +++ b/master-gitlab.sh @@ -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"