feat: drop-in support for custom templates

User templates can now be added without rebuilding: drop a script into
~/.config/motd-assist/templates/ and reference it from a preset via
"install": "<filename>". Same-name files override built-ins; new files
are picked up by the running TUI via 'r'. `motd-assist templates` lists
known templates and creates the drop-in directory.

Apply plans now embed the resolved template content (Plan.ResolveContents)
so the sudo/root process never needs to read user config; snapshots store
installed script content so restore works under sudo as well. Validation
rejects plans with unresolved content.
This commit is contained in:
Tronax 2026-08-31 10:31:58 +02:00
parent d56659e21a
commit 303c49b484
Signed by: Tronax
SSH key fingerprint: SHA256:2pKKXDZucWvaF/GzXNz0FY53EAO1YDLN80bqS+TTz/o
10 changed files with 375 additions and 48 deletions

View file

@ -68,8 +68,32 @@ motd-assist restore # letzten Apply zurücksetzen
Die Array-Reihenfolge bestimmt die MOTD-Reihenfolge. Nicht gelistete System-Scripte
bleiben unverändert; nicht mehr benötigte gebündelte Scripte werden beim Preset-Wechsel
entfernt. `install` referenziert eine gebündelte Vorlage (`brand-header`,
`sysinfo-panel`, `footer`).
entfernt. `install` referenziert eine Vorlage siehe nächster Abschnitt.
## Eigene Vorlagen (Drop-in)
Vorlagen, die Presets über `"install"` referenzieren, können ohne Rebuild ergänzt
werden: Datei in den Drop-in-Ordner legen, fertig.
```sh
motd-assist templates # zeigt Ordner (legt ihn an) + bekannte Vorlagen
~/.config/motd-assist/templates/mein-header # eigene Vorlage (POSIX sh)
```
Anschließend im Preset referenzieren:
```json
{ "name": "10-mein-header", "enabled": true, "install": "mein-header" }
```
- Der Dateiname im Drop-in-Ordner ist der Vorlagenname; gleichnamige Dateien
überdecken die Built-ins (`brand-header`, `sysinfo-panel`, `footer`).
- Neue/geänderte Vorlagen übernimmt die laufende TUI mit `r`.
- Installierte Scripte aus Vorlagen gelten als von motd-assist verwaltet
(Preset-Wechsel räumt sie wieder ab, `restore` kennt ihren Inhalt).
- Technisch: Der Apply-Plan bettet den Vorlageninhalt ein. Das Auflösen
passiert im unprivilegierten Kontext; der sudo-Prozess muss die
User-Konfiguration nicht lesen können.
## Entwicklung