112 lines
3.9 KiB
Bash
112 lines
3.9 KiB
Bash
#!/bin/bash
|
||
#
|
||
# CheckMK Local Check für IBM Spectrum Scale mmhealth node show
|
||
# Datei: /usr/lib/check_mk_agent/local/mmhealth_node
|
||
# Ausführbar machen: chmod +x /usr/lib/check_mk_agent/local/mmhealth_node
|
||
#
|
||
# Erstellt separate Services für jeden GPFS Health Component
|
||
#
|
||
|
||
# Pfad zum mmhealth Kommando
|
||
MMHEALTH_CMD="/usr/lpp/mmfs/bin/mmhealth"
|
||
HOSTNAME=$(hostname)
|
||
|
||
# Prüfen ob mmhealth verfügbar ist
|
||
if [ ! -x "$MMHEALTH_CMD" ]; then
|
||
echo "2 \"GPFS HEALTH GLOBAL $HOSTNAME\" - CRITICAL: mmhealth command not found at $MMHEALTH_CMD"
|
||
exit 0
|
||
fi
|
||
|
||
# mmhealth node show ausführen und Ausgabe parsen
|
||
OUTPUT=$($MMHEALTH_CMD node show 2>&1)
|
||
EXIT_CODE=$?
|
||
|
||
if [ $EXIT_CODE -ne 0 ]; then
|
||
echo "2 \"GPFS HEALTH GLOBAL $HOSTNAME\" - CRITICAL: mmhealth command failed with exit code $EXIT_CODE"
|
||
exit 0
|
||
fi
|
||
|
||
# Node Status extrahieren
|
||
NODE_STATUS=$(echo "$OUTPUT" | grep "Node status:" | awk '{print $3}')
|
||
STATUS_CHANGE=$(echo "$OUTPUT" | grep "Status Change:" | cut -d':' -f2- | sed 's/^[[:space:]]*//')
|
||
|
||
if [ -z "$NODE_STATUS" ]; then
|
||
echo "2 \"GPFS HEALTH GLOBAL $HOSTNAME\" - CRITICAL: Could not parse node status from mmhealth output"
|
||
exit 0
|
||
fi
|
||
|
||
# Funktion zur Status-Konvertierung in CheckMK-Codes
|
||
get_status_code() {
|
||
case "$1" in
|
||
"HEALTHY") echo "0" ;; # OK
|
||
"TIPS") echo "1" ;; # WARNING - TIPS bedeutet Verbesserungsvorschläge
|
||
"DEGRADED"|"WARNING") echo "1" ;; # WARNING
|
||
"UNHEALTHY"|"FAILED"|"ERROR") echo "2" ;; # CRITICAL
|
||
*) echo "3" ;; # UNKNOWN
|
||
esac
|
||
}
|
||
|
||
# Funktion zur Status-Beschreibung
|
||
get_status_text() {
|
||
case "$1" in
|
||
"HEALTHY") echo "OK" ;;
|
||
"TIPS") echo "WARNING" ;;
|
||
"DEGRADED"|"WARNING") echo "WARNING" ;;
|
||
"UNHEALTHY"|"FAILED"|"ERROR") echo "CRITICAL" ;;
|
||
*) echo "UNKNOWN" ;;
|
||
esac
|
||
}
|
||
|
||
# Funktion zur Performance-Daten (numerisch für Graphing)
|
||
get_perf_value() {
|
||
case "$1" in
|
||
"HEALTHY") echo "1" ;;
|
||
"TIPS") echo "0.5" ;;
|
||
"DEGRADED"|"WARNING") echo "0.5" ;;
|
||
"UNHEALTHY"|"FAILED"|"ERROR") echo "-1" ;;
|
||
*) echo "-2" ;;
|
||
esac
|
||
}
|
||
|
||
# Globaler Node Status
|
||
STATUS_CODE=$(get_status_code "$NODE_STATUS")
|
||
STATUS_TEXT=$(get_status_text "$NODE_STATUS")
|
||
PERF_VALUE=$(get_perf_value "$NODE_STATUS")
|
||
echo "$STATUS_CODE \"GPFS HEALTH NODE $HOSTNAME\" - $STATUS_TEXT: Node status is $NODE_STATUS ($STATUS_CHANGE) | node_status=$PERF_VALUE"
|
||
|
||
# Component-Details extrahieren (nach der Trennlinie)
|
||
COMPONENT_DATA=$(echo "$OUTPUT" | sed -n '/^Component/,/^$/p' | tail -n +3)
|
||
|
||
# Jeden Component parsen
|
||
while IFS= read -r line; do
|
||
# Leere Zeilen überspringen
|
||
[ -z "$line" ] && continue
|
||
|
||
# Zeilen mit nur Trennzeichen überspringen
|
||
echo "$line" | grep -q "^-*$" && continue
|
||
|
||
# Component-Daten extrahieren (whitespace-separated, aber mit Spaces in Reasons)
|
||
COMPONENT=$(echo "$line" | awk '{print $1}')
|
||
COMP_STATUS=$(echo "$line" | awk '{print $2}')
|
||
COMP_CHANGE=$(echo "$line" | awk '{print $3" "$4" "$5}' | sed 's/[[:space:]]*$//')
|
||
REASONS=$(echo "$line" | cut -d' ' -f6- | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')
|
||
|
||
# Leere Component-Namen überspringen
|
||
[ -z "$COMPONENT" ] || [ "$COMPONENT" = "-" ] && continue
|
||
|
||
# Status-Codes für Component
|
||
STATUS_CODE=$(get_status_code "$COMP_STATUS")
|
||
STATUS_TEXT=$(get_status_text "$COMP_STATUS")
|
||
PERF_VALUE=$(get_perf_value "$COMP_STATUS")
|
||
|
||
# Reasons formatieren (falls vorhanden)
|
||
if [ -n "$REASONS" ] && [ "$REASONS" != "-" ]; then
|
||
REASON_TEXT=" - $REASONS"
|
||
else
|
||
REASON_TEXT=""
|
||
fi
|
||
|
||
# Service für Component erstellen
|
||
echo "$STATUS_CODE \"GPFS HEALTH $COMPONENT $HOSTNAME\" - $STATUS_TEXT: $COMPONENT is $COMP_STATUS ($COMP_CHANGE)$REASON_TEXT | ${COMPONENT,,}_status=$PERF_VALUE"
|
||
|
||
done <<< "$COMPONENT_DATA" |