mirror of
https://github.com/bashclub/checkmk-monitoring-plugins.git
synced 2026-03-19 16:01:43 +01:00
Create checkcertbot.sh
Validates all local Certificates created by Certbot, just delete obsoletes
This commit is contained in:
92
checkcertbot.sh
Normal file
92
checkcertbot.sh
Normal file
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Einfacher Checkmk Local Check für Certbot-Zertifikate
|
||||
# Prüft alle cert.pem unter /etc/letsencrypt/live und gibt Status + SANs aus.
|
||||
# Schwellwerte:
|
||||
# <= 0 Tage -> CRITICAL (abgelaufen)
|
||||
# 1–14 Tage -> CRITICAL
|
||||
# 15–30 Tage -> WARNING
|
||||
# > 30 Tage -> OK
|
||||
|
||||
CERTBOT_LIVE_DIR="/etc/letsencrypt/live"
|
||||
WARN_DAYS=30
|
||||
CRIT_DAYS=14
|
||||
|
||||
# Header für Checkmk Local Checks
|
||||
echo "<<<local>>>"
|
||||
|
||||
# Abhängigkeiten prüfen
|
||||
if ! command -v openssl >/dev/null 2>&1; then
|
||||
echo "3 Certbot_Certs - UNKNOWN: openssl nicht gefunden"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ ! -d "$CERTBOT_LIVE_DIR" ]; then
|
||||
echo "3 Certbot_Certs - UNKNOWN: Verzeichnis $CERTBOT_LIVE_DIR nicht gefunden"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
NOW_EPOCH=$(date +%s)
|
||||
|
||||
# Alle Certbot-Zertifikate durchgehen
|
||||
for CERT_DIR in "$CERTBOT_LIVE_DIR"/*; do
|
||||
[ -d "$CERT_DIR" ] || continue
|
||||
|
||||
CERT_NAME="$(basename "$CERT_DIR")"
|
||||
CERT_FILE="$CERT_DIR/cert.pem"
|
||||
|
||||
if [ ! -f "$CERT_FILE" ]; then
|
||||
# Kein cert.pem in diesem Verzeichnis – überspringen
|
||||
continue
|
||||
fi
|
||||
|
||||
# Ablaufdatum auslesen
|
||||
END_DATE_RAW=$(openssl x509 -enddate -noout -in "$CERT_FILE" 2>/dev/null | cut -d= -f2)
|
||||
|
||||
if [ -z "$END_DATE_RAW" ]; then
|
||||
echo "3 Certbot_${CERT_NAME} - UNKNOWN: Konnte Ablaufdatum nicht lesen ($CERT_FILE)"
|
||||
continue
|
||||
fi
|
||||
|
||||
# Ablaufzeit in Epoch umrechnen
|
||||
END_EPOCH=$(date -d "$END_DATE_RAW" +%s 2>/dev/null)
|
||||
if [ -z "$END_EPOCH" ]; then
|
||||
echo "3 Certbot_${CERT_NAME} - UNKNOWN: Konnte Ablaufdatum nicht parsen: $END_DATE_RAW"
|
||||
continue
|
||||
fi
|
||||
|
||||
SECONDS_LEFT=$((END_EPOCH - NOW_EPOCH))
|
||||
DAYS_LEFT=$((SECONDS_LEFT / 86400))
|
||||
|
||||
# SANs ermitteln (Subject Alternative Names)
|
||||
SANS=$(openssl x509 -noout -text -in "$CERT_FILE" 2>/dev/null \
|
||||
| grep -A1 "Subject Alternative Name" \
|
||||
| tail -n1 \
|
||||
| sed 's/ *DNS://g' \
|
||||
| sed 's/, */,/g' \
|
||||
| xargs)
|
||||
|
||||
# Status bestimmen
|
||||
if [ "$SECONDS_LEFT" -le 0 ]; then
|
||||
STATE=2
|
||||
STATE_TEXT="CRITICAL"
|
||||
MSG="Zertifikat abgelaufen (seit $((-DAYS_LEFT)) Tagen)"
|
||||
elif [ "$DAYS_LEFT" -le "$CRIT_DAYS" ]; then
|
||||
STATE=2
|
||||
STATE_TEXT="CRITICAL"
|
||||
MSG="Zertifikat läuft sehr bald ab (in ${DAYS_LEFT} Tagen)"
|
||||
elif [ "$DAYS_LEFT" -le "$WARN_DAYS" ]; then
|
||||
STATE=1
|
||||
STATE_TEXT="WARNING"
|
||||
MSG="Zertifikat läuft bald ab (in ${DAYS_LEFT} Tagen)"
|
||||
else
|
||||
STATE=0
|
||||
STATE_TEXT="OK"
|
||||
MSG="Zertifikat gültig (noch ${DAYS_LEFT} Tage)"
|
||||
fi
|
||||
|
||||
# Optionales Perfdata-Beispiel (kannst du bei Bedarf anpassen oder entfernen):
|
||||
# days_left=N
|
||||
# 0/1/2 entsprechen OK/WARN/CRIT
|
||||
echo "${STATE} Certbot_${CERT_NAME} days_left=${DAYS_LEFT};;0; ${STATE_TEXT}: ${MSG}, NotAfter: ${END_DATE_RAW}, SANs: ${SANS}"
|
||||
done
|
||||
Reference in New Issue
Block a user