MEDIUM: cli: add agent-port command

this patch allows to set agent port at runtime. In order to align with
both `addr` and `check-addr` commands, also add the possibility to
optionnaly set port on `agent-addr` command. This led to a small
refactor in order to use the same function for both `agent-addr` and
`agent-port` commands.

Signed-off-by: William Dauchy <wdauchy@gmail.com>
This commit is contained in:
William Dauchy 2021-02-11 22:51:24 +01:00 committed by Christopher Faulet
parent b456e1f389
commit 7cabc06da6
2 changed files with 80 additions and 10 deletions

View File

@ -1828,10 +1828,14 @@ set server <backend>/<server> agent [ up | down ]
switch a server's state regardless of some slow agent checks for example. switch a server's state regardless of some slow agent checks for example.
Note that the change is propagated to tracking servers if any. Note that the change is propagated to tracking servers if any.
set server <backend>/<server> agent-addr <addr> set server <backend>/<server> agent-addr <addr> [port <port>]
Change addr for servers agent checks. Allows to migrate agent-checks to Change addr for servers agent checks. Allows to migrate agent-checks to
another address at runtime. You can specify both IP and hostname, it will be another address at runtime. You can specify both IP and hostname, it will be
resolved. resolved.
Optionally, change the port agent.
set server <backend>/<server> agent-port <port>
Change the port used for agent checks.
set server <backend>/<server> agent-send <value> set server <backend>/<server> agent-send <value>
Change agent string sent to agent check target. Allows to update string while Change agent string sent to agent check target. Allows to update string while

View File

@ -56,6 +56,8 @@ static int srv_state_get_version(FILE *f);
static void srv_cleanup_connections(struct server *srv); static void srv_cleanup_connections(struct server *srv);
static const char *update_server_check_addr_port(struct server *s, const char *addr, static const char *update_server_check_addr_port(struct server *s, const char *addr,
const char *port); const char *port);
static const char *update_server_agent_addr_port(struct server *s, const char *addr,
const char *port);
/* List head of all known server keywords */ /* List head of all known server keywords */
static struct srv_kw_list srv_keywords = { static struct srv_kw_list srv_keywords = {
@ -3576,6 +3578,54 @@ int update_server_addr(struct server *s, void *ip, int ip_sin_family, const char
return 0; return 0;
} }
/* update agent health check address and port
* addr can be ip4/ip6 or a hostname
* if one error occurs, don't apply anything
* must be called with the server lock held.
*/
static const char *update_server_agent_addr_port(struct server *s, const char *addr,
const char *port)
{
struct sockaddr_storage sk;
struct buffer *msg;
int new_port;
msg = get_trash_chunk();
chunk_reset(msg);
if (!(s->agent.state & CHK_ST_ENABLED)) {
chunk_strcat(msg, "agent checks are not enabled on this server");
goto out;
}
if (addr) {
memset(&sk, 0, sizeof(struct sockaddr_storage));
if (str2ip(addr, &sk) == NULL) {
chunk_appendf(msg, "invalid addr '%s'", addr);
goto out;
}
}
if (port) {
if (strl2irc(port, strlen(port), &new_port) != 0) {
chunk_appendf(msg, "provided port is not an integer");
goto out;
}
if (new_port < 0 || new_port > 65535) {
chunk_appendf(msg, "provided port is invalid");
goto out;
}
}
out:
if (msg->data)
return msg->area;
else {
if (addr)
set_srv_agent_addr(s, &sk);
if (port)
set_srv_agent_port(s, new_port);
}
return NULL;
}
/* update server health check address and port /* update server health check address and port
* addr must be ip4 or ip6, it won't be resolved * addr must be ip4 or ip6, it won't be resolved
* if one error occurs, don't apply anything * if one error occurs, don't apply anything
@ -4443,15 +4493,31 @@ static int cli_parse_set_server(char **args, char *payload, struct appctx *appct
cli_err(appctx, "'set server <srv> agent' expects 'up' or 'down'.\n"); cli_err(appctx, "'set server <srv> agent' expects 'up' or 'down'.\n");
} }
else if (strcmp(args[3], "agent-addr") == 0) { else if (strcmp(args[3], "agent-addr") == 0) {
struct sockaddr_storage sk; char *addr = NULL;
char *port = NULL;
memset(&sk, 0, sizeof(sk)); if (strlen(args[4]) == 0) {
if (!(sv->agent.state & CHK_ST_ENABLED)) cli_err(appctx, "set server <b>/<s> agent-addr requires"
cli_err(appctx, "agent checks are not enabled on this server.\n"); " an address and optionally a port.\n");
else if (str2ip(args[4], &sk)) goto out_unlock;
set_srv_agent_addr(sv, &sk); }
else addr = args[4];
cli_err(appctx, "incorrect addr address given for agent.\n"); if (strcmp(args[5], "port") == 0)
port = args[6];
warning = update_server_agent_addr_port(sv, addr, port);
if (warning)
cli_msg(appctx, LOG_WARNING, warning);
}
else if (strcmp(args[3], "agent-port") == 0) {
char *port = NULL;
if (strlen(args[4]) == 0) {
cli_err(appctx, "set server <b>/<s> agent-port requires"
" a port.\n");
goto out_unlock;
}
port = args[4];
warning = update_server_agent_addr_port(sv, NULL, port);
if (warning)
cli_msg(appctx, LOG_WARNING, warning);
} }
else if (strcmp(args[3], "agent-send") == 0) { else if (strcmp(args[3], "agent-send") == 0) {
if (!(sv->agent.state & CHK_ST_ENABLED)) if (!(sv->agent.state & CHK_ST_ENABLED))