#!/bin/bash # ============================================ # SCRIPT PULIZIA IP - ESECUZIONE VIA CRON # Per database server MySQL/MariaDB # Supporta pulizie orarie: 1h, 12h, 24h # ============================================ # Configurazione database DB_HOST="localhost" DB_USER="root" DB_PASSWORD="Hdgtejskjjc0-" DB_NAME="LOG_MIKROTIK" LOG_FILE="/var/log/ddos_cleanup.log" # Colori per output (se eseguito manualmente) RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' CYAN='\033[0;36m' MAGENTA='\033[0;35m' NC='\033[0m' # Funzione di logging log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> "$LOG_FILE" if [ -t 1 ]; then # Se eseguito da terminale echo -e "${BLUE}$(date '+%H:%M:%S')${NC} - $1" fi } log_success() { echo "$(date '+%Y-%m-%d %H:%M:%S') - SUCCESS: $1" >> "$LOG_FILE" if [ -t 1 ]; then echo -e "${GREEN}✅ $1${NC}" fi } log_error() { echo "$(date '+%Y-%m-%d %H:%M:%S') - ERROR: $1" >> "$LOG_FILE" if [ -t 1 ]; then echo -e "${RED}❌ $1${NC}" fi } log_warning() { echo "$(date '+%Y-%m-%d %H:%M:%S') - WARNING: $1" >> "$LOG_FILE" if [ -t 1 ]; then echo -e "${YELLOW}⚠️ $1${NC}" fi } log_info() { echo "$(date '+%Y-%m-%d %H:%M:%S') - INFO: $1" >> "$LOG_FILE" if [ -t 1 ]; then echo -e "${CYAN}ℹ️ $1${NC}" fi } # Funzione per eseguire query SQL execute_sql() { local query="$1" local description="$2" log_message "Esecuzione: $description" result=$(mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" -e "$query" 2>&1) exit_code=$? if [ $exit_code -eq 0 ]; then log_success "$description completata" if [ -n "$result" ] && [ "$result" != "" ]; then echo "$result" >> "$LOG_FILE" fi return 0 else log_error "$description fallita: $result" return 1 fi } # Funzione principale di pulizia (giorni) cleanup_ips() { local retention_days="${1:-7}" local list_name="${2:-ddos_detect_v03}" local dry_run="${3:-FALSE}" log_message "=== INIZIO PULIZIA IP AUTOMATICA (GIORNI) ===" log_message "Lista: $list_name, Ritenzione: $retention_days giorni, Dry run: $dry_run" # Esegui stored procedure local sql="CALL cleanup_ddos_ips($retention_days, '$list_name', $dry_run);" if execute_sql "$sql" "Pulizia IP lista $list_name"; then log_success "Pulizia completata per lista $list_name" return 0 else log_error "Pulizia fallita per lista $list_name" return 1 fi } # Funzione di pulizia oraria (NUOVA!) cleanup_ips_hours() { local retention_hours="${1:-24}" local list_name="${2:-ddos_detect_v03}" local dry_run="${3:-FALSE}" log_message "=== INIZIO PULIZIA IP ORARIA ===" log_message "Lista: $list_name, Ritenzione: $retention_hours ore, Dry run: $dry_run" # Esegui stored procedure oraria local sql="CALL cleanup_ddos_ips_hours($retention_hours, '$list_name', $dry_run);" if execute_sql "$sql" "Pulizia ORARIA IP lista $list_name"; then log_success "Pulizia oraria completata per lista $list_name ($retention_hours ore)" return 0 else log_error "Pulizia oraria fallita per lista $list_name" return 1 fi } # Funzione per ottenere statistiche (aggiornata) get_statistics() { log_message "Raccolta statistiche IP con dettagli orari..." # Query per statistiche generali con info orarie local stats_query=" SELECT list_name, COUNT(*) as total_ips, COUNT(CASE WHEN retrieved_at >= DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN 1 END) as last_1h, COUNT(CASE WHEN retrieved_at >= DATE_SUB(NOW(), INTERVAL 12 HOUR) THEN 1 END) as last_12h, COUNT(CASE WHEN retrieved_at >= DATE_SUB(NOW(), INTERVAL 1 DAY) THEN 1 END) as last_24h, COUNT(CASE WHEN retrieved_at >= DATE_SUB(NOW(), INTERVAL 7 DAY) THEN 1 END) as last_7d, COUNT(CASE WHEN retrieved_at < DATE_SUB(NOW(), INTERVAL 1 HOUR) THEN 1 END) as older_1h, COUNT(CASE WHEN retrieved_at < DATE_SUB(NOW(), INTERVAL 12 HOUR) THEN 1 END) as older_12h, COUNT(CASE WHEN retrieved_at < DATE_SUB(NOW(), INTERVAL 1 DAY) THEN 1 END) as older_24h, COUNT(CASE WHEN retrieved_at < DATE_SUB(NOW(), INTERVAL 7 DAY) THEN 1 END) as older_7d FROM ip_list GROUP BY list_name; " execute_sql "$stats_query" "Raccolta statistiche complete" } # Funzione per verificare connessione database test_connection() { log_message "Test connessione database..." if execute_sql "SELECT 1" "Test connessione"; then log_success "Connessione database OK" return 0 else log_error "Connessione database fallita" return 1 fi } # Funzione per pulizia completa (tutte le liste) cleanup_all_lists() { log_message "=== PULIZIA COMPLETA TUTTE LE LISTE ===" # Lista principale DDoS Detection cleanup_ips 7 "ddos_detect_v03" "FALSE" # Altre liste esistenti (se presenti) cleanup_ips 10 "ddos_ia" "FALSE" cleanup_ips 15 "ddos2-attackers" "FALSE" cleanup_ips 20 "ddos3-attackers" "FALSE" # Pulizia log vecchi local cleanup_log_query="DELETE FROM ip_cleanup_log WHERE operation_time < DATE_SUB(NOW(), INTERVAL 30 DAY);" execute_sql "$cleanup_log_query" "Pulizia log vecchi" log_message "=== PULIZIA COMPLETA TERMINATA ===" } # Funzioni di pulizia rapida predefinite quick_cleanup_1h() { local list_name="${1:-ddos_detect_v03}" local dry_run="${2:-FALSE}" echo -e "${MAGENTA}⚡ PULIZIA RAPIDA 1 ORA${NC}" log_info "Pulizia rapida 1 ora per lista: $list_name" if test_connection; then cleanup_ips_hours 1 "$list_name" "$dry_run" fi } quick_cleanup_12h() { local list_name="${1:-ddos_detect_v03}" local dry_run="${2:-FALSE}" echo -e "${MAGENTA}⚡ PULIZIA RAPIDA 12 ORE${NC}" log_info "Pulizia rapida 12 ore per lista: $list_name" if test_connection; then cleanup_ips_hours 12 "$list_name" "$dry_run" fi } quick_cleanup_24h() { local list_name="${1:-ddos_detect_v03}" local dry_run="${2:-FALSE}" echo -e "${MAGENTA}⚡ PULIZIA RAPIDA 24 ORE${NC}" log_info "Pulizia rapida 24 ore per lista: $list_name" if test_connection; then cleanup_ips_hours 24 "$list_name" "$dry_run" fi } # Parsing argomenti aggiornato case "${1:-auto}" in "test") echo -e "${BLUE}🔧 TEST CONNESSIONE DATABASE${NC}" test_connection ;; "stats") echo -e "${BLUE}📊 STATISTICHE IP LISTE (CON DETTAGLI ORARI)${NC}" test_connection && get_statistics ;; "dry-run") echo -e "${BLUE}🔍 SIMULAZIONE PULIZIA${NC}" retention_days="${2:-7}" list_name="${3:-ddos_detect_v03}" test_connection && cleanup_ips "$retention_days" "$list_name" "TRUE" ;; "cleanup") echo -e "${BLUE}🧹 PULIZIA MANUALE${NC}" retention_days="${2:-7}" list_name="${3:-ddos_detect_v03}" test_connection && cleanup_ips "$retention_days" "$list_name" "FALSE" ;; "dry-run-hours") echo -e "${CYAN}🔍 SIMULAZIONE PULIZIA ORARIA${NC}" retention_hours="${2:-24}" list_name="${3:-ddos_detect_v03}" test_connection && cleanup_ips_hours "$retention_hours" "$list_name" "TRUE" ;; "cleanup-hours") echo -e "${CYAN}🧹 PULIZIA ORARIA MANUALE${NC}" retention_hours="${2:-24}" list_name="${3:-ddos_detect_v03}" test_connection && cleanup_ips_hours "$retention_hours" "$list_name" "FALSE" ;; "1h"|"1hour") quick_cleanup_1h "${2:-ddos_detect_v03}" "FALSE" ;; "12h"|"12hours") quick_cleanup_12h "${2:-ddos_detect_v03}" "FALSE" ;; "24h"|"24hours") quick_cleanup_24h "${2:-ddos_detect_v03}" "FALSE" ;; "1h-dry"|"1hour-dry") quick_cleanup_1h "${2:-ddos_detect_v03}" "TRUE" ;; "12h-dry"|"12hours-dry") quick_cleanup_12h "${2:-ddos_detect_v03}" "TRUE" ;; "24h-dry"|"24hours-dry") quick_cleanup_24h "${2:-ddos_detect_v03}" "TRUE" ;; "auto"|"") # Modalità automatica (per cron) if test_connection; then cleanup_all_lists get_statistics fi ;; "help"|"-h"|"--help") echo -e "${GREEN}📖 USO SCRIPT PULIZIA IP DATABASE (CON SUPPORTO ORARIO)${NC}" echo "" echo "Uso: $0 [comando] [parametri]" echo "" echo -e "${YELLOW}Comandi principali:${NC}" echo " auto - Pulizia automatica tutte le liste (default per cron)" echo " test - Test connessione database" echo " stats - Mostra statistiche IP attuali (con dettagli orari)" echo "" echo -e "${YELLOW}Pulizie basate su giorni:${NC}" echo " dry-run [gg] [lista] - Simulazione pulizia (default: 7 giorni, ddos_detect_v03)" echo " cleanup [gg] [lista] - Pulizia manuale (default: 7 giorni, ddos_detect_v03)" echo "" echo -e "${CYAN}Pulizie basate su ore (NUOVO!):${NC}" echo " dry-run-hours [h] [lista] - Simulazione pulizia oraria (default: 24 ore)" echo " cleanup-hours [h] [lista] - Pulizia oraria manuale (default: 24 ore)" echo "" echo -e "${MAGENTA}Pulizie rapide predefinite:${NC}" echo " 1h [lista] - Pulisci IP più vecchi di 1 ora" echo " 12h [lista] - Pulisci IP più vecchi di 12 ore" echo " 24h [lista] - Pulisci IP più vecchi di 24 ore" echo " 1h-dry [lista] - Simula pulizia 1 ora" echo " 12h-dry [lista] - Simula pulizia 12 ore" echo " 24h-dry [lista] - Simula pulizia 24 ore" echo "" echo -e "${YELLOW}Esempi pulizie standard:${NC}" echo " $0 test # Test connessione" echo " $0 stats # Statistiche complete" echo " $0 dry-run 7 ddos_detect_v03 # Simula pulizia 7 giorni" echo " $0 cleanup 3 ddos_detect_v03 # Pulisci IP più vecchi di 3 giorni" echo "" echo -e "${CYAN}Esempi pulizie orarie:${NC}" echo " $0 1h # Pulisci IP > 1 ora (lista default)" echo " $0 12h ddos_detect_v03 # Pulisci IP > 12 ore" echo " $0 24h-dry # Simula pulizia IP > 24 ore" echo " $0 cleanup-hours 6 ddos_ia # Pulisci IP > 6 ore lista ddos_ia" echo " $0 dry-run-hours 2 ddos_detect_v03 # Simula pulizia IP > 2 ore" echo "" echo -e "${YELLOW}Configurazione cron per pulizia automatica:${NC}" echo " # Pulizia quotidiana alle 02:30" echo " 30 2 * * * /path/to/db_cleanup_cron.sh auto >> /var/log/cron_ddos.log 2>&1" echo "" echo -e "${MAGENTA}Configurazioni cron per pulizie rapide:${NC}" echo " # Pulizia IP > 1 ora ogni 2 ore" echo " 0 */2 * * * /path/to/db_cleanup_cron.sh 1h >> /var/log/ddos_1h.log 2>&1" echo " # Pulizia IP > 12 ore ogni 6 ore" echo " 0 */6 * * * /path/to/db_cleanup_cron.sh 12h >> /var/log/ddos_12h.log 2>&1" echo "" echo -e "${YELLOW}Log file:${NC} $LOG_FILE" ;; *) log_error "Comando sconosciuto: $1" echo -e "${RED}❌ Comando sconosciuto. Usa '$0 help' per l'aiuto${NC}" exit 1 ;; esac exit_code=$? # Log finale if [ $exit_code -eq 0 ]; then log_success "Script terminato con successo" else log_error "Script terminato con errori (exit code: $exit_code)" fi exit $exit_code