Initial version of the .NET HostAvailabilityMonitor.
This commit is contained in:
@@ -0,0 +1,349 @@
|
||||
# Dokumentation – Host Availability Monitor (.NET Framework 4.8)
|
||||
|
||||
## 1. Zielbild
|
||||
|
||||
Die Anwendung überwacht auf einem Windows Server 2019 in festen Intervallen die netzwerktechnische Verfügbarkeit definierter Ziele. Typische Einsatzzwecke:
|
||||
|
||||
- interne Fileshares
|
||||
- externe HTTPS-Endpunkte
|
||||
- SFTP-Gegenstellen
|
||||
- TCP-Dienste
|
||||
- Hosts per Ping
|
||||
|
||||
Der Betrieb erfolgt typischerweise über den **Windows Task Scheduler** alle 30 Minuten.
|
||||
|
||||
## 2. Unterstützte Zieltypen
|
||||
|
||||
### 2.1 UNC / SMB
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
\\internerserver1\share1
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
1. TCP-Check auf Port 445 (oder überschriebenen Port)
|
||||
2. Optional zusätzliche Pfadvalidierung mit `Directory.Exists(...)` / `File.Exists(...)`
|
||||
|
||||
Hinweis:
|
||||
|
||||
- `ValidateUncPathAccess=false` ist robuster, wenn es nur um Erreichbarkeit geht.
|
||||
- `ValidateUncPathAccess=true` ist strenger, weil Berechtigungen, Namensauflösung und tatsächlicher Share-Zugriff geprüft werden.
|
||||
|
||||
### 2.2 HTTP / HTTPS
|
||||
|
||||
Beispiele:
|
||||
|
||||
```text
|
||||
https://host1.de/url
|
||||
http://intranet.local/health
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
- Standardmäßig `HEAD`
|
||||
- Fallback auf `GET`, wenn `HEAD` nicht unterstützt wird (`405` / `501`) oder der HEAD-Request fehlschlägt
|
||||
- Jede empfangene HTTP-Antwort zählt als **netzwerktechnisch erreichbar**
|
||||
|
||||
### 2.3 SFTP
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
sftp://partner.example.local/inbound
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
- TCP-Port-Prüfung, standardmäßig Port 22
|
||||
- kein Login, keine Dateioperation
|
||||
|
||||
### 2.4 TCP
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
tcp://host2.example.local:8443
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
- reiner Verbindungsaufbau auf dem Zielport
|
||||
|
||||
### 2.5 ICMP
|
||||
|
||||
Beispiel:
|
||||
|
||||
```text
|
||||
icmp://server01
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
- Ping über `System.Net.NetworkInformation.Ping`
|
||||
|
||||
### 2.6 Plain Hostnames
|
||||
|
||||
Beispiele:
|
||||
|
||||
```text
|
||||
server01
|
||||
partner-gateway
|
||||
```
|
||||
|
||||
Verhalten:
|
||||
|
||||
- wenn `Port` gesetzt ist: TCP-Check
|
||||
- wenn kein `Port` gesetzt ist: ICMP-Check
|
||||
|
||||
## 3. Konfigurationsmodell
|
||||
|
||||
Die Konfiguration erfolgt in `appsettings.json`.
|
||||
|
||||
### 3.1 Runtime
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `MaxConcurrency` | Maximale parallele Checks |
|
||||
| `DefaultValidateUncPathAccess` | Default für UNC-Pfadzugriffsprüfung |
|
||||
| `NonZeroExitCodeOnAnyFailure` | Exit Code 2 bei mindestens einem fehlgeschlagenen Check |
|
||||
| `NonZeroExitCodeOnExecutionError` | Exit Code 1 bei technischen Fehlern |
|
||||
| `StateDirectory` | Verzeichnis für Statusdatei |
|
||||
|
||||
### 3.2 Logging
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `LogDirectory` | Verzeichnis der Logdateien |
|
||||
| `FilePrefix` | Präfix des Tageslogs |
|
||||
| `RetentionDays` | Anzahl Tage zur Aufbewahrung |
|
||||
|
||||
### 3.3 EventLog
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `Enabled` | Aktiviert Event Log |
|
||||
| `LogName` | Standard: `Application` |
|
||||
| `Source` | Event Source |
|
||||
| `CreateSourceIfMissing` | Optionaler Versuch, die Source anzulegen |
|
||||
| `WriteSuccessEntries` | Erfolgreiche Einzelchecks schreiben |
|
||||
| `WriteSummaryEntries` | Laufzusammenfassung schreiben |
|
||||
|
||||
### 3.4 Email
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `Enabled` | Aktiviert SMTP-Benachrichtigung |
|
||||
| `SmtpHost` / `SmtpPort` | SMTP-Ziel |
|
||||
| `UseSsl` | SSL/TLS für SMTP |
|
||||
| `Username` / `Password` | Optionale Credentials |
|
||||
| `From` | Absender |
|
||||
| `To` | Empfängerliste |
|
||||
| `SubjectPrefix` | Präfix im Betreff |
|
||||
| `SendOnFailure` | Mail bei Fehler |
|
||||
| `SendOnRecovery` | Mail bei Wiederherstellung |
|
||||
| `OnlyOnStateChange` | Nur bei Statuswechsel |
|
||||
| `CooldownMinutes` | Minimaler Abstand zwischen Benachrichtigungen |
|
||||
| `TimeoutSeconds` | SMTP-Timeout |
|
||||
|
||||
### 3.5 Targets
|
||||
|
||||
| Feld | Bedeutung |
|
||||
|---|---|
|
||||
| `Name` | Anzeigename |
|
||||
| `Endpoint` | UNC, URL, SFTP, TCP, ICMP oder Hostname |
|
||||
| `TimeoutSeconds` | Timeout je Ziel |
|
||||
| `Port` | Optionaler Zielport |
|
||||
| `ValidateUncPathAccess` | Optional pro UNC-Ziel |
|
||||
| `HttpMethod` | `HEAD` oder `GET` |
|
||||
| `Enabled` | Ziel aktiv/inaktiv |
|
||||
|
||||
## 4. Logging-Verhalten
|
||||
|
||||
### 4.1 Dateilog
|
||||
|
||||
Pro Tag entsteht genau eine Logdatei:
|
||||
|
||||
```text
|
||||
logs\host-availability-monitor-2026-04-16.log
|
||||
```
|
||||
|
||||
Format:
|
||||
|
||||
```text
|
||||
2026-04-16 08:00:00.123 +02:00 | INFO | Lauf gestartet.
|
||||
2026-04-16 08:00:00.532 +02:00 | SUCCESS | Name=Externe Webseite | Kind=Https | Endpoint=https://host1.de/url | DurationMs=278 | Status=Reachable | Detail=HTTP-Antwort erhalten (200 OK). | Host=host1.de | Port=443 | HttpStatus=200
|
||||
2026-04-16 08:00:01.003 +02:00 | FAIL | Name=SFTP Partner A | Kind=Sftp | Endpoint=sftp://partner.example.local/inbound | DurationMs=10005 | Status=Unreachable | Detail=TCP-Verbindung fehlgeschlagen: A connection attempt failed... | Host=partner.example.local | Port=22 | ErrorType=SocketException
|
||||
```
|
||||
|
||||
### 4.2 Retention
|
||||
|
||||
Beim Start eines Laufs werden alte Tageslogs bereinigt.
|
||||
|
||||
Standard:
|
||||
|
||||
- aktueller Tag + 4 vorherige Tage bleiben erhalten
|
||||
- ältere Logs werden gelöscht
|
||||
|
||||
## 5. Event Log
|
||||
|
||||
Es wird in das Windows Application Event Log geschrieben.
|
||||
|
||||
Typische Events:
|
||||
|
||||
- Fehler bei Einzelchecks: Warning
|
||||
- technische Fehler: Error
|
||||
- Laufzusammenfassung: Information oder Warning
|
||||
|
||||
Wichtig:
|
||||
|
||||
- Das Erzeugen einer Event Source benötigt erhöhte Rechte.
|
||||
- Im produktiven Betrieb sollte die Source einmalig per Skript registriert werden.
|
||||
- Falls Event Log nicht verfügbar ist, fällt die Anwendung auf Dateilogging zurück und läuft weiter.
|
||||
|
||||
## 6. Benachrichtigungslogik
|
||||
|
||||
Die Anwendung speichert je Ziel einen Status in `state\monitor-state.json`.
|
||||
|
||||
Gespeicherte Informationen pro Ziel:
|
||||
|
||||
- `IsUp`
|
||||
- `ConsecutiveFailures`
|
||||
- `LastCheckedUtc`
|
||||
- `LastChangedUtc`
|
||||
- `LastNotificationUtc`
|
||||
- `LastDetail`
|
||||
|
||||
### 6.1 Benachrichtigung bei Fehler
|
||||
|
||||
Es wird benachrichtigt, wenn:
|
||||
|
||||
- `Email.Enabled=true`
|
||||
- `SendOnFailure=true`
|
||||
- das Ziel aktuell fehlschlägt
|
||||
- und je nach Einstellung entweder
|
||||
- ein Statuswechsel vorliegt oder
|
||||
- der Cooldown abgelaufen ist
|
||||
|
||||
### 6.2 Benachrichtigung bei Recovery
|
||||
|
||||
Es wird benachrichtigt, wenn:
|
||||
|
||||
- `Email.Enabled=true`
|
||||
- `SendOnRecovery=true`
|
||||
- das Ziel aktuell erfolgreich ist
|
||||
- und der vorherige bekannte Zustand `down` war
|
||||
|
||||
### 6.3 Anti-Spam
|
||||
|
||||
Mit `OnlyOnStateChange=true` werden bei Dauerfehlern nicht bei jedem Lauf erneut Mails versendet.
|
||||
|
||||
Mit `CooldownMinutes > 0` kann zusätzlich ein Zeitfenster definiert werden.
|
||||
|
||||
## 7. Exit Codes
|
||||
|
||||
| Exit Code | Bedeutung |
|
||||
|---|---|
|
||||
| `0` | Lauf erfolgreich abgeschlossen |
|
||||
| `1` | technischer Fehler / Konfigurations- oder Laufzeitproblem |
|
||||
| `2` | mindestens ein Ziel fehlgeschlagen und `NonZeroExitCodeOnAnyFailure=true` |
|
||||
|
||||
## 8. Task Scheduler Empfehlung
|
||||
|
||||
### 8.1 Allgemein
|
||||
|
||||
- Trigger: alle 30 Minuten
|
||||
- Benutzerkonto: dediziertes Servicekonto, falls UNC-Zugriffe Berechtigungen benötigen
|
||||
- "Start in": Installationsverzeichnis setzen
|
||||
|
||||
### 8.2 Beispiel
|
||||
|
||||
**Aktion**
|
||||
|
||||
- Program/script:
|
||||
|
||||
```text
|
||||
C:\Tools\HostAvailabilityMonitor\HostAvailabilityMonitor.exe
|
||||
```
|
||||
|
||||
- Add arguments:
|
||||
|
||||
```text
|
||||
C:\Tools\HostAvailabilityMonitor\appsettings.json
|
||||
```
|
||||
|
||||
- Start in:
|
||||
|
||||
```text
|
||||
C:\Tools\HostAvailabilityMonitor
|
||||
```
|
||||
|
||||
## 9. Betriebshinweise
|
||||
|
||||
### 9.1 UNC-Prüfung
|
||||
|
||||
Wenn echte Share-Verfügbarkeit geprüft werden soll:
|
||||
|
||||
- Task mit geeignetem Servicekonto ausführen
|
||||
- `ValidateUncPathAccess=true` für das betreffende Ziel setzen
|
||||
|
||||
Wenn nur der Zielserver bzw. SMB-Port relevant ist:
|
||||
|
||||
- `ValidateUncPathAccess=false` belassen
|
||||
|
||||
### 9.2 HTTP/HTTPS
|
||||
|
||||
Die Anwendung prüft Erreichbarkeit, nicht Business-Logik. Für Applikations-Health kann eine dedizierte Health-URL sinnvoller sein.
|
||||
|
||||
### 9.3 SFTP
|
||||
|
||||
Da nur der Port geprüft wird, eignet sich der Check für "Ist die Gegenstelle erreichbar?", nicht für "Kann ich mich anmelden und Dateien lesen?".
|
||||
|
||||
### 9.4 TLS
|
||||
|
||||
Die Anwendung aktiviert zusätzlich gängige SecurityProtocol-Werte, damit HTTPS-Ziele in älteren .NET-Framework-Umgebungen robuster funktionieren.
|
||||
|
||||
## 10. Build und Deployment
|
||||
|
||||
### 10.1 Voraussetzungen
|
||||
|
||||
- Windows Build Host
|
||||
- Visual Studio oder Build Tools mit MSBuild
|
||||
- .NET Framework 4.8 Targeting/Developer Pack
|
||||
|
||||
### 10.2 Build
|
||||
|
||||
```powershell
|
||||
msbuild .\HostAvailabilityMonitor.sln /p:Configuration=Release /p:Platform="Any CPU"
|
||||
```
|
||||
|
||||
### 10.3 Artefakte
|
||||
|
||||
Relevant für Deployment:
|
||||
|
||||
- `HostAvailabilityMonitor.exe`
|
||||
- `HostAvailabilityMonitor.exe.config`
|
||||
- `appsettings.json`
|
||||
- weitere referenzierte .NET-Assemblies aus `bin\Release`
|
||||
|
||||
## 11. Sicherheits- und Resilienz-Aspekte
|
||||
|
||||
Die Anwendung ist bewusst defensiv aufgebaut:
|
||||
|
||||
- Fehler einzelner Checks stoppen nicht den Gesamtlauf
|
||||
- Event Log Ausfälle führen nicht zum Abbruch
|
||||
- Statusdatei wird atomar aktualisiert
|
||||
- Log-Bereinigung blockiert den Lauf nicht
|
||||
- Mailversand markiert Benachrichtigungen nur bei echtem Erfolg
|
||||
|
||||
## 12. Empfohlene nächste Ausbaustufen
|
||||
|
||||
Optional könnte das Projekt später erweitert werden um:
|
||||
|
||||
- CSV- oder HTML-Report pro Lauf
|
||||
- pro Target eigene Empfängergruppen
|
||||
- zusätzliche Protokolle wie FTP oder LDAP-Portchecks
|
||||
- Performance Counter oder Windows Service statt Task Scheduler
|
||||
- Gitea CI-Workflow für Windows Runner
|
||||
Reference in New Issue
Block a user