checkmk-plugin-docker-ps/docker_file_check.sh

63 lines
2.2 KiB
Bash
Executable File

#!/bin/bash
#
# Checkmk Local Check: Dateien/Verzeichnisse in Docker Containern pruefen
#
# Prueft per "docker exec" ob Dateien oder Verzeichnisse in einem
# Container existieren. Funktioniert fuer beides (Datei und Verzeichnis).
#
# Status-Mapping:
# Pfad existiert -> OK (0)
# Pfad fehlt -> CRITICAL (2)
# Container nicht da -> CRITICAL (2)
# Keine Docker-Rechte -> CRITICAL (2)
#
# === KONFIGURATION ===
# Format: CONTAINER_NAME_ODER_ID:PFAD1,PFAD2,PFAD3
# Es kann sowohl der Container-Name als auch die ID verwendet werden.
# Mehrere Container jeweils in einer eigenen Zeile.
CHECKS=(
"mein_container:/root/db.sql,/data,/root/irgendeinedatei"
# "e650d85ff452:/etc/nginx/nginx.conf,/var/log/nginx"
)
# ======================
# Rechte-Pruefung
if ! docker ps -a --format '{{.ID}}' >/dev/null 2>&1; then
echo "2 Docker_FileCheck - Keine Berechtigung fuer Docker oder Docker nicht verfuegbar"
exit 1
fi
for CHECK in "${CHECKS[@]}"; do
# Zeile aufsplitten in Container und Pfade
CONTAINER="${CHECK%%:*}"
PATHS="${CHECK#*:}"
# Pruefen ob Container laeuft (Name oder ID)
RUNNING=$(docker ps --filter "name=^/${CONTAINER}$" --filter "id=${CONTAINER}" --format '{{.Names}}' 2>/dev/null | head -1)
if [ -z "$RUNNING" ]; then
echo "2 Docker_Files_${CONTAINER} - Container \"${CONTAINER}\" laeuft nicht oder existiert nicht"
continue
fi
IFS=',' read -ra PATH_LIST <<< "$PATHS"
for FILEPATH in "${PATH_LIST[@]}"; do
FILEPATH=$(echo "$FILEPATH" | xargs)
# Sicherer Service-Name: Sonderzeichen ersetzen
SAFE_NAME=$(echo "${CONTAINER}_${FILEPATH}" | sed 's|[^a-zA-Z0-9_]|_|g')
SERVICE_NAME="Docker_File_${SAFE_NAME}"
if docker exec "$CONTAINER" test -e "$FILEPATH" 2>/dev/null; then
# Typ ermitteln (Datei oder Verzeichnis)
if docker exec "$CONTAINER" test -d "$FILEPATH" 2>/dev/null; then
TYPE="Verzeichnis"
else
TYPE="Datei"
fi
echo "0 ${SERVICE_NAME} - ${TYPE} ${FILEPATH} existiert in ${CONTAINER}"
else
echo "2 ${SERVICE_NAME} - ${FILEPATH} fehlt in ${CONTAINER}"
fi
done
done