#!/bin/bash
#
#Beschreibung: durchsucht den gpg-Schlüsselring nach Schlüsseln, die demnächst
#verfallen oder bereits verfallen sind
#Liegt das Verfallsdatum länger als 90 Tage zurück, wird der Schlüssel gelöscht 
#
#benötigt: /usr/bin/gpg
#
#Aufruf: keylist.sh
#
#Hinweise und Fehler an tuxator@tuxator.de 
#
#Status: ok
#################################################################################
#Variablen
typeset -i days
typeset -i decay_days=14	#Schlüssel verfällt in x Tagen
typeset -i delete_days=90	#Schlüssel ist seit x Tagen verfallen
keyfile="/home/$(whoami)/.gnupg/pubring.gpg"
homedir="/home/$(whoami)/.gnupg"
retval=0
#Voraussetzungen
if [[ ! -e /usr/bin/gpg ]] || [[ ! -e ${keyfile} ]]; then
	retval=1
fi
if [[ ${retval} == 0 ]]; then
	#Liste der schon verfallenen Schlüssel holen
	for decays in $(gpg --homedir ${homedir} --list-keys | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfallen|expired): [0-9]{4}-[0-9]{2}-[0-9]{2}\]" | awk '{print $5}' | sed 's/]//g')
	do
		#Schlüssel-IDs holen
		for keyid in $(gpg --homedir ${homedir} --list-keys | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfallen|expired): ${decays}\]" | awk '{print $2}' | awk -F/ '{print $2}')
		do
			#versuche Schlüssel erneut vom Server zu laden
			gpg -q --homedir ${homedir} --recv-keys ${keyid}
			if [[ $(gpg --homedir ${homedir} --list-keys ${keyid} | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfallen|expired): ${decays}\]") ]]; then
				#no
				#Wieviele Tage ist der Schlüssel abgelaufen?
				#Ablaufdatum in Sekunden seit 01.01.1970 minus Jetzt in Sekunden seit 01.01.1970 geteilt durch 60*60*24
				days=($(date -d "${decays}" +%s)-$(date +%s))/86400*-1
				#Liegt Verfallsdatum außerhalb der Zeitspanne von delete_days?
				if (( ${days} > ${delete_days} )); then
					#yes
					echo "####################################################################"
					echo "Schlüssel ${keyid} ist seit ${days} Tagen abgelaufen und wird gelöscht."
					#Schlüssel löschen
					gpg --batch --yes -q --homedir ${homedir} --delete-key ${keyid}
					echo "####################################################################"
				fi
			fi
		done
	done
###################################################################################################################
	#Liste der zurückgezogenen Schlüssel holen
	for keyid in $(gpg --homedir ${homedir} --list-keys | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(widerrufen|revoked): [0-9]{4}-[0-9]{2}-[0-9]{2}\]" | awk '{print $2}' | awk -F/ '{print $2}')
	do
		echo "####################################################################"
		echo "Schlüssel ${keyid} wurde widerrufen und wird gelöscht."
		#Schlüssel löschen
		gpg --batch --yes -q --homedir ${homedir} --delete-key ${keyid}
		echo "####################################################################"
	done
###################################################################################################################
	#Liste der demnächst verfallenen Schlüssel holen
	for decays in $(gpg --homedir ${homedir} --list-keys | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfällt|expires): [0-9]{4}-[0-9]{2}-[0-9]{2}\]" | awk '{print $5}' | sed 's/]//g')
	do
		#in wieviel Tagen läuft der Schlüssel ab?
		#Ablaufdatum in Sekunden seit 01.01.1970 minus Jetzt in Sekunden seit 01.01.1970 geteilt durch 60*60*24
		days=($(date -d "${decays}" +%s)-$(date +%s))/86400
		#Liegt Verfallsdatum innerhalb der Zeitspanne von decay_days?
		if (( ${days} <= ${decay_days} )); then
			#Schlüssel-ID holen
			for keyid in $(gpg --homedir ${homedir} --list-keys | grep -E "^pub[[:space:]]+.{5}/.{8} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfällt|expires): ${decays}\]" | awk '{print $2}' | awk -F/ '{print $2}')
			do
				#Mailadresse holen
				mailaddi=$(gpg --homedir ${homedir} --list-keys | grep -A 1 -E "^pub[[:space:]]+.{5}/${keyid} [0-9]{4}-[0-9]{2}-[0-9]{2} \[(verfällt|expires): ${decays}\]" | awk '{print $NF}' | sed -e "s/${decays}//" -e 's/]//g' -e 's/<//g' -e 's/>//g')
				#gib Schlüssel-ID, Mailadresse und Verfalssdatum aus
				echo "####################################################################"
				echo "Schlüssel ${keyid} von ${mailaddi} verfällt am ${decays} in ${days} Tagen."
				echo "####################################################################"
			done
		fi
	done
fi
exit ${retval}