2
0

50-fail2ban 948 B

123456789101112131415161718192021
  1. #!/bin/bash
  2. logfile='/var/log/fail2ban.log*'
  3. mapfile -t lines < <(grep -hioP '(\[[a-z-]+\]) ?(?:restore)? (ban|unban)' $logfile | sort | uniq -c)
  4. jails=($(printf -- '%s\n' "${lines[@]}" | grep -oP '\[\K[^\]]+' | sort | uniq))
  5. out=""
  6. for jail in ${jails[@]}; do
  7. bans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] ban" | awk '{print $1}')
  8. restores=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] restore ban" | awk '{print $1}')
  9. unbans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] unban" | awk '{print $1}')
  10. bans=${bans:-0} # default value
  11. restores=${restores:-0} # default value
  12. unbans=${unbans:-0} # default value
  13. bans=$(($bans+$restores))
  14. diff=$(($bans-$unbans))
  15. out+=$(printf "$jail, %+3s bans, %+3s unbans, %+3s active" $bans $unbans $diff)"\n"
  16. done
  17. printf "\nfail2ban status (monthly):\n"
  18. printf "$out" | column -ts $',' | sed -e 's/^/ /'