Previously, external checks required to find at least one listener in order to pass the <proxy_address> and <proxy_port> arguments to the external script. It prevented from declaring external checks in backend sections and haproxy rejected the configuration.
The listener is now optional and values "NOT_USED" are passed if no listener is found. For instance, this is the case with a backend section. This is specific to the 1.6 branch. --- doc/configuration.txt | 15 ++++++++------- src/checks.c | 17 +++++++++-------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/doc/configuration.txt b/doc/configuration.txt index 9fb0999..aa6baab 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -5338,13 +5338,14 @@ external-check command <command> The arguments passed to the to the command are: - proxy_address proxy_port server_address server_port - - The proxy_address and proxy_port are derived from the first listener - that is either IPv4, IPv6 or a UNIX socket. It is an error for no such - listeners to exist. In the case of a UNIX socket listener the - proxy_address will be the path of the socket and the proxy_port will - be the string "NOT_USED". + <proxy_address> <proxy_port> <server_address> <server_port> + + The <proxy_address> and <proxy_port> are derived from the first listener + that is either IPv4, IPv6 or a UNIX socket. In the case of a UNIX socket + listener the proxy_address will be the path of the socket and the + <proxy_port> will be the string "NOT_USED". In a backend section, it's not + possible to determine a listener, and both <proxy_address> and <proxy_port> + will have the string value "NOT_USED". If the command executed and exits with a zero status then the check is considered to have passed, otherwise the check is considered to have diff --git a/src/checks.c b/src/checks.c index 5dc95b2..bb8b719 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1589,11 +1589,6 @@ static int prepare_external_check(struct check *check) break; } - if (!listener) { - err_fmt = "Starting [%s:%s] check: no listener.\n"; - goto err; - } - check->curpid = NULL; check->envp = calloc(2, sizeof(check->argv)); @@ -1612,19 +1607,25 @@ static int prepare_external_check(struct check *check) check->argv[0] = px->check_command; - if (listener->addr.ss_family == AF_INET || + if (!listener) { + check->argv[1] = strdup("NOT_USED"); + check->argv[2] = strdup("NOT_USED"); + } + else if (listener->addr.ss_family == AF_INET || listener->addr.ss_family == AF_INET6) { addr_to_str(&listener->addr, host, sizeof(host)); check->argv[1] = strdup(host); port_to_str(&listener->addr, serv, sizeof(serv)); check->argv[2] = strdup(serv); - } else if (listener->addr.ss_family == AF_UNIX) { + } + else if (listener->addr.ss_family == AF_UNIX) { const struct sockaddr_un *un; un = (struct sockaddr_un *)&listener->addr; check->argv[1] = strdup(un->sun_path); check->argv[2] = strdup("NOT_USED"); - } else { + } + else { goto err; } -- 2.1.3