2626if ! TXT_PREFIX=$( sanitize_dns_label " $TXT_PREFIX " ) ; then
2727 exit 1
2828fi
29+ if ! MAXCONN=$( sanitize_positive_integer " $MAXCONN " " MAXCONN" ) ; then
30+ exit 1
31+ fi
32+ if ! TIMEOUT_CONNECT=$( sanitize_haproxy_timeout " $TIMEOUT_CONNECT " " TIMEOUT_CONNECT" ) ; then
33+ exit 1
34+ fi
35+ if ! TIMEOUT_CLIENT=$( sanitize_haproxy_timeout " $TIMEOUT_CLIENT " " TIMEOUT_CLIENT" ) ; then
36+ exit 1
37+ fi
38+ if ! TIMEOUT_SERVER=$( sanitize_haproxy_timeout " $TIMEOUT_SERVER " " TIMEOUT_SERVER" ) ; then
39+ exit 1
40+ fi
41+ if ! EVIDENCE_PORT=$( sanitize_positive_integer " $EVIDENCE_PORT " " EVIDENCE_PORT" ) ; then
42+ exit 1
43+ fi
2944
3045# Warn about deprecated L7 env vars
3146for var in CLIENT_MAX_BODY_SIZE PROXY_READ_TIMEOUT PROXY_SEND_TIMEOUT PROXY_CONNECT_TIMEOUT; do
@@ -87,11 +102,11 @@ setup_certbot_env() {
87102
88103setup_py_env
89104
90- # Generate haproxy.cfg for single-domain mode (DOMAIN + TARGET_ENDPOINT)
91- setup_haproxy_cfg () {
92- local target_hostport
93- target_hostport= $( parse_target_endpoint " $TARGET_ENDPOINT " )
94-
105+ # Emit common haproxy global/defaults/frontend preamble.
106+ # Both single-domain and multi-domain modes share this identical config.
107+ emit_haproxy_preamble () {
108+ # "crt <dir>" loads all PEM files from the directory.
109+ # ALPN is appended conditionally via ${ALPN:+ alpn ${ALPN}}.
95110 cat << EOF >/etc/haproxy/haproxy.cfg
96111global
97112 log stdout format raw local0
@@ -125,15 +140,10 @@ EOF
125140 use_backend be_evidence if is_evidence
126141EVIDENCE_BLOCK
127142 fi
143+ }
128144
129- cat << EOF >>/etc/haproxy/haproxy.cfg
130-
131- default_backend be_upstream
132-
133- backend be_upstream
134- server app1 ${target_hostport}
135- EOF
136-
145+ # Append the evidence backend block to haproxy.cfg
146+ emit_evidence_backend () {
137147 if [ " $EVIDENCE_SERVER " = " true" ]; then
138148 cat << EOF >>/etc/haproxy/haproxy.cfg
139149
@@ -145,41 +155,27 @@ EOF
145155 fi
146156}
147157
148- # Generate haproxy.cfg for multi-domain mode (ROUTING_MAP)
149- setup_haproxy_cfg_multi () {
150- cat << EOF >/etc/haproxy/haproxy.cfg
151- global
152- log stdout format raw local0
153- maxconn ${MAXCONN}
154- pidfile /var/run/haproxy/haproxy.pid
155- ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305
156- ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
157- ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
158- ssl-default-bind-curves secp384r1
158+ # Generate haproxy.cfg for single-domain mode (DOMAIN + TARGET_ENDPOINT)
159+ setup_haproxy_cfg () {
160+ local target_hostport
161+ target_hostport=$( parse_target_endpoint " $TARGET_ENDPOINT " )
159162
160- defaults
161- log global
162- mode tcp
163- option tcplog
164- timeout connect ${TIMEOUT_CONNECT}
165- timeout client ${TIMEOUT_CLIENT}
166- timeout server ${TIMEOUT_SERVER}
163+ emit_haproxy_preamble
167164
168- frontend tls_in
169- bind :${PORT} ssl crt /etc/haproxy/certs/${ALPN: + alpn ${ALPN} }
165+ cat << EOF >>/etc/haproxy/haproxy.cfg
166+
167+ default_backend be_upstream
168+
169+ backend be_upstream
170+ server app1 ${target_hostport}
170171EOF
171172
172- if [ " $EVIDENCE_SERVER " = " true " ] ; then
173- cat << ' EVIDENCE_BLOCK ' >>/etc/haproxy/haproxy.cfg
173+ emit_evidence_backend
174+ }
174175
175- # Route /evidences requests to local evidence HTTP server
176- tcp-request inspect-delay 5s
177- tcp-request content accept if WAIT_END
178- acl is_evidence payload(0,0) -m beg "GET /evidences"
179- acl is_evidence payload(0,0) -m beg "HEAD /evidences"
180- use_backend be_evidence if is_evidence
181- EVIDENCE_BLOCK
182- fi
176+ # Generate haproxy.cfg for multi-domain mode (ROUTING_MAP)
177+ setup_haproxy_cfg_multi () {
178+ emit_haproxy_preamble
183179
184180 # Parse ROUTING_MAP and generate use_backend rules + backend sections
185181 # Support both newline-separated and comma-separated formats
@@ -189,12 +185,13 @@ EVIDENCE_BLOCK
189185 local backend_rules=" "
190186 local backend_sections=" "
191187 local first_be_name=" "
188+ local domain target be_name
192189
193190 while IFS= read -r line; do
194191 [[ -n " $line " ]] || continue
195192 [[ " $line " == \# * ]] && continue
196- local domain=" ${line%% =* } "
197- local target=" ${line#* =} "
193+ domain=" ${line%% =* } "
194+ target=" ${line#* =} "
198195 domain=$( echo " $domain " | sed ' s/^[[:space:]]*//;s/[[:space:]]*$//' )
199196 target=$( echo " $target " | sed ' s/^[[:space:]]*//;s/[[:space:]]*$//' )
200197 [[ -n " $domain " && -n " $target " ]] || continue
@@ -203,7 +200,7 @@ EVIDENCE_BLOCK
203200 target=$( parse_target_endpoint " $target " )
204201
205202 # Generate safe backend name from domain
206- local be_name=" be_$( echo " $domain " | sed ' s/[^A-Za-z0-9]/_/g' ) "
203+ be_name=" be_$( echo " $domain " | sed ' s/[^A-Za-z0-9]/_/g' ) "
207204
208205 if [ -z " $first_be_name " ]; then
209206 first_be_name=" $be_name "
@@ -227,15 +224,7 @@ backend ${be_name}
227224
228225 echo " $backend_sections " >> /etc/haproxy/haproxy.cfg
229226
230- if [ " $EVIDENCE_SERVER " = " true" ]; then
231- cat << EOF >>/etc/haproxy/haproxy.cfg
232-
233- backend be_evidence
234- mode http
235- http-request replace-path /evidences(.*) \1
236- server evidence 127.0.0.1:${EVIDENCE_PORT}
237- EOF
238- fi
227+ emit_evidence_backend
239228}
240229
241230set_alias_record () {
0 commit comments