Merge: ISO-Volume-ID-Feature (anderer Session-Strang) + ISO-Ablauf-Sweep zusammenführen

# Conflicts:
#	app.py
This commit is contained in:
Thomas Stallinger 2026-08-26 09:53:25 +02:00
commit eeb5879a46

27
app.py
View File

@ -4,10 +4,12 @@ import hashlib
import hmac import hmac
import json import json
import os import os
import re
import secrets import secrets
import subprocess import subprocess
import threading import threading
import time import time
import unicodedata
from uuid import UUID, uuid4 from uuid import UUID, uuid4
import psycopg import psycopg
@ -2253,11 +2255,35 @@ def run_iso_build_expiry_sweep() -> None:
except Exception as exc: except Exception as exc:
print(f"[iso-build-expiry] Sweep-Fehler (naechster Versuch in {ISO_BUILD_EXPIRY_SWEEP_INTERVAL_SECONDS}s): {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: 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" output_path = ISO_BUILD_OUTPUT_DIR / f"{build_id}.iso"
update_iso_build(build_id, status="running", mark_started=True) 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: try:
result = subprocess.run( result = subprocess.run(
[ [
@ -2268,6 +2294,7 @@ def run_iso_build(build_id, organization_id: str, activation_code: str, wifi_ssi
activation_code, activation_code,
wifi_ssid or "", wifi_ssid or "",
wifi_psk or "", wifi_psk or "",
volid,
], ],
cwd=TUXFLOTTE_INSTALLER_DIR, cwd=TUXFLOTTE_INSTALLER_DIR,
capture_output=True, capture_output=True,