#!/bin/bash # Colors for output NORMAL='\033[0;39m' GREEN='\033[1;32m' RED='\033[1;31m' YELLOW='\033[33m' BLUE='\033[34m' REPO_URL="https://github.com/SubleXBle/Fail2Ban-Report.git" BRANCH_NAME="latest" DEFAULT_WEBROOT="/var/www/html" DEFAULT_SH_PATH="/opt/Fail2Ban-Report" DEFAULT_CONFIG_PATH="$DEFAULT_SH_PATH/fail2ban-report.config" PHP_CONFIG_PATH="$DEFAULT_SH_PATH/includes/config.php" echo -e "${BLUE}--- Fail2Ban-Report Installer ---${NORMAL}" # Ask for Webroot path read -rp "Please enter the installation directory for the web tool (default: $DEFAULT_WEBROOT): " WEBROOT WEBROOT=${WEBROOT:-$DEFAULT_WEBROOT} TARGET_DIR="${WEBROOT%/}/Fail2Ban-Report" # Ask for .sh script storage path read -rp "Please enter the directory to store shell scripts (default: $DEFAULT_SH_PATH): " SH_PATH SH_PATH=${SH_PATH:-$DEFAULT_SH_PATH} # Ask for config file path (optional) read -rp "Please enter the path for the config file (default: $DEFAULT_CONFIG_PATH): " CONFIG_PATH CONFIG_PATH=${CONFIG_PATH:-$DEFAULT_CONFIG_PATH} echo -e "\nUsing webroot installation path: $TARGET_DIR" echo -e "Using shell script path: $SH_PATH" echo -e "Using config file path: $CONFIG_PATH\n" # Check for git with polite option for wget fallback echo -e "${BLUE}Checking if git is installed...${NORMAL}" if ! command -v git &>/dev/null; then echo -e "${YELLOW}Git is not installed.${NORMAL}" read -rp "Would you like to download the repository as a ZIP archive using wget instead? (Y/N): " use_wget use_wget=${use_wget,,} if [[ "$use_wget" == "y" ]]; then ZIP_URL="https://github.com/SubleXBle/Fail2Ban-Report/archive/refs/heads/$BRANCH_NAME.zip" ZIP_FILE="/tmp/fail2ban_report.zip" echo -e "${BLUE}Downloading ZIP archive...${NORMAL}" if ! command -v wget &>/dev/null; then echo -e "${RED}wget is not installed. Please install wget or git manually and rerun this installer.${NORMAL}" exit 1 fi wget -O "$ZIP_FILE" "$ZIP_URL" echo -e "${BLUE}Extracting ZIP archive...${NORMAL}" if ! command -v unzip &>/dev/null; then echo -e "${RED}unzip is not installed. Please install unzip manually and rerun this installer.${NORMAL}" exit 1 fi unzip -o "$ZIP_FILE" -d /tmp/ rm -f "$ZIP_FILE" mv "/tmp/Fail2Ban-Report-$BRANCH_NAME" "$TARGET_DIR" else echo -e "${RED}Git is required or please choose to download via wget. Exiting.${NORMAL}" exit 1 fi else # git is installed, proceed with clone or pull if [ -d "$TARGET_DIR" ]; then if [ -d "$TARGET_DIR/.git" ]; then echo -e "${BLUE}Repository already exists. Pulling latest changes...${NORMAL}" cd "$TARGET_DIR" || { echo -e "${RED}Cannot change directory to $TARGET_DIR${NORMAL}"; exit 1; } git pull origin "$BRANCH_NAME" else echo -e "${YELLOW}$TARGET_DIR exists but is not a git repository.${NORMAL}" # Check if remote repo reachable if git ls-remote "$REPO_URL" &>/dev/null; then read -rp "Do you want to delete $TARGET_DIR and clone fresh? (Y/N): " yn yn=${yn,,} if [[ "$yn" == "y" ]]; then rm -rf "$TARGET_DIR" echo -e "${BLUE}Cloning Fail2Ban-Report repository into $TARGET_DIR...${NORMAL}" git clone -b "$BRANCH_NAME" "$REPO_URL" "$TARGET_DIR" else echo -e "${RED}Installation aborted by user.${NORMAL}" exit 1 fi else echo -e "${RED}Cannot reach remote repository at $REPO_URL.${NORMAL}" echo -e "${RED}Please check your internet connection or fix $TARGET_DIR manually.${NORMAL}" exit 1 fi fi else echo -e "${YELLOW}Cloning Fail2Ban-Report repository into $TARGET_DIR...${NORMAL}" git clone -b "$BRANCH_NAME" "$REPO_URL" "$TARGET_DIR" fi fi # Check and optionally install jq echo -e "\n${BLUE}Checking for jq...${NORMAL}" if ! command -v jq &>/dev/null; then echo -e "${YELLOW}jq is not installed.${NORMAL}" read -rp "Would you like to install jq now? (Y/N): " install_jq install_jq=${install_jq,,} if [[ "$install_jq" == "y" ]]; then if command -v apt &>/dev/null; then sudo apt update && sudo apt install -y jq elif command -v dnf &>/dev/null; then sudo dnf install -y jq elif command -v pacman &>/dev/null; then sudo pacman -Sy jq --noconfirm else echo -e "${RED}Unsupported package manager. Please install jq manually.${NORMAL}" exit 1 fi else echo -e "${RED}jq is required for this tool. Exiting.${NORMAL}" exit 1 fi else echo -e "${GREEN}jq is already installed.${NORMAL}" fi # Ensure shell script path exists mkdir -p "$SH_PATH" # === fail2ban_log2json.sh installation === if [ -f "$TARGET_DIR/fail2ban_log2json.sh" ]; then echo -e "\n${BLUE}Installing fail2ban_log2json.sh...${NORMAL}" cp "$TARGET_DIR/fail2ban_log2json.sh" "$SH_PATH/" chmod +x "$SH_PATH/fail2ban_log2json.sh" else echo -e "${RED}fail2ban_log2json.sh not found in repo.${NORMAL}" exit 1 fi # Set ARCHIVE_PATH in fail2ban_log2json.sh ARCHIVE_PATH="${TARGET_DIR}/archive" ESCAPED_ARCHIVE_PATH=$(echo "$ARCHIVE_PATH" | sed 's_/_\\/_g') if grep -q "^ARCHIVE_PATH=" "$SH_PATH/fail2ban_log2json.sh"; then sed -i "s/^ARCHIVE_PATH=.*/ARCHIVE_PATH=\"$ESCAPED_ARCHIVE_PATH\"/" "$SH_PATH/fail2ban_log2json.sh" else sed -i "1iARCHIVE_PATH=\"$ESCAPED_ARCHIVE_PATH\"" "$SH_PATH/fail2ban_log2json.sh" fi mkdir -p "$ARCHIVE_PATH" chmod 755 "$ARCHIVE_PATH" # === firewall-update.sh installation === if [ -f "$TARGET_DIR/firewall-update.sh" ]; then echo -e "\n${BLUE}Installing firewall-update.sh...${NORMAL}" cp "$TARGET_DIR/firewall-update.sh" "$SH_PATH/" chmod +x "$SH_PATH/firewall-update.sh" # Set correct blocklist.json path in firewall-update.sh ESCAPED_BLOCKLIST_PATH=$(echo "$ARCHIVE_PATH/blocklist.json" | sed 's_/_\\/_g') sed -i "s|^BLOCKLIST_JSON=.*|BLOCKLIST_JSON=\"$ESCAPED_BLOCKLIST_PATH\"|" "$SH_PATH/firewall-update.sh" else echo -e "${RED}firewall-update.sh not found in repo.${NORMAL}" fi # === Create PHP config include with config path constant === echo -e "\n${BLUE}Creating PHP config include file for config path...${NORMAL}" mkdir -p "$(dirname "$PHP_CONFIG_PATH")" cat > "$PHP_CONFIG_PATH" < "$CONFIG_PATH" < "$CONFIG_PATH" </dev/null | grep -v -F "$SH_PATH/fail2ban_log2json.sh"; echo "$CRON_CMD") | crontab - echo -e "${GREEN}Cronjob installed: $CRON_CMD${NORMAL}" else echo -e "${BLUE}Skipping cronjob installation for fail2ban_log2json.sh.${NORMAL}" fi # --- Cronjob installation for firewall-update.sh with choice --- echo -e "\nPlease select how often the firewall-update.sh cronjob should run:" echo "1) Every 5 minutes" echo "2) Every 15 minutes" echo "3) Do not install cronjob" read -rp "Enter your choice [1-3]: " FW_CRON_CHOICE case "$FW_CRON_CHOICE" in 1) FW_CRON_SCHEDULE="*/5 * * * *" ;; 2) FW_CRON_SCHEDULE="*/15 * * * *" ;; 3) FW_CRON_SCHEDULE="" ;; *) echo -e "${YELLOW}Invalid choice. No cronjob will be installed for firewall-update.sh.${NORMAL}" FW_CRON_SCHEDULE="" ;; esac if [ -n "$FW_CRON_SCHEDULE" ]; then FW_CRON_CMD="$FW_CRON_SCHEDULE $SH_PATH/firewall-update.sh > /dev/null 2>&1" (crontab -l 2>/dev/null | grep -v -F "$SH_PATH/firewall-update.sh"; echo "$FW_CRON_CMD") | crontab - echo -e "${GREEN}Firewall cronjob installed: $FW_CRON_CMD${NORMAL}" else echo -e "${BLUE}No firewall cronjob installed.${NORMAL}" fi echo -e "\n${GREEN}Installation completed successfully!${NORMAL}" echo "Webroot path: $TARGET_DIR" echo "Shell scripts in: $SH_PATH" echo "Firewall script path: $SH_PATH/firewall-update.sh" echo # === Cleanup frontend install directory === echo -e "${BLUE}Cleaning up frontend installation directory...${NORMAL}" find "$TARGET_DIR" -type f -name "*.sh" -exec rm -f {} \; find "$TARGET_DIR" -type f -name "*.md" -exec rm -f {} \; find "$TARGET_DIR" -type f -name "*.config" -exec rm -f {} \; if [ -d "$TARGET_DIR/assets/images" ]; then rm -rf "$TARGET_DIR/assets/images" echo -e "${GREEN}Removed $TARGET_DIR/assets/images/${NORMAL}" fi # Remove this installer script itself INSTALLER_PATH="$(realpath "$0")" echo -e "${YELLOW}Removing installer script: $INSTALLER_PATH${NORMAL}" rm -f "$INSTALLER_PATH" echo "Please ensure your webserver configuration is properly adjusted and test the blocklist system."