]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: config: support default values for environment variables
authorWilly Tarreau <w@1wt.eu>
Thu, 18 Nov 2021 16:42:50 +0000 (17:42 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 18 Nov 2021 16:54:49 +0000 (17:54 +0100)
Sometimes it is really useful to be able to specify a default value for
an optional environment variable, like the ${name-value} construct in
shell. In fact we're really missing this for a number of settings in
reg tests, starting with timeouts.

This commit simply adds support for the common syntax above. Other
common forms like '+' to replace existing variables, or ':-' and ':+'
to act on empty variables, were not implemented at this stage, as they
are less commonly needed.

doc/configuration.txt
src/tools.c

index 4f306d73be1e312e9f2d6ad7e425700c26fc0f6d..f597a8c6057bb117124d3803911110998bc382e1 100644 (file)
@@ -727,13 +727,16 @@ shell. Variable names can contain alphanumerical characters or the character
 underscore ("_") but should not start with a digit. If the variable contains a
 list of several values separated by spaces, it can be expanded as individual
 arguments by enclosing the variable with braces and appending the suffix '[*]'
-before the closing brace.
+before the closing brace. It is also possible to specify a default value to
+use when the variable is not set, by appending that value after a dash '-'
+next to the variable name. Note that the default value only replaces non
+existing variables, not empty ones.
 
   Example:
 
       bind "fd@${FD_APP1}"
 
-      log "${LOCAL_SYSLOG}:514" local0 notice   # send to local server
+      log "${LOCAL_SYSLOG-127.0.0.1}:514" local0 notice  # send to local server
 
       user "$HAPROXY_USER"
 
index 8fc67163a9e6dd95fe54eb124de474aee38a07c3..5d8483d4e31b8494e3b849219b3f0d6c69afd1b3 100644 (file)
@@ -5440,13 +5440,27 @@ uint32_t parse_line(char *in, char *out, size_t *outlen, char **args, int *nbarg
                        }
 
                        if (brace) {
-                               if (*in != '}') {
+                               if (*in == '-') {
+                                       /* default value starts just after the '-' */
+                                       if (!value)
+                                               value = in + 1;
+
+                                       while (*in && *in != '}')
+                                               in++;
+                                       if (!*in)
+                                               goto no_brace;
+                                       *in = 0; // terminate the default value
+                               }
+                               else if (*in != '}') {
+                               no_brace:
                                        /* unmatched brace */
                                        err |= PARSE_ERR_BRACE;
                                        if (errptr)
                                                *errptr = brace;
                                        goto leave;
                                }
+
+                               /* brace found, skip it */
                                in++;
                                brace = NULL;
                        }