This commit is contained in:
scriptos 2025-03-21 20:23:50 +01:00
commit 4fd2d4080c
2 changed files with 229 additions and 0 deletions

85
Readme.md Normal file
View File

@ -0,0 +1,85 @@
# PRTG Custom Whois Monitoring Script
Dieses Skript ermöglicht es, Domains in **PRTG** zu überwachen. Es nutzt `whois.exe`, um den Status einer Domain zu überprüfen und optional das **Erstellungsdatum (Created)** sowie das **letzte Aktualisierungsdatum (Updated)** auszugeben.
## 📌 Funktionen
**Überwachung von Domains in PRTG** (Status: registriert/frei)
**Erkennt das "Creation Date" und "Updated Date"** für `.com`, `.net`, `.org` uvm.
✅ **Funktioniert mit allen TLDs**
**PRTG-kompatible JSON-Ausgabe** für einfache Integration
**Fehlermeldungen und Debugging über Log-Dateien**
## 🛠 Einrichtung in PRTG
### 1⃣ Skript speichern
Speichere die Datei als **`CustomWhoisCheck.ps1`** unter:
```plaintext
C:\Program Files (x86)\PRTG Network Monitor\Custom Sensors\EXEXML\
```
### 2⃣ whois.exe installieren
Lade whois.exe von Microsoft Sysinternals herunter und speichere sie z. B. in:
```plaintext
C:\Apps\WhoIs\whois.exe
```
🔗 [Download: Whois von Sysinternals](https://docs.microsoft.com/en-us/sysinternals/downloads/whois)
## 🔧 Nutzung in PRTG
### 1⃣ Neuen Sensor in PRTG erstellen
1. Neuen Sensor hinzufügen
2. Sensor-Typ: `EXE/Script Advanced`
3. Skript auswählen: `CustomWhoisCheck.ps1`
4. Parameter hinzufügen:
```plaintext
-Domain "techniverse.net"
```
5. Sensor speichern & testen
### 2⃣ Alternative: Domain als PRTG-Parameter setzen
Falls du Domains direkt über das Gerät in PRTG definieren möchtest:
```plaintext
-Domain "%host"
```
## 🚦 Wann wird der Sensor rot?
### 🔴 Sensor wird rot, wenn:
- Die Domain frei ist → Gefahr von Domaingrabbing!
- `whois.exe` keine Antwort liefert (z. B. Netzwerkproblem)
- Der Whois-Server nicht erreichbar ist
### 🟢 Sensor bleibt grün, wenn:
- Die Domain registriert ist
- Whois-Abfrage erfolgreich war
📌 `.de`-Domains zeigen nur "registriert", da DENIC keine Creation/Updated-Daten über Whois bereitstellt.
## 🔴 1⃣ PRTG so einstellen, dass der Sensor auf "Fehler" geht (rot)
Standardmäßig zeigt PRTG den Sensor als "OK" an, auch wenn der Wert 2 ist. Damit PRTG dies als Fehler erkennt, müssen wir eine Einstellung anpassen:
1. Gehe in PRTG zu deinem Sensor
2. Klicke auf "Kanäle"
3. Wähle den Kanal "Domain Status" aus
4. Scrolle nach unten zu "Erweiterte Kanal-Einstellungen"
5. Setze bei "Fehler, wenn Wert größer als" den Wert auf 1
6. Speichern & testen
📌 Ergebnis:
`0` = OK (grün) → Domain ist registriert
`2` = Fehler (rot) → Domain ist frei und kann registriert werden
Jetzt sollte der Sensor auf rot springen, wenn die Domain frei wird. ✅
---
**Autor:** Patrick Asmus
**Lizenz:** MIT

144
whois-checker.v1.ps1 Normal file
View File

@ -0,0 +1,144 @@
# Beschreibung:
# Parameter: -Domain meindomainname.de
# Autor: Patrick Asmus
# Web: https://www.techniverse.net
# Version: 1.0
# Datum: 21.03.2025
# Modifikation: Initial
#####################################################
param (
[string]$Domain
)
# Prüfen, ob eine Domain übergeben wurde
if (-not $Domain) {
$result = @{
prtg = @{
error = 1
text = "Error: No domain parameter provided!"
}
}
$result | ConvertTo-Json -Depth 3
exit 1
}
# Pfad zur whois.exe
$whoisPath = "C:\Apps\WhoIs\whois.exe"
# Prüfen ob whois.exe vorhanden ist
if (!(Test-Path $whoisPath)) {
$result = @{
prtg = @{
error = 1
text = "Error: whois.exe not found at $whoisPath"
}
}
$result | ConvertTo-Json -Depth 3
exit 1
}
# Whois-Abfrage durchführen
try {
$whoisResult = & $whoisPath -accepteula $Domain | Out-String
$whoisResult = $whoisResult -replace "`r`n", " " -replace "`n", " " -replace "`r", " " # Zeilenumbrüche entfernen
$whoisResult = $whoisResult.Trim()
} catch {
$result = @{
prtg = @{
error = 1
text = "Error during whois query"
}
}
$result | ConvertTo-Json -Depth 3
exit 1
}
# Debugging: Whois-Output in eine Datei schreiben
$whoisResult | Out-File "C:\Apps\WhoIs\whois_output.log"
# Prüfen, ob es sich um eine .de-Domain handelt
$isDeDomain = $Domain -match "\.de$"
if ($isDeDomain) {
# .de-Domains liefern keine Creation/Updated-Daten -> Nur Status anzeigen
$creationDate = $updatedDate = $creationTimestamp = $updatedTimestamp = $null
} else {
# Whois-Abfrage für .com/.net/.org-Domains auswerten
$creationDate = if ($whoisResult -match "(?i)Creation\s*Date:\s*([\d]{4}-[\d]{2}-[\d]{2})") { $matches[1] } else { $null }
$updatedDate = if ($whoisResult -match "(?i)Updated\s*Date:\s*([\d]{4}-[\d]{2}-[\d]{2})") { $matches[1] } else { $null }
}
# Konvertiere Datum in YYYYMMDD (PRTG kann nur Zahlen speichern)
function Convert-ToTimestamp($dateString) {
if ($dateString -match "\d{4}-\d{2}-\d{2}") {
return $dateString -replace "-", ""
} else {
return $null # Falls kein Datum gefunden wurde
}
}
$creationTimestamp = Convert-ToTimestamp $creationDate
$updatedTimestamp = Convert-ToTimestamp $updatedDate
# Prüfen auf "Status: free" oder andere Indikatoren für nicht registrierte Domains
if ($whoisResult -match "(?i)Status:\s+free" -or $whoisResult -match "(?i)No match" -or $whoisResult -match "(?i)not found" -or $whoisResult -match "(?i)does not exist") {
$result = @{
prtg = @{
result = @(@{
channel = "Domain Status"
value = 2
unit = "Custom"
})
text = "Domain '$Domain' is free! Risk of domain grabbing!"
}
}
$result | ConvertTo-Json -Depth 3
exit 2
} else {
# Domain ist registriert
$prtgResult = @(
@{
channel = "Domain Status"
value = 0
unit = "Custom"
}
)
# Nur bei Nicht-.de-Domains Created/Updated anzeigen
if (-not $isDeDomain) {
if ($creationTimestamp) {
$prtgResult += @{
channel = "Creation Date (YYYYMMDD)"
value = $creationTimestamp
unit = "Custom"
}
}
if ($updatedTimestamp) {
$prtgResult += @{
channel = "Updated Date (YYYYMMDD)"
value = $updatedTimestamp
unit = "Custom"
}
}
}
# Textausgabe für PRTG: Bei .de-Domains nur "registered" ohne Created/Updated
if ($isDeDomain) {
$statusText = "Domain '$Domain' is registered."
} else {
$statusText = "Domain '$Domain' is registered."
if ($creationDate) { $statusText += " Created: $creationDate" }
if ($updatedDate) { $statusText += ", Updated: $updatedDate" }
}
# JSON für PRTG ausgeben
$result = @{
prtg = @{
result = $prtgResult
text = $statusText
}
}
$result | ConvertTo-Json -Depth 3
exit 0
}