Checkmk/linux.sh
2026-03-16 08:32:13 +01:00

274 lines
7.6 KiB
Bash
Raw Permalink 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.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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