97 lines
3.3 KiB
Bash
97 lines
3.3 KiB
Bash
#!/bin/bash
|
||
|
||
set -uo pipefail
|
||
|
||
ok() { echo -e "✅ $1"; }
|
||
info() { echo -e "ℹ️ $1"; }
|
||
warn() { echo -e "⚠️ $1"; }
|
||
err() { echo -e "❌ $1"; }
|
||
|
||
|
||
|
||
echo ""
|
||
echo "──────────────────────────────────────────────────────────"
|
||
|
||
# Wenn kein Container angegeben → automatisch suchen
|
||
if [[ $# -eq 0 ]]; then
|
||
|
||
|
||
info "Kein fail2ban Container angegeben, versuche Autodetect"
|
||
|
||
CONTAINER=$(docker ps --format '{{.Names}}' | grep -i fail2ban | head -n1)
|
||
|
||
if [[ -z "$CONTAINER" ]]; then
|
||
err "Kein Fail2Ban Container gefunden"
|
||
echo "──────────────────────────────────────────────────────────"
|
||
exit 1
|
||
else
|
||
info "Container gefunden"
|
||
|
||
fi
|
||
else
|
||
CONTAINER="$1"
|
||
|
||
# Existiert der Container überhaupt?
|
||
if ! docker ps -a --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
|
||
err "Container '$CONTAINER' existiert nicht"
|
||
echo "──────────────────────────────────────────────────────────"
|
||
exit 1
|
||
fi
|
||
|
||
# Läuft der Container?
|
||
if ! docker ps --format '{{.Names}}' | grep -Fxq "$CONTAINER"; then
|
||
err "Container '$CONTAINER' läuft nicht"
|
||
echo "──────────────────────────────────────────────────────────"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
|
||
info "Verwende Container: $CONTAINER"
|
||
echo "──────────────────────────────────────────────────────────"
|
||
echo ""
|
||
|
||
JAILS=$(docker exec "$CONTAINER" fail2ban-client status \
|
||
| awk -F: '/Jail list/ {print $2}' | xargs)
|
||
|
||
IFS=',' read -ra JAIL_ARRAY <<< "$JAILS"
|
||
|
||
for JAIL in "${JAIL_ARRAY[@]}"; do
|
||
JAIL=$(echo "$JAIL" | xargs)
|
||
|
||
IPS=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
|
||
| awk -F: '/Banned IP list/ {print $2}' | xargs)
|
||
|
||
if [[ -z "$IPS" ]]; then
|
||
ok "$JAIL → keine Bans"
|
||
continue
|
||
fi
|
||
|
||
info "🔓 $JAIL → entbanne: $IPS"
|
||
|
||
COUNT=0
|
||
FAILED=0
|
||
|
||
for IP in $IPS; do
|
||
if docker exec "$CONTAINER" fail2ban-client set "$JAIL" unbanip "$IP" >/dev/null 2>&1; then
|
||
((COUNT++))
|
||
else
|
||
((FAILED++))
|
||
warn "$JAIL → konnte $IP nicht entbannen"
|
||
fi
|
||
done
|
||
|
||
REMAINING=$(docker exec "$CONTAINER" fail2ban-client status "$JAIL" \
|
||
| awk '/Currently banned/ {print $4}')
|
||
|
||
if [[ "$REMAINING" == "0" ]]; then
|
||
ok "$JAIL → $COUNT IP(s) entfernt"
|
||
else
|
||
err "$JAIL → $REMAINING IP(s) noch gebannt"
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "──────────────────────────────────────────────────────────"
|
||
ok "Fertig."
|
||
echo "──────────────────────────────────────────────────────────" |