mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-02-19 12:16:59 +00:00
MAJOR: tools: support environment variables in addresses
Now that all addresses are parsed using str2sa_range(), it becomes easy to add support for environment variables and use them everywhere an address is needed. Environment variables are used as $VAR or ${VAR} as in shell. Any number of variables may compose an address, allowing various fantasies such as "fd@${FD_HTTP}" or "${LAN_DC1}.1:80". These ones are usable in logs, bind, servers, peers, stats socket, source, dispatch, and check address.
This commit is contained in:
parent
40aa070c51
commit
dad36a3ee3
@ -562,6 +562,11 @@ log <address> <facility> [max level [min level]]
|
|||||||
the chroot) and uid/gid (be sure the path is appropriately
|
the chroot) and uid/gid (be sure the path is appropriately
|
||||||
writeable).
|
writeable).
|
||||||
|
|
||||||
|
Any part of the address string may reference any number of environment
|
||||||
|
variables by preceding their name with a dollar sign ('$') and
|
||||||
|
optionally enclosing them with braces ('{}'), similarly to what is done
|
||||||
|
in Bourne shell.
|
||||||
|
|
||||||
<facility> must be one of the 24 standard syslog facilities :
|
<facility> must be one of the 24 standard syslog facilities :
|
||||||
|
|
||||||
kern user mail daemon auth syslog lpr news
|
kern user mail daemon auth syslog lpr news
|
||||||
@ -1021,6 +1026,10 @@ peer <peername> <ip>:<port>
|
|||||||
peer name. This makes it easier to maintain coherent configuration files
|
peer name. This makes it easier to maintain coherent configuration files
|
||||||
across all peers.
|
across all peers.
|
||||||
|
|
||||||
|
Any part of the address string may reference any number of environment
|
||||||
|
variables by preceding their name with a dollar sign ('$') and optionally
|
||||||
|
enclosing them with braces ('{}'), similarly to what is done in Bourne shell.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
peers mypeers
|
peers mypeers
|
||||||
peer haproxy1 192.168.0.1:1024
|
peer haproxy1 192.168.0.1:1024
|
||||||
@ -1619,6 +1628,10 @@ bind /<path> [, ...] [param*]
|
|||||||
- 'fd@<n>' -> use file descriptor <n> inherited from the
|
- 'fd@<n>' -> use file descriptor <n> inherited from the
|
||||||
parent. The fd must be bound and may or may not already
|
parent. The fd must be bound and may or may not already
|
||||||
be listening.
|
be listening.
|
||||||
|
Any part of the address string may reference any number of
|
||||||
|
environment variables by preceding their name with a dollar
|
||||||
|
sign ('$') and optionally enclosing them with braces ('{}'),
|
||||||
|
similarly to what is done in Bourne shell.
|
||||||
|
|
||||||
<port_range> is either a unique TCP port, or a port range for which the
|
<port_range> is either a unique TCP port, or a port range for which the
|
||||||
proxy will accept connections for the IP address specified
|
proxy will accept connections for the IP address specified
|
||||||
@ -1675,6 +1688,9 @@ bind /<path> [, ...] [param*]
|
|||||||
bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
|
bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
|
||||||
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
|
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
|
||||||
|
|
||||||
|
listen external_bind_app1
|
||||||
|
bind fd@${FD_APP1}
|
||||||
|
|
||||||
See also : "source", "option forwardfor", "unix-bind" and the PROXY protocol
|
See also : "source", "option forwardfor", "unix-bind" and the PROXY protocol
|
||||||
documentation, and section 5 about bind options.
|
documentation, and section 5 about bind options.
|
||||||
|
|
||||||
@ -2829,6 +2845,11 @@ no log
|
|||||||
inside the chroot) and uid/gid (be sure the path is
|
inside the chroot) and uid/gid (be sure the path is
|
||||||
appropriately writeable).
|
appropriately writeable).
|
||||||
|
|
||||||
|
Any part of the address string may reference any number of
|
||||||
|
environment variables by preceding their name with a dollar
|
||||||
|
sign ('$') and optionally enclosing them with braces ('{}'),
|
||||||
|
similarly to what is done in Bourne shell.
|
||||||
|
|
||||||
<facility> must be one of the 24 standard syslog facilities :
|
<facility> must be one of the 24 standard syslog facilities :
|
||||||
|
|
||||||
kern user mail daemon auth syslog lpr news
|
kern user mail daemon auth syslog lpr news
|
||||||
@ -2862,6 +2883,8 @@ no log
|
|||||||
log global
|
log global
|
||||||
log 127.0.0.1:514 local0 notice # only send important events
|
log 127.0.0.1:514 local0 notice # only send important events
|
||||||
log 127.0.0.1:514 local0 notice notice # same but limit output level
|
log 127.0.0.1:514 local0 notice notice # same but limit output level
|
||||||
|
log ${LOCAL_SYSLOG}:514 local0 notice # send to local server
|
||||||
|
|
||||||
|
|
||||||
log-format <string>
|
log-format <string>
|
||||||
Allows you to custom a log line.
|
Allows you to custom a log line.
|
||||||
@ -5094,6 +5117,10 @@ server <name> <address>[:[port]] [param*]
|
|||||||
- 'ipv4@' -> address is always IPv4
|
- 'ipv4@' -> address is always IPv4
|
||||||
- 'ipv6@' -> address is always IPv6
|
- 'ipv6@' -> address is always IPv6
|
||||||
- 'unix@' -> address is a path to a local unix socket
|
- 'unix@' -> address is a path to a local unix socket
|
||||||
|
Any part of the address string may reference any number of
|
||||||
|
environment variables by preceding their name with a dollar
|
||||||
|
sign ('$') and optionally enclosing them with braces ('{}'),
|
||||||
|
similarly to what is done in Bourne shell.
|
||||||
|
|
||||||
<port> is an optional port specification. If set, all connections will
|
<port> is an optional port specification. If set, all connections will
|
||||||
be sent to this port. If unset, the same port the client
|
be sent to this port. If unset, the same port the client
|
||||||
@ -5109,6 +5136,9 @@ server <name> <address>[:[port]] [param*]
|
|||||||
server first 10.1.1.1:1080 cookie first check inter 1000
|
server first 10.1.1.1:1080 cookie first check inter 1000
|
||||||
server second 10.1.1.2:1080 cookie second check inter 1000
|
server second 10.1.1.2:1080 cookie second check inter 1000
|
||||||
server transp ipv4@
|
server transp ipv4@
|
||||||
|
server backup ${SRV_BACKUP}:1080 backup
|
||||||
|
server www1_dc1 ${LAN_DC1}.101:80
|
||||||
|
server www1_dc2 ${LAN_DC2}.101:80
|
||||||
|
|
||||||
See also: "default-server", "http-send-name-header" and section 5 about
|
See also: "default-server", "http-send-name-header" and section 5 about
|
||||||
server options
|
server options
|
||||||
@ -5133,6 +5163,10 @@ source <addr>[:<port>] [interface <name>]
|
|||||||
- 'ipv4@' -> address is always IPv4
|
- 'ipv4@' -> address is always IPv4
|
||||||
- 'ipv6@' -> address is always IPv6
|
- 'ipv6@' -> address is always IPv6
|
||||||
- 'unix@' -> address is a path to a local unix socket
|
- 'unix@' -> address is a path to a local unix socket
|
||||||
|
Any part of the address string may reference any number of
|
||||||
|
environment variables by preceding their name with a dollar
|
||||||
|
sign ('$') and optionally enclosing them with braces ('{}'),
|
||||||
|
similarly to what is done in Bourne shell.
|
||||||
|
|
||||||
<port> is an optional port. It is normally not needed but may be useful
|
<port> is an optional port. It is normally not needed but may be useful
|
||||||
in some very specific contexts. The default value of zero means
|
in some very specific contexts. The default value of zero means
|
||||||
|
@ -732,6 +732,14 @@ char *memprintf(char **out, const char *format, ...)
|
|||||||
*/
|
*/
|
||||||
char *indent_msg(char **out, int level);
|
char *indent_msg(char **out, int level);
|
||||||
|
|
||||||
|
/* Convert occurrences of environment variables in the input string to their
|
||||||
|
* corresponding value. A variable is identified as a series of alphanumeric
|
||||||
|
* characters or underscores following a '$' sign. The <in> string must be
|
||||||
|
* free()able. NULL returns NULL. The resulting string might be reallocated if
|
||||||
|
* some expansion is made.
|
||||||
|
*/
|
||||||
|
char *env_expand(char *in);
|
||||||
|
|
||||||
/* debugging macro to emit messages using write() on fd #-1 so that strace sees
|
/* debugging macro to emit messages using write() on fd #-1 so that strace sees
|
||||||
* them.
|
* them.
|
||||||
*/
|
*/
|
||||||
|
@ -655,7 +655,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high, char
|
|||||||
|
|
||||||
portl = porth = porta = 0;
|
portl = porth = porta = 0;
|
||||||
|
|
||||||
str2 = back = strdup(str);
|
str2 = back = env_expand(strdup(str));
|
||||||
if (str2 == NULL) {
|
if (str2 == NULL) {
|
||||||
memprintf(err, "out of memory in '%s'\n", __FUNCTION__);
|
memprintf(err, "out of memory in '%s'\n", __FUNCTION__);
|
||||||
goto out;
|
goto out;
|
||||||
@ -688,7 +688,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high, char
|
|||||||
((struct sockaddr_in *)&ss)->sin_addr.s_addr = strtol(str2, &endptr, 10);
|
((struct sockaddr_in *)&ss)->sin_addr.s_addr = strtol(str2, &endptr, 10);
|
||||||
|
|
||||||
if (!*str2 || *endptr) {
|
if (!*str2 || *endptr) {
|
||||||
memprintf(err, "file descriptor '%s' is not a valid integer\n", str2);
|
memprintf(err, "file descriptor '%s' is not a valid integer in '%s'\n", str2, str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -750,7 +750,7 @@ struct sockaddr_storage *str2sa_range(const char *str, int *low, int *high, char
|
|||||||
porta = porth;
|
porta = porth;
|
||||||
}
|
}
|
||||||
else if (*port1) { /* other any unexpected char */
|
else if (*port1) { /* other any unexpected char */
|
||||||
memprintf(err, "invalid character '%c' in port number '%s'\n", *port1, port1);
|
memprintf(err, "invalid character '%c' in port number '%s' in '%s'\n", *port1, port1, str);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
set_host_port(&ss, porta);
|
set_host_port(&ss, porta);
|
||||||
@ -1996,6 +1996,83 @@ char *indent_msg(char **out, int level)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Convert occurrences of environment variables in the input string to their
|
||||||
|
* corresponding value. A variable is identified as a series of alphanumeric
|
||||||
|
* characters or underscores following a '$' sign. The <in> string must be
|
||||||
|
* free()able. NULL returns NULL. The resulting string might be reallocated if
|
||||||
|
* some expansion is made. Variable names may also be enclosed into braces if
|
||||||
|
* needed (eg: to concatenate alphanum characters).
|
||||||
|
*/
|
||||||
|
char *env_expand(char *in)
|
||||||
|
{
|
||||||
|
char *txt_beg;
|
||||||
|
char *out;
|
||||||
|
char *txt_end;
|
||||||
|
char *var_beg;
|
||||||
|
char *var_end;
|
||||||
|
char *value;
|
||||||
|
char *next;
|
||||||
|
int out_len;
|
||||||
|
int val_len;
|
||||||
|
|
||||||
|
if (!in)
|
||||||
|
return in;
|
||||||
|
|
||||||
|
value = out = NULL;
|
||||||
|
out_len = 0;
|
||||||
|
|
||||||
|
txt_beg = in;
|
||||||
|
do {
|
||||||
|
/* look for next '$' sign in <in> */
|
||||||
|
for (txt_end = txt_beg; *txt_end && *txt_end != '$'; txt_end++);
|
||||||
|
|
||||||
|
if (!*txt_end && !out) /* end and no expansion performed */
|
||||||
|
return in;
|
||||||
|
|
||||||
|
val_len = 0;
|
||||||
|
next = txt_end;
|
||||||
|
if (*txt_end == '$') {
|
||||||
|
char save;
|
||||||
|
|
||||||
|
var_beg = txt_end + 1;
|
||||||
|
if (*var_beg == '{')
|
||||||
|
var_beg++;
|
||||||
|
|
||||||
|
var_end = var_beg;
|
||||||
|
while (isalnum((int)(unsigned char)*var_end) || *var_end == '_') {
|
||||||
|
var_end++;
|
||||||
|
}
|
||||||
|
|
||||||
|
next = var_end;
|
||||||
|
if (*var_end == '}' && (var_beg > txt_end + 1))
|
||||||
|
next++;
|
||||||
|
|
||||||
|
/* get value of the variable name at this location */
|
||||||
|
save = *var_end;
|
||||||
|
*var_end = '\0';
|
||||||
|
value = getenv(var_beg);
|
||||||
|
*var_end = save;
|
||||||
|
val_len = value ? strlen(value) : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
out = realloc(out, out_len + (txt_end - txt_beg) + val_len + 1);
|
||||||
|
if (txt_end > txt_beg) {
|
||||||
|
memcpy(out + out_len, txt_beg, txt_end - txt_beg);
|
||||||
|
out_len += txt_end - txt_beg;
|
||||||
|
}
|
||||||
|
if (val_len) {
|
||||||
|
memcpy(out + out_len, value, val_len);
|
||||||
|
out_len += val_len;
|
||||||
|
}
|
||||||
|
out[out_len] = 0;
|
||||||
|
txt_beg = next;
|
||||||
|
} while (*txt_beg);
|
||||||
|
|
||||||
|
/* here we know that <out> was allocated and that we don't need <in> anymore */
|
||||||
|
free(in);
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* c-indent-level: 8
|
* c-indent-level: 8
|
||||||
|
Loading…
Reference in New Issue
Block a user