diff --git a/tests/scripts/checkcerts.sh b/tests/scripts/checkcerts.sh index 5c3d737e46e9a119f85d789ced39ed676baa084d..72aa9c53bdc02f767a528cbb6bb16ab3e43c2916 100755 --- a/tests/scripts/checkcerts.sh +++ b/tests/scripts/checkcerts.sh @@ -4,6 +4,9 @@ # Returns nonzero on failure. Fails if cert cannot be read or is older than # $SOON (default 30). # +# Hard dependency: OpenSSL OR gnutls +# Recommended: GNU date +# # zzz 2011-08 # kytv 2013-03 # public domain @@ -22,51 +25,72 @@ elif [ $(which certtool) ]; then : ;else exit 1 fi -CHECKCERT() { +# This "grouping hack" is here to prevent errors from being displayed with the +# original Bourne shell (Linux shells don't need the {}s +if { date --help;} >/dev/null 2>&1 ; then + HAVE_GNUDATE=1 +fi + +checkcert() { if [ $OPENSSL ]; then DATA=$(openssl x509 -enddate -noout -in $1| cut -d'=' -f2-) else DATA=$(certtool -i < "$1" | sed -e '/Not\sAfter/!d' -e 's/^.*:\s\(.*\)/\1/') fi # While this isn't strictly needed it'll ensure that the output is consistent, - # regardles of the tool used. - date -u -d "$(echo $DATA)" '+%F %H:%M' + # regardles of the tool used. Dates/times are formatting according to OpenSSL's output + # since this available by default on most systems. + if [ -n "$HAVE_GNUDATE" ]; then + LANG=C date -u -d "$(echo $DATA)" '+%b %d %H:%M:%S %Y GMT' + else + echo $DATA + fi } - -cd `dirname $0`/../../installer/resources/certificates - -NOW=$(date -u '+%s') - -for i in *.crt -do - echo "Checking $i ..." - EXPIRES=`CHECKCERT $i` - if [ -z "$EXPIRES" ]; then - echo "********* FAILED CHECK FOR $i *************" - FAIL=1 - else +compute_dates() { + # Date computations currently depend on GNU date(1). + # If run on a non-Linux system just print the expiration date. + # TODO Cross-platform date calculation support + if [ -n "$HAVE_GNUDATE" ]; then SECS=$(date -u -d "$EXPIRES" '+%s') DAYS="$(expr \( $SECS - $NOW \) / 86400)" if [ $DAYS -ge $SOON ]; then echo "Expires in $DAYS days ($EXPIRES)" - elif [ $DAYS -le $SOON ] && [ $DAYS -gt 0 ]; then - echo "****** Check for $i failed, expires in $DAYS days (<= ${SOON}d) ($EXPIRES) ******" - FAIL=1 - elif [ $DAYS -le $WARN ] && [ $DAYS -ge $SOON ]; then - echo "****** WARNING: $i expires in $DAYS days (<= ${WANT}d) ($EXPIRES) ******" elif [ $DAYS -eq 1 ]; then DAYS=$(echo $DAYS | sed 's/^-//') - echo "****** Check for $I failed, expires in $DAYS day ($EXPIRES) ******" + echo "****** Check for $I failed, expires tomorrow ($EXPIRES) ******" FAIL=1 elif [ $DAYS -eq 0 ]; then echo "****** Check for $i failed, expires today ($EXPIRES) ******" FAIL=1 - elif [ $DAYS -le 0 ]; then + elif [ $DAYS -le $SOON ] && [ $DAYS -gt 0 ]; then + echo "****** Check for $i failed, expires in $DAYS days (<= ${SOON}d) ($EXPIRES) ******" + FAIL=1 + elif [ $DAYS -lt $WARN ] && [ $DAYS -gt $SOON ]; then + echo "****** WARNING: $i expires in $DAYS days (<= ${WANT}d) ($EXPIRES) ******" + elif [ $DAYS -lt 0 ]; then DAYS=$(echo $DAYS | sed 's/^-//') echo "****** Check for $i failed, expired $DAYS days ago ($EXPIRES) ******" FAIL=1 fi + else + echo $EXPIRES + fi +} + +cd `dirname $0`/../../installer/resources/certificates + +NOW=$(date -u '+%s') + +for i in *.crt +do + echo "Checking $i ..." + EXPIRES=`checkcert $i` + if [ -z "$EXPIRES" ]; then + echo "********* FAILED CHECK FOR $i *************" + FAIL=1 + else + compute_dates fi done