274 lines
7.6 KiB
Bash
274 lines
7.6 KiB
Bash
#!/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 |