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:
commit
d56659e21a
34 changed files with 3260 additions and 0 deletions
82
README.md
Normal file
82
README.md
Normal 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).
|
||||
Loading…
Add table
Add a link
Reference in a new issue