--- f2b-parse.sh.org	2026-11-02 10:04:11.571032267 +0900
+++ f2b-parse.sh	2026-11-02 10:03:38.576702956 +0900
@@ -205,7 +205,7 @@
 
 # Pre-scan log files for jail names (dynamic detection)
 # Extract jail names from [jail_name] patterns in the log
-JAIL_NAMES_LIST=$(grep -hoE '\[[a-zA-Z0-9_ -]+\] ' "${LOG_FILES[@]}" 2>/dev/null \
+JAIL_NAMES_LIST=$(grep -hoP '\[(?!Errno )[a-zA-Z0-9_ -]+\] ' "${LOG_FILES[@]}" 2>/dev/null \
     | sed 's/^\[//; s/\] $//' | sort -u | tr '\n' ' ')
 JAIL_NAMES_LIST=${JAIL_NAMES_LIST% }
 
@@ -452,6 +452,7 @@
         ip_is_banned[ip] = 1
         jail_ip_banned[jail, ip] = 1
         jail_ip_bannedAt[jail, ip] = ts_iso
+        trends_restorebans[date_str]++
         msg = "[" jail "] Restore Ban " ip
         add_recent_log(ts_iso, "RestoreBan", ip, jail, msg)
     }
@@ -537,6 +538,8 @@
     print "  \"summary\": {"
     print "    \"totalAttacks\": " totalAttacks ","
     print "    \"totalBans\": " totalBans ","
+    totalUnbans  = totalUnbans - restoredBans
+    if (totalUnbans < 0) totalUnbans = 0
     print "    \"totalUnbans\": " totalUnbans ","
     print "    \"activeBans\": " activeBans ","
     print "    \"restoredBans\": " restoredBans ","
@@ -634,6 +637,8 @@
         bans = jail_bans[jn] + 0
         unbans = jail_unbans[jn] + 0
         restored = jail_restored[jn] + 0
+        unbans = unbans - restored
+        if (unbans < 0) unbans = 0
         ign = jail_ignored[jn] + 0
 
         uips = 0
@@ -726,6 +731,9 @@
         }
         bans_c = trends_bans[d] + 0
         unbans_c = trends_unbans[d] + 0
+        restorebans_c = trends_restorebans[d] + 0
+        unbans_c = unbans_c - restorebans_c
+        if (unbans_c < 0) unbans_c = 0
         printf ", \"total\": %d, \"bans\": %d, \"unbans\": %d }", total, bans_c, unbans_c
         if (i < n_dates) printf ","
         printf "\n"
@@ -751,6 +759,9 @@
         attacks = jail_attacks[jn] + 0
         bans = jail_bans[jn] + 0
         unbans = jail_unbans[jn] + 0
+        restored = jail_restored[jn] + 0
+        unbans = unbans - restored
+        if (unbans < 0) unbans = 0
 
         # Currently banned IPs for this jail (state tracked from Ban/RestoreBan/Unban)
         n_bips = 0
