24 Commits
Author SHA1 Message Date
adminandClaude Opus 5.5 33266b6634 Bootstrap schickt den Fingerprint des Geräts als Nachweis mit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-27 21:17:28 +01:00
adminandClaude Opus 5.5 d1ebb9e6e9 Agent meldet Firmware-Stand (Secure Boot, Setup Mode, Drittanbieter-CA, TPM) beim Check-in
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-26 18:47:05 +01:00
adminandClaude Opus 5.5 54f76f12f9 ADR-0046 Schritt 2: Ansible-Stand als Archiv von anode, Git als Rückfall
- ansible_stand {commit, sha256} aus dem Check-in: Archiv mit Secret im
  Header laden, Summe prüfen, mit tarfile-Datenfilter entpacken, atomar nach
  /var/lib/tuxflotte/ansible/<commit>/ (0700), aktueller + voriger Stand
  bleiben; dann ansible-playbook -c local mit denselben Tags/Extra-Vars
- Fingerabdruck nimmt den Commit aus ansible_stand statt git ls-remote
  (gleicher Wert wie bisher, kein Extra-Lauf beim Umstieg)
- ohne Stand oder bei Fehler: ansible-pull mit ansible_repo wie bisher
- Check-in meldet ansible_weg (archiv/git/git-rueckfall)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 09:00:47 +02:00
adminandClaude Opus 5.5 931fac1c90 Lizenz: GPL-3.0 (Entscheidung des Nutzers 18.10.2026, ADR-0046)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 18:31:10 +02:00
adminandClaude Opus 5.5 f93c11b1a5 Merge branch 'konten-sofort'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 10:39:49 +02:00
adminandClaude Opus 5.5 ad09d815b1 Persoenliche Konten sofort nach dem Check-in anwenden (Hilfsskript der Rolle), nicht erst im ansible-pull-Lauf
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 10:39:07 +02:00
adminandClaude Opus 5.5 393271456e Merge branch 'personalisierung-merkmal'
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 17:02:32 +02:00
adminandClaude Opus 5.5 521b6792d1 Persoenliche Konten: Liste aus dem Check-in an Ansible, Ergebnis an den Server (ADR-0041)
Rolle persoenliche-konten laeuft bei jedem Lauf mit, die Liste (mit
Passwort-Hashes) nur ueber die root-lesbare Extra-Vars-Datei. Das Ergebnis
der Rolle geht an /api/v1/agent/persoenliche-konten; die Datei bleibt
liegen, wenn die Meldung scheitert.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 15:55:01 +02:00
adminandClaude Opus 5.5 9956e0412c Zeitgrenze fuer ansible-pull (2h), Abbruch der ganzen Prozessgruppe, danach dpkg --configure -a
Liebherr-83 verlor am 14.10.2026 mitten im Lauf das Netz und checkte danach
stundenlang nicht mehr ein: subprocess.run wartete ohne Grenze. Jetzt
eigene Prozessgruppe, nach PULL_TIMEOUT_SECONDS SIGTERM, nach 30s SIGKILL
an alle (ansible-playbook/apt/dpkg), danach dpkg --configure -a; der Lauf
gilt als fehlgeschlagen und wird nach 5 Minuten wiederholt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 17:20:20 +02:00
adminandClaude Opus 5.5 17d7186cc1 Extra-Vars fuer ansible-pull nur root-lesbar per Datei statt Kommandozeile
Bisher stand das JSON samt entschluesselter _passwort/_secret-Optionen in
der Kommandozeile von ansible-pull: waehrend des Laufs fuer jeden
angemeldeten Benutzer per ps lesbar und von ansible-pull selbst ins Journal
geschrieben. Jetzt 0600-Datei unter /run/tuxflotte/agent, -e @datei, nach
dem Lauf geloescht; Schreibfehler zaehlt als fehlgeschlagener Lauf.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:05:13 +02:00
adminandClaude Opus 5.5 982e4e2496 Check-in meldet die Prüfsumme der eigenen agent.py
Damit sieht der Server, welche Agent-Fassung auf einem Gerät läuft
(ADR-0044). Ist die Datei nicht lesbar, fehlt das Feld einfach.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 09:46:13 +02:00
adminandClaude Opus 5.5 737a0275e9 Lebenszeichen nach jedem angenommenen Check-in (fuer die Agent-Aktualisierung)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 17:27:22 +02:00
adminandClaude Opus 5.5 c9950bff23 Erststart-Anzeige: am Ende Bildschirm leeren und auf Konsole 1 zurueck (Geraete ohne Display-Manager)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 12:44:52 +02:00
adminandClaude Opus 5.5 d4a496686c Erststart-Zaehler je Merkmal (Entfernen/Konfiguration zusammengefasst), Debug-Modus ueberspringt unveraenderte Laeufe (B10)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 11:28:59 +02:00
adminandClaude Opus 5.5 81a4853614 Erststart-Anzeige: Schritt k von n statt Ansible-Tasknamen (Kunden-ISO-Test R14)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 10:24:42 +02:00
adminandClaude Opus 5.5 6e097ce8c1 Schneller Neuversuch nach fehlgeschlagenem Lauf, Statusdateien + Erststart-Anzeige vor dem Anmeldebildschirm (Kunden-ISO-Test R6)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:42:52 +02:00
adminandClaude Sonnet 5 0075709fc2 tuxflotte-agent.service: EnvironmentFile fuer lokale Adress-Ueberschreibung
Ohne EnvironmentFile= war der bereits vorhandene TUXFLOTTE_ANODE_URL-
Override in agent.py auf jedem fertig installierten Geraet wirkungslos -
der systemd-Dienst kannte die Variable schlicht nie. Fuehrendes "-" macht
die Datei optional (Produktivgeraete ohne /etc/tuxflotte/agent.env sind
unveraendert).

Teil der E2E-Testrunde, siehe platform-docs/roadmap/
e2e-testrunde-lokale-adressierung.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DWKevK2QUK5tsGmqfSD6Yy
2026-09-19 14:43:38 +02:00
adminandClaude Sonnet 5 42c0df2503 Hostnamenkonvention: "hostname" aus Checkin-Antwort an Ansible weiterreichen
apply_roles() bekommt jetzt hostname als eigenen Parameter, "hostname"-
Rolle ist wie webapp-shortcuts immer Teil des ansible-pull-Laufs
(tuxflotte_zielhostname als Extra-Var, leer wenn keine Konvention
konfiguriert oder das Gerät seinen eigenen Namen behalten hat).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-10 12:07:02 +02:00
adminandClaude Sonnet 5 f7d24f487e Webapp-Mechanismus (Phase 2): apply_roles() um webapps erweitert
'webapp-shortcuts' (siehe admin/ansible-content) ist jetzt IMMER Teil
der --tags, auch bei leeren Listen - anders als die anderen Rollen ist
sie nicht present/absent-gesteuert, sondern bekommt die komplette
aktuelle Webapp-Liste als eigene Extra-Var (tuxflotte_webapps) und
gleicht selbst ab, was existieren soll. Icon-URLs werden hier
(nicht im Server) zu vollen URLs zusammengesetzt (ANODE_URL + relativer
icon_path aus dem Checkin) - der Server kennt seine eigene oeffentliche
Adresse nirgends, gleiches Muster wie bei GOLDEN_IMAGE_URL.

Der bisherige 'nothing to do'-Kurzschluss (kein ansible-pull-Lauf ohne
Blueprints/Auftraege) entfaellt dadurch zwangslaeufig - ein Geraet mit
gerade entfernten Webapps, aber sonst leeren Listen, muss trotzdem
laufen, um aufzuraeumen.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VLk93dhDMrkPXefVdknMV9
2026-09-09 14:59:23 +02:00
adminandClaude Opus 5 1046f9f13c Health-Metriken im Checkin + Jitter aufs Standardintervall
collect_health() sammelt Diskbelegung/RAM/Uptime/Load Average rein per
Stdlib (shutil.disk_usage, /proc/meminfo, /proc/uptime, os.getloadavg),
jeder Wert einzeln try/except. checkin() schickt das Ergebnis jetzt mit.
main()-Loop wendet 0-30 Min Jitter nur auf 'große' Intervalle (>=1h) an -
der kurze Debug-Modus (60s) und der Fallback-Retry bleiben unverjittert,
sonst würde Jitter den Debug-Zweck untergraben. Boot-Checkin war schon
vorher vorhanden (run_once() läuft immer vor der ersten sleep()), hier
nicht angefasst.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-26 10:00:48 +02:00
adminandClaude Sonnet 5 26fabfff03 feat: Self-Heal-Re-Bootstrap bei 401 auf Check-in
Ermöglicht die neue Reprovisionieren-Aktion im Kundenportal: wenn das
lokale Secret serverseitig ungültig gemacht wurde (Deprovisionierung),
holt sich der Agent beim nächsten Poll automatisch ein neues über den
bestehenden /api/v1/agent/bootstrap-Endpoint statt dauerhaft mit 401
hängenzubleiben.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-10 13:04:55 +02:00
adminandClaude Sonnet 5 03f70e747a feat: tuxflotte_auftrag_optionen an ansible-pull durchreichen
apply_roles() baut zusätzlich zu den present/absent-States ein
optionen-Dict je Rolle aus der Check-in-Antwort und gibt es im selben
--extra-vars-JSON mit (z.B. standardbrowser für brave-fedora).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 15:28:52 +02:00
adminandClaude Sonnet 5 9799a3daa0 feat: apply and report Auftragskatalog state via ansible-pull
Extends the checkin/apply cycle to cover the "auftraege" list from the
check-in response (see ADR-0010) alongside the existing workspace
blueprints: both are merged into one ansible-pull invocation, with
--tags the union of all involved roles (a catalog role needs to run
even when its target state is absent, so its removal branch executes)
and a new --extra-vars payload (tuxflotte_auftrag_states, role ->
present/absent) that ansible-content's site.yml threads down into each
role.

After the pull, reports the outcome of each Auftragskatalog entry back
via the new POST /api/v1/agent/report endpoint (applied/apply_failed/
removed/remove_failed). This is intentionally coarse: ansible-pull has
one exit code for the whole run, not per-role results, so all entries
in a given run share that outcome. Workspace blueprints are not
reported on, matching ADR-0010's scope.

Verified end to end against anode and the QEMU test VM: selecting
browser-brave as a catalog entry produced an "applied" event and the
marker file; deselecting it removed the marker and produced a
"removed" event - both written by the agent's own report call, not
simulated.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-04 09:45:07 +02:00
admin 8382a0a949 feat: initial Provisioning Agent (check-in loop + ansible-pull)
Erste lauffaehige Version: laedt Credentials, meldet sich per Bearer-Token
bei anode/api/v1/agent/checkin, wendet zugewiesene Blueprints per
ansible-pull an und schlaeft bis zum naechsten Intervall.
2026-08-01 15:55:26 +02:00