From: Cyril Bonté Date: Tue, 2 Dec 2014 20:21:35 +0000 (+0100) Subject: MINOR: checks: allow external checks in backend sections X-Git-Tag: v1.6-dev1~253 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=777be861c5798072b561d21c03296c0fa82295d6;p=thirdparty%2Fhaproxy.git MINOR: checks: allow external checks in backend sections Previously, external checks required to find at least one listener in order to pass the and 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. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 9fb099937e..aa6baabb4a 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -5338,13 +5338,14 @@ external-check 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". + + + The and 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 + will be the string "NOT_USED". In a backend section, it's not + possible to determine a listener, and both and + 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 5dc95b2a28..bb8b719ebe 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; }