Files
lernbar/scripts/im-container/wiederherstellen.sh
T
Florian WildeandClaude Opus 5 c61d5711e0 Baustein 10b: Anleitung mit Screenshots, Abnahmelauf, Fassung 1.0.0
docs/ANLEITUNG.md: 20 Abschnitte, 27 Bildschirmfotos, getrennt fuer
Ausbilder und Azubi, dazu "Wenn etwas nicht geht". Die Bilder entstehen
automatisiert ueber npm run screenshots - was dort steht, ist gemessen
und nicht gemalt.

scripts/pruefungen/abnahme.mjs (npm run abnahme) laeuft gegen eine
frische, leere Datenbank in einem Wegwerfverzeichnis: aufsetzen, Konten
anlegen, arbeiten, abnehmen, sichern, beschaedigen, zurueckspielen. Eine
Sicherung, die nie zurueckgespielt wurde, ist keine Sicherung. 33 von 33
Pruefungen erfuellt, Protokoll in docs/ABNAHME.md.

Dabei drei echte Fehler gefunden, alle in Wegen, die nie ausgefuehrt
worden waren:

- Die Sicherungsskripte liefen nicht in Git Bash, obwohl das in ihrem
  Kopf stand: tar deutet den Doppelpunkt in "C:\..." als Rechnernamen.
  Beide wechseln jetzt erst ins Verzeichnis und uebergeben einen blossen
  Dateinamen.
- Auf einer frischen Datenbank gibt es noch kein Wochenblatt; der Weg
  jedes neuen Azubis war nie durchlaufen worden.
- Der Abnahmelauf selbst liess unter Windows seinen Server ueberleben
  (kill() beendet nur die cmd.exe) und prueft deshalb jetzt vorher, ob
  der Port frei ist - sonst haette er gegen fremde Daten geprueft.

Fassung 1.0.0: package.json stand noch auf 0.1.0, waehrend das
Aenderungsprotokoll bei 0.9.0 war.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-11 19:26:34 +02:00

69 lines
1.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/sh
# ---------------------------------------------------------------------------
# Wiederherstellung aus einem Sicherungsarchiv.
#
# wiederherstellen.sh <archiv.tar.gz> [--ohne-rueckfrage]
#
# Der vorhandene Datenbestand wird vorher zur Seite gelegt
# (daten/verdraengt-<zeitstempel>/), nichts wird endgültig gelöscht.
# Die Anwendung sollte dabei gestoppt sein.
# ---------------------------------------------------------------------------
set -eu
ARCHIV="${1:-}"
BESTAETIGT="${2:-}"
if [ -z "$ARCHIV" ] || [ ! -f "$ARCHIV" ]; then
echo "Aufruf: wiederherstellen.sh <archiv.tar.gz> [--ohne-rueckfrage]" >&2
exit 1
fi
DATEN="${LERNBAR_DATEN:-/daten}"
DB="${LERNBAR_DB:-$DATEN/lernbar.sqlite}"
if [ "$BESTAETIGT" != "--ohne-rueckfrage" ]; then
printf 'Der aktuelle Datenbestand unter %s wird ersetzt. Fortfahren? [j/N] ' "$DATEN"
read -r antwort
case "$antwort" in
j | J | ja | Ja) ;;
*)
echo "Abgebrochen."
exit 1
;;
esac
fi
ARBEIT="$(mktemp -d)"
trap 'rm -rf "$ARBEIT"' EXIT
# Siehe sicherung.sh: tar darf den Doppelpunkt im Pfad nicht zu sehen bekommen.
VERZEICHNIS="$(cd "$(dirname "$ARCHIV")" && pwd)"
DATEI="$(basename "$ARCHIV")"
( cd "$VERZEICHNIS" && tar -xzf "$DATEI" -C "$ARBEIT" )
if [ ! -f "$ARBEIT/lernbar.sqlite" ]; then
echo "Das Archiv enthält keine lernbar.sqlite – falsche Datei?" >&2
exit 1
fi
STEMPEL="$(date +%Y%m%d-%H%M%S)"
VERDRAENGT="$DATEN/verdraengt-$STEMPEL"
mkdir -p "$VERDRAENGT"
for datei in "$DB" "$DB-wal" "$DB-shm"; do
[ -e "$datei" ] && mv "$datei" "$VERDRAENGT/" || true
done
if [ -d "$DATEN/anhaenge" ]; then
mv "$DATEN/anhaenge" "$VERDRAENGT/anhaenge"
fi
mkdir -p "$DATEN"
cp "$ARBEIT/lernbar.sqlite" "$DB"
mkdir -p "$DATEN/anhaenge"
if [ -d "$ARBEIT/anhaenge" ]; then
cp -R "$ARBEIT/anhaenge/." "$DATEN/anhaenge/" 2>/dev/null || true
fi
echo "Wiederhergestellt aus $ARCHIV."
echo "Der vorherige Stand liegt unter $VERDRAENGT und kann gelöscht werden, sobald alles passt."