From d0e12e5cf8854dee9737b9013a7e67473b526774 Mon Sep 17 00:00:00 2001 From: Christoph Date: Fri, 17 Apr 2026 09:43:17 +0200 Subject: [PATCH] Add script 'check_prosody_auth.sh'. --- check_prosody_auth.sh | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100755 check_prosody_auth.sh diff --git a/check_prosody_auth.sh b/check_prosody_auth.sh new file mode 100755 index 0000000..863abb7 --- /dev/null +++ b/check_prosody_auth.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash + +# -------------------- +# This script checks whether the 'prosody' service has logged any Dovecot authentication errors within +# the last check interval (MONITORING_INTERVAL) +# +# It is a good idea to run this script as a cron job every check interval minutes (MONITORING_INTERVAL). +# -------------------- + +LOGFILE="/var/log/prosody_auth_check.log" +TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') +DOVECOT_HOST="a.mx.oopen.de" +DOVECOT_PORT="44444" +MONITORING_INTERVAL=6 + +# Test 1: Ist Dovecot überhaupt erreichbar? +if ! timeout 8 bash -c "echo >/dev/tcp/$DOVECOT_HOST/$DOVECOT_PORT" 2>/dev/null; then + echo "$TIMESTAMP WARN: Dovecot nicht erreichbar - Prosody-Restart wäre sinnlos, überspringe" >> $LOGFILE + exit 1 +fi + +# Test 2: Genau der bekannte Fehler in den letzten 6 Minuten? +ERROR_COUNT=$(journalctl -u prosody --since "${MONITORING_INTERVAL} minutes ago" --no-pager 2>/dev/null | \ + grep -c "sasl_dovecot: Could not read from socket" || true) + +if [ "$ERROR_COUNT" -gt 0 ]; then + echo "$TIMESTAMP ERROR: sasl_dovecot socket-Fehler erkannt ($ERROR_COUNT×) – starte Prosody neu" >> $LOGFILE + systemctl restart prosody + sleep 5 + if systemctl is-active --quiet prosody; then + echo "$TIMESTAMP OK: Prosody erfolgreich neugestartet" >> $LOGFILE + else + echo "$TIMESTAMP CRITICAL: Prosody-Neustart fehlgeschlagen!" >> $LOGFILE + fi + exit 0 +fi + +echo "$TIMESTAMP OK: Keine Auth-Fehler" >> $LOGFILE