MINOR: config: support default values for environment variables

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.
This commit is contained in:
Willy Tarreau 2021-11-18 17:42:50 +01:00
parent 002e2068cc
commit ec347b1239
2 changed files with 20 additions and 3 deletions

View 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"

View 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;
}