Template überarbeitet + fix in der Generierung

This commit is contained in:
2026-03-06 19:45:18 +01:00
parent cf915c5c80
commit 86eeb2b947
4 changed files with 186 additions and 6 deletions

View File

@@ -56,7 +56,26 @@ sudo /opt/adguard-shield/report-generator.sh install
Der Report enthält folgende Statistiken: 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 - Gesamtzahl der Sperren und Entsperrungen
- Anzahl eindeutiger gesperrter IPs - Anzahl eindeutiger gesperrter IPs
- Permanente Sperren - Permanente Sperren

View File

@@ -207,6 +207,26 @@ cleanup_ban_history() {
fi 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 ──────────────────────────────────────────────────── # ─── Statistiken berechnen ────────────────────────────────────────────────────
calculate_stats() { calculate_stats() {
# Ban-History bereinigen (falls Retention konfiguriert) # Ban-History bereinigen (falls Retention konfiguriert)
@@ -259,12 +279,19 @@ calculate_stats() {
done done
fi fi
# AbuseIPDB Reports (suche in Log-Datei) # AbuseIPDB Reports zeitraum-gefiltert aus der Logdatei
ABUSEIPDB_REPORTS=0 ABUSEIPDB_REPORTS=0
if [[ -f "$LOG_FILE" ]]; then if [[ -f "$LOG_FILE" ]]; then
local abuseipdb_start_date while IFS= read -r line; do
abuseipdb_start_date=$(date -d "@$start_epoch" '+%Y-%m-%d' 2>/dev/null || date -r "$start_epoch" '+%Y-%m-%d') local ts
ABUSEIPDB_REPORTS=$(grep -c "AbuseIPDB: IP .* erfolgreich gemeldet" "$LOG_FILE" 2>/dev/null | head -1 || echo "0") 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 fi
# Angriffsarten # Angriffsarten
@@ -420,6 +447,65 @@ generate_recent_bans_html() {
echo "$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='<table>'
html+='<tr>'
html+='<th>Zeitraum</th>'
html+='<th>Sperren</th>'
html+='<th>Entsperrungen</th>'
html+='<th>Eindeutige IPs</th>'
html+='<th>Permanent gebannt</th>'
html+='</tr>'
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+="<tr${row_class}>"
html+="<td><strong>${label}</strong></td>"
html+="<td>${bans}</td>"
html+="<td>${unbans}</td>"
html+="<td>${unique}</td>"
html+="<td>${perm}</td>"
html+="</tr>"
done
html+='</table>'
echo "$html"
}
# ─── TXT-Tabellen generieren ────────────────────────────────────────────────── # ─── TXT-Tabellen generieren ──────────────────────────────────────────────────
generate_top10_ips_txt() { generate_top10_ips_txt() {
if [[ -z "$TOP10_IPS" ]]; then if [[ -z "$TOP10_IPS" ]]; then
@@ -495,6 +581,46 @@ generate_recent_bans_txt() {
done <<< "$RECENT_BANS" 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 ──────────────────────────────────────────────────────── # ─── Report generieren ────────────────────────────────────────────────────────
generate_report() { generate_report() {
local format="${1:-$REPORT_FORMAT}" local format="${1:-$REPORT_FORMAT}"
@@ -530,6 +656,8 @@ generate_report() {
protocol_table=$(generate_protocol_html) protocol_table=$(generate_protocol_html)
local recent_bans_table local recent_bans_table
recent_bans_table=$(generate_recent_bans_html) recent_bans_table=$(generate_recent_bans_html)
local period_overview_table
period_overview_table=$(generate_period_overview_html)
# Platzhalter ersetzen # Platzhalter ersetzen
report="${report//\{\{REPORT_PERIOD\}\}/$report_period}" report="${report//\{\{REPORT_PERIOD\}\}/$report_period}"
@@ -550,6 +678,7 @@ generate_report() {
report="${report//\{\{TOP10_DOMAINS_TABLE\}\}/$top10_domains_table}" report="${report//\{\{TOP10_DOMAINS_TABLE\}\}/$top10_domains_table}"
report="${report//\{\{PROTOCOL_TABLE\}\}/$protocol_table}" report="${report//\{\{PROTOCOL_TABLE\}\}/$protocol_table}"
report="${report//\{\{RECENT_BANS_TABLE\}\}/$recent_bans_table}" report="${report//\{\{RECENT_BANS_TABLE\}\}/$recent_bans_table}"
report="${report//\{\{PERIOD_OVERVIEW_TABLE\}\}/$period_overview_table}"
echo "$report" echo "$report"
@@ -572,6 +701,8 @@ generate_report() {
protocol_txt=$(generate_protocol_txt) protocol_txt=$(generate_protocol_txt)
local recent_bans_txt local recent_bans_txt
recent_bans_txt=$(generate_recent_bans_txt) recent_bans_txt=$(generate_recent_bans_txt)
local period_overview_txt
period_overview_txt=$(generate_period_overview_txt)
# Platzhalter ersetzen # Platzhalter ersetzen
report="${report//\{\{REPORT_PERIOD\}\}/$report_period}" report="${report//\{\{REPORT_PERIOD\}\}/$report_period}"
@@ -592,6 +723,7 @@ generate_report() {
report="${report//\{\{TOP10_DOMAINS_TEXT\}\}/$top10_domains_txt}" report="${report//\{\{TOP10_DOMAINS_TEXT\}\}/$top10_domains_txt}"
report="${report//\{\{PROTOCOL_TEXT\}\}/$protocol_txt}" report="${report//\{\{PROTOCOL_TEXT\}\}/$protocol_txt}"
report="${report//\{\{RECENT_BANS_TEXT\}\}/$recent_bans_txt}" report="${report//\{\{RECENT_BANS_TEXT\}\}/$recent_bans_txt}"
report="${report//\{\{PERIOD_OVERVIEW_TEXT\}\}/$period_overview_txt}"
echo "$report" echo "$report"
else else

View File

@@ -221,6 +221,24 @@
font-size: 11px; font-size: 11px;
color: #adb5bd; 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; }
}
</style> </style>
</head> </head>
<body> <body>
@@ -234,6 +252,11 @@
<!-- Statistik-Übersicht --> <!-- Statistik-Übersicht -->
<div class="content"> <div class="content">
<!-- Zeitraum-Schnellübersicht -->
<h2>📅 Zeitraum-Schnellübersicht</h2>
{{PERIOD_OVERVIEW_TABLE}}
<!-- Gesamt-Übersicht des Berichtszeitraums -->
<h2>📊 Übersicht</h2> <h2>📊 Übersicht</h2>
<div class="stats-grid"> <div class="stats-grid">
<div class="stat-card danger"> <div class="stat-card danger">

View File

@@ -7,7 +7,13 @@
Host: {{HOSTNAME}} Host: {{HOSTNAME}}
─────────────────────────────────────────────────────────────── ───────────────────────────────────────────────────────────────
📊 ÜBERSICHT <EFBFBD> ZEITRAUM-SCHNELLÜBERSICHT
───────────────────────────────────────────────────────────────
{{PERIOD_OVERVIEW_TEXT}}
───────────────────────────────────────────────────────────────
📊 ÜBERSICHT (Berichtszeitraum)
─────────────────────────────────────────────────────────────── ───────────────────────────────────────────────────────────────
Sperren gesamt: {{TOTAL_BANS}} Sperren gesamt: {{TOTAL_BANS}}