--adopt: verwaistes Mailbox-Verzeichnis einem Benutzer zuordnen

Fuer den Fall, dass der alte Benutzer schon geloescht und der neue von
Hand angelegt wurde - dann liegt nur noch das Verzeichnis herum. users.cfg
bleibt unangetastet, es wandert allein das Verzeichnis.

Geprueft wird vorher, dass der Zielbenutzer existiert und der alte nicht
mehr; gibt es ihn noch, verweist das Script auf die normale Umbenennung.
Hat das Ziel schon ein Verzeichnis mit Mails, bricht es ab - mit --force
wird das bestehende als <name>.abgeloest-<zeitstempel> beiseitegeschoben
statt geloescht.

Die Zielpruefung arbeitet jetzt als Folge statt paarweise: bei der
Uebernahme raeumt der erste Schritt das Ziel, das der zweite belegt. Eine
isolierte Pruefung haette das als Konflikt gemeldet.

Dazu die Kontaktkarte: .personal traegt Namen und Adresse des vorherigen
Eigentuemers. Sie wird jetzt umgeschrieben statt entfernt - Kerio legt sie
naemlich nicht neu an, wenn sie fehlt, weder beim Neustart noch bei einer
Aenderung ueber die Admin-API. Das gilt auch fuer die normale Umbenennung,
wo bisher die alte Adresse stehenblieb.

Beides gegen den Testserver verifiziert: nach der Uebernahme sieht der
Zielbenutzer alle Mails samt Unterordnern und Flags, die Kontaktkarte
stimmt, users.cfg ist unveraendert und neue Mail wird zugestellt.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
duffyduck
2026-08-07 14:35:51 +02:00
co-authored by Claude Opus 5
parent c4883d42bb
commit da64a15486
3 changed files with 500 additions and 10 deletions
+63 -6
View File
@@ -29,6 +29,16 @@ danach geprüft:
| Verwaistes Verzeichnis unter dem alten Namen | keines |
| GUID und Passwort-Hash des Benutzers | unverändert |
Und für `--adopt`, mit gelöschtem Altbenutzer und neu angelegtem Zielbenutzer:
| Prüfung | Ergebnis |
| --- | --- |
| Alle 7 Mails beim neuen Benutzer sichtbar | ja, inklusive Unterordner und Flags |
| Kontaktkarte `.personal` | auf neuen Namen und Adresse umgeschrieben |
| `users.cfg` | unverändert |
| Neue Mail an den Zielbenutzer | zugestellt |
| Verwaistes Verzeichnis | keines übrig |
Geändert haben sich nur Kerios eigene Index- und Statusdateien (`.journal.db`,
`status.fld`, `index.fld`) — die schreibt der Server bei jedem Zugriff neu.
@@ -37,6 +47,7 @@ Dazu Unit-Tests unter [tests/](tests/):
```bash
python3 tests/test_store.py
python3 tests/test_users_config.py
python3 tests/test_adopt.py
```
---
@@ -121,11 +132,47 @@ sudo ./kerio_rename_user.py --domain firma.de \
--old-login anna.mueller --full-name "Anna Schmidt"
```
## Verwaistes Verzeichnis übernehmen (`--adopt`)
Für den Fall, dass der alte Benutzer **schon gelöscht** und der neue **schon
angelegt** ist — dann liegt nur noch das Mailbox-Verzeichnis herum und soll dem
neuen Benutzer zugeordnet werden:
```bash
sudo ./kerio_rename_user.py --adopt \
--domain firma.de \
--old-login anna.mueller \
--new-login anna.schmidt
```
`--old-login` ist hier der Name des **verwaisten Verzeichnisses**, `--new-login`
der **bereits existierende** Zielbenutzer. `users.cfg` wird dabei nicht
angefasst — es wandert nur das Verzeichnis.
Geprüft wird vorher:
- Der Zielbenutzer existiert in `users.cfg` (sonst liefe die Mailbox ins Leere).
- Der alte Benutzer existiert **nicht** mehr. Gibt es ihn noch, bricht das
Script ab und verweist auf die normale Umbenennung, die auch `users.cfg`
mitzieht.
- Hat der Zielbenutzer schon ein Verzeichnis mit Mails darin, bricht das Script
ab. Mit `--force` wird das bestehende Verzeichnis als
`<name>.abgeloest-<zeitstempel>` beiseitegeschoben statt gelöscht — die Mails
bleiben also erhalten, werden aber **nicht** zusammengeführt.
Nach der Übernahme wird die Kontaktkarte des Benutzers (`.personal`) auf den
neuen Namen und die neue Adresse umgeschrieben, `stats.usr` beiseitegelegt —
die legt Kerio selbst neu an.
**Das Kennwort kommt nicht mit.** Der Zielbenutzer meldet sich weiterhin mit
seinem eigenen an; übernommen wird ausschließlich der Mailbestand.
## Optionen
| Option | Bedeutung |
| --- | --- |
| `--list` | Benutzer aus `users.cfg` auflisten |
| `--adopt` | Verwaistes Verzeichnis einem bestehenden Benutzer zuordnen |
| `--domain` | Mail-Domain, z. B. `firma.de` |
| `--old-login`, `--new-login` | Login-Namen ohne `@domain` |
| `--full-name` | Neuer angezeigter Name |
@@ -136,22 +183,32 @@ sudo ./kerio_rename_user.py --domain firma.de \
| `--service-wait` | Sekunden Wartezeit aufs Stoppen, Standard 90 |
| `--dry-run` | Nur anzeigen |
| `--yes` | Rückfrage überspringen |
| `--force` | Auch bei Benutzern aus einem Verzeichnisdienst |
| `--force` | Bei Verzeichnisdienst-Benutzern; mit `--adopt`: belegtes Ziel beiseiteschieben |
`--service-manager none` fasst den Dienst nicht an — dafür muss Kerio dann
selbst gestoppt sein, bevor das Script läuft.
## Die Kontaktkarte
`<mailbox>/.personal` ist die persönliche vCard des Benutzers und trägt seinen
Namen und seine Adresse. Das Script schreibt sie in beiden Modi auf den neuen
Stand um — Adresse, `FN:` und die Betreffzeile.
Löschen wäre keine Alternative: **Kerio legt die Datei nicht neu an**, wenn sie
fehlt. Weder beim Dienstneustart noch bei einer Änderung am Benutzer über die
Admin-API (geprüft gegen 10.0.9). Der Benutzer stünde dauerhaft ohne eigene
Kontaktkarte da.
## Was das Script bewusst nicht anfasst
Nach der Umbenennung steht der alte Name noch an ein paar Stellen, die reine
Anzeige betreffen und den Mailbetrieb nicht stören:
Der alte Name bleibt an zwei Stellen stehen, die reine Anzeige betreffen und den
Mailbetrieb nicht stören:
- `.personal` — die vCard des Benutzers, enthält noch die alte Adresse
- `#public/Contacts/` — der Eintrag in der globalen Adressliste
- `.caldav.db` / `.carddav.db` — die DAV-Datenbanken
Kerio schreibt `.personal` beim Start teilweise selbst neu. Wer die Adresse dort
sofort korrekt haben will, korrigiert den Kontakt in der Administrationskonsole.
Wer die sofort korrekt haben will, korrigiert den Kontakt in der
Administrationskonsole.
Kommt der alte Name in `users.cfg` außerhalb der Benutzerlisten vor (etwa in
einem Alias), meldet das Script das im Plan und ändert es **nicht** automatisch —