diff --git a/docs/report.md b/docs/report.md index 7494359..6a65c3d 100644 --- a/docs/report.md +++ b/docs/report.md @@ -56,7 +56,26 @@ sudo /opt/adguard-shield/report-generator.sh install Der Report enthält folgende Statistiken: -### Übersicht +### Zeitraum-Schnellübersicht *(immer ganz oben)* + +Eine Vergleichstabelle mit Live-Zahlen für vier feste Zeitfenster – unabhängig vom konfigurierten `REPORT_INTERVAL`: + +| Zeitraum | Sperren | Entsperrungen | Eindeutige IPs | Permanent gebannt | +|----------|---------|---------------|----------------|-------------------| +| Heute *(nur nach 20:00 Uhr)* | … | … | … | … | +| Gestern | … | … | … | … | +| Letzte 7 Tage | … | … | … | … | +| Letzte 14 Tage | … | … | … | … | +| Letzte 30 Tage | … | … | … | … | + +Im HTML-Format wird **Gestern** grün hervorgehoben, **Heute** blau (erscheint nur ab 20:00 Uhr). +- **Gestern** umfasst exakt 00:00:00 – 23:59:59 des gestrigen Tages. +- **Heute** umfasst den laufenden Tag von 00:00:00 bis zum Zeitpunkt der Reportgenerierung und wird nur eingeblendet, wenn der Report nach 20:00 Uhr erstellt wird. +Die übrigen Zeiträume laufen vom Starttag 00:00 Uhr bis zum Zeitpunkt der Reportgenerierung. + +> **Hinweis:** Die AbuseIPDB-Meldungen werden in der Schnellübersicht nicht mehr separat ausgewiesen, da sie immer mit einer Permanentsperre korrelieren – der Wert „Permanent gebannt" ist daher ausreichend. Die Gesamtanzahl der AbuseIPDB-Reports im Berichtszeitraum ist weiterhin in der allgemeinen Übersicht sichtbar. + +### Übersicht (Berichtszeitraum) - Gesamtzahl der Sperren und Entsperrungen - Anzahl eindeutiger gesperrter IPs - Permanente Sperren diff --git a/report-generator.sh b/report-generator.sh index 5574ee1..4db7329 100644 --- a/report-generator.sh +++ b/report-generator.sh @@ -207,6 +207,26 @@ cleanup_ban_history() { fi } +# ─── Statistiken für beliebigen Zeitraum berechnen ────────────────────────── +# Gibt "bans|unbans|unique_ips|permanent" für einen Epochen-Bereich zurück +get_stats_for_epoch_range() { + local start_epoch="$1" + local end_epoch="$2" + + local filtered + filtered=$(filter_history_by_period "$start_epoch" "$end_epoch") + + local bans=0 unbans=0 unique_ips=0 permanent=0 + if [[ -n "$filtered" ]]; then + bans=$(echo "$filtered" | grep -c '| BAN ' || echo "0") + unbans=$(echo "$filtered" | grep -c '| UNBAN ' || echo "0") + unique_ips=$(echo "$filtered" | grep '| BAN ' | awk -F'|' '{print $3}' | xargs -I{} echo {} | sort -u | wc -l | xargs || echo "0") + permanent=$(echo "$filtered" | grep '| BAN ' | awk -F'|' '{print $6}' | grep -ic 'permanent' || echo "0") + fi + + echo "${bans}|${unbans}|${unique_ips}|${permanent}" +} + # ─── Statistiken berechnen ──────────────────────────────────────────────────── calculate_stats() { # Ban-History bereinigen (falls Retention konfiguriert) @@ -259,12 +279,19 @@ calculate_stats() { done fi - # AbuseIPDB Reports (suche in Log-Datei) + # AbuseIPDB Reports – zeitraum-gefiltert aus der Logdatei ABUSEIPDB_REPORTS=0 if [[ -f "$LOG_FILE" ]]; then - local abuseipdb_start_date - abuseipdb_start_date=$(date -d "@$start_epoch" '+%Y-%m-%d' 2>/dev/null || date -r "$start_epoch" '+%Y-%m-%d') - ABUSEIPDB_REPORTS=$(grep -c "AbuseIPDB: IP .* erfolgreich gemeldet" "$LOG_FILE" 2>/dev/null | head -1 || echo "0") + while IFS= read -r line; do + local ts + ts=$(echo "$line" | sed 's/^\[\([0-9-]* [0-9:]*\)\].*/\1/') + [[ -z "$ts" || "$ts" == "$line" ]] && continue + local le + le=$(date -d "$ts" '+%s' 2>/dev/null || echo "0") + if [[ "$le" -ge "$start_epoch" && "$le" -le "$end_epoch" ]]; then + ABUSEIPDB_REPORTS=$((ABUSEIPDB_REPORTS + 1)) + fi + done < <(grep "AbuseIPDB:.*erfolgreich gemeldet" "$LOG_FILE" 2>/dev/null || true) fi # Angriffsarten @@ -420,6 +447,65 @@ generate_recent_bans_html() { echo "$html" } +# ─── Zeitraum-Schnellübersicht (HTML) ───────────────────────────────────────── +generate_period_overview_html() { + local today_midnight + today_midnight=$(get_today_midnight) + local now + now=$(date '+%s') + local yesterday_start=$((today_midnight - 86400)) + local yesterday_end=$((today_midnight - 1)) + + # Zeiträume: "Label:start_epoch:end_epoch" (Doppelpunkt als Trennzeichen) + local periods=() + + # Heute nur nach 20:00 Uhr einblenden + local current_hour + current_hour=$(date '+%H' | sed 's/^0*//') + if [[ "${current_hour:-0}" -ge 20 ]]; then + periods+=("Heute:${today_midnight}:${now}") + fi + + periods+=( + "Gestern:${yesterday_start}:${yesterday_end}" + "Letzte 7 Tage:$((today_midnight - 7 * 86400)):${now}" + "Letzte 14 Tage:$((today_midnight - 14 * 86400)):${now}" + "Letzte 30 Tage:$((today_midnight - 30 * 86400)):${now}" + ) + + local html='
| Zeitraum | ' + html+='Sperren | ' + html+='Entsperrungen | ' + html+='Eindeutige IPs | ' + html+='Permanent gebannt | ' + html+='
|---|---|---|---|---|
| ${label} | " + html+="${bans} | " + html+="${unbans} | " + html+="${unique} | " + html+="${perm} | " + html+="