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.
106 lines
4 KiB
Markdown
106 lines
4 KiB
Markdown
# 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).
|