diff --git a/linux.sh b/linux.sh new file mode 100644 index 0000000..0649928 --- /dev/null +++ b/linux.sh @@ -0,0 +1,274 @@ +#!/bin/bash +########################################## +#   CheckMK Agent Registrierung +#   Author: Maximilian Radtke +#   E-Mail: maximilian.radtke@gc-gruppe.de +########################################## + + +# Farben für bessere Lesbarkeit +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + + +# Funktion für formatierte Ausgaben +print_header() { +    echo -e "\n${BLUE}╔════════════════════════════════════════════════════════════╗${NC}" +    echo -e "${BLUE}║${NC}  CheckMK Agent - TLS & Updater Registrierung             ${BLUE}║${NC}" +    echo -e "${BLUE}╚════════════════════════════════════════════════════════════╝${NC}\n" +} + + +print_success() { +    echo -e "${GREEN}✓${NC} $1" +} + + +print_error() { +    echo -e "${RED}✗${NC} $1" +} + + +print_info() { +    echo -e "${CYAN}ℹ${NC} $1" +} + + +print_warning() { +    echo -e "${YELLOW}⚠${NC} $1" +} + + +# Funktion zur Überprüfung ob Befehle existieren +check_dependencies() { +    local missing_deps=0 +    +    if ! command -v cmk-agent-ctl &> /dev/null; then +        print_error "cmk-agent-ctl nicht gefunden" +        missing_deps=1 +    fi +    +    if ! command -v cmk-update-agent &> /dev/null; then +        print_error "cmk-update-agent nicht gefunden" +        missing_deps=1 +    fi +    +    if ! command -v curl &> /dev/null; then +        print_error "curl nicht gefunden" +        missing_deps=1 +    fi +    +    if ! command -v jq &> /dev/null; then +        print_warning "jq nicht gefunden - API-Suche wird übersprungen" +    fi +    +    if [ $missing_deps -eq 1 ]; then +        print_error "Bitte installieren Sie die fehlenden Abhängigkeiten" +        exit 1 +    fi +} + + +# Funktion zur Eingabevalidierung +validate_input() { +    local var_name=$1 +    local var_value=$2 +    +    if [ -z "$var_value" ]; then +        print_error "$var_name darf nicht leer sein" +        return 1 +    fi +    return 0 +} + + +# Funktion zum Suchen des Hosts in CheckMK via API +search_checkmk_host() { +    local server=$1 +    local site=$2 +    local username=$3 +    local password=$4 +    local search_hostname=$5 +    +    # Prüfe ob jq verfügbar ist +    if ! command -v jq &> /dev/null; then +        return 1 +    fi +    +    print_info "Suche Host in CheckMK..." >&2 +    +    # API URL +    local api_url="https://${server}/${site}/check_mk/api/1.0/domain-types/host_config/collections/all" +    +    # Bearer Token Format: "username password" +    local auth_header="Authorization: Bearer ${username} ${password}" +    +    # API Aufruf +    local response=$(curl -s -k -H "$auth_header" -H "Accept: application/json" "$api_url" 2>/dev/null) +    +    if [ $? -ne 0 ]; then +        print_warning "Konnte nicht auf CheckMK API zugreifen" >&2 +        return 1 +    fi +    +    # Suche nach dem Host (case-insensitive) +    local search_lower=$(echo "$search_hostname" | tr '[:upper:]' '[:lower:]') +    local found_host=$(echo "$response" | jq -r --arg search "$search_lower" '.value[]? | select(.id | ascii_downcase == $search) | .id' 2>/dev/null | head -n 1) +    +    if [ -n "$found_host" ]; then +        print_success "Host gefunden in CheckMK: $found_host" >&2 +        echo "$found_host" +        return 0 +    else +        print_warning "Host '$search_hostname' nicht in CheckMK gefunden" >&2 +        return 1 +    fi +} + + +# Header anzeigen +print_header + + +# Abhängigkeiten prüfen +print_info "Prüfe Systemvoraussetzungen..." +check_dependencies +print_success "Alle benötigten Befehle gefunden" +echo "" + + +# Benutzereingaben sammeln +echo -e "${BLUE}═══ Schritt 1: Server-Informationen ═══${NC}\n" + + +while true; do +    read -p "Server: " SERVER +    validate_input "Server" "$SERVER" && break +done + + +while true; do +    read -p "Site: " SITE +    validate_input "Site" "$SITE" && break +done + + +echo "" +echo -e "${BLUE}═══ Schritt 2: Anmeldedaten ═══${NC}\n" + + +while true; do +    read -p "Benutzername: " USERNAME +    validate_input "Benutzername" "$USERNAME" && break +done + + +while true; do +    read -s -p "Passwort: " PASSWORD +    echo "" +    validate_input "Passwort" "$PASSWORD" && break +done + + +echo "" +echo -e "${BLUE}═══ Schritt 3: Hostname ═══${NC}\n" + + +# Verwende den FQDN direkt vom System +DEFAULT_HOSTNAME=$(hostname | tr '[:upper:]' '[:lower:]') + + +read -p "Hostname [$DEFAULT_HOSTNAME]: " HOSTNAME + + +if [ -z "$HOSTNAME" ]; then +    HOSTNAME="$DEFAULT_HOSTNAME" +fi + + +# Versuche den Host in CheckMK zu finden +echo "" +CHECKMK_HOSTNAME=$(search_checkmk_host "$SERVER" "$SITE" "$USERNAME" "$PASSWORD" "$HOSTNAME") + + +if [ -n "$CHECKMK_HOSTNAME" ]; then +    # Host in CheckMK gefunden - verwende exakte Schreibweise +    HOSTNAME="$CHECKMK_HOSTNAME" +else +    # Host nicht gefunden - verwende Kleinschreibung als Fallback +    HOSTNAME=$(echo "$HOSTNAME" | tr '[:upper:]' '[:lower:]') +    print_warning "Verwende Fallback-Hostname: $HOSTNAME" +    echo "" +    read -p "Trotzdem fortfahren? (j/n): " CONTINUE +    if [[ ! "$CONTINUE" =~ ^[jJ]$ ]]; then +        print_warning "Abbruch durch Benutzer" +        exit 0 +    fi +fi + + +# Zusammenfassung anzeigen +echo "" +echo -e "${BLUE}═══ Zusammenfassung ═══${NC}\n" +echo -e "Server:    ${GREEN}$SERVER${NC}" +echo -e "Site:      ${GREEN}$SITE${NC}" +echo -e "Username:  ${GREEN}$USERNAME${NC}" +echo -e "Hostname:  ${GREEN}$HOSTNAME${NC}" +echo "" + + +read -p "Fortfahren? (j/n): " CONFIRM +if [[ ! "$CONFIRM" =~ ^[jJ]$ ]]; then +    print_warning "Abbruch durch Benutzer" +    exit 0 +fi + + +# TLS-Registrierung durchführen +echo "" +echo -e "${BLUE}═══ Schritt 4: TLS-Registrierung ═══${NC}\n" +print_info "Registriere Agent mit TLS..." + + +if yes | cmk-agent-ctl register --hostname "$HOSTNAME" --server "$SERVER" --site "$SITE" --user "$USERNAME" --password "$PASSWORD"; then +    print_success "TLS-Registrierung erfolgreich abgeschlossen" +else +    print_error "TLS-Registrierung fehlgeschlagen (Exit-Code: $?)" +    echo "" +    print_info "Mögliche Ursachen:" +    print_info "  - Netzwerkverbindung zum Server prüfen: ping $SERVER" +    print_info "  - Firewall-Regeln prüfen (Port 8000): telnet $SERVER 8000" +    print_info "  - DNS-Auflösung prüfen: nslookup $SERVER" +    exit 1 +fi + + +# Updater registrieren +echo "" +echo -e "${BLUE}═══ Schritt 5: Updater-Registrierung ═══${NC}\n" +print_info "Registriere Agent-Updater..." + + +if cmk-update-agent register -s "$SERVER" -i "$SITE" -H "$HOSTNAME" -p https -U "$USERNAME" -S "$PASSWORD"; then +    print_success "Updater-Registrierung erfolgreich abgeschlossen" +else +    print_error "Updater-Registrierung fehlgeschlagen (Exit-Code: $?)" +    exit 1 +fi + + +# Erfolgsmeldung +echo "" +echo -e "${GREEN}╔════════════════════════════════════════════════════════════╗${NC}" +echo -e "${GREEN}║${NC}  ✓ Registrierung erfolgreich abgeschlossen!               ${GREEN}║${NC}" +echo -e "${GREEN}╚════════════════════════════════════════════════════════════╝${NC}" +echo "" +print_info "Der CheckMK Agent ist nun registriert und einsatzbereit" +echo "" + + +exit 0 \ No newline at end of file diff --git a/windows.ps1 b/windows.ps1 new file mode 100644 index 0000000..6aba7a8 --- /dev/null +++ b/windows.ps1 @@ -0,0 +1,334 @@ +########################################## +#   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 \ No newline at end of file