motd-assist/README.md
Tronax 303c49b484
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.
2026-08-31 10:31:58 +02:00

106 lines
4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# motd-assist
TUI-Tool zur Verwaltung dynamischer MOTDs auf Ubuntu/Debian (`/etc/update-motd.d`)
— geschrieben in Go mit [Bubble Tea](https://github.com/charmbracelet/bubbletea)
und [Lip Gloss](https://github.com/charmbracelet/lipgloss).
## Features
- **Presets**: schnell zwischen MOTD-Stilen wechseln (mitgeliefert: `ubuntu-default`,
`minimal`, `server-dashboard`); eigene Presets landen in `~/.config/motd-assist/presets/`
- **Live-Vorschau**: die aktivierten Scripte werden ausgeführt und farbig in der TUI
angezeigt inklusive noch nicht installierter Preset-Scripte und Breitenanpassung
- **Dynamische Erkennung**: welche Scripte existieren, welche aktiv sind (Executable-Bit),
ob `pam_motd` konfiguriert ist, Distro/Hostname
- **Gebündelte Style-Scripte**: Branding-Header, Sysinfo-Panel (MEM/DISK/LOAD-Balken),
dezenter Footer reines POSIX `sh`, keine Abhängigkeiten
- **Sicherheiten**: Script-Inhalte werden nie verändert (nur chmod/rename/install),
vor jedem Apply wird ein Snapshot geschrieben, `motd-assist restore` macht ihn rückgängig
## Installation
```sh
go build -o motd-assist . # oder: go install motd-assist@latest
sudo cp motd-assist /usr/local/bin/
```
## Bedienung (TUI)
`motd-assist` startet die TUI. Lesen und Vorschauen geht ohne Root; erst beim
Anwenden (`a`) erscheint die sudo-Passwortabfrage.
| Taste | Funktion |
| --- | --- |
| `tab` / `shift+tab` | zwischen Presets · Scripten · Vorschau wechseln |
| `j`/`k`, `↑`/`↓` | auswählen |
| `enter` / `space` | Preset laden · Script an/aus |
| `u` / `d` | Script in der MOTD-Reihenfolge nach oben/unten |
| `a` | Änderungen anwenden (sudo) |
| `esc` | ausstehende Änderungen verwerfen |
| `s` | aktuellen Zustand als Preset speichern |
| `D` | ausgewähltes Preset löschen (nur eigene) |
| `r` | Systemzustand neu einlesen |
| `?` | Hilfe · `q` beenden |
## CLI
```sh
motd-assist preview [-w 72] # aktuellen MOTD rendern und ausgeben
motd-assist list # Scripte + Zustand anzeigen
motd-assist presets # verfügbare Presets auflisten
motd-assist apply <preset> # Preset anwenden (fragt ggf. sudo-Passwort)
motd-assist restore # letzten Apply zurücksetzen
```
## Preset-Format (JSON)
```json
{
"name": "mein-preset",
"description": "Kurze Beschreibung",
"scripts": [
{ "name": "00-header", "enabled": false },
{ "name": "10-brand-header", "enabled": true, "install": "brand-header" },
{ "name": "95-footer", "enabled": true, "install": "footer" }
]
}
```
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 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
```sh
go test ./... # Unit-Tests (Logik plattformneutral)
MOTD_ASSIST_ROOT=<dir> go run . # gegen ein Test-Root laufen lassen
```
Das Tool zielt auf Linux; Windows-Builds kompilieren, haben aber kein
Executable-Bit-Konzept (alles Lesen/Planen funktioniert, Ausführen der Scripte nicht).