#!/usr/bin/env bash
# Leert die Redis-Datenbanken des ausser Betrieb genommenen Altsystems (6.6).
# Aufruf auf einem Frontend; die Zugangsdaten kommen aus dessen .env.local.
#
#   redis-altsystem-raeumen.sh pruefen   # nur zeigen
#   redis-altsystem-raeumen.sh leeren    # wirklich leeren
set -uo pipefail
BEFEHL="${1:-pruefen}"
cd /var/www/riccardo

eval "$(python3 - <<'PY'
import re, shlex
from urllib.parse import urlparse, unquote
u = urlparse(re.search(r'^REDIS_URL=(.+)$', open('.env.local').read(), re.M).group(1).strip().strip('"\''))
print('RH=%s\nRP=%s\nRPW=%s' % (shlex.quote(u.hostname or ''), shlex.quote(str(u.port or 6379)), shlex.quote(unquote(u.password or ''))))
PY
)"
export REDISCLI_AUTH="$RPW"
R=(redis-cli -h "$RH" -p "$RP" --no-auth-warning)

# Das Altsystem belegte 0,1,2,3,5 - unser Shop 6 bis 12. Die Liste steht hier
# fest und wird NICHT geraten: ein FLUSHALL waere ein Griff in den laufenden
# Betrieb.
ALT=(0 1 2 3 5)
UNSER=(6 7 8 9 10 11 12)

echo "Unser Shop (unberuehrt):"
for db in "${UNSER[@]}"; do printf '  db%-2s %s Schluessel\n' "$db" "$(${R[@]} -n "$db" dbsize)"; done
echo "Altsystem:"
for db in "${ALT[@]}"; do printf '  db%-2s %s Schluessel\n' "$db" "$(${R[@]} -n "$db" dbsize)"; done
echo "Belegt: $(${R[@]} info memory | grep -oP 'used_memory_human:\K.*' | tr -d '\r')"

[ "$BEFEHL" = leeren ] || { echo; echo "Nur geprueft. Zum Leeren: $0 leeren"; exit 0; }

# Erst eine Punktsicherung. Sie liegt auf der Redis-Maschine selbst - hier
# geht es nicht um einen Maschinenverlust, sondern um den Fall, dass eine
# der Datenbanknummern doch nicht zum Altsystem gehoert.
VORHER=$(${R[@]} info persistence | grep -oP 'rdb_last_save_time:\K[0-9]+')
${R[@]} bgsave > /dev/null
for _ in $(seq 1 30); do
    NACHHER=$(${R[@]} info persistence | grep -oP 'rdb_last_save_time:\K[0-9]+')
    [ "$NACHHER" != "$VORHER" ] && break
    sleep 1
done
[ "${NACHHER:-}" != "$VORHER" ] || { echo "BGSAVE ist nicht durchgelaufen - abgebrochen."; exit 1; }
echo "Schnappschuss geschrieben (rdb_last_save_time $NACHHER)."

for db in "${ALT[@]}"; do
    anzahl=$(${R[@]} -n "$db" dbsize)
    [ "$anzahl" = "0" ] && { echo "  db$db war schon leer"; continue; }
    ${R[@]} -n "$db" flushdb > /dev/null
    echo "  db$db geleert ($anzahl Schluessel)"
done

echo "Belegt danach: $(${R[@]} info memory | grep -oP 'used_memory_human:\K.*' | tr -d '\r')"
echo "Gegenprobe, unser Shop:"
for db in "${UNSER[@]}"; do printf '  db%-2s %s Schluessel\n' "$db" "$(${R[@]} -n "$db" dbsize)"; done
