feat: add motd-assist TUI for managing dynamic MOTDs

Initial Go project built with Bubble Tea and Lip Gloss:
- Live preview and management of /etc/update-motd.d scripts
- Embedded presets (ubuntu-default, minimal, server-dashboard)
- Bundled POSIX sh style scripts (brand header, sysinfo panel, footer)
- Snapshot/restore safety around applying changes
- CLI subcommands preview, apply, restore, list-presets
- Unit tests for detect, sanitize, and apply logic
This commit is contained in:
Tronax 2026-08-24 14:19:28 +02:00
commit d56659e21a
Signed by: Tronax
SSH key fingerprint: SHA256:2pKKXDZucWvaF/GzXNz0FY53EAO1YDLN80bqS+TTz/o
34 changed files with 3260 additions and 0 deletions

82
README.md Normal file
View file

@ -0,0 +1,82 @@
# 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 gebündelte Vorlage (`brand-header`,
`sysinfo-panel`, `footer`).
## 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).