#!/bin/bash
# Kategorie: portal
# Serverzertifikate verifizieren und Ablaufdatum ermitteln
# (C) 2015 Stefan Schäfer - invis-server.org

# License: GPLv3
# Dieses Programm ist freie Software. Sie können es unter den Bedingungen der 
# GNU General Public License, wie von der Free Software Foundation veröffentlicht,
# weitergeben und/oder modifizieren, entweder gemäß Version 3 der Lizenz oder
# (nach Ihrer Option) jeder späteren Version.

# Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen
# von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite 
# Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. 
# Details finden Sie in der GNU General Public License.

# Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem 
# Programm erhalten haben. Falls nicht, siehe <http://www.gnu.org/licenses/>. 

## Variablen
# Ergebnisverzeichnis
resultdir="/var/spool/results/certs"
# Zertifikate
cacert="/etc/invis/certs/ca.crt"
certs=("/etc/invis/certs/ca.crt" "/etc/invis/certs/ldap-cert.pem" "/etc/invis/certs/mail-cert.pem" "/etc/apache2/ssl.crt/invis-server.crt")

diffdays() {
	datenowseconds=`date "+%s"`
	dateseconds=`date -d "$1" "+%s"`
	(( diffseconds=$dateseconds - $datenowseconds ))
	(( diffdays=$diffseconds / 86400 ))
	echo $diffdays
}

# Ergebnisverzeichnis anlegen, wenn nicht vorhanden
if [[ ! -d $resultdir ]]; then
    mkdir -p $resultdir
fi

# Letzte Ergebnisdatei loeschen, wenn vorhanden
if [[ -f $resultdir/certstatus ]]; then
    rm $resultdir/certstatus
fi

# Letzte Alarmdatei loeschen, wenn vorhanden
if [[ -f $resultdir/alarm ]]; then
    rm $resultdir/alarm
fi

for cert in ${certs[*]}; do
	unformeddate=`openssl x509 -noout -text -in $cert |grep "Not After"|cut -d ":" -f2-`
	daysleft=`diffdays "$unformeddate"`
	datum=`date -d "$unformeddate" "+%d.%m.%Y"`
	verify=`openssl verify -CAfile $cacert $cert`
	certpath=`echo $verify| tr -d " " |cut -d ":" -f 1`
	certname=`basename $certpath`
	certstate=`echo $verify| tr -d " " |cut -d ":" -f 2`
	if [[ `echo $certname | grep "^ca"` ]]; then
	    certtype="Stammzertifikat"
	fi
	if [[ `echo $certname | grep "^ldap"` ]]; then
	    certtype="LDAP-Server"
	fi
	if [[ `echo $certname | grep "^mail"` ]]; then
	    certtype="Mail-Server"
	fi
	if [[ `echo $certname | grep "^invis"` ]]; then
	    certtype="Web- &amp; VPN-Server"
	fi
	echo "$certtype:$datum:$certstate" >> $resultdir/certstatus
	if (( $daysleft <= 7 )); then
	    echo "Das $certtype Zertifikat läuft am $datum aus. Bitte erneuern!" >> $resultdir/alarm
	fi
done

# Bei Bedarf Alarm per email versenden
if [[ -f $resultdir/alarm ]]; then
	emergmailer $resultdir
fi
