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>
69 lines
1.9 KiB
Bash
Executable File
69 lines
1.9 KiB
Bash
Executable File
#!/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."
|