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