From 381e0e55c1747811f70142157ed64f4294fb162e Mon Sep 17 00:00:00 2001 From: Thomas Stallinger Date: Tue, 13 Oct 2026 13:47:59 +0200 Subject: [PATCH] =?UTF-8?q?Hostname:=20Standardpr=C3=A4fix=20tuxflotte=20s?= =?UTF-8?q?tatt=20des=20vom=20Boot-Medium=20gemeldeten=20Namens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ohne eigene Hostnamenkonvention übernahm der Server den vom Client gemeldeten Namen. Der Client ist das Live-System des Boot-Mediums, also hieß jedes Gerät "debian" (auch das erste Kundengerät). Jetzt vergibt der Server immer selbst, ohne eigenen Präfix als tuxflotte-. Bekannte Geräte mit unpassendem Namen bekommen ihn bei der nächsten Neuinstallation. Co-Authored-By: Claude Opus 5.5 --- app.py | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/app.py b/app.py index 95a5be6..c9cf4ae 100644 --- a/app.py +++ b/app.py @@ -44,6 +44,11 @@ AGENT_REPORTABLE_EVENT_TYPES = {"applied", "apply_failed", "removed", "remove_fa # Name der pro Organisation automatisch angelegten Standard-OE (siehe # Konfigurationsgruppen-Plan) - Landeplatz fuer neu aktivierte Geraete. STANDARD_OE_NAME = "Neue Geräte" +# Hostnamen vergibt immer der Server. Organisationen ohne eigenen Präfix +# bekommen diesen (13.10.2026) - vorher galt dann der vom Client gemeldete +# Name, und der Client ist das Live-System des Boot-Mediums: jedes Gerät +# hieß "debian" (auch das erste Kundengerät). +STANDARD_HOSTNAME_PRAEFIX = "tuxflotte" # Phase 4 des Self-Service-ISO-Plans (siehe tuxflotte-installer/scripts/ # build_customer_iso.sh). TUXFLOTTE_INSTALLER_DIR ist ein separat auf anode @@ -1634,9 +1639,9 @@ def set_hostname_konvention(organization_id: str, praefix: str | None, stellen: def generate_hostname_for_organization(cur, organization_id: str) -> str | None: """ Erzeugt einen Hostnamen nach der Organisations-Konvention (Design-Runde - 10.09.2026, siehe ADR-0028/Roadmap) - None, wenn keine Konvention - konfiguriert ist (hostname_praefix leer), dann bleibt der vom Client - gemeldete Hostname wie bisher maßgeblich (siehe resolve_hostname_for_activation()). + 10.09.2026, siehe ADR-0028/Roadmap). Ohne eigenen Präfix der + Organisation gilt STANDARD_HOSTNAME_PRAEFIX. None nur, wenn es die + Organisation nicht gibt. "sequenziell": liest+erhöht hostname_naechste_sequenz innerhalb derselben Transaktion wie der Aufrufer (SELECT ... FOR UPDATE sperrt @@ -1660,10 +1665,11 @@ def generate_hostname_for_organization(cur, organization_id: str) -> str | None: ) row = cur.fetchone() - if row is None or not row[0]: + if row is None: return None praefix, stellen, modus, naechste_sequenz = row + praefix = praefix or STANDARD_HOSTNAME_PRAEFIX obergrenze = 10 ** stellen if modus == "zufaellig": @@ -1698,8 +1704,9 @@ def resolve_hostname_for_activation(organization_id: str, device_fingerprint: st """ Ermittelt den für die Aktivierung zu verwendenden Hostnamen. - Neues Gerät: Organisations-Hostnamenkonvention, falls konfiguriert, - sonst der vom Client gemeldete Name. + Neues Gerät: nach der Hostnamenkonvention der Organisation (ohne + eigenen Präfix: STANDARD_HOSTNAME_PRAEFIX). Der vom Client gemeldete + Name ist nur noch Rückfall, wenn die Vergabe nichts liefert. Bekanntes Gerät (Neuinstallation): Kunden-ISO-Test 02.10.2026 - bisher galt hier immer der vom Client gemeldete Name. Der Client ist aber das @@ -1707,8 +1714,9 @@ def resolve_hostname_for_activation(organization_id: str, device_fingerprint: st nicht den des installierten Geräts - jede Neuinstallation benannte das Gerät deshalb in "debian" um und die Konvention griff nie. Jetzt: passt der gespeicherte Name zur Konvention, bleibt er; sonst wird nach - der Konvention neu vergeben. Ohne Konvention bleibt der gespeicherte - Name (auch ein manuell vergebener). + der Konvention neu vergeben. Seit 13.10.2026 auch ohne eigenen Präfix + (Standardpräfix): ein Gerät, das noch "debian" heißt, bekommt bei der + nächsten Neuinstallation seinen Namen. """ with get_database_connection() as conn: @@ -1729,9 +1737,7 @@ def resolve_hostname_for_activation(organization_id: str, device_fingerprint: st return generiert or reported_hostname gespeichert, praefix, stellen = bestehend - - if not praefix: - return gespeichert or reported_hostname + praefix = praefix or STANDARD_HOSTNAME_PRAEFIX if gespeichert and re.fullmatch(rf"{re.escape(praefix)}-\d{{{stellen}}}", gespeichert): return gespeichert