mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-08-07 23:56:57 +02:00
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:
parent
b456e1f389
commit
7cabc06da6
@ -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
|
||||||
|
84
src/server.c
84
src/server.c
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user