aboutsummaryrefslogblamecommitdiffstatshomepage
path: root/lets-ca.sh-cron
blob: da75067a0e36daa9178912a1a74eeee3b8098542 (plain) (tree)



























































































































































                                                                                
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
#############

# This script resigns certificates already in use.
# It uses lets-ca.sh to do this.

# by Dennis Eriksen, dennis@eriksen.im, 2015-12-21

#############




################################################################################

# TODO

################################################################################

# Make sure the script doesn't just loop over infinitely many certificates. It
# should probably handle ~5/week. I'm thinking it should take the five oldest,
# that are over one month old.



################################################################################

# Config 

################################################################################

readonly CERTDIR="/etc/letsencrypt/certs"

readonly LETSCASH="/usr/local/sbin/lets-ca.sh"

readonly LOGFILE="/var/log/lets-ca.sh-cron.log"

readonly DEBUG=FALSE

# Time To Expiry - When do we resign certificates?
readonly TTE=5184000 # 60 days.

# How many certs do we take each run?
readonly NUMCERTS=3

TMP=$(mktemp)



################################################################################

# echo

################################################################################

echo() {
  [[ "$DEBUG" == TRUE ]] && builtin echo "$1"
  logger -p cron.info -t lets-ca.sh-cron "$1"
}

error() {
  builtin echo "$1"
  logger -p cron.err -s -t lets-ca.sh-cron "$1"
}



################################################################################

# cleanup

################################################################################

trap cleanup EXIT
trap caughterror INT TERM

cleanup() {
  rm $TMP
}

caughterror() {
  local rv=$?
  cleanup
  error "Script exited early. Something happened."
  exit $rv
}



################################################################################

# main

################################################################################

main() {
  local domain
  local i=0

  for domain in $(ls $CERTDIR); do

    # Don't do more certs than specified
    if [[ $i == $NUMCERTS ]]; then
      echo "\$NUMCERTS reached. $domain will have to wait."
      continue
    fi

    # Check if all the files are there
    if [[ ! -f "$CERTDIR/$domain/$domain.key" ]] || \
       [[ ! -f "$CERTDIR/$domain/$domain.crt" ]] || \
       [[ ! -f "$CERTDIR/$domain/$domain.csr" ]]; then
      error "The CRT, CSR or KEY for $domain seems to be missing."
      # Let's continue the for-loop instead of aborting.
      continue
    fi

    # There's no need to renew certs with more than 60 days of validity left
    if openssl x509 -in $CERTDIR/$domain/$domain.crt -noout -checkend $TTE; then
      echo "$domain is still valid for at least another $(($TTE/60/60/24))days."
      continue
    fi

    # Check if there are any services specified with the cert
    if [[ -f "$CERTDIR/$domain/services" ]] && \
       [[ ! -z "$CERTDIR/$domain/services" ]]; then
      cat $CERTDIR/$domain/services >> $TMP
    fi

    # Do the dirty deed
    echo "Resigning $domain"
    [[ ! "$DEBUG" == TRUE ]] && $LETSCASH -q -s $domain
    echo "Deploying $domain"
    [[ ! "$DEBUG" == TRUE ]] && $LETSCASH -q -d $domain

    # Number of domains handled so far.
    ((i+=1))

  done

  # Reload any services associated with the certificates (if specified)
  if [[ ! -z "$TMP" ]]; then
    for service in $(sort $TMP | uniq); do
      echo "Reloading $service"
      [[ ! "$DEBUG" == TRUE ]] && systemctl reload $service
    done
  fi

}

[[ "$DEBUG" == TRUE ]] && set -x

main

exit 0