Hallo da man nicht immer sofort mitbekommt das der Abgleich einen Fehler hat habe ich etwas gebastelt
Auf einem Debian System läuft via Cron folgendes check-sync-status.sh Skript
config.conf
check-sync-status.sh
send- log-email.sh
Das ganze Informiert über den Fehler Per Mail und per WhatsApp.
Was haltet ihr davon ?
Ich bin für Verbesserungsvorschläge offen .
Auf einem Debian System läuft via Cron folgendes check-sync-status.sh Skript
config.conf
Code:
# === SQL Server Verbindungsdetails ===
DB_SERVER=""
DB_USER=""
DB_PASS=""
DB_NAME=""
# === SQL-Abfragen ===
SQL_SYNC_QUERY="SELECT TOP 1 [cStatusMeldung] FROM [Mandant_1].[Sync].[tSyncLogsitzung] ORDER BY dEnde DESC;"
# === Skriptspezifische Konfiguration ===
# SQL-Export
SQL_LOG_DIR="/home/developer/log/sql"
# === E-Mail Versand Konfiguration ===
MAIL_TO="" # Empfängermail
MAIL_FROM="" # Absendermail
# Dynamische Betreffzeilen für verschiedene Log-Typen
SUBJECT_INVOICE="Invoice Upload Log"
SUBJECT_SQL_EXPORT="SQL Export Log"
SUBJECT_CAM_SORT="Cam Record Sort Log"
SUBJECT_DEFAULT="System Log"
# === Fehler-Handling für Sync-Abfrage ===
ERROR_TEXT="Der Abgleich wurde abgebrochen."
EMAIL_COOLDOWN_TIME=1800 # 30 Minuten Cooldown in Sekunden
# === Log-Verwaltung ===
LOG_DIR="/home/developer/log"
MAX_LOG_FILES=30
check-sync-status.sh
Bash:
#!/bin/bash
# === Konfiguration einlesen ===
CONFIG_FILE="/home/developer/scripts/config.conf"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
echo "❌ FEHLER: Konfigurationsdatei '$CONFIG_FILE' nicht gefunden!" >&2
exit 1
fi
# === Verzeichnisse setzen ===
mkdir -p "$SQL_LOG_DIR"
LOCK_DIR="$SQL_LOG_DIR/lock"
mkdir -p "$LOCK_DIR"
# === Lock-Datei im Unterverzeichnis setzen ===
EMAIL_COOLDOWN_FILE="$LOCK_DIR/sync-error-email.lock"
# === Log-Datei erstellen ===
LOG_TIMESTAMP=$(date +%Y-%m-%d_%H-%M)
LOG_FILE="$SQL_LOG_DIR/sync-check-$LOG_TIMESTAMP.log"
# === SQL-Abfrage ausführen und speichern ===
echo "🔍 Führe SQL-Abfrage aus..." | tee "$LOG_FILE"
/opt/mssql-tools18/bin/sqlcmd -S "$DB_SERVER" -U "$DB_USER" -P "$DB_PASS" -d "$DB_NAME" -C -Q "$SQL_SYNC_QUERY" -h -1 -W 2>&1 | tee -a "$LOG_FILE"
# === Prüfen, ob der Fehlertext in der Abfrage enthalten ist ===
if grep -q "$ERROR_TEXT" "$LOG_FILE"; then
echo "⚠️ Abgleich wurde abgebrochen! Prüfe, ob eine Benachrichtigung gesendet werden kann..." | tee -a "$LOG_FILE"
# Prüfe, ob eine E-Mail-Sperre aktiv ist
if [ -f "$EMAIL_COOLDOWN_FILE" ]; then
LAST_EMAIL_TIME=$(stat -c %Y "$EMAIL_COOLDOWN_FILE")
CURRENT_TIME=$(date +%s)
TIME_DIFF=$((CURRENT_TIME - LAST_EMAIL_TIME))
if [ $TIME_DIFF -lt $EMAIL_COOLDOWN_TIME ]; then
REMAINING_TIME=$((EMAIL_COOLDOWN_TIME - TIME_DIFF))
echo "⏳ Benachrichtigung bereits gesendet. Nächste in $REMAINING_TIME Sekunden möglich." | tee -a "$LOG_FILE"
exit 0
else
echo "🔄 Cooldown abgelaufen. Sende neue Benachrichtigung..." | tee -a "$LOG_FILE"
/bin/bash /home/developer/scripts/send-log-email.sh "$LOG_FILE"
curl -s "https://api.callmebot.com/whatsapp.php?phone=######&text=Achtung+WAWI+Abgleichfehler&apikey=#######" > /dev/null
touch "$EMAIL_COOLDOWN_FILE"
fi
else
echo "📧 Erster Fehler erkannt. Sende Benachrichtigung..." | tee -a "$LOG_FILE"
/bin/bash /home/developer/scripts/send-log-email.sh "$LOG_FILE"
curl -s "https://api.callmebot.com/whatsapp.php?phone=#######&text=Achtung+WAWI+Abgleichfehler&apikey=######" > /dev/null
touch "$EMAIL_COOLDOWN_FILE"
fi
# Maximal 30 Log-Dateien behalten
find "$SQL_LOG_DIR" -type f -name "sync-check-*.log" | sort -r | tail -n +$((MAX_LOG_FILES+1)) | xargs rm -f
else
echo "✅ Kein Fehler gefunden." | tee -a "$LOG_FILE"
# Falls Sperrdatei existiert, aber kein Fehler mehr auftritt -> Lösche sie
if [ -f "$EMAIL_COOLDOWN_FILE" ]; then
echo "🗑️ Fehler behoben, lösche Sperrdatei." | tee -a "$LOG_FILE"
rm -f "$EMAIL_COOLDOWN_FILE"
fi
# Lösche das Log, da kein Fehler aufgetreten ist
echo "🗑️ Kein Fehler gefunden. Lösche Log-Datei." | tee -a "$LOG_FILE"
rm -f "$LOG_FILE"
fi
echo "✅ Skript abgeschlossen."
exit 0
send- log-email.sh
Bash:
#!/bin/bash
# === Konfiguration einlesen ===
CONFIG_FILE="/home/developer/scripts/config.conf"
if [ -f "$CONFIG_FILE" ]; then
source "$CONFIG_FILE"
else
echo "❌ FEHLER: Konfigurationsdatei '$CONFIG_FILE' nicht gefunden!"
exit 1
fi
# Argumente: Log-Datei, optional SQL-Export-Datei, optional E-Mail-Adresse für SQL-Export
LOG_FILE="$1"
ATTACHMENT="$2"
EMAIL_TO="$3"
# === PRÜFUNGEN ===
if [ -z "$LOG_FILE" ] || [ ! -f "$LOG_FILE" ]; then
echo "❌ Fehler: Keine gültige Log-Datei angegeben."
exit 1
fi
# Dynamischer Betreff basierend auf der Log-Datei
LOG_FILENAME=$(basename "$LOG_FILE")
if [[ "$LOG_FILENAME" == *"sql-export"* ]]; then
SUBJECT="$SUBJECT_SQL_EXPORT - $(date +%Y-%m-%d)"
elif [[ "$LOG_FILENAME" == *"invoice-upload"* ]]; then
SUBJECT="$SUBJECT_INVOICE - $(date +%Y-%m-%d)"
elif [[ "$LOG_FILENAME" == *"cam-rec-sort"* ]]; then
SUBJECT="$SUBJECT_CAM_SORT - $(date +%Y-%m-%d)"
else
SUBJECT="$SUBJECT_DEFAULT - $(date +%Y-%m-%d)"
fi
# === Überprüfung & Installation von msmtp ===
if ! command -v msmtp &> /dev/null; then
sudo apt update && sudo apt install -y msmtp msmtp-mta
fi
# Falls keine spezielle E-Mail für den Export angegeben wurde, Standard-Mail-Adresse verwenden
if [ -z "$EMAIL_TO" ]; then
EMAIL_TO="$MAIL_TO"
echo "📧 Keine spezielle E-Mail für Export angegeben, sende Log an Standard-Empfänger: $MAIL_TO"
fi
# Mehrere Empfänger in ein Array umwandeln (Trennung durch Leerzeichen)
IFS=' ' read -ra EMAIL_ADDRESSES <<< "$EMAIL_TO"
# === E-Mail-Versand für jeden Empfänger ===
for EMAIL in "${EMAIL_ADDRESSES[@]}"; do
EMAIL=$(echo "$EMAIL" | xargs) # Entfernt unnötige Leerzeichen
if [ -n "$ATTACHMENT" ] && [ -f "$ATTACHMENT" ]; then
echo "📎 Sende SQL-Export mit Anhang an: $EMAIL"
(
echo "Subject: $SUBJECT"
echo "From: $MAIL_FROM"
echo "To: $EMAIL"
echo "Content-Type: multipart/mixed; boundary=boundary123"
echo "MIME-Version: 1.0"
echo ""
echo "--boundary123"
echo "Content-Type: text/plain; charset=UTF-8"
echo ""
cat "$LOG_FILE"
echo ""
echo "--boundary123"
echo "Content-Type: text/csv; name=$(basename "$ATTACHMENT")"
echo "Content-Disposition: attachment; filename=$(basename "$ATTACHMENT")"
echo "Content-Transfer-Encoding: base64"
echo ""
base64 "$ATTACHMENT"
echo "--boundary123--"
) | sudo msmtp -a default "$EMAIL" 2>/dev/null
else
echo "📧 Sende Log-Datei ohne Anhang an: $EMAIL"
(
echo "Subject: $SUBJECT"
echo "From: $MAIL_FROM"
echo "To: $EMAIL"
echo "Content-Type: text/plain; charset=UTF-8"
echo "MIME-Version: 1.0"
echo ""
cat "$LOG_FILE"
) | msmtp -a default "$EMAIL" 2>/dev/null
fi
done
exit 0
Das ganze Informiert über den Fehler Per Mail und per WhatsApp.
Was haltet ihr davon ?
Ich bin für Verbesserungsvorschläge offen .
Zuletzt bearbeitet: