Avalonia-Desktop-App (.NET 10) zur Verwaltung von MSSQL- und Oracle-Datenbanken (Backup, Clone, Snapshot, Archive-Log, Samba-Copy). Alle Datenbank-Aktionen laufen über das PowerShell-Modul FOC-SQL.psm1; DTM baut kein eigenes Remoting nach, sondern ruft die Modulfunktionen in einer eingebetteten PowerShell-Session auf.
Entwickelt von Lars Oste · Landeshauptstadt Potsdam · Fachbereich 54.2
Fertige Pakete gibt es auf der Releases-Seite:
Windows: DTM-vX.Y.Z-windows.zip herunterladen, entpacken, DTM.exe
starten. Keine Installation nötig (self-contained, .NET-Runtime ist enthalten).
Linux (AppImage, empfohlen): DTM-vX.Y.Z-x86_64.AppImage herunterladen,
ausführbar machen und starten:
chmod +x DTM-*-x86_64.AppImage
./DTM-*-x86_64.AppImageLinux (tar.gz): DTM-vX.Y.Z-linux.tar.gz entpacken und ./DTM starten.
- Windows für die Modul-Aktionen (Backup/Snapshot etc.): die FOC-SQL- Funktionen brauchen die Windows-/Domänen-Umgebung. Die App selbst läuft auch unter Linux — dort ist das Feature-Set aber auf reine Read-Operationen begrenzt.
- Eine
credential.xmlim Benutzerprofil:Get-Credential | Export-Clixml "$env:USERPROFILE\credential.xml"
- Das FOC-SQL-Modul unter der konfigurierten Samba-Quelle.
- App starten, Verbindungen über das ⚙-Symbol neben „Datenbanken" einrichten.
- Im selben Dialog Samba-Quelle für FOC-SQL und optional den Modulpfad-Override eintragen und Speichern klicken.
Das ⚙-Symbol neben der „Datenbanken"-Überschrift öffnet den Dialog Verbindungen verwalten.
| Feld | Bedeutung |
|---|---|
| Typ | Datenbanktyp (MSSQL, ORACLE) — DropDown |
| Server | Hostname oder IP des Datenbankservers |
| Benutzer | DB-Benutzername |
| Passwort | Wird verschlüsselt gespeichert (DPAPI unter Windows, Base64 unter Linux) |
| Datenbank | Standard-Datenbankname |
| ConnectionString | Optionaler ODBC-ConnectionString; überschreibt Server/User/Passwort |
Bei MSSQL zusätzlich (PS-Remoting-Credentials, wenn abweichend von der
Default-credential.xml):
| Feld | Bedeutung |
|---|---|
| RemoteUser | Windows-User für WinRM-Aufrufe (leer = Fallback auf credential.xml) |
| RemotePassword | DPAPI-verschlüsselt in connections.json |
Und Backend (nur MSSQL): FocSql (Default, WinRM-Aufruf ans FOC-SQL-Modul)
oder OdbcDirect (direkte SQL-Ausführung via ODBC — für DMZ-Server ohne WinRM,
15 der 17 Aktionen verfügbar; Copy-to-Samba und Sync-to-Test sind File-System-
Operationen und deaktiviert).
Aktionen: Neu, Bearbeiten (Doppelklick oder Schaltfläche), Löschen.
Änderungen werden sofort in %APPDATA%\DTM\connections.json persistiert.
Unter FOC-SQL Modul im gleichen Dialog:
| Feld | Bedeutung |
|---|---|
| Samba-Quelle | UNC-Pfad mit FOC-SQL.psm1 (z. B. \\server\share\Modules\FOC) |
| Modulpfad (Override) | Absoluter lokaler Pfad; leer = Samba-Logik aktiv |
DTM prüft beim Start (einmalig pro App-Start, im Hintergrund) gegen die GitHub-Releases-Seite, ob eine neuere Version verfügbar ist. Ein manueller Check ist jederzeit über ℹ → Auf Updates prüfen in der About-Box möglich (umgeht den Cache).
-
DTM ruft
api.github.com/repos/Kroste/DTM/releases/latestauf (proxy-fähig viaWebRequest.DefaultWebProxy+CredentialCache.DefaultCredentials). -
Ist die veröffentlichte Version größer als die laufende (
AssemblyInformationalVersion), erscheint der Update-Dialog mit den Release Notes zwischen aktueller und Zielversion (ausraw.githubusercontent.com/Kroste/DTM/main/release-notes.json):Option Verhalten Jetzt aktualisieren Lädt das passende Plattform-Asset (Windows-ZIP / Linux-tar.gz / AppImage), zeigt einen Fortschrittsbalken und startet ein Skript, das nach dem Beenden von DTM die Dateien austauscht und die App neu startet. Später Erinnerung beim nächsten App-Start. Überspringen Kein weiterer Hinweis in dieser Sitzung.
Ist die release-notes.json mit einem "modulesChanged"-Eintrag markiert
("MSSQL" bzw. "FOC-SQL"), zeigt der Dialog einen roten Banner
(„MSSQL-Modul wurde geändert — jeder Server braucht einmal eine
PowerShell-Sitzung") bzw. einen grünen Hinweis (FOC-SQL sync't automatisch
beim nächsten Start).
Bei einem Git-Tag (v*) läuft .github/workflows/release.yml:
- Tests auf Ubuntu
- Self-contained Builds für
win-x64(.zip),linux-x64(.tar.gz) undlinux-x64AppImage - GitHub Release mit automatischen Release-Notes und allen drei Assets
Nach Auswahl einer Datenbank zeigt die Info-Card oben Host, Status, Compatibility- Level bzw. Oracle-Version, den Recovery-/ArchiveLog-Modus und die Größe.
Die Größe ist die allokierte Gesamtgröße der Datenbank – passend zur Anzeige in SQL Server Management Studio bzw. den Oracle-Dictionary-Views:
- MSSQL: Datendateien + Transaktionslog (entspricht der SSMS-Eigenschaft „Größe"). Weicht der Wert stark vom reinen Datenbestand ab, ist meist ein aufgeblähtes Log die Ursache (FULL-Recovery ohne Log-Backup) – dann hilft „Log Aus" bzw. „Shrink Log".
- Oracle: Summe aus
dba_data_files+dba_temp_files(inkl. TEMP- Tablespaces).
| Button | Modulfunktion | Zeitplanung | Interaktiv |
|---|---|---|---|
| Backup | Backup-Database |
ja | – |
| Clone | Sync-Database-ToTest |
ja | – |
| DB → Samba | Copy-Database-ToSamba |
– | – |
| Snapshot | Set-Snapshot |
ja | – |
| Restore | Restore-Snapshot |
– | Oracle: Vorab-Dialog mit Restore-Points + PDB-Liste; MSSQL: pwsh-Prompt |
| Remove | Remove-Snapshot |
– | ja |
| ArchiveLog An | Set-Archive-Log |
– | – |
| ArchiveLog Aus | Set-Archive-Log -Off |
– | – |
| Cluster-Health | Get-ClusterHealthStatus |
– | – (MSSQL-only, read-only Status im Info-Card) |
| VM-Snapshot / VM-Restore / VM-Remove | Ansible/OLVM-REST | – | Oracle-only, VM-Snapshot via Ansible-Playbook, Restore/Remove aktuell disabled bis Playbooks fertig |
Zeitplanung: Im Zeit-Dialog „Sofort" oder „Geplant" (Datum/Uhrzeit) wählen.
Interaktive Aktionen (Restore/Remove) zeigen Prompts im pwsh-Tab;
Antworten (Nummer, ja/j) in die Befehlszeile tippen.
ArchiveLog-Buttons togglen je nach DB-Typ unterschiedlich:
- Oracle: echter
ARCHIVELOG ON/OFF. - MSSQL:
Recovery FULL/SIMPLE(Set-Archive-Logdispatched im Modul nach DB-Typ — sieheCLAUDE.md„Akzeptierte Abweichungen").
Die Buttons spiegeln den aktuellen Modus: ist „ON"/FULL aktiv, ist „Log An"
deaktiviert und „Log Aus" klickbar — und umgekehrt. Nach einem Klick
aktualisieren sich die Stats automatisch nach ca. 8 Sekunden.
Oracle-Restore-Vorschau: Bei Oracle öffnet sich vor Restore-Snapshot ein
Dialog mit den verfügbaren Restore Points und der PDB-Liste der CDB. Bei
Multi-PDB-Konfiguration wird prominent gewarnt — Restore-Snapshot fährt die
gesamte CDB herunter und setzt sie auf den gewählten Restore Point zurück
(alle PDBs sind betroffen, nicht nur die ausgewählte).
- Titelleiste — eigene Titelleiste ohne nativen OS-Rahmen
(
ChromeWindow-Basisklasse:WindowDecorations.BorderOnly,ExtendClientAreaToDecorationsHint = true,CanResize = true).- ℹ öffnet die About-Box (Version, Entwickler, Update-Check).
- − minimiert, ⊡/❐ maximiert/restauriert, ✕ schließt.
- Alle Dialoge verwenden denselben Style (draggable Titelleiste, nur Schließen-Button).
| Datei | Inhalt |
|---|---|
%APPDATA%\DTM\connections.json |
Verbindungsliste (Passwörter und optionale PS-Remoting-Credentials DPAPI-verschlüsselt) |
%APPDATA%\DTM\settings.json |
FocSql-Einstellungen (SambaSource, ModulePath) |
Beide Dateien werden beim ersten Speichern automatisch angelegt.
DTM verwendet NLog. Die Log-Dateien liegen neben der Anwendung unter logs/:
| Datei | Inhalt |
|---|---|
logs/info.log |
Debug- und Info-Meldungen (Verbindungsaufbau, DB-Ladevorgänge, Aktionen) |
logs/error.log |
Warnungen und Fehler |
logs/powershell.log |
Gesamte PS-Terminal-Ausgabe (Ein-/Ausgaben, Fehler, Job-Header); tägliche Archivierung, 7 Tage Aufbewahrung |
Passwörter, Tokens und Credentials werden automatisch maskiert — der
${masked}-Layout-Renderer greift auf Password=/PWD= in ConnectionStrings,
URL-Query-Params (password=/token=/api_key=), Bearer-Tokens und
Authorization-Header. Ergebnis im Log: Password=*** statt Klartext.
Bei einem Problem bitte ein Issue mit der aktuellen Logdatei eröffnen.
# Klone (inkl. Dev-Submodul FOC-SQL unter external/):
git clone --recurse-submodules https://github.com/Kroste/DTM.git
# oder, falls schon geklont:
git submodule update --init external/FOC-SQL
# Bauen und Tests (VSCode-Task "build" / "test" ruft dasselbe):
dotnet build DTM.slnx -c Debug
dotnet test DTM.Tests/DTM.Tests.csproj
# Starten (VSCode-Task "DTM ausfuehren" umgeht das coreclr-Problem
# auf Code-OSS/Codium):
dotnet run --project DTM/DTM.csprojRelease: VSCode-Task „release (tag + push)" — prüft den Git-Zustand, setzt
den vX.Y.Z-Tag und stößt die GitHub-Action an, die alle Pakete baut.
Das Submodul unter external/FOC-SQL/ ist eine reine Entwicklungs-Referenz
auf den FOC-SQL-Quellcode. Die App lädt FOC-SQL zur Laufzeit weiterhin über die
in den Einstellungen konfigurierte Samba-Quelle bzw. den Modulpfad-Override.
- Views/ — Avalonia-UI (alle Fenster über
ChromeWindow-Basisklasse).MainWindow— DB-Baum, Info-Anzeige, Aktions-Buttons, PowerShell-Konsole.ConnectionManagerWindow/EditConnectionWindow— Verbindungsverwaltung.TimePickerWindow— Zeitplanung für Backup/Clone/Snapshot.SessionsWindow— Anzeige aktiver DB-Sessions.UpdatePromptWindow— Update-Dialog (Jetzt / Später / Überspringen).AboutWindow— Versionsinfo, Entwickler, manueller Update-Check.OracleRestoreSelectWindow,MssqlSnapshotSelectWindow,OlvmSnapshotSelectWindow— Auswahl-Dialoge für destruktive Aktionen mit Bestätigung.
- ViewModels/ — MVVM (CommunityToolkit.Mvvm).
MainWindowViewModel— Aktionen, Statistik-Anzeige, Baum-Aufbau, Auto-Update.ConnectionManagerViewModel— Verbindungsliste, FocSql-Einstellungen.EditConnectionViewModel— Formular für eine einzelne Verbindung.
- Data/Config/
ConnectionStore—connections.json(DPAPI/Base64-Passwortschutz).AppSettingsStore—settings.json.FocSqlRuntime— Laufzeit-Zustand der FocSql-Konfiguration.
- Data/Updater/
UpdateService— Klemmbrett-Pattern:HttpClientgegen GitHub-Releases-API, Cache pro App-Start,forceRefreshfür manuellen Check, Cross-Platform- Self-Update via.bat(Windows) /.sh(Linux, inkl. AppImage inplace-cp).
- Data/Terminal/
PowerShellTerminalSession— in-process Runspace mitDtmPSHost/DtmPSHostUI.TerminalBus— Mediator zwischen ViewModel-Aktionen und Session.AnsiParser/AnsiPalette/AnsiConsole— farbige Ausgabe.
- Data/HelperClasses/
- ODBC-Zugriff für DB-Liste und Statistik (MSSQL/Oracle).
LogMask— maskiert Passwörter in Connection-Strings vor dem Logging (ergänzt den globalen${masked}-Renderer als Ad-hoc-Schutz).ORACLE_REST— oVirt/OLVM REST-API für VM-FQDNs und -Snapshots.OdbcMssqlActionService— direkte ODBC-Ausführung für DMZ-Server ohne WinRM (BackendOdbcDirect).
- Diagnostics/
MaskingLayoutRenderer—${masked}-LayoutRenderer für NLog (Regex-basiert, per[ModuleInitializer]registriert).FatalErrorHandler— globaler Handler für UnhandledException, UnobservedTaskException und Dispatcher-Fehler.
dotnet test DTM.Tests/DTM.Tests.csprojDie Test-Suite (~361 Tests, xUnit.v3 + FluentAssertions 7.x) deckt ab:
Data/Config/— ConnectionStore, AppSettingsStore, ConnectionEntryData/Terminal/— AnsiParser, AnsiPalette, FocSqlRuntime, TerminalBus, DtmPSHostUIData/HelperClasses/— ServerCredential, DB_SERVER, Database_Info, Database_Stats-VariantenData/— DTM_DATA (Routing via FakeFactory), AsyncUtil, OdbcMssqlActionService-ValidierungData/Updater/— UpdateService (Version-Parser)Diagnostics/— MaskingLayoutRenderer (Secret-Regex)ViewModels/— MainWindowViewModel, ConnectionManagerViewModel, EditConnectionViewModel, SessionsViewModel, TimePickerViewModel, TreeNode-ViewModels
Keine Abhängigkeit auf DB-Server, Avalonia-UI-Thread oder PowerShell-Runspace.
MIT — siehe LICENSE.
☕ Gefällt dir das Tool? Buy me a coffee


