feat: Offline-Bibliothek + Download-only-Modus

Neuer Modus in der GUI: Image nur herunterladen und dauerhaft unter
./downloads/library/ ablegen, ohne USB-Stick. Baut sich so vorab eine
komplette Offline-Sammlung aller macOS-Versionen auf (z.B. auf externe
Platte kopierbar). Stick-Jobs pruefen jetzt IMMER zuerst die lokale
Bibliothek und ueberspringen den Download bei Treffer -- jeder normale
Stick-Bau traegt so nebenbei zur Bibliothek bei.

Backend: installer.py bekommt job_type (stick|download), persistente
Downloads in library/<name>/ mit meta.json + atomarem .part-Rename,
neue /api/library. Frontend: Modus-Umschalter, Bibliotheks-Status,
Offline-Badges in der Versionsliste.

Live getestet auf aria-wohnung: Container neu gebaut, Katalog laedt 37
Installer, Download-Job End-to-End ueber die echte API (Cache-Miss dann
Cache-Hit verifiziert), Stick-Job-Validierung weiterhin intakt.
This commit is contained in:
ARIA
2026-07-18 10:58:55 +02:00
parent 40964b9130
commit 5c2cdd7543
6 changed files with 307 additions and 46 deletions
+29 -1
View File
@@ -52,7 +52,35 @@ kein Bug im eigentlichen Sinn, sondern ein Zeichen dass sich intern was
geaendert hat &mdash; dann muss `backend/installer.py` (`_extract_recovery_dmg`)
angepasst werden.
### 3. USB-Geraete-Erkennung
### 3. Offline-Bibliothek / "nur herunterladen"-Modus
Oben in der GUI laesst sich per Umschalter zwischen zwei Modi waehlen:
- **"Auf USB-Stick schreiben"** (Standard) &mdash; wie bisher.
- **"Nur herunterladen (Offline-Bibliothek)"** &mdash; laedt ausschliesslich das
Original-Image (`BaseSystem.dmg`/`InstallESD.dmg` bzw. `InstallAssistant.pkg`,
je nach Version) und legt es **dauerhaft** unter `./downloads/library/<name>/`
ab (inkl. `meta.json` mit Titel/Version/Groesse/Download-Zeitpunkt). Kein
Geraet noetig, nichts wird geloescht.
Damit kannst du dir vorab &mdash; solange Internet da ist &mdash; eine komplette
Offline-Sammlung aller verfuegbaren macOS-Versionen aufbauen. Weil die
Downloads im Bind-Mount `./downloads` liegen (siehe oben, kein Docker-Volume),
reicht es, den kompletten Projektordner (inkl. `downloads/library/`) auf eine
externe Platte zu kopieren &mdash; dort ist dann alles fuer den Stick-Bau parat,
auch ganz ohne Internetzugang.
**Wichtig:** ein "Stick erstellen"-Job prueft VOR jedem Download automatisch,
ob das Image schon in der Bibliothek liegt (`installer.get_cached_payload`),
und ueberspringt den Download dann komplett &mdash; das gilt fuer beide Modi.
Jeder normale Stick-Bau traegt also nebenbei zur Bibliothek bei, und ein
spaeterer Stick-Bau aus derselben Bibliothek (z.B. von der externen Platte)
laedt nichts erneut herunter.
Die GUI zeigt oben die Gesamtgroesse + Anzahl bereits heruntergeladener
Installer an, und markiert bereits vorhandene Versionen in der Auswahlliste
mit "bereits offline vorhanden".
### 4. USB-Geraete-Erkennung
Der Container laeuft mit `privileged: true` und mountet `/dev` sowie
`/run/udev` vom Host durch &mdash; noetig, um Sticks direkt zu partitionieren
und zu beschreiben. Das ist bewusst so gebaut, bedeutet aber: der Container