From: James Brown Date: Thu, 22 Oct 2015 01:19:05 +0000 (-0700) Subject: MINOR: check: add agent-send server parameter X-Git-Tag: v1.7-dev1~52 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=55f9ff11b507eccfebb8f212962e675551d61c7b;p=thirdparty%2Fhaproxy.git MINOR: check: add agent-send server parameter Causes HAProxy to emit a static string to the agent on every check, so that you can independently control multiple services running behind a single agent port. --- diff --git a/doc/configuration.txt b/doc/configuration.txt index 7dea0f6c4a..c3966d709b 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -10058,6 +10058,13 @@ agent-check Supported in default-server: No +agent-send + If this option is specified, haproxy will send the given string (verbatim) + to the agent server upon connection. You could, for example, encode + the backend name into this string, which would enable your agent to send + different responses based on the backend. Make sure to include a '\n' if + you want to terminate your request with a newline. + agent-inter The "agent-inter" parameter sets the interval between two agent checks to milliseconds. If left unspecified, the delay defaults to 2000 ms. diff --git a/include/types/checks.h b/include/types/checks.h index 02fc743751..dd2018400a 100644 --- a/include/types/checks.h +++ b/include/types/checks.h @@ -176,6 +176,8 @@ struct check { * rise to rise+fall-1 = good */ int rise, fall; /* time in iterations */ int type; /* Check type, one of PR_O2_*_CHK */ + char *send_string; /* optionally send a string when connecting to the agent */ + int send_string_len; /* length of agent command string */ struct server *server; /* back-pointer to server */ char **argv; /* the arguments to use if running a process-based check */ char **envp; /* the environment to use if running a process-based check */ diff --git a/src/checks.c b/src/checks.c index 997cf81202..e77926ac3d 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1459,6 +1459,10 @@ static int connect_conn_chk(struct task *t) } } + if ((check->type & PR_O2_LB_AGENT_CHK) && check->send_string_len) { + bo_putblk(check->bo, check->send_string, check->send_string_len); + } + /* prepare a new connection */ conn_init(conn); diff --git a/src/haproxy.c b/src/haproxy.c index 93423a9b09..973af29182 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1412,6 +1412,7 @@ void deinit(void) free(s->check.bo); free(s->agent.bi); free(s->agent.bo); + free(s->agent.send_string); free((char*)s->conf.file); #ifdef USE_OPENSSL if (s->use_ssl || s->check.use_ssl) diff --git a/src/server.c b/src/server.c index c92623d481..224d536f19 100644 --- a/src/server.c +++ b/src/server.c @@ -984,6 +984,9 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr newsrv->check.downinter = curproxy->defsrv.check.downinter; newsrv->agent.use_ssl = curproxy->defsrv.agent.use_ssl; newsrv->agent.port = curproxy->defsrv.agent.port; + if (curproxy->defsrv.agent.send_string != NULL) + newsrv->agent.send_string = strdup(curproxy->defsrv.agent.send_string); + newsrv->agent.send_string_len = curproxy->defsrv.agent.send_string_len; newsrv->agent.inter = curproxy->defsrv.agent.inter; newsrv->agent.fastinter = curproxy->defsrv.agent.fastinter; newsrv->agent.downinter = curproxy->defsrv.agent.downinter; @@ -1052,6 +1055,14 @@ int parse_server(const char *file, int linenum, char **args, struct proxy *curpr newsrv->agent.port = atol(args[cur_arg + 1]); cur_arg += 2; } + else if (!strcmp(args[cur_arg], "agent-send")) { + global.maxsock++; + free(newsrv->agent.send_string); + newsrv->agent.send_string_len = strlen(args[cur_arg + 1]); + newsrv->agent.send_string = calloc(1, newsrv->agent.send_string_len + 1); + memcpy(newsrv->agent.send_string, args[cur_arg + 1], newsrv->agent.send_string_len); + cur_arg += 2; + } else if (!defsrv && !strcmp(args[cur_arg], "cookie")) { newsrv->cookie = strdup(args[cur_arg + 1]); newsrv->cklen = strlen(args[cur_arg + 1]);