#!/usr/bin/env bash
# shellcheck disable=all

# Copyright (C) 2021-2022 Zaharia Constantin <constantin.zaharia@progeek.ro>
# Copyright (C) 2021-2022 ProGeek <https://progeek.ro>
# SPDX-License-Identifier: GPL-3.0-or-later

set -euo pipefail
LC_ALL=C
LC_NUMERIC=C

include () {
    [[ -f $1 ]] && source $1
}

include /var/local/machine/plugins/colors.sh
include /var/local/machine/plugins/functions.sh

logfile='/var/log/fail2ban.log*'

[[ -e "$logfile" ]] || exit 0

mapfile -t lines < <(grep -hioP '(\[[a-z-]+\]) ?(?:restore)? (ban|unban)' $logfile | sort | uniq -c)
jails=($(printf -- '%s\n' "${lines[@]}" | grep -oP '\[\K[^\]]+' | sort | uniq))

out=""
for jail in ${jails[@]}; do
    bans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] ban" | awk '{print $1}')
    restores=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] restore ban" | awk '{print $1}')
    unbans=$(printf -- '%s\n' "${lines[@]}" | grep -iP "[[:digit:]]+ \[$jail\] unban" | awk '{print $1}')
    bans=${bans:-0} # default value
    restores=${restores:-0} # default value
    unbans=${unbans:-0} # default value
    bans=$(($bans+$restores))
    diff=$(($bans-$unbans))
    out+=$(printf "$jail, %+3s bans, %+3s unbans, %+3s active" $bans $unbans $diff)"\n"
done

printf "\nFail2ban status (monthly):\n"
printf "$out" | column -ts $',' | sed -e 's/^/  /'