Assistent mit Menuefuehrung, dazu zwei Haertungen

kerio_tui.py fuehrt durch Umbenennung und Uebernahme, ohne dass man
Parameter kennen muss: Benutzer und Domains kommen zur Auswahl, verwaiste
Mailbox-Verzeichnisse findet der Assistent selbst, und vor dem Ausfuehren
zeigt er den gleichwertigen Kommandozeilenaufruf. Nur curses aus der
Standardbibliothek, keine neue Abhaengigkeit.

Beim Durchfahren ueber ein PTY kamen zwei Dinge heraus:

keypad(True) loest die Pfeiltasten auf diesem Server nicht auf - getch()
liefert 27, 91, 66 statt KEY_DOWN, wofuer ein unpassendes terminfo
genuegt. Das fuehrende ESC haette als "zurueck" gegolten und den
Assistenten bei jedem Pfeildruck verlassen. Er loest die Sequenzen jetzt
selbst auf; ein einzelnes ESC wirkt weiterhin als Abbruch.

Und: Bricht die Verbindung weg, waehrend Kerio gestoppt ist, stirbt das
Script an SIGHUP und laesst den Dienst unten - genau so passiert, als der
Testtreiber die Verbindung schloss. ServiceController.abgesichert() faengt
SIGHUP, SIGTERM und SIGINT ab und startet den Dienst wieder, bevor der
Abbruch durchgereicht wird. Gegen den Testserver geprueft: Signal mitten
im Stopp-Fenster, Dienst kommt hoch, Daten unberuehrt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-07 14:54:33 +02:00
co-authored by Claude Opus 5
parent b9cbf65fac
commit 24070cba4e
5 changed files with 751 additions and 69 deletions
+32 -1
View File
@@ -4,13 +4,32 @@ Werkzeuge für Kerio Connect auf der Kommandozeile.
| Datei | Zweck |
| --- | --- |
| [`kerio_tui.py`](kerio_tui.py) | Assistent mit Menüführung — ohne Kommandozeilenparameter |
| [`kerio_rename_user.py`](kerio_rename_user.py) | Benutzer umbenennen — Login-Name **und** Mailbox-Verzeichnis im Store |
| [`kerio_users_config.py`](kerio_users_config.py) | Lesen und Ändern von `users.cfg` |
| [`kerio_common.py`](kerio_common.py) | Gemeinsame Bausteine: Admin-API-Client, Dienststeuerung |
Das Script läuft **lokal auf dem Kerio-Server als root**, braucht nur die
Alles läuft **lokal auf dem Kerio-Server als root**, braucht nur die
Python-Standardbibliothek und bietet `--dry-run`.
## Der Assistent
Wer nicht mit Parametern hantieren will:
```bash
sudo ./kerio_tui.py
```
Der Assistent zeigt die vorhandenen Benutzer zur Auswahl, findet **verwaiste
Mailbox-Verzeichnisse von selbst** (Verzeichnisse ohne zugehörigen Benutzer),
fragt die nötigen Angaben ab und zeigt vor dem Ausführen den gleichwertigen
Kommandozeilenaufruf — wer ihn kennt, tippt ihn beim nächsten Mal direkt.
Bedienung: Pfeiltasten oder `j`/`k`, Enter bestätigt, `q` oder Esc geht zurück.
Geändert wird erst nach einer ausdrücklichen Bestätigung; bis dahin lässt sich
jeder Schritt abbrechen.
## Getestet
Gegen **Kerio Connect 10.0.9 patch 2** auf Debian 12, mit lizenziertem Server
@@ -39,6 +58,13 @@ Und für `--adopt`, mit gelöschtem Altbenutzer und neu angelegtem Zielbenutzer:
| Neue Mail an den Zielbenutzer | zugestellt |
| Verwaistes Verzeichnis | keines übrig |
Der Assistent wurde über ein PTY durch alle Abläufe gefahren; dabei kam heraus,
dass `keypad(True)` auf diesem Server die Pfeiltasten **nicht** auflöst —
`getch()` liefert `27, 91, 66` statt `KEY_DOWN`. Ein fehlendes oder
unpassendes terminfo reicht dafür. Die Oberfläche löst die Sequenzen deshalb
selbst auf, sonst würde das führende ESC als „zurück" gelten und der Assistent
bei jedem Pfeildruck herausspringen.
Geändert haben sich nur Kerios eigene Index- und Statusdateien (`.journal.db`,
`status.fld`, `index.fld`) — die schreibt der Server bei jedem Zugriff neu.
@@ -48,6 +74,7 @@ Dazu Unit-Tests unter [tests/](tests/):
python3 tests/test_store.py
python3 tests/test_users_config.py
python3 tests/test_adopt.py
python3 tests/test_tui.py
```
---
@@ -228,6 +255,10 @@ legt anschließend in der Administrationskonsole einen Alias an.
- **Vorher ein Backup des Stores anlegen.** Das Script verschiebt Verzeichnisse.
- Erst an einem Testbenutzer ausprobieren.
- Der Benutzer sollte während des Laufs nicht angemeldet sein.
- Bricht die SSH-Verbindung weg, während Kerio gestoppt ist, fängt das Script
das Signal ab und **startet den Dienst wieder**, bevor es sich beendet.
Verlassen sollte man sich darauf trotzdem nicht — besser in `tmux` oder
`screen` arbeiten.
- Nach der Umbenennung müssen sich alle Mail-Clients mit dem neuen Login neu
anmelden.
- Gruppenmitgliedschaften bleiben erhalten: Kerio referenziert Gruppen über