- Bildschirmsperre: Hook läuft dort als Benutzer und ließ das Entsperren
scheitern; ohne root beendet er sich jetzt ohne Fehler.
- Wiederherstellung: ein schon entsperrtes Home ließ jeden Schlüssel durch;
der Hook sperrt jetzt vor der Prüfung.
- Anmeldebildschirm: kurze Meldungszeilen (slick-greeter schneidet ab);
passwort-hinweis zeigt während der Wiederherstellung keinen QR-Code und
startet den Anmeldebildschirm nicht neu, sonst wäre die Meldung weg.
- Dialog: "Später" passt jetzt zum Text.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Konten mit "verschluesseln" werden ohne Home angelegt; der PAM-Hook
home-verschluesselung verschlüsselt es bei der ersten Anmeldung mit dem
Passwort und einem zufälligen Wiederherstellungsschlüssel, den ein Dialog
nach der Anmeldung einmalig zeigt. Nach einem Passwort-Reset fragt der
Hook nach dem Schlüssel (Eingabe im Passwortfeld) und hängt das Home auf
das neue Passwort um. Sperren beim Abmelden über logind und user@.service.
fscrypt wird nur eingerichtet, wenn ein Konto es verlangt; nur ext4.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
useradd übernahm den Modus aus login.defs; je nach Distribution 0755,
dann las der Gast im unverschlüsselten Home mit.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paket-Updates von shim/GRUB schrieben nach EFI/ubuntu bzw. EFI/debian,
die Firmware startet aber EFI/tuxflotte. Auf VM 107 (Mint, Secure Boot)
geprüft: veraltete Kette erneuert, zweiter Lauf ohne Änderung,
Paket-Neuinstallation schreibt nach EFI/tuxflotte und EFI/BOOT, Neustart
mit Secure Boot über den neuen Eintrag. roadmap/secure-boot-verschluesselung.md
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Auf VM 107 (26.10.2026) lief der Agent parallel; dpkg -i wartet nicht
auf die Sperre. Bis zu 10 Versuche im Abstand von 30 s.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tipp10, Xournal++, Bluefish, Geany, Shutter (mit Editor) aus den
Distributionsquellen; VS Code und DBeaver aus den Hersteller-Repos;
Zoom per Flathub; BlueJ und Pulsar (statt des eingestellten Atom) als
fest gepinnte .deb mit Prüfsumme; Webex als .deb, nur wenn es fehlt.
grundsystem: Autostart von mintreport per dpkg-divert abgeschaltet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Auf Liebherr-84 blieb die Cinnamon-Sitzung nach dem Abmelden im Zustand
closing; der Hinweis wurde gesetzt, der Anmeldebildschirm aber nicht neu
gestartet. Gilt ebenso für persoenliche-konten.py und den Abbau.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Anmeldebildschirm liest BackgroundFile aus der LightDM-Erweiterung
(org.freedesktop.DisplayManager.AccountsService), auf Liebherr-84 blieb das
Bild deshalb aus. Weitere Fehleingabe zeigt den Hinweis neu, wenn er nicht
sichtbar ist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Rolle personalisierung baut bei present und absent Konto, Kiosk, PAM-Zeile,
Wächter und LightDM-Konfiguration ab; Wrapper erst nach Neustart von
LightDM. persoenliche-konten.py startet LightDM nach angelegtem,
gesperrtem, entsperrtem oder entferntem Konto neu (nur ohne
Benutzersitzung); Hilfsskript wird immer abgelegt, damit der Schnellweg
auch beim ersten Konto greift.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Auf Lehrergeräten gehört der private Schlüssel der Gruppe
tuxflotte-veyon-master mit gast und allen regulären Konten (UID 1000-59999);
das Konten-Hilfsskript nimmt neue Konten gleich beim Anlegen auf. Ohne
Lehrerrolle und beim Abwählen wird die Gruppe entfernt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Secret aus agent.credentials im Header (no_log), Adresse aus agent.env.
Fehlschlag per ignore_errors sichtbar, damit der Rückfall greift.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Testorganisationen behalten die Veyon-Rolle aus 9e5bc1e; nur der
freigegebene Stand c219e3b ist ohne sie.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nur für die Freigabe nach ansible-content-stabil (18.10.2026): Kunden
bekommen Personalisierung und Agent ad09d81, die neue Veyon-Rolle
(9e5bc1e) noch nicht. Der folgende Commit stellt sie auf main wieder her.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Legt bestätigte Konten an (Hash per chpasswd -e über stdin), sperrt
(abgelaufen, im Greeter ausgeblendet), entsperrt und entfernt nur Konten
mit eigenem Marker. Fehlende Konten in der Liste bleiben unberührt.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Golden Image und Installer verloren security.capability (ping ohne
cap_net_raw auf Liebherr-83). Liste aus den setcap-Aufrufen der postinst-
Skripte der Images: ping, mtr-packet, gst-ptp-helper, snap-confine (aus
.caps), sssd-Helfer. Setzt nur bei Abweichung (setcap -v), im User-
Namespace getestet.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Bauplan Schritt 2 (platform-docs roadmap/veyon-schluesselverteilung-
diskussion-2026-10-14.md), stellt den Handtest vom 15.10.2026 nach:
Methode 1, Schluessel als Dateien (oeffentlich 444, privat 440 root:gast,
no_log), alte tuxflotte*-Schluessel weg, Raumliste nur auf Lehrern und nur
bei Aenderung (Pruefsumme), ufw 11100 Schueler / 11400 Lehrer, Konfigurator
immer und Master auf Schuelern ausgeblendet, veyon.service an. absent
raeumt nur dort auf, wo die Rolle eingerichtet hatte.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nur noch SMB, per x-systemd.automount (eingehaengt beim Zugriff, nofail
statt Ansible-Fehler bei fehlendem Server) und x-gvfs-show mit Namen in der
Seitenleiste. Schreibzugriff fuer alle nur mit fileserver_schreibzugriff.
Option fileserver_home_freigabe heisst jetzt fileserver_freigabe, WebDAV
entfaellt (davfs2-Zugangsdaten wurden nie hinterlegt). Merkmal laut DB am
15.10.2026 nirgends zugewiesen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ein Skript gleicht bei jeder Anmeldung (XDG-Autostart, auch Gastsitzung)
~/.config/gtk-3.0/bookmarks mit /etc/tuxflotte/org-ressourcen.json ab und
verwaltet nur selbst angelegte Eintraege. Nextcloud bekommt den WebDAV-
Zugang /remote.php/webdav. gvfs-backends nur nachinstalliert, wo es fehlt
und eine grafische Sitzung existiert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Kein Katalog-Merkmal, der Server schickt den Auftrag (vorerst nur an
Organisationen mit Ausrollstufe vorab). App-Rollen lesen die Liste im
selben Lauf aus tuxflotte_auftrag_optionen['org-ressourcen'].
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
LightDM-session-wrapper leitet nur dieses Konto in einen WebKit-Kiosk
(nur Herkunft anode, keine Downloads/Dateidialoge/neuen Fenster,
Leerlauf-Abmeldung). Eigene PAM-Freigabe und logind-Drop-in, unabhängig
von guest-session. GDM wird übersprungen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Template statt nmcli (PSK sonst per ps sichtbar), SSID als Byte-Liste,
PSK GKeyFile-escaped; eigene Datei tuxflotte-org-wlan.nmconnection, das
Installations-WLAN (tuxflotte-installations-wlan.nmconnection) bleibt
unberuehrt. Ungueltige Angaben werden uebersprungen statt den Lauf
scheitern zu lassen. Gegenstueck: provisioning-server Migration 0061,
kundenplattform optionen_felder.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Repariert Geraete, die mit dem Installer vor decc740 installiert wurden:
statische resolv.conf des Installationsnetzes, nach Ortswechsel keine
Namensaufloesung (Liebherr-83, 14.10.2026). Nur bei regulaerer Datei und
laufendem systemd-resolved; alte Datei bleibt als
/etc/resolv.conf.tuxflotte-statisch.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Erster echter Wechsel über die Rolle agent auf Testgeräten (Vorab),
danach am Server ablesbar. Für Kunden noch nicht freigegeben.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Agent wurde bei der Installation einmal geladen und nie erneuert. Die
Rolle (Tag always) laedt die in defaults festgelegte Fassung mit Pruefsumme
und laesst sie nach dem laufenden Durchgang von agent-wechsel.sh tauschen.
Checkt der neue Agent binnen 5 Minuten nicht ein, kommt die alte Fassung
zurueck; dieselbe Fassung wird fruehestens nach einem Tag erneut versucht.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- security-updates/auto-update: Das Ubuntu-Image bringt 20auto-upgrades und
10periodic selbst mit. Abwaehlen loeschte sie und schaltete damit die
automatischen Sicherheitsupdates der Distro ab. Jetzt wird dort der
Auslieferungszustand wiederhergestellt; auf Mint/Debian wie bisher entfernt.
- zeitserver: Abwaehlen trug auf jedem Geraet pool.ntp.org ein, jetzt zurueck
auf den auskommentierten Standard.
- guest-session: Konto gast nur entfernen, wenn es von der Rolle stammt.
- scripts/pruefe_absent.py: prueft die Abwaehl-Zweige gegen die Paketlisten
der Golden Images (nach jedem neuen Image laufen lassen).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Der Server schickt die Vorgabe der Workspace-Version als eigenen Auftrag
(present + Option browser, sonst absent). Die Rolle traegt die erste
vorhandene .desktop-Datei des Browsers in /etc/xdg/mimeapps.list ein und
nimmt bei absent nur zurueck, was sie selbst gesetzt hat. Die alte Option
standardbrowser der Rolle brave entfaellt (in Produktion nirgends gesetzt).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mit der Vorschlags-Adresse gingen Eingaben in der Adresszeile schon beim
Tippen an Google. Auf Schulgeräten nicht gewollt (Entscheidung 13.10.2026).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Nimmt im normalen Browserfenster den Erststart-Schirm "Wähle deine
Suchmaschine" weg, der in der flüchtigen Gastsitzung bei jeder Anmeldung
wiederkam. Auf VM 107 geprüft: Fenster öffnet direkt den neuen Tab, Suche
über die Adresszeile geht an Google.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
In der flüchtigen Gastsitzung zeigte Chrome bei jeder Anmeldung erst die
Zusatzbedingungen, dann "Willkommen bei Chrome" (Standardbrowser und
Nutzungsstatistiken vorangekreuzt). Die Richtlinie nimmt den zweiten Dialog
und im normalen Fenster "In Chrome anmelden" weg, require_eula=false in
initial_preferences den ersten. Auf VM 107 (Ubuntu 26.04, Chrome 155) in der
Gastsitzung geprüft, auch Abwählen und erneutes Anwählen.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ubuntus Desktop-Icons-Erweiterung startet Starter nur mit
metadata::trusted. Ein Autostart-Skript (nur GNOME) setzt das Merkmal beim
Sitzungsstart auf die Tuxflotte-Starter im Desktop-Ordner.
Beim ersten Agent-Lauf legt guest-session das fluechtige Gast-Home an,
bevor /etc/skel/Desktop gefuellt ist. Die Rolle fuellt das Gast-Home
einmal neu, wenn ihm der Ordner Desktop fehlt und niemand als gast
angemeldet ist.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Loeschliste entstand bisher nur in dem Lauf, in dem ein Starter aus
dem Anwendungsverzeichnis verschwand. War ein Home dann nicht erreichbar
(verschluesselt und gesperrt, ADR-0041) oder brach der Lauf ab, blieb der
Starter dauerhaft liegen. Jetzt gleicht jeder Lauf /etc/skel/Desktop und
die Nutzer-Desktop-Ordner gegen die Soll-Liste ab.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
present: root-Passwort sperren (passwd -l, umkehrbar), sshd-Drop-in
90-tuxflotte-diagnose.conf stilllegen, ssh.service aus; Merkdatei
haelt fest, was gesperrt wurde. absent nimmt nur zurueck, was diese
Rolle gesperrt hat (ADR-0010-Nachtrag). Auf Liebherr-35 geprueft:
sperren, idempotent, wiederherstellen, absent ohne Merkdatei = nichts.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Neue Rolle grundsystem (Tag always, laeuft zuerst): stellt die
Paketliste des jeweiligen Golden Image bereit (aus var/lib/dpkg/status der
Images auf anode) und installiert Grundsystem-Pakete wieder, die fruehere
absent-Laeufe laut apt-Historie entfernt haben (feste Liste der
betroffenen Pakete). barrierefreiheit, firewall, fileserver, ad-anbindung
und security-updates filtern ihre absent-Paketlisten gegen diese Liste.
Audit 09.10.2026: nur diese fuenf (plus wlan-firmware, 49b6f45) entfernten
Image-Pakete (orca, onboard, ufw/gufw, cifs-utils/casper,
samba-common-bin, sssd, unattended-upgrades). Auf Liebherr-35 verifiziert:
Reparatur stellt orca/onboard/samba-common-bin/cifs-utils/casper wieder
her, zweiter Lauf ohne Aenderung.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
KRITISCH (E2E 09.10.2026): der Server schickt fuer jedes Katalog-Merkmal
ausserhalb des Workspace "absent" (ADR-0010). Die Rolle machte daraus
apt remove linux-firmware - auf jedem Geraet, inkl. Kernel-Metapakete.
WLAN-Firmware weg, sichtbar erst nach dem naechsten Neustart (betroffen:
VM 107, Liebherr-35, MS Gaissach). Jetzt: absent entfernt nichts mehr;
Pakete, die ein frueherer remove-Lauf laut apt-Historie entfernt hat,
werden wieder installiert. Auf Liebherr-35 verifiziert (Firmware + Kernel-
Metapakete zurueck, iwlwifi laedt Firmware 89, WLAN verbunden).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
E2E-Test 09.10.2026: abmelden und nach wenigen Sekunden neu anmelden ->
alte Datei noch da. logind laesst user@ standardmaessig 10 s weiterlaufen,
bei Neuanmeldung in dieser Zeit endet er nie und ExecStopPost (Reset) laeuft
nicht. Auf VM 107 mit ~3 s Neuanmeldung verifiziert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Die Gastsitzung war nie fluechtig: das vierte Feld in namespace.conf
listet AUSGENOMMENE Benutzer, "root,gast" nahm gast aus. Auch "~gast"
reicht nicht, weil user@UID (gnome-keyring, dconf, Portale) ausserhalb des
Sitzungs-Namespace laeuft. Jetzt: tmpfs auf /home/gast im System-Namespace,
zurueckgesetzt beim Booten und nach jeder Gastsitzung, mit
unverschluesseltem login-Schluesselbund (Brave fragte sonst bei jedem Start).
Neu: Rolle sitzungsauswahl (LightDM nur Standardsitzung, Tag always) und
Merkmal konsolenwechsel-sperre (DontVTSwitch, mutter-Kuerzel, keine getty).
Siehe platform-docs ADR-0039. Auf VM 107 (Mint 22.3) verifiziert.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Live gefunden (19.09.2026, erster QEMU-E2E-Testlauf mit dem Ubuntu-
Backend): "Destination /etc/systemd/timesyncd.conf does not exist!" fatal
- die Annahme "auf allen drei Ziel-Backends bereits Teil des
Basissystems" stimmte fuer dieses Golden Image nicht. Gleiches Muster wie
guest-session/firewall: EIN fataler Task riss den gesamten restlichen
ansible-pull-Lauf mit (failed=1 von 380 Tasks, aber alle 25
Auftragskatalog-Eintraege wurden als fehlgeschlagen gemeldet).
Stat-Guard vor beiden lineinfile-Tasks (present und absent).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
Live gefunden (19.09.2026, gleicher Testlauf wie die guest-session/git/
flatpak-Funde): "Failed to find required executable 'ufw'" auf einem
Geraet, auf dem das firewall-Merkmal nie ausgewaehlt war - ufw wurde
dementsprechend nie installiert, und "deaktivieren" (das ohnehin nie aktiv
war) sollte ein reiner No-op sein statt fatal zu scheitern. Gleiches
Stat-Guard-Muster wie roles/guest-session/.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
Live gefunden (19.09.2026, erster QEMU-E2E-Testlauf mit dem neuen
schlanken "debian-13-base"-Backend): lineinfile schlug fatal fehl
("Destination /etc/pam.d/lightdm does not exist!"), weil die Rolle nur
zwischen RedHat/GDM und "Debian-Familie => LightDM" unterschied - das neue
headless-schlanke Debian-Backend hat aber gar keinen Display-Manager
installiert. Ein fataler Task-Fehler bricht bei ansible-pull den GESAMTEN
restlichen Play ab, nicht nur diese Rolle - dadurch wurde auf dem
betroffenen Geraet ueberhaupt kein einziges Merkmal mehr angewendet.
Zwei stat-Tasks pruefen jetzt, ob die jeweilige PAM-Datei existiert; die
lineinfile-Tasks werden uebersprungen statt zu scheitern, wenn nicht. Ein
Gast-Sitzungs-Merkmal ist ohne Display-Manager ohnehin bedeutungslos (kein
grafischer Login-Bildschirm vorhanden).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
Neue Rollen chromium (nur Debian/Mint, echtes .deb-Paket - siehe
Rollenkommentar zum Ubuntu-Snap-Problem) und microsoft-edge (alle drei
Backends, Microsofts eigenes apt-Repo, gleiches Muster wie google-chrome).
Beide vor webapp-shortcuts in site.yml eingehängt.
webapp.desktop.j2: Categories= kommt jetzt aus item.categories (server-
seitig aus der gewählten App-Kategorie übersetzt, siehe
KATEGORIE_ZU_XDG_CATEGORIES in provisioning-server/app.py) statt fest
Network;WebBrowser; - und Exec= nutzt bei gesetztem item.kiosk_browser
("google-chrome"/"chromium") den jeweiligen --app=<url>-Kiosk-Start
statt xdg-open. Beide Werte werden bereits serverseitig aufgelöst, die
Rolle selbst trifft keine eigene Entscheidung.
Syntax-geprüft (ansible-playbook --syntax-check, Jinja2-Testrender mit
allen drei Exec-Varianten). Menü-Kategorisierung selbst (landet die
Webapp wirklich im erwarteten Cinnamon-Menüordner?) braucht noch einen
echten Boot-Test - siehe Rückmeldung im Chat.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Live gegen die golden-linux-mint VM gefunden: ansible.builtin.hostname
aktualisiert ansible_facts['hostname'] im laufenden Play automatisch nach
einer Änderung - die when:-Bedingung der /etc/hosts-Aktualisierung verglich
direkt gegen diesen (jetzt schon neuen) Fact und wurde faelschlich
uebersprungen. Der fehlende 127.0.1.1-Eintrag liess sudo im
Folge-Task mit "unable to resolve host" scheitern (privilege escalation
timeout).
Fix: Vorher-Hostname einmal per set_fact einfrieren statt live gegen
ansible_facts zu vergleichen, UND /etc/hosts vor dem eigentlichen
Hostnamenwechsel aktualisieren statt danach - kein Zwischenzustand mit
neuem Hostnamen aber altem /etc/hosts-Eintrag mehr moeglich.
Wechsel, Idempotenz und "keine Konvention konfiguriert" (leerer
tuxflotte_zielhostname) live gegen die VM verifiziert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Immer eingebundene Basis-Rolle (analog webapp-shortcuts, kein present/
absent-Merkmal) - setzt den Hostnamen nur, wenn tuxflotte_zielhostname
gesetzt UND vom aktuellen ansible_facts['hostname'] abweicht
(ansible.builtin.hostname, plattformübergreifend) + pflegt den
127.0.1.1-Eintrag in /etc/hosts nach.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
- terminal-sperre: blendet Terminal-Emulatoren per XDG-Hidden-Override in
/usr/local/share/applications aus (weiche Variante, keine
Ausführungssperre - Entscheidung 10.09.2026). Realer Bug live gefunden
und gefixt: Zielverzeichnis existierte nicht, copy schlug fehl.
- netzwerkscanner-sperre: schlankes Cleanup (nmap/wireshark & Co.
entfernen, falls vorinstalliert) - kein laufender Schutz nötig, da
ADR-0026 Selbstinstallation durch den interaktiven Nutzer bereits
verhindert. "absent" installiert bewusst nichts zurück.
- Beide Rollen präsent+idempotent+absent live gegen die golden-linux-mint
VM (103) getestet.
- site.yml: beide Rollen eingebunden (53 -> 55 include_role-Blöcke).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Drei neue Konfiguration-Merkmale mit echten Zugangsdaten in optionen,
Kategorie konfig-identitaet-netzwerk:
- ad-anbindung: Domaenen-Beitritt per realmd/sssd/adcli (Standard-
Werkzeugkette, regulaere Pakete). realmd konfiguriert PAM beim Beitritt
automatisch mit.
- fileserver: EINE Netzwerk-Freigabe per SMB oder WebDAV (cifs-utils/
davfs2). Bewusst enger als die urspruengliche Anforderung ($HOME +
beliebig viele Freigaben) - $HOME-Mount gehoert eher zur AD-Rolle
(SSSD/autofs), "beliebig viele Freigaben" braeuchte einen listenbasierten
Mechanismus wie webapp-shortcuts. Beides vorgemerkt, nicht umgesetzt.
- update-proxy: reiner apt-Proxy-Client (pragmatische Version aus der
Diskussion vom 09.09. - fest benanntes Proxy-Geraet statt dynamischer
Peer-Wahl). Das Proxy-Geraet selbst braucht apt-cacher-ng weiterhin
manuell/serverseitig.
NICHT live gegen echte AD-/Fileserver-Infrastruktur getestet (Nutzer-
Entscheidung 10.09.2026: Testinfrastruktur erst nach dem Proxmox-
Hardware-Umzug, aktuelle pve-Hardware zu schwach fuer einen zusaetzlichen
Test-Dienst). Was getestet wurde: Rollen-Syntax, das "optionen nicht
gesetzt -> sauber ueberspringen"-Verhalten aller drei Rollen (echter
ansible-playbook-Lauf), und fuer update-proxy zusaetzlich der volle
Konfigurations-Pfad (reine Datei-Operation, kein Netzwerk-I/O, deshalb
gefahrlos lokal testbar).
Dabei echten Bug gefunden+behoben (betraf alle drei neuen Rollen
gleichermassen): `dict.get("fehlender_key")` liefert Python/Jinja None,
"and None" ist in aktuellen Ansible-Versionen (2.16+) kein gueltiges
when:-Ergebnis mehr - harter Fehler statt stiller Falsy-Umwandlung wie
frueher. Zusaetzlich: `| default('')` ersetzt standardmaessig NUR
undefinierte Werte, nicht explizites None - `| default('', true)` noetig,
um auch None abzufangen. Jede Rolle leitet jetzt einmal zu Beginn ein
echtes Boolean per set_fact ab statt .get() direkt in when: zu verwenden.
Voraussetzung: Migration 0035 (Verschluesselung + OE-/Gruppen-optionen-
Fix, admin/provisioning-server) muss vorher angewendet sein.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Konfiguration: multimedia-codecs, barrierefreiheit, wlan-firmware,
tastaturlayout, laender, zeitserver, auto-update.
Härtung: firewall, virenscanner, security-updates.
Vier Config-Value-Rollen (tastaturlayout/laender/zeitserver/auto-update)
nutzen tuxflotte_optionen fuer den eigentlichen Wert (Muster wie
brave/standardbrowser), nicht nur present/absent.
ECHT auf golden-linux-mint getestet (ansible-core dort, Live-VM ueber
SSH), nicht nur Syntax-Check - dabei drei reale Bugs gefunden+behoben:
1. wlan-firmware: Paketname ist NICHT distributionsunabhaengig wie
angenommen - Debian "firmware-linux-nonfree", Ubuntu/Mint
"linux-firmware". Per ansible_facts[distribution] verzweigt (dabei
zusaetzlich gelernt: Mint meldet sich als "Linux Mint" mit
Leerzeichen, nicht "Linuxmint").
2. auto-update: Jinja-Dict-Lookup in set_fact lieferte einen String
statt int zurueck, dadurch spaeterer Vergleich mit TypeError
abgestuerzt UND zwei stille Gleichheitsvergleiche immer falsch
(waeren nie aufgefallen ohne den einen lauten Fehler an anderer
Stelle). Mit explizitem int-Filter behoben.
3. firewall/security-updates: Auftrag-abgewaehlt deaktivierte nur die
Funktion (ufw disable / Config-Datei loeschen), liess aber das Paket
installiert - inkonsistent zum Rest des Katalogs, wo absent immer
vollstaendige Rueckabwicklung bedeutet. Ergaenzt.
Nebenbefund beim Testen: clamav-daemon startet bewusst nicht sofort nach
der Installation (echte systemd-Condition auf die noch fehlende
Signaturdatenbank) - kein Bug, aber clamav-freshclam war standardmaessig
nicht dauerhaft aktiviert, das nachgezogen.
Firewall-Rolle laesst SSH bewusst offen (sonst waere Fernwartung
ausgesperrt - fast selbst beim Testen passiert). Bekannte offene Luecke
klar kommentiert: andere Merkmale mit Eingehend-Bedarf (z.B. veyon)
muessen ihre eigene ufw-Freigabe mitbringen, diese Rolle kennt andere
Merkmale nicht (Konflikt-/Gruppen-Handling insgesamt noch offen, siehe
Roadmap).
Gehoert zusammen mit admin/provisioning-server-Migration 0035 (live auf
anode angewendet+verifiziert: 10 Merkmale, 30 Blueprint-Zeilen) und den
3 neuen Kategorien aus Migration 0034.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Kundeneigene URLs (workspace_webapps, siehe admin/provisioning-server)
werden als .desktop-Menueintrag (/usr/share/applications) UND
best-effort als Desktop-Icon ausgeliefert - kein present/absent pro
Eintrag wie sonst im Katalog, sondern ein echter ABGLEICH: die Rolle
bekommt bei jedem Lauf die komplette aktuelle Liste und sorgt dafuer,
dass GENAU diese Eintraege existieren (Datei-Identifikation ueber die
stabile DB-UUID, keine Namens-Slugifizierung noetig). Laeuft deshalb
IMMER (site.yml-Play-Var tuxflotte_webapps, agent.py haengt sie immer
in --tags ein, siehe admin/provisioning-agent), nicht nur bei
Aenderungen.
Desktop-Icon-Ablage bewusst pragmatisch: /etc/skel/Desktop (kuenftige
Nutzer) + bestehende /home/*/Desktop-Ordner, falls schon vorhanden -
kein erzwungenes Anlegen. Haengt an der noch offenen ADR-0026
(kein final festgelegter primaerer interaktiver Nutzer-Account) - deckt
ab, was heute real existiert (z.B. den 'gast'-Account aus
guest-session), ohne auf die endgueltige Klaerung zu warten.
ECHT END-ZU-ENDE GETESTET (nicht nur Syntax-Check): echter
ansible-playbook-Lauf gegen localhost mit Mock-Daten - Anlegen
(mit+ohne Favicon), Aktualisieren, vollstaendiges Entfernen bei leerer
Liste, Idempotenz. Favicon-Download-Pfad mit echter URL verifiziert.
ansible-core dafuer neu installiert (vorher nicht vorhanden).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
google-chrome, anydesk: distributionsunabhängige Hersteller-apt-Repos
(Repo-URL+GPG-Key real recherchiert und verifiziert, 09.09.2026).
kolibri: neueres, distributionsunabhängiges GitHub-Pages-Repo von
Learning Equality (offiziell nur für Debian 13+ dokumentiert - NICHT
live auf Mint/Ubuntu bestätigt, siehe Rollenkommentar).
veyon: kein universelles Repo verfügbar, offizielle .deb-Downloads sind
pro Distro/Version fest gebaut - Codename-Erkennung über
/etc/os-release (UBUNTU_CODENAME bei Mint/Ubuntu, VERSION_CODENAME bei
Debian) mit expliziter Zuordnungstabelle (trixie/noble/resolute). Nur
der Debian-Fall bisher real bestätigt, siehe Rollenkommentar - vor
breitem Rollout auf allen drei Golden-VMs live gegenprüfen.
gdevelop, turbowarp: kein Debian-Paket, Flathub-IDs real bestätigt
(io.gdevelop.ide, org.turbowarp.TurboWarp) - Flatpak-Fallback wie bei
brave/libreoffice/onlyoffice.
Vectr bewusst NICHT als native Rolle - hat kein Debian-Paket, nur Snap
(passt nicht zu Mints Snap-Abstinenz) oder Web-App - wird stattdessen
ein Default-Eintrag im neuen Webapp-Mechanismus.
Gehört zusammen mit admin/provisioning-server-Migration 0031 (live auf
anode angewendet+verifiziert: 6 Merkmale, 18 Blueprint-Zeilen).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Erste Batch des Merkmal-Ausbaus (siehe Roadmap-Plan, Memory
project_phase2_app_store_merkmale): 28 Ansible-Rollen fuer Apps mit
regulaerem Debian/Ubuntu-Paket (per apt-cache auf einer echten
Debian-trixie-Quelle verifiziert, nicht aus dem Gedaechtnis geraten).
apt/deb bewusst statt Flatpak (Nutzer-Entscheidung 09.09.2026, kehrt
die bisherige brave/libreoffice/onlyoffice-Praxis fuer alle NEUEN
Rollen um). Kein os_family-Zweig noetig - alle drei Ziel-Backends
(mint-image/debian-image/ubuntu-image) sind Debian-Familie, Fedora
bewusst ausgeklammert.
Rollen: gimp, inkscape, scribus, librecad (Kreativ/Grafik); audacity,
musescore, metronome, minuet (Musik/Audio); stellarium, octave,
kalgebra, kalzium, kbruch, step, tuxmath, filius, gcompris (Bildung
Mathe/Naturwissenschaft); ktouch, kwordquiz, kanagram, tuxtype,
foliate (Bildung Sprache/Schreiben); evolution (Buero); kturtle,
fritzing (Programmieren/Making); remmina (Internet); geogebra, marble
(Unterrichtswerkzeuge).
Jede Rolle folgt dem bestehenden Muster (Marker-Datei unter
/run/tuxflotte/agent/applied/, present/absent-Verzweigung auf
tuxflotte_state) - alle 33 site.yml-Bloecke + alle Rollen-tasks als
YAML geparst verifiziert.
Gehoert zusammen mit admin/provisioning-server-Migration 0030 (Merkmal-
+Blueprint-DB-Eintraege, live auf anode angewendet+verifiziert).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
Kein Flatpak verfügbar (Google vertreibt nur eigene .deb/.rpm-Pakete),
daher wie guest-session eine einzige Rolle mit interner
os_family-Verzweigung statt Flatpak-Installation. apt (Debian/Mint)
installiert direkt per deb-URL, dnf (Fedora) per rpm-URL.
Syntax-geprüft (ansible-playbook --syntax-check); die tatsächliche
Paketinstallation (Netzwerk, Abhängigkeitsauflösung) ist im Gegensatz
zu den bisherigen Flatpak-Rollen noch nicht auf echter Hardware
verifiziert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Neben OnlyOffice als zusätzliche Katalog-Option, distro-unabhängig
über Flatpak (org.libreoffice.LibreOffice), gleiches present/absent-
Muster wie die onlyoffice-Rolle.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Fedora-Installer wurde zurückgestellt (Installationsprobleme), Fokus liegt
jetzt auf Mint, später weitere Distros. Beide Rollen sind über Flatpak
implementiert und damit schon jetzt distributionsunabhängig - die
"-fedora"-Benennung war irreführend. Konvention: kein Suffix = bewusst
distro-unabhängig (wie schon guest-session), "-mint"/"-fedora"-Suffix nur
für tatsächlich distro-spezifische Logik.
roles/brave-fedora -> roles/brave, roles/onlyoffice-fedora -> roles/onlyoffice,
Marker-Dateinamen und Task-Namen angepasst, site.yml und README aktualisiert.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
lineinfile matchte bisher nur exakten Text - Debian/LightDM liefert eine
Zeile mit identischer Wirkung, aber anderer Formatierung mit, wurde also
nicht erkannt und stattdessen dupliziert. regexp behebt das für den
present-Task; der absent-Task bleibt bewusst beim exakten String-Match,
damit er nie die von der Distribution mitgelieferte Zeile entfernt.
Gefunden bei der E2E-Verifikation auf der QEMU-Test-VM.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ersetzt die reinen Marker-Datei-Platzhalter durch echte Anforderungen des
Schulcomputer-Workspace:
- guest-session: flüchtige Gastsitzung über lokalen gast-User +
pam_namespace-tmpfs-Polyinstantiation, nopasswdlogin-Login. PAM-Layout
wird über ansible_facts os_family erkannt (RedHat vs. Debian), da der
Rollenname für beide Backends geteilt wird.
- brave-fedora: Installation via Flatpak/Flathub, neue optionale
standardbrowser-Option (tuxflotte_optionen) setzt/entfernt den
System-Default in /etc/xdg/mimeapps.list, mit Firefox-Fallback.
- onlyoffice-fedora: Installation via Flatpak/Flathub.
site.yml reicht zusätzlich zu tuxflotte_auftrag_states auch
tuxflotte_auftrag_optionen pro Rolle durch.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Adds a tuxflotte_state variable, threaded from a new
tuxflotte_auftrag_states dict in site.yml (role name -> present/absent,
populated by the agent from the checkin response's "auftraege" list,
see ADR-0010) down into each role via include_role vars. Roles not
present in that dict default to "present" via .get(), so today's
purely workspace-composed, additive-only behavior is unchanged.
Retrofits all three existing placeholder roles with the present/absent
branch as the reference implementation of the convention, and
documents it in the README for future catalog-eligible roles. This is
what makes deselecting an Auftrag actually revert something instead of
just stopping future re-application.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Tags on include_role only apply to the include statement itself, not
the role's inner tasks, unless passed via apply. Without this,
ansible-pull --tags <role> silently skipped every role task, so no
marker files were ever written during the QEMU agent test.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Ein Platzhalter je Merkmal aus der Schulcomputer-Bereitstellungsvorlage (guest-session, brave-fedora, onlyoffice-fedora), zum Beweis der ansible-pull-Pipeline des Provisioning Agent.