feat: Dateien aus der Nextcloud uebernehmen

tools/uebernehmen.ps1 holt einen Nextcloud-Ordner in den Dienst. Unterordner
bleiben erhalten, -Probe zeigt erst nur, was passieren wuerde.

UEBER DAS DASHBOARD UND NICHT UEBER DIE TOKEN-API. Nextcloud-Dateien heissen
"Brand Logo (final).PNG" -- checkPath lehnt das mit Recht ab. Der
Dashboard-Weg biegt den Namen bereits vorhersagbar zurecht. Dieselbe Regel an
einer Stelle ist besser als dieselbe Regel an zweien, von denen eine irgendwann
abweicht.

WIEDERHOLBAR ueber overwrite=false: was schon da ist, meldet der Dienst je
Datei als "Pfad ist belegt". Nachgemessen mit 57 Marken -- zweiter Lauf: 0
uebernommen, 57 waren schon da.

DREI FEHLER BEIM BAUEN, alle durch Messen gefunden:

1. Ein kaputter Formular-Rumpf ergab einen NACKTEN 500, aufgefangen nur von der
   Auffanglinie. Jetzt 400 mit Grund.

2. PowerShells `Invoke-RestMethod -Form` scheitert am Dienst. Ich hatte die
   Ursache zuerst falsch: nicht (nur) die Grenzmarkierung in
   Anfuehrungszeichen, die RFC 2046 erlaubt und die wir jetzt vertragen --
   sondern der Rumpf selbst. Mitgeschnitten:

       Content-Disposition: form-data; name=file; filename=a.png

   RFC 7578 verlangt name="file" MIT Anfuehrungszeichen, .NET laesst sie weg,
   und Nodes Parser besteht darauf. Das steht im RUMPF; dafuer braeuchte es
   einen eigenen Multipart-Parser, und der waere unverhaeltnismaessig. Die
   Werkzeuge nehmen deshalb curl.exe -F.

3. PowerShell-Falle: curl.exe gibt zeilenweise ein ARRAY zurueck, und
   -match/-notmatch darauf FILTERT, statt zu pruefen. Ein nicht-leeres Ergebnis
   gilt als wahr -- damit meldete das Skript "Kein Verzeichnis gefunden" bei
   einer tadellosen Antwort mit HTTP 207. Jetzt wird vorher zusammengefuegt,
   auch in sichern.ps1, wo dieselbe Falle nur deshalb nicht zuschlug, weil die
   Ausgabe eine Zeile hat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-11 20:59:59 +02:00
co-authored by Claude Opus 5
parent 51071fc292
commit 5d35381952
3 changed files with 265 additions and 11 deletions
+5 -2
View File
@@ -98,7 +98,10 @@ $archiv = Join-Path $Ziel $name
# -- 1. Datenbank stimmig herausholen ------------------------------------------
Schritt 'Datenbank sichern (SQLite-Sicherungsschnittstelle im Container)'
$ausgabe = docker exec $Container node dist/backup.js /data/.sicherung/media.db 2>&1
# Auch hier zusammenfuegen: die Ausgabe kaeme sonst als Array, und -match
# darauf filtert, statt zu pruefen (siehe uebernehmen.ps1). Solange es eine
# Zeile ist, faellt das nicht auf -- bei zweien schon.
$ausgabe = (docker exec $Container node dist/backup.js /data/.sicherung/media.db 2>&1) -join "`n"
if ($LASTEXITCODE -ne 0) {
Schlecht "Fehlgeschlagen: $ausgabe"
exit 1
@@ -285,7 +288,7 @@ if (-not ($z['basis'] -and $z['benutzer'] -and $z['passwort'])) {
# Auch draussen ausduennen. Sonst waechst die Nextcloud still voll, und das
# faellt erst auf, wenn sie voll ist.
$liste = curl.exe -s -u $auth -X PROPFIND -H 'Depth: 1' "$wurzel/$($z['ordner'])"
$liste = (curl.exe -s -u $auth -X PROPFIND -H 'Depth: 1' "$wurzel/$($z['ordner'])") -join "`n"
$fernListe = @([regex]::Matches($liste, 'd4rk_media-[\d-]+\.tar\.gz') |
ForEach-Object { $_.Value } | Sort-Object -Unique -Descending)
if ($fernListe.Count -gt $Behalten) {