#!/bin/sh # Lädt die aktuelle DB-IP-Lite-Länderdatei (monatlich) nach $ANALYTICS_DATA_DIR/geo.csv und startet # den Dienst nur neu, wenn sich die Datei geändert hat. Läuft auf dem Host (z. B. per Cron, 1x pro Woche). # Die alte geo.csv wird nie gelöscht, bevor die neue geprüft und umbenannt ist. set -eu DIR="${ANALYTICS_DATA_DIR:-/srv/webklar-analytics}" CONTAINER="${ANALYTICS_CONTAINER:-webklar-analytics}" NEU="$DIR/geo.csv.new" ZIEL="$DIR/geo.csv" MARKER="$DIR/geo.restart-pending" fehler() { echo "Fehler (geo-update): $*" >&2; rm -f "$NEU" "$NEU.gz"; exit 1; } command -v curl >/dev/null 2>&1 || fehler "curl fehlt." command -v gunzip >/dev/null 2>&1 || fehler "gunzip fehlt." [ -d "$DIR" ] || fehler "Datenverzeichnis $DIR existiert nicht." JETZT="$(date -u +%Y-%m)" JAHR="${JETZT%-*}" MONAT="${JETZT#*-}" m="$(printf '%s' "$MONAT" | sed 's/^0//')" if [ "$m" -eq 1 ]; then VORMONAT="$((JAHR - 1))-12"; else VORMONAT="$JAHR-$(printf '%02d' "$((m - 1))")"; fi geladen="" for monat in "$JETZT" "$VORMONAT"; do url="https://download.db-ip.com/free/dbip-country-lite-$monat.csv.gz" if curl -fsSL --retry 2 --max-time 300 -o "$NEU.gz" "$url" 2>/dev/null && gunzip -c "$NEU.gz" > "$NEU" 2>/dev/null; then geladen="$monat" break fi done rm -f "$NEU.gz" [ -n "$geladen" ] || fehler "Download von DB-IP fehlgeschlagen (weder $JETZT noch $VORMONAT). Bestehende geo.csv bleibt unverändert." zeilen="$(wc -l < "$NEU" | tr -d ' ')" [ "$zeilen" -gt 100000 ] || fehler "Neue Datei hat nur $zeilen Zeilen (erwartet > 100000). Bestehende geo.csv bleibt unverändert." grep -Eq ',"?DE"?\r?$' "$NEU" || fehler "Neue Datei enthält kein 'DE'. Bestehende geo.csv bleibt unverändert." neustart() { docker restart "$CONTAINER" >/dev/null || fehler "Neustart von $CONTAINER fehlgeschlagen (geo.csv ist aber aktualisiert, nächster Lauf versucht den Neustart erneut)." rm -f "$MARKER" echo "$CONTAINER neu gestartet." } if [ -f "$ZIEL" ] && cmp -s "$NEU" "$ZIEL"; then rm -f "$NEU" if [ -f "$MARKER" ]; then echo "geo.csv ($geladen) unverändert, aber ein früherer Neustart steht aus." neustart else echo "geo.csv ($geladen) unverändert, kein Neustart nötig." fi exit 0 fi mv -f "$NEU" "$ZIEL" : > "$MARKER" # bleibt liegen, bis der Neustart gelungen ist echo "geo.csv aktualisiert ($geladen, $zeilen Zeilen)." neustart