|
|
@@ -36,6 +36,14 @@
|
|
|
# Note: This functionality requires HAProxy was compiled against
|
|
|
# a version of OpenSSL that supports this.
|
|
|
#
|
|
|
+# export DEPLOY_HAPROXY_HOT_UPDATE="yes"
|
|
|
+# export DEPLOY_HAPROXY_STATS_SOCKET="UNIX:/run/haproxy/admin.sock"
|
|
|
+#
|
|
|
+# OPTIONAL: Deploy the certificate over the HAProxy stats socket without
|
|
|
+# needing to reload HAProxy. Default is "no".
|
|
|
+#
|
|
|
+# Require the socat binary. DEPLOY_HAPROXY_STATS_SOCKET variable uses the socat
|
|
|
+# address format.
|
|
|
|
|
|
######## Public functions #####################
|
|
|
|
|
|
@@ -53,6 +61,8 @@ haproxy_deploy() {
|
|
|
DEPLOY_HAPROXY_BUNDLE_DEFAULT="no"
|
|
|
DEPLOY_HAPROXY_ISSUER_DEFAULT="no"
|
|
|
DEPLOY_HAPROXY_RELOAD_DEFAULT="true"
|
|
|
+ DEPLOY_HAPROXY_HOT_UPDATE_DEFAULT="no"
|
|
|
+ DEPLOY_HAPROXY_STATS_SOCKET_DEFAULT="UNIX:/run/haproxy/admin.sock"
|
|
|
|
|
|
_debug _cdomain "${_cdomain}"
|
|
|
_debug _ckey "${_ckey}"
|
|
|
@@ -118,6 +128,26 @@ haproxy_deploy() {
|
|
|
Le_Deploy_haproxy_reload="${DEPLOY_HAPROXY_RELOAD_DEFAULT}"
|
|
|
fi
|
|
|
|
|
|
+ # HOT_UPDATE is optional. If not provided then assume "${DEPLOY_HAPROXY_HOT_UPDATE_DEFAULT}"
|
|
|
+ _getdeployconf DEPLOY_HAPROXY_HOT_UPDATE
|
|
|
+ _debug2 DEPLOY_HAPROXY_HOT_UPDATE "${DEPLOY_HAPROXY_HOT_UPDATE}"
|
|
|
+ if [ -n "${DEPLOY_HAPROXY_HOT_UPDATE}" ]; then
|
|
|
+ Le_Deploy_haproxy_hot_update="${DEPLOY_HAPROXY_HOT_UPDATE}"
|
|
|
+ _savedomainconf Le_Deploy_haproxy_hot_update "${Le_Deploy_haproxy_hot_update}"
|
|
|
+ elif [ -z "${Le_Deploy_haproxy_hot_update}" ]; then
|
|
|
+ Le_Deploy_haproxy_hot_update="${DEPLOY_HAPROXY_HOT_UPDATE_DEFAULT}"
|
|
|
+ fi
|
|
|
+
|
|
|
+ # STATS_SOCKET is optional. If not provided then assume "${DEPLOY_HAPROXY_STATS_SOCKET_DEFAULT}"
|
|
|
+ _getdeployconf DEPLOY_HAPROXY_STATS_SOCKET
|
|
|
+ _debug2 DEPLOY_HAPROXY_STATS_SOCKET "${DEPLOY_HAPROXY_STATS_SOCKET}"
|
|
|
+ if [ -n "${DEPLOY_HAPROXY_STATS_SOCKET}" ]; then
|
|
|
+ Le_Deploy_haproxy_stats_socket="${DEPLOY_HAPROXY_STATS_SOCKET}"
|
|
|
+ _savedomainconf Le_Deploy_haproxy_stats_socket "${Le_Deploy_haproxy_stats_socket}"
|
|
|
+ elif [ -z "${Le_Deploy_haproxy_stats_socket}" ]; then
|
|
|
+ Le_Deploy_haproxy_stats_socket="${DEPLOY_HAPROXY_STATS_SOCKET_DEFAULT}"
|
|
|
+ fi
|
|
|
+
|
|
|
# Set the suffix depending if we are creating a bundle or not
|
|
|
if [ "${Le_Deploy_haproxy_bundle}" = "yes" ]; then
|
|
|
_info "Bundle creation requested"
|
|
|
@@ -142,6 +172,7 @@ haproxy_deploy() {
|
|
|
_issuer="${_pem}.issuer"
|
|
|
_ocsp="${_pem}.ocsp"
|
|
|
_reload="${Le_Deploy_haproxy_reload}"
|
|
|
+ _statssock="${Le_Deploy_haproxy_stats_socket}"
|
|
|
|
|
|
_info "Deploying PEM file"
|
|
|
# Create a temporary PEM file
|
|
|
@@ -265,15 +296,48 @@ haproxy_deploy() {
|
|
|
fi
|
|
|
fi
|
|
|
|
|
|
- # Reload HAProxy
|
|
|
- _debug _reload "${_reload}"
|
|
|
- eval "${_reload}"
|
|
|
- _ret=$?
|
|
|
- if [ "${_ret}" != "0" ]; then
|
|
|
- _err "Error code ${_ret} during reload"
|
|
|
- return ${_ret}
|
|
|
+ if [ "${Le_Deploy_haproxy_hot_update}" = "yes" ]; then
|
|
|
+ # Update certificate over HAProxy stats socket.
|
|
|
+ _info "Update the certificate over HAProxy stats socket."
|
|
|
+ if _exists socat; then
|
|
|
+ _socat_cert_cmd="echo 'show ssl cert' | socat '${_statssock}' - | grep -q '^${_pem}$'"
|
|
|
+ _debug _socat_cert_cmd "${_socat_cert_cmd}"
|
|
|
+ eval "${_socat_cert_cmd}"
|
|
|
+ _ret=$?
|
|
|
+ if [ "${_ret}" != "0" ]; then
|
|
|
+ _err "Couldn't find '${_pem}' in haproxy 'show ssl cert'"
|
|
|
+ return "${_ret}"
|
|
|
+ fi
|
|
|
+ _socat_cert_set_cmd="echo -e 'set ssl cert ${_pem} <<\n$(cat "${_pem}")\n' | socat '${_statssock}' - | grep -q 'Transaction created'"
|
|
|
+ _debug _socat_cert_set_cmd "${_socat_cert_set_cmd}"
|
|
|
+ eval "${_socat_cert_set_cmd}"
|
|
|
+ _ret=$?
|
|
|
+ if [ "${_ret}" != "0" ]; then
|
|
|
+ _err "Can't update '${_pem}' in haproxy"
|
|
|
+ return "${_ret}"
|
|
|
+ fi
|
|
|
+ _socat_cert_commit_cmd="echo 'commit ssl cert ${_pem}' | socat '${_statssock}' - | grep -q '^Success!$'"
|
|
|
+ _debug _socat_cert_commit_cmd "${_socat_cert_commit_cmd}"
|
|
|
+ eval "${_socat_cert_commit_cmd}"
|
|
|
+ _ret=$?
|
|
|
+ if [ "${_ret}" != "0" ]; then
|
|
|
+ _err "Can't commit '${_pem}' in haproxy"
|
|
|
+ return ${_ret}
|
|
|
+ fi
|
|
|
+ else
|
|
|
+ _err "'socat' is not available, couldn't update over stats socket"
|
|
|
+ fi
|
|
|
else
|
|
|
- _info "Reload successful"
|
|
|
+ # Reload HAProxy
|
|
|
+ _debug _reload "${_reload}"
|
|
|
+ eval "${_reload}"
|
|
|
+ _ret=$?
|
|
|
+ if [ "${_ret}" != "0" ]; then
|
|
|
+ _err "Error code ${_ret} during reload"
|
|
|
+ return ${_ret}
|
|
|
+ else
|
|
|
+ _info "Reload successful"
|
|
|
+ fi
|
|
|
fi
|
|
|
|
|
|
return 0
|