add files

This commit is contained in:
magadmin 2026-03-16 08:32:13 +01:00
parent d70e612491
commit 0801a864d9
2 changed files with 608 additions and 0 deletions

274
linux.sh Normal file
View file

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

334
windows.ps1 Normal file
View file

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