From 6a586ef72153580db24a405ad696786b2aa52c48 Mon Sep 17 00:00:00 2001 From: Developer Date: Thu, 23 Apr 2026 23:03:47 -0400 Subject: [PATCH] Critical fixes: Replace while-read loops with mapfile, fix integer variable defaults FIXES: 1. Replace server IPs while-read with mapfile to prevent hanging 2. Fix integer expression errors in variable initialization - Strip whitespace from wc commands - Add 0 defaults for all numeric variables RESULT: Script now progresses past threat score loading phase Status: Hangs at IP scoring loop (separate issue to investigate) --- modules/security/bot-analyzer.sh | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/modules/security/bot-analyzer.sh b/modules/security/bot-analyzer.sh index 827dbf7..6448a5a 100755 --- a/modules/security/bot-analyzer.sh +++ b/modules/security/bot-analyzer.sh @@ -1657,9 +1657,10 @@ calculate_threat_scores() { # Pre-load server IPs for fast exclusion checking (avoids grep in loop) declare -A server_ips_array if [ -f "$TEMP_DIR/server_ips.txt" ]; then - while read -r ip; do + mapfile -t server_ips_list < "$TEMP_DIR/server_ips.txt" 2>/dev/null + for ip in "${server_ips_list[@]}"; do [ -n "$ip" ] && server_ips_array["$ip"]=1 - done < "$TEMP_DIR/server_ips.txt" + done fi # Pre-count requests per IP using mapfile (faster than while-read on large files) @@ -2302,13 +2303,21 @@ generate_report() { # QUICK STATS DASHBOARD print_header "QUICK STATS DASHBOARD" - total_requests=$(wc -l < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null || echo "0") - unique_ips=$(awk -F'|' '{print $1}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | wc -l || echo "0") - unique_domains=$(awk -F'|' '{print $2}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | wc -l || echo "0") - bot_requests=$(awk -F'|' '$9 != "unknown"' < "$TEMP_DIR/classified_bots.txt" 2>/dev/null | wc -l || echo "0") + total_requests=$(wc -l < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null) + total_requests=${total_requests:-0} + + unique_ips=$(awk -F'|' '{print $1}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | wc -l 2>/dev/null) + unique_ips=${unique_ips:-0} + + unique_domains=$(awk -F'|' '{print $2}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | wc -l 2>/dev/null) + unique_domains=${unique_domains:-0} + + bot_requests=$(awk -F'|' '$9 != "unknown"' < "$TEMP_DIR/classified_bots.txt" 2>/dev/null | wc -l 2>/dev/null) + bot_requests=${bot_requests:-0} # Count private/internal IPs (excluded from threat analysis) - private_ips=$(awk -F'|' '{print $1}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | grep -E '^(127\.|10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.)' 2>/dev/null | wc -l || echo "0") + private_ips=$(awk -F'|' '{print $1}' < "$TEMP_DIR/parsed_logs.txt" 2>/dev/null | sort -u | grep -E '^(127\.|10\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[01])\.|169\.254\.)' 2>/dev/null | wc -l 2>/dev/null) + private_ips=${private_ips:-0} # Count server's own IPs in the logs server_ip_hits=0