Skip to content

Repository files navigation

DTM — Datenbank-Manager

CI Release License: MIT

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

DTM Hauptfenster


Installation

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.AppImage

Linux (tar.gz): DTM-vX.Y.Z-linux.tar.gz entpacken und ./DTM starten.

Voraussetzungen

  • 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.xml im Benutzerprofil:
    Get-Credential | Export-Clixml "$env:USERPROFILE\credential.xml"
  • Das FOC-SQL-Modul unter der konfigurierten Samba-Quelle.

Erste Schritte

  1. App starten, Verbindungen über das ⚙-Symbol neben „Datenbanken" einrichten.
  2. Im selben Dialog Samba-Quelle für FOC-SQL und optional den Modulpfad-Override eintragen und Speichern klicken.

Verbindungen verwalten

Das ⚙-Symbol neben der „Datenbanken"-Überschrift öffnet den Dialog Verbindungen verwalten.

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

Auto-Update

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).

Ablauf

  1. DTM ruft api.github.com/repos/Kroste/DTM/releases/latest auf (proxy-fähig via WebRequest.DefaultWebProxy + CredentialCache.DefaultCredentials).

  2. Ist die veröffentlichte Version größer als die laufende (Assembly­Informational­Version), erscheint der Update-Dialog mit den Release Notes zwischen aktueller und Zielversion (aus raw.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).

GitHub Actions

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) und linux-x64 AppImage
  • GitHub Release mit automatischen Release-Notes und allen drei Assets

Datenbank-Übersicht (Info-Card)

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).

Aktionen

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-Log dispatched im Modul nach DB-Typ — siehe CLAUDE.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).

Oracle Restore-Vorschau


Benutzeroberfläche

  • 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).

Datenspeicherung

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.


Logs & Fehlersuche

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.


Entwicklung

# 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.csproj

Release: 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.

Architektur (Kurzüberblick)

  • 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/
    • ConnectionStoreconnections.json (DPAPI/Base64-Passwortschutz).
    • AppSettingsStoresettings.json.
    • FocSqlRuntime — Laufzeit-Zustand der FocSql-Konfiguration.
  • Data/Updater/
    • UpdateService — Klemmbrett-Pattern: HttpClient gegen GitHub-Releases-API, Cache pro App-Start, forceRefresh für manuellen Check, Cross-Platform- Self-Update via .bat (Windows) / .sh (Linux, inkl. AppImage inplace-cp).
  • Data/Terminal/
    • PowerShellTerminalSession — in-process Runspace mit DtmPSHost/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 (Backend OdbcDirect).
  • Diagnostics/
    • MaskingLayoutRenderer${masked}-LayoutRenderer für NLog (Regex-basiert, per [ModuleInitializer] registriert).
    • FatalErrorHandler — globaler Handler für UnhandledException, UnobservedTaskException und Dispatcher-Fehler.

Tests

dotnet test DTM.Tests/DTM.Tests.csproj

Die Test-Suite (~361 Tests, xUnit.v3 + FluentAssertions 7.x) deckt ab:

  • Data/Config/ — ConnectionStore, AppSettingsStore, ConnectionEntry
  • Data/Terminal/ — AnsiParser, AnsiPalette, FocSqlRuntime, TerminalBus, DtmPSHostUI
  • Data/HelperClasses/ — ServerCredential, DB_SERVER, Database_Info, Database_Stats-Varianten
  • Data/ — DTM_DATA (Routing via FakeFactory), AsyncUtil, OdbcMssqlActionService-Validierung
  • Data/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.


Lizenz

MIT — siehe LICENSE.


☕ Gefällt dir das Tool? Buy me a coffee

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Sponsor this project

Packages

Contributors

Languages