{% extends "admin/layout.html" %} {% block title %}{{ organization.name if organization else organization_id }} — Tuxflotte Admin{% endblock %} {% block admin_content %}

← Organisationen

{{ organization.name if organization else organization_id }}

{% include "admin/_kunden_nav.html" %} {% if aktiver_tab == "organisationsdaten" %}

Kundengruppe

Legt fest, welche Vorlagen-Workspaces die Organisation sieht und zuweisen kann. Ohne Kundengruppe sieht sie nur global freigegebene Vorlagen.

Ausrollstufe

Legt fest, welchen Stand der Rollen die Geräte dieser Organisation beim Check-in ziehen. Stabil: nur freigegebene Änderungen (Standard, für Kunden). Vorab: jede Änderung sofort (nur für Testorganisationen). Die Umstellung wirkt beim nächsten Check-in der Geräte.

{% endif %} {% if aktiver_tab == "hostname" %}

Legt fest, wie Geräte dieser Organisation bei der Installation automatisch benannt werden ("<Präfix>-<Nummer>"). Leerer Präfix = Standard "tuxflotte". Ein bereits bekanntes Gerät behält bei einer Neuinstallation seinen Namen, wenn er zur Konvention passt; sonst bekommt es einen neuen.

{% if hostname_konvention %}

Nächste sequenzielle Nummer: {{ hostname_konvention.naechste_sequenz }} (nur relevant im sequenziellen Modus)

{% endif %}
{% endif %} {% if aktiver_tab == "diagnosezugang" %}

Richtet auf Geräten, die mit einem danach erstellten Installationsmedium installiert werden, einen root-Zugang ein (per SSH, ohne „Konsolenwechsel sperren“ auch an der Konsole). Nur für die Fehlersuche gedacht. Das Passwort ist ausschließlich hier im Admin-Bereich sichtbar, auf das Installationsmedium gelangt nur sein Hash. Ausschalten wirkt nur auf neu erstellte Installationsmedien.

Bereits installierte Geräte: Dort sperrt das Härtungs-Merkmal „Diagnosezugang sperren“ (Workspace, OE oder Gruppe) den Zugang – root-Passwort gesperrt, SSH aus. Abwählen stellt ihn wieder her. Hinweis: Das Merkmal „Konsolenwechsel sperren“ nimmt die Anmeldung an der Textkonsole weg; der Diagnosezugang geht dann nur per SSH.

{% if diagnosezugang.aktiv %}

Status: aktiv

Benutzer: root
Passwort: {{ diagnosezugang.passwort or "— (nicht lesbar)" }}

Ein neues Passwort gilt nur für danach erstellte Installationsmedien – vorhandene Medien und Geräte behalten das alte.

{% else %}

Status: aus

{% endif %}
{% endif %} {% if aktiver_tab == "aktivitaeten" %}

Installationen und Agent-Läufe der Geräte dieser Organisation, neueste zuerst (höchstens 100). Ein Agent-Lauf prüft alle Merkmale eines Geräts; Fehler sind markiert.

{% set log_basis = "/admin/geraete" %} {% include "_aktivitaeten.html" %}
{% endif %} {% if aktiver_tab == "aktivierungscodes" %}
{# GUI-Runde 09.10.2026: Gültigkeit, Nutzung, Deaktivieren/Löschen #}

Mit einem Aktivierungscode meldet sich ein Gerät bei der Installation dieser Organisation zu. Deaktivierte oder abgelaufene Codes werden abgelehnt; bereits installierte Geräte bleiben davon unberührt.

{% if activation_codes %}
{% for ac in activation_codes %} {% endfor %}
CodeBezeichnungStatusGültig bisVerwendetAngelegtAktionen
{{ ac.code }} {{ ac.bezeichnung or "–" }} {% if not ac.active %}deaktiviert {% elif ac.abgelaufen %}abgelaufen {% else %}aktiv{% endif %} {{ ac.gueltig_bis | datum(False) if ac.gueltig_bis else "unbegrenzt" }} {% if ac.verwendet_anzahl %}{{ ac.verwendet_anzahl }}× · {{ ac.zuletzt_verwendet | datum(False) }}{% else %}noch nie{% endif %} {{ ac.created_at | datum(False) }}
Löschen
{% else %}

Noch keine Aktivierungscodes.

{% endif %}
Neuen Aktivierungscode erzeugen
{% endif %} {% if aktiver_tab == "bereitstellungsvorlagen" %}
{% if vorlage_fehler %}

{{ vorlage_fehler }}

{% endif %} {% if bearbeiten %} {# GUI-Runde 09.10.2026: Bearbeiten einer bestehenden Vorlage #}

← alle Bereitstellungsvorlagen

„{{ bearbeiten.label }}“ bearbeiten

{% if bearbeiten.geraete_anzahl or bearbeiten.medien_anzahl %}

Wird verwendet von {{ bearbeiten.geraete_anzahl }} Gerät(en) und {{ bearbeiten.medien_anzahl }} Installationsmedium/-medien. Änderungen gelten für künftige Installationen und für den Workspace dieser Geräte, sofern ihre OE keinen eigenen Workspace hat.

{% endif %} {% set v = bearbeiten %} {% set aktion = "/admin/kunden/" ~ organization_id ~ "/bereitstellungsvorlagen/" ~ bearbeiten.id %} {% set knopf = "Änderungen speichern" %} {% include "admin/_bereitstellungsvorlage_formular.html" %}

Löschen

{% if bearbeiten.geraete_anzahl or bearbeiten.medien_anzahl %}

Nicht möglich, solange Geräte oder Installationsmedien die Vorlage verwenden.

{% else %}
Vorlage löschen
{% endif %} {% else %}

Eine Bereitstellungsvorlage legt fest, mit welchem Workspace (und damit welcher Distro) und welcher Partitionierung ein Gerät installiert wird. Zum Bearbeiten oder Löschen auf die Bezeichnung klicken.

{% if bereitstellungsvorlagen %}
{% for v in bereitstellungsvorlagen %} {% set ws_distro = (workspace_distro.get(v.workspace.id) or {}) %} {% endfor %}
BezeichnungWorkspaceDistro PartitionierungStandardGeräteMedien
{{ v.label }} {{ v.workspace.name }} {{ v.backend.name }} {{ v.backend.version }} {% if ws_distro and ws_distro.id != v.backend.id %}
passt nicht zum Workspace ({{ ws_distro.name }}){% endif %}
{{ v.partitioning.root_filesystem }} {% if v.partitioning.scheme == "custom" and v.partitioning.extra_partitions %} + {% for p in v.partitioning.extra_partitions %}{{ p.mountpoint }} {{ p.percent }} %{{ ", " if not loop.last else "" }}{% endfor %} {% endif %} {% if v.disk_encryption %}
verschlüsselt{% endif %} {% if v.secure_boot_required %}
Secure Boot{% endif %}
{{ "ja" if v.is_default else "–" }} {{ v.geraete_anzahl }} {{ v.medien_anzahl }}
{% else %}

Noch keine Bereitstellungsvorlagen.

{% endif %} Neue Bereitstellungsvorlage anlegen {% set v = None %} {% set aktion = "/admin/kunden/" ~ organization_id ~ "/bereitstellungsvorlagen" %} {% set knopf = "Anlegen" %} {% include "admin/_bereitstellungsvorlage_formular.html" %} {% endif %}
{% endif %} {% if aktiver_tab == "konten" %}

Plattform-Admin-Konten (organisationsübergreifend) werden getrennt unter Admin-Accounts verwaltet, tauchen hier absichtlich nicht auf.

{% for b in benutzer %} {% endfor %}
E-MailOrg-AdminAngelegt
{{ b.email }} {{ "ja" if b.ist_organisationsadmin else "nein" }} {{ b.created_at | datum(False) }}
Ändern
Neues Konto anlegen
{% endif %} {% if aktiver_tab == "struktur" %} {# Struktur & Workspaces (Workspace-Creator neu, Schritt F, 07.10.2026): Workspace an der OE, vererbt nach unten. Die Distro-Konfliktregel prüft anode beim Speichern. #}
{% if request.query_params.get("fehler") %}

{{ request.query_params.get("fehler") }}

{% endif %} {% if request.query_params.get("hinweis") %}

{{ request.query_params.get("hinweis") }}

{% endif %}

Ein Workspace an einer OE gilt für alle Geräte darin und in ihren Unter-OEs (außer eine Unter-OE hat einen eigenen). Geräte müssen zur Distro des Workspace passen – sonst wird das Speichern mit Begründung abgelehnt. Gruppen ergänzen nur.

{% macro oe_knoten(oe, oes, tiefe) %}
{{ oe.name }}{% if oe.ist_standard %} (Standard){% endif %} · {{ oe.anzahl_geraete }} Gerät(e){% if oe.distros %}: {{ oe.distros | join(", ") }}{% endif %}
{% if oe.workspace %} Workspace: {{ oe.workspace.name }} ({{ oe.workspace.distro }}, {{ "automatisch neueste Version" if oe.workspace.automatisch else "auf v" ~ oe.workspace.version ~ " gepinnt" }}) {% elif oe.wirksamer_workspace %} Workspace geerbt: {{ oe.wirksamer_workspace.name }} von {{ oe.wirksamer_workspace.geerbt_von }} {% else %} Kein Workspace – es gilt der Workspace der Installation {% endif %}
Workspace ändern · Unter-OE anlegen
{% for kind in oes | selectattr("parent_id", "equalto", oe.id) %}{{ oe_knoten(kind, oes, tiefe + 1) }}{% endfor %} {% endmacro %} {% for wurzel in organisationseinheiten | selectattr("parent_id", "equalto", none) %}{{ oe_knoten(wurzel, organisationseinheiten, 0) }}{% endfor %}
{% endif %} {% if aktiver_tab == "gruppen" %}

Querschnitts-Gruppen (z.B. Lehrer/Schulleitung) — ein Gerät kann in mehreren gleichzeitig sein.

{% if not gruppen %}

Keine Gruppen angelegt.

{% else %}
{% for gruppe in gruppen %} {% endfor %}
Name
{{ gruppe.name }} Verwalten
{% endif %}
Neue Gruppe anlegen
{% endif %} {% if aktiver_tab == "ressourcen" %}
{% if not ressourcen_freigeschaltet %}

Für diese Organisation noch nicht freigeschaltet (Ausrollstufe „stabil“): die Ressourcen werden gespeichert, aber nicht an Geräte verteilt, und die Kunden-Seite ist ausgeblendet.

{% endif %} {% set basis_url = "/admin/kunden/" ~ organization_id ~ "/ressourcen" %} {% set darf_bearbeiten = true %} {% include "_ressourcen.html" %}
{% endif %} {% endblock %}