########################################## #   CheckMK Agent Registrierung #   Author: Marius Gielnik #   E-Mail: marius.gielnik@gc-gruppe.de ########################################## # Farben fuer bessere Lesbarkeit $ColorInfo = "Cyan" $ColorSuccess = "Green" $ColorError = "Red" $ColorWarning = "Yellow" # Fester API-Server $API_SERVER = "monitoring.gc-gruppe.net" # Funktion fuer formatierte Ausgaben function Write-Header {     Write-Host ""     Write-Host "============================================================" -ForegroundColor Cyan     Write-Host "  CheckMK Agent - TLS & Updater Registrierung             " -ForegroundColor Cyan     Write-Host "============================================================" -ForegroundColor Cyan     Write-Host "" } function Write-Success {     param([string]$Message)     Write-Host "[OK] $Message" -ForegroundColor Green } function Write-ErrorMsg {     param([string]$Message)     Write-Host "[FEHLER] $Message" -ForegroundColor Red } function Write-Info {     param([string]$Message)     Write-Host "[INFO] $Message" -ForegroundColor Cyan } function Write-Warning {     param([string]$Message)     Write-Host "[WARNUNG] $Message" -ForegroundColor Yellow } function Write-SectionHeader {     param([string]$Message)     Write-Host ""     Write-Host "--- $Message ---" -ForegroundColor Cyan     Write-Host "" } # Funktion zur Ueberpruefung ob Dateien existieren function Test-Dependencies {     $agentCtlPath = "C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe"     $updaterPath = "C:\Program Files (x86)\checkmk\service\check_mk_agent.exe"         $missingDeps = 0         if (-not (Test-Path $agentCtlPath)) {         Write-ErrorMsg "cmk-agent-ctl.exe nicht gefunden: $agentCtlPath"         $missingDeps++     }         if (-not (Test-Path $updaterPath)) {         Write-ErrorMsg "check_mk_agent.exe nicht gefunden: $updaterPath"         $missingDeps++     }         if ($missingDeps -gt 0) {         Write-ErrorMsg "Bitte installieren Sie den CheckMK Agent"         exit 1     }         return $true } # Funktion zur Eingabevalidierung function Get-ValidatedInput {     param(         [string]$Prompt,         [switch]$IsSecure,         [string]$DefaultValue = ""     )         while ($true) {         if ($IsSecure) {             $value = Read-Host -AsSecureString $Prompt             $plainValue = [Runtime.InteropServices.Marshal]::PtrToStringAuto(                 [Runtime.InteropServices.Marshal]::SecureStringToBSTR($value)             )         } else {             if ($DefaultValue) {                 $value = Read-Host "$Prompt [$DefaultValue]"                 if ([string]::IsNullOrWhiteSpace($value)) {                     $plainValue = $DefaultValue                 } else {                     $plainValue = $value                 }             } else {                 $value = Read-Host $Prompt                 $plainValue = $value             }         }                 if (-not [string]::IsNullOrWhiteSpace($plainValue)) {             return $plainValue         }                 Write-ErrorMsg "Eingabe darf nicht leer sein"     } } # Funktion zum Suchen des Hosts in CheckMK via API (fest ueber monitoring.gc-gruppe.net) function Get-CheckMKHostname {     param(         [string]$Site,         [string]$Username,         [string]$Password,         [string]$SearchHostname     )         try {         Write-Info "Suche Host in CheckMK (via $API_SERVER)..."                 # TLS 1.2 erzwingen         [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12                 # Automation User Format: "username password" als Bearer Token         $authString = "$Username $Password"                 $headers = @{             "Authorization" = "Bearer $authString"             "Accept" = "application/json"         }                 $url = "https://$API_SERVER/$Site/check_mk/api/1.0/domain-types/host_config/collections/all"                 $response = Invoke-RestMethod -Uri $url -Headers $headers -Method Get -ErrorAction Stop                 # Suche nach dem Host (case-insensitive)         $searchLower = $SearchHostname.ToLower()                 if ($response.value) {             foreach ($hostItem in $response.value) {                 if ($hostItem.id.ToLower() -eq $searchLower) {                     Write-Success "Host gefunden in CheckMK: $($hostItem.id)"                     return $hostItem.id                 }             }         }                 Write-Warning "Host '$SearchHostname' nicht in CheckMK gefunden"         return $null             } catch {         Write-Warning "Konnte nicht auf CheckMK API zugreifen ($API_SERVER)"         Write-Info "Fehler: $($_.Exception.Message)"         return $null     } } # Header anzeigen Clear-Host Write-Header # Abhaengigkeiten pruefen Write-Info "Pruefe Systemvoraussetzungen..." Test-Dependencies | Out-Null Write-Success "Alle benoetigten Dateien gefunden" # Benutzereingaben sammeln Write-SectionHeader "Schritt 1: Server-Informationen" $server = Get-ValidatedInput -Prompt "Server" $site = Get-ValidatedInput -Prompt "Site" Write-SectionHeader "Schritt 2: Anmeldedaten" $username = Get-ValidatedInput -Prompt "Benutzername" $passwordPlain = Get-ValidatedInput -Prompt "Passwort" -IsSecure Write-SectionHeader "Schritt 3: Hostname" $defaultHostname = "$env:COMPUTERNAME.ad.ghnit.net".ToLower() $hostname = Get-ValidatedInput -Prompt "Hostname" -DefaultValue $defaultHostname # Versuche den Host in CheckMK zu finden (API-Call ueber monitoring.gc-gruppe.net) Write-Host "" $checkmkHostname = Get-CheckMKHostname -Site $site -Username $username -Password $passwordPlain -SearchHostname $hostname if ($checkmkHostname) {     # Host in CheckMK gefunden - verwende exakte Schreibweise     $hostname = $checkmkHostname } else {     # Host nicht gefunden - verwende Kleinschreibung als Fallback     $hostname = $hostname.ToLower()     Write-Warning "Verwende Fallback-Hostname: $hostname"     Write-Host ""     $continue = Read-Host "Trotzdem fortfahren? (j/n)"     if ($continue -notmatch "^[jJ]$") {         Write-Warning "Abbruch durch Benutzer"         exit 0     } } # Zusammenfassung anzeigen Write-SectionHeader "Zusammenfassung" Write-Host "Server:    " -NoNewline Write-Host "$server" -ForegroundColor Green Write-Host "Site:      " -NoNewline Write-Host "$site" -ForegroundColor Green Write-Host "Username:  " -NoNewline Write-Host "$username" -ForegroundColor Green Write-Host "Hostname:  " -NoNewline Write-Host "$hostname" -ForegroundColor Green Write-Host "API-Server:" -NoNewline Write-Host " $API_SERVER" -ForegroundColor Cyan Write-Host "" $confirm = Read-Host "Fortfahren? (j/n)" if ($confirm -notmatch "^[jJ]$") {     Write-Warning "Abbruch durch Benutzer"     exit 0 } # TLS-Registrierung durchfuehren Write-SectionHeader "Schritt 4: TLS-Registrierung" Write-Info "Registriere Agent mit TLS..." $cmdPathAgentCtl = "C:\Program Files (x86)\checkmk\service\cmk-agent-ctl.exe" $cmdArgsAgentCtl = @(     "register",     "--trust-cert",     "--hostname", $hostname,     "--server", $server,     "--site", $site,     "--user", $username,     "--password", $passwordPlain ) try {     $output = & $cmdPathAgentCtl @cmdArgsAgentCtl 2>&1     if ($LASTEXITCODE -eq 0) {         Write-Success "TLS-Registrierung erfolgreich abgeschlossen"     } else {         Write-ErrorMsg "TLS-Registrierung fehlgeschlagen (Exit-Code: $LASTEXITCODE)"         Write-Host ""         Write-Host "Fehlermeldung:" -ForegroundColor Yellow         Write-Host $output -ForegroundColor Yellow         Write-Host ""         exit 1     } } catch {     Write-ErrorMsg "Fehler bei der TLS-Registrierung: $_"     exit 1 } # Updater registrieren Write-SectionHeader "Schritt 5: Updater-Registrierung" Write-Info "Registriere Agent-Updater..." $cmdPathUpdater = "C:\Program Files (x86)\checkmk\service\check_mk_agent.exe" $cmdArgsUpdater = @(     "updater",     "register",     "--hostname", $hostname,     "--server", $server,     "--site", $site,     "--user", $username,     "--password", $passwordPlain ) try {     $output = & $cmdPathUpdater @cmdArgsUpdater 2>&1     if ($LASTEXITCODE -eq 0) {         Write-Success "Updater-Registrierung erfolgreich abgeschlossen"     } else {         Write-ErrorMsg "Updater-Registrierung fehlgeschlagen (Exit-Code: $LASTEXITCODE)"         Write-Host ""         Write-Host "Fehlermeldung:" -ForegroundColor Yellow         Write-Host $output -ForegroundColor Yellow         Write-Host ""         exit 1     } } catch {     Write-ErrorMsg "Fehler bei der Updater-Registrierung: $_"     exit 1 } # Erfolgsmeldung Write-Host "" Write-Host "============================================================" -ForegroundColor Green Write-Host "  Registrierung erfolgreich abgeschlossen!               " -ForegroundColor Green Write-Host "============================================================" -ForegroundColor Green Write-Host "" Write-Info "Der CheckMK Agent ist nun registriert und einsatzbereit" Write-Host "" # Warten auf Benutzereingabe vor dem Schliessen Read-Host "Druecken Sie Enter zum Beenden" exit 0