#!/usr/bin/env bash

EMAIL_TO="empfänger@adresse.tld"
EMAIL_FROM="absender@adresse.tld"

#Ablaufdatum in Tagen
EXPIRE=25

LOG_FILE="/var/log/plesk_ssl_check.log"

CONF_PATHS=$(find /etc/apache2/plesk.conf.d/vhosts/ /etc/httpd/conf/plesk.conf.d/vhosts/ 2>/dev/null -name "*.conf")

[ -z "$CONF_PATHS" ] && echo "$(date) - Keine Vhost-Konfigurationen gefunden.">> "$LOG_FILE" && exit 1

TMPFILE=$(mktemp)
ALERT=0

# Zertifikatdaten sammeln
for conf in $CONF_PATHS; do
  DOMAIN=$(basename "$conf" .conf)
  CERT_PATH=$(grep -i 'SSLCertificateFile' "$conf" | awk '{print $2}' | head -n1)

  [ -z "$CERT_PATH" ] && continue

  if [ ! -f "$CERT_PATH" ]; then
    echo "$DOMAIN|$CERT_PATH|Datei nicht gefunden!|***|0">> "$TMPFILE"
    ALERT=1
    continue
  fi

  END_DATE_RAW=$(openssl x509 -in "$CERT_PATH" -noout -enddate 2>/dev/null)
  END_DATE=$(echo "$END_DATE_RAW" | cut -d= -f2)

  if [ -n "$END_DATE" ]; then
    EXP_TS=$(date -d "$END_DATE" +%s 2>/dev/null)
    NOW_TS=$(date +%s)
    DIFF_DAYS=$(( (EXP_TS - NOW_TS) / 86400 ))
  else
    END_DATE="Unbekannt"
    EXP_TS=0
    DIFF_DAYS=999
  fi

  MARKER=""
  if [ "$EXP_TS" -eq 0 ] || [ "$DIFF_DAYS" -le $EXPIRE ]; then
    MARKER="***"
    ALERT=1
  fi
  CERT_FILE=$(basename "$CERT_PATH")
  echo "$DOMAIN|$CERT_FILE|$END_DATE|$MARKER|$EXP_TS">> "$TMPFILE"
done

TMPFILE_SORTED=$(mktemp)

{
  echo "SSL-Zertifikatsreport für $(date)"
  echo
  printf "%-25s %-25s %-25s %-15s %-5s\n" "Domain" "Zertifikat-Datei" "Ablaufdatum" "Verbleibend" "Hinweis"
  echo "----------------------------------------------------------------------------------------------------------------------------"

  sort -t'|' -k5,5n "$TMPFILE" | while IFS='|' read -r DOMAIN CERT_PATH END_DATE MARKER EXP_TS; do

   if [ "$EXP_TS" -eq 0 ]; then
      DATE_PART="$END_DATE"
      AGE_PART=""
    else
      NOW=$(date +%s)
      DIFF_DAYS=$(( (EXP_TS - NOW) / 86400 ))
      DATE_PART="$END_DATE"
      AGE_PART="in $DIFF_DAYS Tagen"
    fi

    printf "%-25s %-25s %-25s %-15s %-5s\n" "$DOMAIN" "$CERT_PATH" "$DATE_PART" "$AGE_PART" "$MARKER"

  done

  printf "\n\n\n"

}> "$TMPFILE_SORTED"

# Report in Variable lesen
REPORT=$(cat "$TMPFILE_SORTED")

# In Log schreiben
echo -e "$REPORT">> "$LOG_FILE"

# Mail senden, wenn nötig
if [ "$ALERT" -eq 1 ]; then
  # HTML-Mail aufbauen
  MAIL_HTML="<html><body>"
  MAIL_HTML+="<h2>ACHTUNG: Plesk SSL-Zertifikate laufen bald ab!</h2>"
  MAIL_HTML+="<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse;'>"
  MAIL_HTML+="<tr><th>Domain</th><th>Zertifikat-Datei</th><th>Ablaufdatum</th><th>Restzeit</th></tr>"

  # Zeilen aus temporärer Datei auslesen
while IFS='|' read -r DOMAIN CERT_PATH END_DATE MARKER EXP_TS; do
  # Wenn Marker *** (bald ablaufend), dann rot färben
  if [ "$MARKER" = "***" ]; then
    ROW_COLOR=" style='background-color:#ffcccc;'"  # Hellrot
  else
    ROW_COLOR=""
  fi

  if [ "$EXP_TS" -eq 0 ]; then
    AGE_PART=""
  else
    NOW_TS=$(date +%s)
    DIFF_DAYS=$(( (EXP_TS - NOW_TS) / 86400 ))
    AGE_PART="$DIFF_DAYS Tage"

  fi

  MAIL_HTML+="<tr$ROW_COLOR><td>$DOMAIN</td><td>$CERT_PATH</td><td>$END_DATE</td><td>$AGE_PART</td></tr>"
done <"$TMPFILE"

  MAIL_HTML+="</table></body></html>"

  /usr/sbin/sendmail -f $EMAIL_FROM $EMAIL_TO <<EOF
Subject: ACHTUNG: Plesk SSL-Zertifikate laufen bald ab!
From: $EMAIL_FROM
To: $EMAIL_TO
MIME-Version: 1.0
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: 8bit

$MAIL_HTML
EOF
fi

# Aufräumen
rm -f "$TMPFILE" "$TMPFILE_SORTED"

Logrotate einrichten:

nano /etc/logrotate.d/plesk_ssl_check
/var/log/plesk_ssl_check.log {
    monthly
    rotate 4
    compress
    missingok
    notifempty
    create 640 root adm
    su root root
    postrotate
    endscript
}

Logrotate testen:

 logrotate --force /etc/logrotate.d/plesk_ssl_check