438 lines
15 KiB
Markdown
438 lines
15 KiB
Markdown
# 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://<ip>` für Netzwerk-Konnektivität und `rdp://<ip>: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)
|