RuleRunner prüft Anbindungen vor jedem Lauf, baut das Ziel auf und führt die Engine im Worker mit Inaktivitäts-Watchdog aus. Der Lock wird erst beim echten Ende des Workers freigegeben. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
3.7 KiB
3.7 KiB
Changelog
Alle nennenswerten Änderungen an NetMover stehen hier.
Format nach Keep a Changelog,
Versionierung nach Semantic Versioning.
Die Version steht an genau einer Stelle: src/netmover/__init__.py.
[Unreleased]
Hinzugefügt
- Projektgerüst (Python ≥ 3.12, FastAPI-Stack, src-Layout, ruff, mypy strict, pytest).
- Datenmodell mit SQLAlchemy 2.x:
credentials,mounts,rules,runs,run_items,copied_files,file_failures,settings. - Alembic-Migration
0001(initiales Schema); NetMover migriert beim Start selbst. - Zeitzonenbewusste Zeitstempel (UTC) auch auf SQLite.
- Strukturierte Logs (logfmt oder JSON, ein Ereignis pro Zeile).
- CLI
netmover migrate/netmover version. - SFTP als Zieltyp (
sftp) für Ziele, die nur per SSH erreichbar sind; Anmeldung per selbst erzeugtem Ed25519-Schlüssel oder Passwort, Hostschlüssel wird beim ersten Test festgehalten und danach erzwungen. - Eingabeprüfung für Server, Freigaben, Pfade und Mount-Optionen (Allowlist pro
Typ;
credentials,username,password,pass,domaingesperrt). - Fernet-Verschlüsselung der Zugangsdaten (
secret.key, 0600, beim ersten Start erzeugt) und Schwärzung bekannter Geheimnisse inmount-Ausgaben. - Mount-Schicht hinter
MountBackendmitLinuxMountBackend(mount/umountnur mit Argumentliste, CIFS-Zugangsdaten über kurzlebige Datei unter/run/netmover) undFakeMountBackendfür Tests ohne root. - Mount-Test in drei Schritten (einhängen, lesen, schreiben) mit Rollen („nur Quelle, kopieren“ / „Quelle mit Löschen“ / „Ziel“) und Root-Squash-Erkennung inklusive Synology-Hinweis.
- Lebenszeichen mit Zeitlimit vor jedem Lauf; gestörte Mounts (ESTALE, EIO,
ENOTCONN, Zeitüberschreitung) werden per
umount -lbis zu dreimal mit wachsendem Abstand neu eingehängt. - Mountpoints ausschließlich unter
/mnt/netmover/<slug>, müssen vor dem Einhängen leer sein und werden nach dem Aushängen entfernt. - Mover-Engine: Stabilitätsprüfung (Größe und mtime nach dem
Stabilitätsfenster), unfertige/versteckte Dateien und Synology-Ordner
(
@eaDir,#recycle) werden ignoriert, Glob (mehrere Muster mit;) oder Regex. - Atomares Schreiben:
.netmover-<uuid>.part→fsync→ Größenprüfung → Metadaten → Quellprüfung → Umbenennen ohne Überschreiben (link, Rückfall aufrename) → erst dann Quelle löschen; gleiches Gerät ohne Kopie perlink. - Namenskollisionen: umbenennen (
scan-1.pdf,scan-2.pdf, …, jedes Mal gegen das Dateisystem geprüft), überspringen oder überschreiben. - Buchführung im Kopiermodus (
copied_files); verhindert auch Duplikate, wenn im Verschiebemodus die Quelle nicht gelöscht werden kann. - Platzprüfung vor jeder Kopie (Größe + 5 %), Übernahme von mtime und Modus,
optional Eigentümer; Metadaten-Fehler sind Hinweise, keine Fehler;
chownauf CIFS und auf NFS mit Root-Squash wird übersprungen und einmalig gemeldet. - Quarantäneordner für Dateien, die wiederholt scheitern.
- SFTP-Ziel mit demselben atomaren Ablauf (
renameohne Überschreiben,posix-renamebeim Überschreiben,fsync/statvfsüber OpenSSH-Erweiterungen). - Regellauf mit Lock pro Regel, Lebenszeichen der Anbindungen und Worker mit Inaktivitäts-Zeitlimit; ein hängender Worker blockiert nur seine eigene Regel.
- Lokale Ziele unter dem Mount-Basisverzeichnis werden abgelehnt (dort muss die Anbindung als Ziel gewählt werden, damit „eingehängt?“ geprüft wird).
Behoben
- Löschen von Zugangsdaten, die noch von einem Mount benutzt werden, trennt den Mount nicht mehr stillschweigend ab, sondern wird von der Datenbank abgelehnt.