diff --git a/app.py b/app.py index 4f6ad98..d907a0a 100644 --- a/app.py +++ b/app.py @@ -4,10 +4,12 @@ import hashlib import hmac import json import os +import re import secrets import subprocess import threading import time +import unicodedata from uuid import UUID, uuid4 import psycopg @@ -2253,11 +2255,35 @@ def run_iso_build_expiry_sweep() -> None: except Exception as exc: print(f"[iso-build-expiry] Sweep-Fehler (naechster Versuch in {ISO_BUILD_EXPIRY_SWEEP_INTERVAL_SECONDS}s): {exc}") +def compute_iso_volid(organization_name: str) -> str: + """ + ISO9660-Volume-ID fuer eine personalisierte Kunden-ISO: Organisationsname + + Bau-Datum, damit ein gemountetes/im Dateimanager angezeigtes Medium + erkennbar ist, statt bei der festen generischen Bezeichnung zu bleiben. + ISO9660 erlaubt fuer die Primary-Volume-Descriptor-Volume-ID nur + Grossbuchstaben/Ziffern/Unterstrich und maximal 32 Zeichen - Umlaute + u.ae. werden per NFKD-Normalisierung auf ihr ASCII-Grundzeichen + reduziert (z.B. "Groesse" statt Wegfall), alles andere zu "_" + zusammengefasst. Faellt bei einem Namen ohne jedes ASCII-Zeichen (z.B. + rein kyrillisch/chinesisch) auf "ORG" zurueck statt eine leere + Volume-ID zu erzeugen. + """ + ascii_only = unicodedata.normalize("NFKD", organization_name).encode("ascii", "ignore").decode("ascii") + sanitized = re.sub(r"[^A-Za-z0-9]+", "_", ascii_only).strip("_").upper() + date_suffix = datetime.now(timezone.utc).strftime("%Y%m%d") + max_name_len = 32 - 1 - len(date_suffix) # 32 - "_" - "YYYYMMDD" + sanitized = sanitized[:max_name_len].rstrip("_") or "ORG" + return f"{sanitized}_{date_suffix}" + + def run_iso_build(build_id, organization_id: str, activation_code: str, wifi_ssid: str | None, wifi_psk: str | None) -> None: output_path = ISO_BUILD_OUTPUT_DIR / f"{build_id}.iso" update_iso_build(build_id, status="running", mark_started=True) + organization = fetch_organization(organization_id) + volid = compute_iso_volid(organization["name"] if organization else "TUXFLOTTE") + try: result = subprocess.run( [ @@ -2268,6 +2294,7 @@ def run_iso_build(build_id, organization_id: str, activation_code: str, wifi_ssi activation_code, wifi_ssid or "", wifi_psk or "", + volid, ], cwd=TUXFLOTTE_INSTALLER_DIR, capture_output=True,