commit 4fd2d4080ce194953320c294813f99dc4e0466e5 Author: scriptos Date: Fri Mar 21 20:23:50 2025 +0100 Initial diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000..06bdb23 --- /dev/null +++ b/Readme.md @@ -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 \ No newline at end of file diff --git a/whois-checker.v1.ps1 b/whois-checker.v1.ps1 new file mode 100644 index 0000000..772c9a7 --- /dev/null +++ b/whois-checker.v1.ps1 @@ -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 +}