Files
Webklar-Kundenbereich/analytics/scripts/geo-update.sh
T

61 lines
2.3 KiB
Bash
Executable File

#!/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