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.
This commit is contained in:
James Brown 2015-10-21 18:19:05 -07:00 committed by Willy Tarreau
parent c4eebc8157
commit 55f9ff11b5
5 changed files with 25 additions and 0 deletions

View file

@ -10058,6 +10058,13 @@ agent-check
Supported in default-server: No
agent-send <string>
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 <delay>
The "agent-inter" parameter sets the interval between two agent checks
to <delay> milliseconds. If left unspecified, the delay defaults to 2000 ms.

View file

@ -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 */

View file

@ -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);

View file

@ -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)

View file

@ -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]);