Fix: dd-Anleitung referenzierte den alten festen Dateinamen

Direkte Folge des vorherigen Commits (sprechender Download-Dateiname) -
die Anleitung auf /installationsmedium zeigte weiterhin
'tuxflotte-installationsmedium.iso'. Namensbildung in _iso_dateiname()
extrahiert, von installationsmedium_ansicht() (fuer die Anzeige) UND
installationsmedium_download() (fuer den echten Header) gemeinsam
genutzt, damit beide nie auseinanderlaufen koennen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Thomas Stallinger 2026-08-28 11:06:37 +02:00
parent fe2a893fbf
commit cf59a9bb44
2 changed files with 29 additions and 14 deletions

View File

@ -148,6 +148,27 @@ def finde_enrollment_session(organization_id: str, session_id: str) -> dict | No
return next((s for s in sessions if s["id"] == session_id), None) return next((s for s in sessions if s["id"] == session_id), None)
def _iso_dateiname(vorlage: dict | None, iso_build: dict | None) -> str:
"""
Sprechender Dateiname statt immer 'tuxflotte-installationsmedium.iso' -
von installationsmedium_ansicht() (fuer die dd-Anleitung) UND
installationsmedium_download() (fuer den tatsaechlichen Content-
Disposition-Header) gemeinsam genutzt, damit beide garantiert densel
ben Namen zeigen.
"""
if vorlage:
backend_teil = _dateikomponente(f"{vorlage['backend']['name']}-{vorlage['backend']['version']}")
workspace_teil = _dateikomponente(vorlage["workspace"]["name"])
else:
backend_teil = "unbekannt"
workspace_teil = "unbekannt"
datum_teil = ((iso_build or {}).get("finished_at") or datetime.now(timezone.utc).isoformat())[:10]
return f"tuxflotte-{backend_teil}-{workspace_teil}-{datum_teil}.iso"
@router.get("/installationsmedium") @router.get("/installationsmedium")
def installationsmedium_ansicht(request: Request, user=Depends(get_current_user)): def installationsmedium_ansicht(request: Request, user=Depends(get_current_user)):
organization_id = str(user.organization_id) organization_id = str(user.organization_id)
@ -158,6 +179,7 @@ def installationsmedium_ansicht(request: Request, user=Depends(get_current_user)
enrollment_session = None enrollment_session = None
iso_build = None iso_build = None
iso_dateiname = None
if konfiguration and konfiguration["enrollment_session_id"]: if konfiguration and konfiguration["enrollment_session_id"]:
enrollment_session = finde_enrollment_session(organization_id, konfiguration["enrollment_session_id"]) enrollment_session = finde_enrollment_session(organization_id, konfiguration["enrollment_session_id"])
@ -166,6 +188,10 @@ def installationsmedium_ansicht(request: Request, user=Depends(get_current_user)
build_result = anode_request("GET", f"/api/v1/iso-builds/{konfiguration['iso_build_id']}") build_result = anode_request("GET", f"/api/v1/iso-builds/{konfiguration['iso_build_id']}")
iso_build = build_result.get("iso_build") if build_result.get("success") else None iso_build = build_result.get("iso_build") if build_result.get("success") else None
if konfiguration and iso_build and iso_build["status"] == "completed":
vorlage = next((v for v in vorlagen if v["id"] == konfiguration["bereitstellungsvorlage_id"]), None)
iso_dateiname = _iso_dateiname(vorlage, iso_build)
return templates.TemplateResponse( return templates.TemplateResponse(
request, request,
"installationsmedium.html", "installationsmedium.html",
@ -175,6 +201,7 @@ def installationsmedium_ansicht(request: Request, user=Depends(get_current_user)
"vorlagen": vorlagen, "vorlagen": vorlagen,
"enrollment_session": enrollment_session, "enrollment_session": enrollment_session,
"iso_build": iso_build, "iso_build": iso_build,
"iso_dateiname": iso_dateiname,
}, },
) )
@ -288,22 +315,10 @@ def installationsmedium_download(user=Depends(get_current_user)):
if iso_build["status"] != "completed": if iso_build["status"] != "completed":
raise HTTPException(status_code=409, detail="Das Installationsmedium ist noch nicht fertig gebaut.") raise HTTPException(status_code=409, detail="Das Installationsmedium ist noch nicht fertig gebaut.")
# Sprechender Dateiname statt immer desselben generischen Namens (siehe
# _dateikomponente()) - Backend+Version+Workspace aus der verwendeten
# Bereitstellungsvorlage, Datum aus dem Bau-Abschluss.
vorlagen_result = anode_request("GET", f"/api/v1/organizations/{organization_id}/bereitstellungsvorlagen") vorlagen_result = anode_request("GET", f"/api/v1/organizations/{organization_id}/bereitstellungsvorlagen")
vorlagen = vorlagen_result.get("bereitstellungsvorlagen", []) if vorlagen_result.get("success") else [] vorlagen = vorlagen_result.get("bereitstellungsvorlagen", []) if vorlagen_result.get("success") else []
vorlage = next((v for v in vorlagen if v["id"] == konfiguration["bereitstellungsvorlage_id"]), None) vorlage = next((v for v in vorlagen if v["id"] == konfiguration["bereitstellungsvorlage_id"]), None)
dateiname = _iso_dateiname(vorlage, iso_build)
if vorlage:
backend_teil = _dateikomponente(f"{vorlage['backend']['name']}-{vorlage['backend']['version']}")
workspace_teil = _dateikomponente(vorlage["workspace"]["name"])
else:
backend_teil = "unbekannt"
workspace_teil = "unbekannt"
datum_teil = (iso_build.get("finished_at") or datetime.now(timezone.utc).isoformat())[:10]
dateiname = f"tuxflotte-{backend_teil}-{workspace_teil}-{datum_teil}.iso"
def stream_datei(): def stream_datei():
with anode_stream("GET", f"/api/v1/iso-builds/{build_id}/download") as response: with anode_stream("GET", f"/api/v1/iso-builds/{build_id}/download") as response:

View File

@ -41,7 +41,7 @@
</p> </p>
<p> <p>
Unter Linux/macOS: Unter Linux/macOS:
<code>sudo dd if=tuxflotte-installationsmedium.iso of=/dev/sdX bs=4M status=progress conv=fsync</code> <code>sudo dd if={{ iso_dateiname }} of=/dev/sdX bs=4M status=progress conv=fsync</code>
(<code>/dev/sdX</code> durch den tatsächlichen USB-Stick ersetzen — <strong>alle Daten darauf werden überschrieben</strong>). (<code>/dev/sdX</code> durch den tatsächlichen USB-Stick ersetzen — <strong>alle Daten darauf werden überschrieben</strong>).
</p> </p>
</details> </details>