#!/usr/bin/env bash
# Erzeugt die Ausnahmeliste von fail2ban aus der einen Quelle der Wahrheit
# (/etc/controldeskpanel/firewall.conf) und laedt fail2ban neu.
#
# Ohne diesen Abgleich koennte der Betreiber die erlaubte SSH-Adresse
# aendern und anschliessend von genau der Adresse gesperrt werden, die er
# gerade freigegeben hat.
set -uo pipefail

CONF=/etc/controldeskpanel/firewall.conf
[[ -f "$CONF" ]] || { echo "fehlt: $CONF" >&2; exit 2; }
# shellcheck disable=SC1090
. "$CONF"

# Feste Eintraege: Rueckschleife und die eigenen Adressen dieses Servers —
# das Panel ruft sich selbst auf und darf sich dabei nicht sperren.
STATIC="127.0.0.1/8 ::1"
SELF="$(ip -4 -br addr show scope global 2>/dev/null | awk '{print $3}' | cut -d/ -f1 | tr '\n' ' ')"
SELF6="$(ip -6 -br addr show scope global 2>/dev/null | awk '{print $3}' | cut -d/ -f1 | tr '\n' ' ')"

cat > /etc/fail2ban/jail.d/cdp-ignoreip.local <<EOF
# ERZEUGT von cdp-f2b-sync-ignoreip — nicht von Hand aendern.
# Quelle der Wahrheit: /etc/controldeskpanel/firewall.conf
# Erzeugt $(date -Is)
[DEFAULT]
ignoreip = ${STATIC} ${SELF}${SELF6}${CDP_ADMIN_SSH_SOURCES:-}
EOF

if fail2ban-client -t >/dev/null 2>&1; then
  systemctl reload fail2ban 2>/dev/null || systemctl restart fail2ban
  echo "Ausnahmeliste abgeglichen: ${STATIC} ${SELF}${SELF6}${CDP_ADMIN_SSH_SOURCES:-}"
else
  echo "FEHLER: fail2ban-Pruefung fehlgeschlagen, nicht neu geladen" >&2
  exit 1
fi