CRITICAL FIX: Prevent main loop from overwriting subprocess updates
Problem: - IPs reaching Score:100 but STILL not being auto-blocked - write_ip_data_to_file was working correctly in subprocesses - BUT main loop was OVERWRITING entire ip_data file every 2 seconds - Line 3539 used ">" which truncates the file - Auto-mitigation engine reads stale data from parent's IP_DATA array - Parent's IP_DATA doesn't have subprocess updates (subshell isolation) Example: 1. HTTP subprocess: IP reaches score=100, writes to file 2. 2 seconds later: Main loop OVERWRITES file with parent's IP_DATA 3. Auto-mitigation reads file: Score shows 0 or old value 4. IP never blocked! Root Cause: The original fix (write_ip_data_to_file) was correct, but the main loop's periodic file write was destroying those updates. Solution: - Main loop now MERGES data instead of overwriting - Reads existing file (contains fresh subprocess updates) - Adds only NEW IPs from parent process - Writes back existing entries (subprocess data takes priority) - Uses flock to prevent race conditions - Atomic replacement with .new file This preserves subprocess updates while still allowing parent process to add IPs it discovers. Result: - Subprocess updates (Score:100) now PERSIST - Auto-mitigation engine sees correct scores - IPs with score >= 80 will be blocked within 10 seconds Testing: Before: Score:100 shown but IP never blocked After: Score:100 → INSTANT_BLOCK within 10 seconds
This commit is contained in:
@@ -3532,11 +3532,35 @@ while true; do
|
|||||||
draw_quick_actions
|
draw_quick_actions
|
||||||
|
|
||||||
# Write IP_DATA to ip_data file for auto-mitigation engine
|
# Write IP_DATA to ip_data file for auto-mitigation engine
|
||||||
|
# NOTE: Subprocesses use write_ip_data_to_file() for real-time updates
|
||||||
|
# This merges parent process data without overwriting subprocess updates
|
||||||
{
|
{
|
||||||
|
flock -w 2 200 || exit 1
|
||||||
|
|
||||||
|
# Read existing file (contains subprocess updates)
|
||||||
|
declare -A existing_ips
|
||||||
|
if [ -f "$TEMP_DIR/ip_data" ]; then
|
||||||
|
while IFS='=' read -r ip data; do
|
||||||
|
[ -n "$ip" ] && existing_ips[$ip]="$data"
|
||||||
|
done < "$TEMP_DIR/ip_data"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Merge parent's IP_DATA with existing (subprocess updates take priority)
|
||||||
for ip in "${!IP_DATA[@]}"; do
|
for ip in "${!IP_DATA[@]}"; do
|
||||||
echo "$ip=${IP_DATA[$ip]}"
|
# Only write if not already in file (subprocess updates are fresher)
|
||||||
|
if [ -z "${existing_ips[$ip]}" ]; then
|
||||||
|
echo "$ip=${IP_DATA[$ip]}"
|
||||||
|
fi
|
||||||
done
|
done
|
||||||
} > "$TEMP_DIR/ip_data" 2>/dev/null
|
|
||||||
|
# Write back existing entries (from subprocesses)
|
||||||
|
for ip in "${!existing_ips[@]}"; do
|
||||||
|
echo "$ip=${existing_ips[$ip]}"
|
||||||
|
done
|
||||||
|
|
||||||
|
} > "$TEMP_DIR/ip_data.new" 2>/dev/null 200>"$TEMP_DIR/ip_data.lock"
|
||||||
|
|
||||||
|
mv "$TEMP_DIR/ip_data.new" "$TEMP_DIR/ip_data" 2>/dev/null
|
||||||
|
|
||||||
# Update total blocks from file
|
# Update total blocks from file
|
||||||
if [ -f "$TEMP_DIR/total_blocks" ]; then
|
if [ -f "$TEMP_DIR/total_blocks" ]; then
|
||||||
|
|||||||
Reference in New Issue
Block a user