You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
hestiacp/bin/v-update-letsencrypt-ssl

176 lines
5.4 KiB

#!/bin/bash
# info: update letsencrypt ssl certificates
# options: NONE
#
# example: v-update-letsencrypt-ssl
#
# This function for renew letsencrypt expired ssl certificate for all users
#----------------------------------------------------------#
# Variables & Functions #
#----------------------------------------------------------#
# Includes
# shellcheck source=/etc/hestiacp/hestia.conf
source /etc/hestiacp/hestia.conf
# shellcheck source=/usr/local/hestia/func/main.sh
source $HESTIA/func/main.sh
# shellcheck source=/usr/local/hestia/func/syshealth.sh
source $HESTIA/func/syshealth.sh
# load config file
source_conf "$HESTIA/conf/hestia.conf"
# Perform verification if read-only mode is enabled
check_hestia_demo_mode
#----------------------------------------------------------#
# Action #
#----------------------------------------------------------#
# Set LE counter
lecounter=0
max_LE_failures=30
days_valid_setting=31
if [ "$LE_STAGING" = "yes" ]; then
# Overwrite setting to allow testing for renewal to be done easier
days_valid_setting=181
fi
# Checking user certificates
for user in $($BIN/v-list-sys-users plain); do
USER_DATA=$HESTIA/data/users/$user
for domain in $(search_objects 'web' 'LETSENCRYPT' 'yes' 'DOMAIN'); do
# Clear any keys related to web domains
sanitize_config_file "web"
domain_suspended="$(get_object_value 'web' 'DOMAIN' "$domain" '$SUSPENDED')"
if [ "$domain_suspended" = "yes" ]; then
continue
fi
fail_counter="$(get_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT_FAIL_COUNT')"
if [[ "$fail_counter" -gt "$max_LE_failures" ]]; then
continue
fi
crt_data=$(openssl x509 -text -in $USER_DATA/ssl/$domain.crt)
not_after=$(echo "$crt_data" | grep "Not After" | cut -f 2,3,4 -d :)
expiration=$(date -d "$not_after" +%s)
now=$(date +%s)
seconds_valid=$((expiration - now))
days_valid=$((seconds_valid / 86400))
if [[ "$days_valid" -lt "$days_valid_setting" ]]; then
if [ $lecounter -gt 0 ]; then
sleep 10
fi
((lecounter++))
aliases=$(echo "$crt_data" | grep DNS:)
aliases=$(echo "$aliases" | sed -e "s/DNS://g" -e "s/,//g")
aliases=$(echo "$aliases" | tr ' ' '\n' | sed "/^$/d")
aliases=$(echo "$aliases" | egrep -v "^$domain,?$")
aliases=$(echo "$aliases" | sed -e ':a;N;$!ba;s/\n/,/g')
# Parsing domain
parse_object_kv_list $(grep "DOMAIN='$domain'" $USER_DATA/web.conf)
# Split aliases into array
IFS=',' read -r -a ALIASES <<< "$ALIAS"
# Unset f_aliases
f_aliases=''
# Loop through all crt aliases
for alias in ${aliases//,/ }; do
# Validate if the alias still exists in web.conf
if [[ ",$ALIAS," =~ ,$alias, ]]; then
f_aliases+="$alias,"
fi
done
# Remove leading comma
if [[ ${f_aliases: -1} = ',' ]]; then f_aliases=${f_aliases::-1}; fi
# Write the filtered alias list to the default var
aliases=$f_aliases
msg=$($BIN/v-add-letsencrypt-domain "$user" "$domain" "$aliases")
if [ $? -ne 0 ]; then
echo "$msg"
log_event "$E_INVALID" "$domain $msg"
$BIN/v-log-action "$user" "Error" "Web" "Let's Encrypt SSL certificate update failed (Domain: $domain)."
if [ -z "$fail_counter" ]; then
add_object_key "web" 'DOMAIN' "$domain" 'LETSENCRYPT_FAIL_COUNT' 'LETSENCRYPT'
fi
((fail_counter++))
update_object_value 'web' 'DOMAIN' "$domain" '$LETSENCRYPT_FAIL_COUNT' "$fail_counter"
else
$BIN/v-log-action "$user" "Info" "Web" "Let's Encrypt SSL certificate renewed (Domain: $domain)."
fi
if [ -n "$UPDATE_HOSTNAME_SSL" ] && [ "$UPDATE_HOSTNAME_SSL" = "yes" ]; then
hostname=$(hostname -f)
if [ "$hostname" = "$domain" ]; then
$BIN/v-update-host-certificate "$user" "$domain"
fi
fi
fi
done
for domain in $(search_objects 'mail' 'LETSENCRYPT' 'yes' 'DOMAIN'); do
domain_suspended="$(get_object_value 'mail' 'DOMAIN' "$domain" '$SUSPENDED')"
if [ "$domain_suspended" = "yes" ]; then
continue
fi
fail_counter="$(get_object_value 'mail' 'DOMAIN' "$domain" '$LETSENCRYPT_FAIL_COUNT')"
if [[ "$fail_counter" -gt "$max_LE_failures" ]]; then
continue
fi
crt_data=$(openssl x509 -text -in $USER_DATA/ssl/mail.$domain.crt)
not_after=$(echo "$crt_data" | grep "Not After" | cut -f 2,3,4 -d :)
expiration=$(date -d "$not_after" +%s)
now=$(date +%s)
seconds_valid=$((expiration - now))
days_valid=$((seconds_valid / 86400))
if [[ "$days_valid" -lt 31 ]]; then
if [ $lecounter -gt 0 ]; then
sleep 10
fi
((lecounter++))
msg=$($BIN/v-add-letsencrypt-domain "$user" "$domain" "" "yes")
if [ $? -ne 0 ]; then
echo "$msg"
$BIN/v-log-action "$user" "Error" "Web" "Let's Encrypt SSL certificate update failed (Domain: $domain)."
log_event "$E_INVALID" "$domain $msg"
if [ -z "$fail_counter" ]; then
add_object_key "mail" 'DOMAIN' "$domain" 'LETSENCRYPT_FAIL_COUNT' 'LETSENCRYPT'
fi
((fail_counter++))
update_object_value 'mail' 'DOMAIN' "$domain" '$LETSENCRYPT_FAIL_COUNT' "$fail_counter"
else
$BIN/v-log-action "$user" "Info" "Web" "Let's Encrypt SSL certificate renewed (Domain: $domain)."
fi
fi
done
done
# Restart related services
$BIN/v-restart-web
$BIN/v-restart-mail
if [ -n "$PROXY_SYSTEM" ]; then
$BIN/v-restart-proxy
fi
#----------------------------------------------------------#
# Hestia #
#----------------------------------------------------------#
log_event "$OK" "$EVENT"
exit