Checkmk/windows.ps1
2026-03-16 08:32:13 +01:00

334 lines
9.5 KiB
PowerShell
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

##########################################
#   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