# Host Availability Monitor + BizTalk Monitor Config Generator (.NET Framework 4.7.2) Dieses Repository ist für eine **Gitea-kompatible Repo-Struktur** aufgebaut und enthält zwei Konsolenanwendungen für **Windows Server 2019 / BizTalk Server 2019** auf **.NET Framework 4.7.2**: 1. **HostAvailabilityMonitor** - prüft Endpunkte wie UNC/SMB, `file://`, HTTP/HTTPS, SFTP, FTP, TCP, ICMP und RDP - lädt optional eine statische HIP-VM-Liste aus `hip-vms.json` und prüft pro VM Netzwerk/Ping sowie RDP/TCP 3389 - schreibt Rolling-Logs, Windows Application Event Log und E-Mails bei DOWN, Recovery und täglichem Status 2. **BizTalkMonitorConfigGenerator** - liest aktive **BizTalk Send Ports** und aktivierte **Receive Locations** aus - erzeugt daraus automatisch die JSON-Konfiguration, die der `HostAvailabilityMonitor` direkt verwenden kann - übernimmt Umgebung, Default-Werte und fachliche Anwendungszuordnung ## Zielbild Der typische Betrieb auf einer BizTalk-Maschine ist: 1. Der **Generator** läuft mit Admin-Rechten auf dem jeweiligen BizTalk-Server. 2. Er liest die aktiven BizTalk-Artefakte aus. 3. Er erzeugt eine vollständige Monitor-Konfiguration im JSON-Format. 4. Der **Monitor** läuft anschließend mit genau dieser JSON-Datei. 5. Bei DOWN und bei `DOWN -> UP` gehen Mails raus. 6. Zusätzlich geht **einmal pro Tag** eine **Status-Mail** mit Tageszusammenfassung raus, standardmäßig um **14:00 Uhr lokal**. ## Gitea-kompatible Repository-Struktur ```text . ├── .editorconfig ├── .gitignore ├── Documentation.en.md ├── Dokumentation.md ├── HostAvailabilityMonitor.sln ├── README.md ├── installers/ │ ├── README.md │ ├── powershell/ │ │ ├── Install-BizTalkMonitorConfigGenerator.ps1 │ │ ├── Install-Both.ps1 │ │ ├── Install-HostAvailabilityMonitor.ps1 │ │ ├── Uninstall-BizTalkMonitorConfigGenerator.ps1 │ │ └── Uninstall-HostAvailabilityMonitor.ps1 │ └── wix/ │ ├── BizTalkMonitorConfigGenerator.wxs │ ├── HostAvailabilityMonitor.wxs │ └── build-msi.ps1 ├── scripts/ │ ├── build-release.ps1 │ ├── generate-monitor-config.ps1 │ ├── install-generator-on-server.ps1 │ ├── install-on-server.ps1 │ ├── package-deployment.ps1 │ └── register-event-source.ps1 └── src/ ├── BizTalkMonitorConfigGenerator/ │ ├── App.config │ ├── BizTalkMonitorConfigGenerator.csproj │ ├── Program.cs │ └── generator-settings.json └── HostAvailabilityMonitor/ ├── App.config ├── HostAvailabilityMonitor.csproj ├── Program.cs ├── appsettings.json └── hip-vms.json ``` Diese Struktur ist bewusst einfach gehalten, damit das Repository sauber in **Gitea** eingecheckt, gebaut und auf Windows-Servern ausgerollt werden kann. ## Lösung / Solution - `src/HostAvailabilityMonitor/` - `src/BizTalkMonitorConfigGenerator/` - `scripts/build-release.ps1` - `scripts/install-on-server.ps1` - `scripts/install-generator-on-server.ps1` - `scripts/generate-monitor-config.ps1` - `scripts/package-deployment.ps1` - `installers/powershell/*` - `installers/wix/*` ## Technische Eckpunkte ### HostAvailabilityMonitor - Task-Scheduler-tauglich - tägliche Logrotation - Log-Retention standardmäßig 30 Tage - Windows Application Event Log - SMTP-Mails bei DOWN, Recovery (`DOWN -> UP`) und täglichem Status - SMTP-Sendports bzw. reine E-Mail-Empfaengerlisten werden vom Generator uebersprungen und vom Monitor defensiv nur als `Skipped` protokolliert, nicht alarmiert - statische HIP-VM-Prüfung über separate `hip-vms.json`, damit durch BizTalk neu erzeugte Endpunktlisten nicht mit der VM-Liste kollidieren - pro HIP-VM werden zwei normale Monitor-Targets erzeugt: `icmp://` für Netzwerk-Konnektivität und `rdp://:3389` für RDP - tägliche Status-Mail auf Basis des **ersten Laufs ab der konfigurierten Uhrzeit** - State-Datei gegen Mail-Spam und für die Einmal-pro-Tag-Logik der Status-Mail - `ApplicationName` pro Target - `EnvironmentName` global ### BizTalkMonitorConfigGenerator - liest BizTalk über **Microsoft.BizTalk.ExplorerOM** - berücksichtigt standardmäßig nur: - **gestartete Send Ports** - **aktivierte Receive Locations** - unterstützt optional: - Secondary Transport von Send Ports - lokale Pfade - Mapping von BizTalk-Anwendungsnamen auf fachliche `ApplicationName`-Werte - schreibt Rolling-Log und Event Log - schreibt die Ziel-JSON **atomar** über Temp-Datei + Rename ## Build ### Voraussetzung Für den Generator muss auf dem Build- oder Zielsystem die BizTalk-Assembly **`Microsoft.BizTalk.ExplorerOM.dll`** verfügbar sein, typischerweise durch installierten BizTalk Server bzw. BizTalk Developer/Admin Components. ### MSBuild ```powershell msbuild .\HostAvailabilityMonitor.sln /p:Configuration=Release /p:Platform="Any CPU" ``` ### Build-Skript ```powershell .\scripts\build-release.ps1 ``` Das Skript erstellt anschließend typischerweise: - `artifacts\publish\net472\HostAvailabilityMonitor\` - `artifacts\publish\net472\BizTalkMonitorConfigGenerator\` Optional direkt mit Deployment-Paket: ```powershell .\scripts\build-release.ps1 -CreateDeploymentPackage ``` Oder separat: ```powershell .\scripts\package-deployment.ps1 ``` Danach liegt ein verteilerfertiges ZIP unter `artifacts\deploy\net472\`. ## Installer / Setup-Optionen Es gibt jetzt **zwei Installer-Wege**: ### 1. PowerShell-Installer (empfohlen fuer BizTalk/Windows Server) Diese Variante ist in restriktiven Serverumgebungen meist am praktikabelsten. Wichtige Dateien: - `installers\powershell\Install-HostAvailabilityMonitor.ps1` - `installers\powershell\Install-BizTalkMonitorConfigGenerator.ps1` - `installers\powershell\Install-Both.ps1` - `installers\powershell\Uninstall-HostAvailabilityMonitor.ps1` - `installers\powershell\Uninstall-BizTalkMonitorConfigGenerator.ps1` Beispiel fuer ein gemeinsames Setup aus dem Deployment-ZIP: ```powershell .\installers\powershell\Install-Both.ps1 ` -PackageRoot . ` -BaseInstallPath "C:\Program Files\JR IT Services\BizTalk Endpoint Monitor" ` -BaseConfigPath "C:\ProgramData\JR IT Services\BizTalk Endpoint Monitor" ` -RegisterEventSources ``` ### 2. WiX-MSI-Quellen (optional) Fuer beide Programme liegen **WiX-Quellen** bei: - `installers\wix\HostAvailabilityMonitor.wxs` - `installers\wix\BizTalkMonitorConfigGenerator.wxs` - `installers\wix\build-msi.ps1` Damit kannst du auf einem Windows-Buildsystem mit WiX Toolset v3 echte MSI-Pakete erzeugen. Beispiel: ```powershell .\installers\wix\build-msi.ps1 ` -PublishRoot .\artifacts\publish\net472 ` -OutputRoot .\artifacts\msi ``` Hinweis: In diesem Arbeitsraum konnte ich **keine MSI-Binaries real bauen**, weil hier keine Windows-/WiX-Toolchain bereitsteht. Ich habe dir daher **robuste PowerShell-Installer** und **MSI-Quellen fuer den Windows-Build** bereitgestellt. ## Installation auf dem Server ### Monitor ```powershell .\scripts\install-on-server.ps1 ` -SourcePath .\artifacts\publish\net472\HostAvailabilityMonitor ` -InstallPath C:\Tools\HostAvailabilityMonitor ` -RegisterEventSource ``` ### Generator ```powershell .\scripts\install-generator-on-server.ps1 ` -SourcePath .\artifacts\publish\net472\BizTalkMonitorConfigGenerator ` -InstallPath C:\Tools\BizTalkMonitorConfigGenerator ` -RegisterEventSource ``` ## Monitor-Konfiguration für tägliche Status-Mail In `appsettings.json` bzw. in `GeneratedMonitorConfig.Email` des Generators stehen jetzt zusätzlich diese Felder: ```json "Email": { "Enabled": true, "To": [ "operations@example.local", "integration-oncall@example.local" ], "Cc": [ "integration-leads@example.local" ], "Bcc": [], "SendOnFailure": true, "SendOnRecovery": true, "SendDailySummary": true, "DailySummaryHourLocal": 14, "DailySummaryMinuteLocal": 0 } ``` Bedeutung: - `SendDailySummary`: schaltet die tägliche Status-Mail ein oder aus - `DailySummaryHourLocal`: lokale Stunde auf dem Server, z. B. `14` - `DailySummaryMinuteLocal`: lokale Minute auf dem Server, z. B. `0` Empfaengerfelder: - `To`: Hauptempfaenger als JSON-Liste - `Cc`: optionale CC-Empfaenger als JSON-Liste - `Bcc`: optionale BCC-Empfaenger als JSON-Liste - Es muss mindestens ein Empfaenger in `To`, `Cc` oder `Bcc` vorhanden sein. - Mehrere Empfaenger werden **nicht** per Semikolon in einem String konfiguriert, sondern als mehrere Array-Eintraege. Wichtig für den Betrieb: - Die Mail wird **nicht durch einen separaten zweiten Job** verschickt. - Sie wird vom normalen Monitor-Lauf versendet. - Das heißt: Der **erste erfolgreiche Programmlauf ab 14:00 Uhr lokal** verschickt die Tageszusammenfassung. - Läuft der Task z. B. alle 30 Minuten, dann geht die Status-Mail je nach Startzeit um `14:00`, `14:30`, `15:00` usw. raus — aber **nur einmal pro Tag**. Inhalt der Tagesstatus-Mail: - Monitorname, Umgebung, Servername - Zeitfenster von Mitternacht bis Versandzeitpunkt - Anzahl aller heutigen Checks - Anzahl heutiger erfolgreicher und fehlgeschlagener Checks - aktueller Snapshot des letzten Laufs - Liste der aktuell DOWN befindlichen Endpunkte mit Anwendung und Umgebung - HIP-VM-Snapshot mit Netzwerk- und RDP-Status pro VM ## HIP-VM-Monitoring Die statischen HIP-VMs liegen getrennt von den BizTalk-Endpunkten in: ```text src\HostAvailabilityMonitor\hip-vms.json ``` Aktiviert wird die Erweiterung in `appsettings.json`: ```json "HipVirtualMachines": { "Enabled": true, "ConfigPath": "hip-vms.json", "ApplicationName": "HIP Virtual Machines", "TimeoutSeconds": 5, "RdpPort": 3389, "CheckNetwork": true, "CheckRdp": true } ``` Pro VM erzeugt der Monitor beim Start zwei normale Checks: - `Network`: Ping/ICMP gegen die konfigurierte Adresse - `RDP`: TCP-Verbindung auf den konfigurierten RDP-Port, standardmäßig `3389` Ausfälle und Recoveries laufen über dieselbe State-Datei und dieselbe Mail-Logik wie alle anderen Targets. Die tägliche Status-Mail enthält zusätzlich eine kompakte HIP-VM-Übersicht je Gruppe, Maschine und Beschreibung. ## Mehrere Mail-Empfaenger konfigurieren Beispiel: ```json "Email": { "Enabled": true, "From": "monitor@example.local", "To": [ "operations@example.local", "integration-oncall@example.local" ], "Cc": [ "integration-leads@example.local" ], "Bcc": [ "audit@example.local" ] } ``` Wichtig: - pro Adresse ein eigener Eintrag im Array - keine Semikolon-getrennte Empfaengerliste in einem einzelnen String - `Cc` und `Bcc` sind optional ## Generator verwenden ### 1. Generator-Einstellungen prüfen oder anpassen Datei: ```text src\BizTalkMonitorConfigGenerator\generator-settings.json ``` Wichtige Felder: - `EnvironmentName`: z. B. `HIP Produktion` - `BizTalk.ConnectionString`: meist `SERVER=.;DATABASE=BizTalkMgmtDb;Integrated Security=SSPI` - `BizTalk.OnlyStartedSendPorts`: nur gestartete Send Ports übernehmen - `BizTalk.OnlyEnabledReceiveLocations`: nur aktivierte Receive Locations übernehmen - `BizTalk.IncludeSecondaryTransportOnSendPorts`: Secondary Transport mit aufnehmen - Hinweis: Secondary Transports mit Adapter `SMTP` werden bewusst nicht als Monitor-Targets erzeugt - `BizTalk.IncludeLocalFilePaths`: lokale Pfade zulassen oder verwerfen - `BizTalk.ApplicationMappings`: Mapping von BizTalk-Anwendungsnamen auf fachliche App-Namen - `Output.Path`: Pfad der zu erzeugenden Monitor-JSON - `GeneratedMonitorConfig`: Vorlage für Logging, Runtime, Event Log und Mail des Monitors - `GeneratedMonitorConfig.Logging.RetentionDays`: Aufbewahrung der taeglichen Monitor-Logdateien, standardmaessig `30` - `GeneratedMonitorConfig.Runtime.StateFileName`: Dateiname der Statusdatei, falls mehrere Monitor-Konfigurationen getrennten Zustand brauchen - `GeneratedMonitorConfig.HipVirtualMachines`: statische HIP-VM-Prüfung in der generierten Monitor-JSON einschalten - `GeneratedMonitorConfig.Email.SendDailySummary`: tägliche Status-Mail in der generierten Monitor-JSON einschalten - `GeneratedMonitorConfig.Email.DailySummaryHourLocal`: lokale Uhrzeit der Tageszusammenfassung - `GeneratedMonitorConfig.Email.DailySummaryMinuteLocal`: lokale Minute der Tageszusammenfassung ### 2. Generator direkt starten ```powershell C:\Tools\BizTalkMonitorConfigGenerator\BizTalkMonitorConfigGenerator.exe C:\Tools\BizTalkMonitorConfigGenerator\generator-settings.json ``` ### 3. Generator per Hilfsskript starten ```powershell .\scripts\generate-monitor-config.ps1 -InstallPath C:\Tools\BizTalkMonitorConfigGenerator ``` ### 4. Ergebnis prüfen Danach sollte eine generierte Monitor-Datei vorhanden sein, z. B.: ```text C:\Tools\BizTalkMonitorConfigGenerator\generated-monitor-appsettings.json ``` Zusätzlich prüfen: - Generator-Logdatei unter `logs\` - Einträge im Windows Application Event Log - Inhalt der generierten JSON ### 5. Monitor mit der erzeugten Datei starten ```powershell C:\Tools\HostAvailabilityMonitor\HostAvailabilityMonitor.exe C:\Tools\BizTalkMonitorConfigGenerator\generated-monitor-appsettings.json ``` ## Praxisbeispiel für den Betrieb auf der BizTalk-Maschine ### Task 1: Generator - Programm: `C:\Tools\BizTalkMonitorConfigGenerator\BizTalkMonitorConfigGenerator.exe` - Argumente: `C:\Tools\BizTalkMonitorConfigGenerator\generator-settings.json` - Starten in: `C:\Tools\BizTalkMonitorConfigGenerator` - Konto: BizTalk-Admin / technisches Administratorkonto - Intervall: z. B. alle 30 Minuten oder vor dem Monitor-Lauf ### Task 2: Monitor - Programm: `C:\Tools\HostAvailabilityMonitor\HostAvailabilityMonitor.exe` - Argumente: `C:\Tools\BizTalkMonitorConfigGenerator\generated-monitor-appsettings.json` - Starten in: `C:\Tools\HostAvailabilityMonitor` - Konto: Dienstkonto mit technischem Zugriff auf Shares, HTTP(S), FTP/SFTP und andere Zielsysteme - Intervall: kurz nach dem Generator, z. B. 1 bis 2 Minuten später Empfehlung für die Status-Mail um 14:00: - den Monitor mindestens alle 15 oder 30 Minuten laufen lassen - sicherstellen, dass in dieser Zeit auch **mindestens ein Lauf nach 14:00 Uhr** stattfindet - kein separater Status-Task notwendig ## Beispiel für ein Generator-Mapping ```json "ApplicationMappings": [ { "BizTalkApplicationName": "HIP*", "ApplicationName": "HIP" }, { "BizTalkApplicationName": "PartnerA*", "ApplicationName": "HIP Partneranbindung" } ] ``` ## Hinweise - Fuer .NET Framework 4.7.2 ist der Build-Output jetzt unter `artifacts\publish\net472\` vorgesehen. - Nicht unterstützte Endpunkte wie `net.pipe://` werden sauber übersprungen und protokolliert. - Für `net.tcp://host:port/...` wird eine Monitor-kompatible `tcp://...`-Adresse erzeugt. - Für lokale Dateipfade ist standardmäßig `IncludeLocalFilePaths=false` gesetzt. - Die erzeugte Monitor-JSON enthält `EnvironmentName` global und `ApplicationName` pro Target. - Der Generator versendet selbst keine E-Mails, sondern erzeugt nur die Konfiguration. - Die Event-Source-Erstellung benötigt Administratorrechte. - Die Tagesstatus-Mail wird nur dann als „versendet“ gespeichert, wenn der SMTP-Versand erfolgreich war. ## Dokumentation - Deutsch: [Dokumentation.md](Dokumentation.md) - English: [Documentation.en.md](Documentation.en.md)