From 86eeb2b947811a40cf33de00d022559f202953bf Mon Sep 17 00:00:00 2001 From: scriptos Date: Fri, 6 Mar 2026 19:45:18 +0100 Subject: [PATCH] =?UTF-8?q?Template=20=C3=BCberarbeitet=20+=20fix=20in=20d?= =?UTF-8?q?er=20Generierung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/report.md | 21 ++++++- report-generator.sh | 140 ++++++++++++++++++++++++++++++++++++++++-- templates/report.html | 23 +++++++ templates/report.txt | 8 ++- 4 files changed, 186 insertions(+), 6 deletions(-) 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='' + html+='' + html+='' + html+='' + html+='' + html+='' + html+='' + html+='' + + for period_def in "${periods[@]}"; do + IFS=':' read -r label start_e end_e <<< "$period_def" + local row_class="" + case "$label" in + Heute) row_class=' class="period-today"' ;; + Gestern) row_class=' class="period-gestern"' ;; + esac + local stats + stats=$(get_stats_for_epoch_range "$start_e" "$end_e") + IFS='|' read -r bans unbans unique perm <<< "$stats" + + html+="" + html+="" + html+="" + html+="" + html+="" + html+="" + html+="" + done + + html+='
ZeitraumSperrenEntsperrungenEindeutige IPsPermanent gebannt
${label}${bans}${unbans}${unique}${perm}
' + echo "$html" +} + # ─── TXT-Tabellen generieren ────────────────────────────────────────────────── generate_top10_ips_txt() { if [[ -z "$TOP10_IPS" ]]; then @@ -495,6 +581,46 @@ generate_recent_bans_txt() { done <<< "$RECENT_BANS" } +# ─── Zeitraum-Schnellübersicht (TXT) ────────────────────────────────────────── +generate_period_overview_txt() { + 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)) + + 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}" + ) + + printf " %-15s %-9s %-12s %-14s %-11s\n" \ + "Zeitraum" "Sperren" "Entsperr." "Eind. IPs" "Permanent" + printf " %-15s %-9s %-12s %-14s %-11s\n" \ + "───────────────" "─────────" "────────────" "──────────────" "───────────" + + for period_def in "${periods[@]}"; do + IFS=':' read -r label start_e end_e <<< "$period_def" + local stats + stats=$(get_stats_for_epoch_range "$start_e" "$end_e") + IFS='|' read -r bans unbans unique perm <<< "$stats" + printf " %-15s %-9s %-12s %-14s %-11s\n" \ + "$label" "$bans" "$unbans" "$unique" "$perm" + done +} + # ─── Report generieren ──────────────────────────────────────────────────────── generate_report() { local format="${1:-$REPORT_FORMAT}" @@ -530,6 +656,8 @@ generate_report() { protocol_table=$(generate_protocol_html) local recent_bans_table recent_bans_table=$(generate_recent_bans_html) + local period_overview_table + period_overview_table=$(generate_period_overview_html) # Platzhalter ersetzen report="${report//\{\{REPORT_PERIOD\}\}/$report_period}" @@ -550,6 +678,7 @@ generate_report() { report="${report//\{\{TOP10_DOMAINS_TABLE\}\}/$top10_domains_table}" report="${report//\{\{PROTOCOL_TABLE\}\}/$protocol_table}" report="${report//\{\{RECENT_BANS_TABLE\}\}/$recent_bans_table}" + report="${report//\{\{PERIOD_OVERVIEW_TABLE\}\}/$period_overview_table}" echo "$report" @@ -572,6 +701,8 @@ generate_report() { protocol_txt=$(generate_protocol_txt) local recent_bans_txt recent_bans_txt=$(generate_recent_bans_txt) + local period_overview_txt + period_overview_txt=$(generate_period_overview_txt) # Platzhalter ersetzen report="${report//\{\{REPORT_PERIOD\}\}/$report_period}" @@ -592,6 +723,7 @@ generate_report() { report="${report//\{\{TOP10_DOMAINS_TEXT\}\}/$top10_domains_txt}" report="${report//\{\{PROTOCOL_TEXT\}\}/$protocol_txt}" report="${report//\{\{RECENT_BANS_TEXT\}\}/$recent_bans_txt}" + report="${report//\{\{PERIOD_OVERVIEW_TEXT\}\}/$period_overview_txt}" echo "$report" else diff --git a/templates/report.html b/templates/report.html index 735db8c..68ffcf9 100644 --- a/templates/report.html +++ b/templates/report.html @@ -221,6 +221,24 @@ font-size: 11px; color: #adb5bd; } + .period-today td { + background: #eef4ff; + font-weight: 600; + } + .period-today td:first-child { + color: #0f3460; + } + .period-gestern td { + background: #f0faf3; + font-weight: 600; + } + .period-gestern td:first-child { + color: #27ae60; + } + @media (max-width: 700px) { + table { font-size: 12px; } + th, td { padding: 8px 8px; } + } @@ -234,6 +252,11 @@
+ +

📅 Zeitraum-Schnellübersicht

+ {{PERIOD_OVERVIEW_TABLE}} + +

📊 Übersicht

diff --git a/templates/report.txt b/templates/report.txt index b582243..4702544 100644 --- a/templates/report.txt +++ b/templates/report.txt @@ -7,7 +7,13 @@ Host: {{HOSTNAME}} ─────────────────────────────────────────────────────────────── - 📊 ÜBERSICHT + � ZEITRAUM-SCHNELLÜBERSICHT +─────────────────────────────────────────────────────────────── + +{{PERIOD_OVERVIEW_TEXT}} + +─────────────────────────────────────────────────────────────── + 📊 ÜBERSICHT (Berichtszeitraum) ─────────────────────────────────────────────────────────────── Sperren gesamt: {{TOTAL_BANS}}