REORG: cli: move "{enable|disable} agent" to server.c
Also mention that "set server" is preferred now. Note that these
were the last enable/disable commands in cli.c. Also remove the
now unused expect_server_admin() function.
diff --git a/src/cli.c b/src/cli.c
index 1661317..060ee23 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -74,8 +74,6 @@
" prompt : toggle interactive mode with prompt\n"
" quit : disconnect\n"
" set rate-limit : change a rate limiting value\n"
- " disable : put a server or frontend in maintenance mode\n"
- " enable : re-enable a server or frontend which is in maintenance mode\n"
"";
static const char stats_permission_denied_msg[] =
@@ -394,52 +392,6 @@
}
-/* Expects to find a backend and a server in <arg> under the form <backend>/<server>,
- * and returns the pointer to the server. Otherwise, display adequate error messages
- * and returns NULL. This function also expects the stream level to be admin. Note:
- * the <arg> is modified to remove the '/'.
- */
-struct server *expect_server_admin(struct stream *s, struct stream_interface *si, char *arg)
-{
- struct appctx *appctx = __objt_appctx(si->end);
- struct proxy *px;
- struct server *sv;
- char *line;
-
- if (strm_li(s)->bind_conf->level < ACCESS_LVL_ADMIN) {
- appctx->ctx.cli.msg = stats_permission_denied_msg;
- appctx->st0 = STAT_CLI_PRINT;
- return NULL;
- }
-
- /* split "backend/server" and make <line> point to server */
- for (line = arg; *line; line++)
- if (*line == '/') {
- *line++ = '\0';
- break;
- }
-
- if (!*line || !*arg) {
- appctx->ctx.cli.msg = "Require 'backend/server'.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return NULL;
- }
-
- if (!get_backend_server(arg, line, &px, &sv)) {
- appctx->ctx.cli.msg = px ? "No such server.\n" : "No such backend.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return NULL;
- }
-
- if (px->state == PR_STSTOPPED) {
- appctx->ctx.cli.msg = "Proxy is disabled.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return NULL;
- }
-
- return sv;
-}
-
/* Processes the stats interpreter on the statistics socket. This function is
* called from an applet running in a stream interface. The function returns 1
* if the request was understood, otherwise zero. It sets appctx->st0 to a value
@@ -658,46 +610,6 @@
return 0;
}
}
- else if (strcmp(args[0], "enable") == 0) {
- if (strcmp(args[1], "agent") == 0) {
- struct server *sv;
-
- sv = expect_server_admin(s, si, args[2]);
- if (!sv)
- return 1;
-
- if (!(sv->agent.state & CHK_ST_CONFIGURED)) {
- appctx->ctx.cli.msg = "Agent was not configured on this server, cannot enable.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return 1;
- }
-
- sv->agent.state |= CHK_ST_ENABLED;
- return 1;
- }
- else { /* unknown "enable" parameter */
- appctx->ctx.cli.msg = "'enable' only supports 'agent', 'frontend', 'health', and 'server'.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return 1;
- }
- }
- else if (strcmp(args[0], "disable") == 0) {
- if (strcmp(args[1], "agent") == 0) {
- struct server *sv;
-
- sv = expect_server_admin(s, si, args[2]);
- if (!sv)
- return 1;
-
- sv->agent.state &= ~CHK_ST_ENABLED;
- return 1;
- }
- else { /* unknown "disable" parameter */
- appctx->ctx.cli.msg = "'disable' only supports 'agent', 'frontend', 'health', and 'server'.\n";
- appctx->st0 = STAT_CLI_PRINT;
- return 1;
- }
- }
else { /* not "show" nor "clear" nor "get" nor "set" nor "enable" nor "disable" */
return 0;
}
diff --git a/src/server.c b/src/server.c
index 5711910..343927b 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3583,6 +3583,22 @@
return 1;
}
+/* parse a "disable agent" command. It always returns 1. */
+static int cli_parse_disable_agent(char **args, struct appctx *appctx, void *private)
+{
+ struct server *sv;
+
+ if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
+ return 1;
+
+ sv = cli_find_server(appctx, args[2]);
+ if (!sv)
+ return 1;
+
+ sv->agent.state &= ~CHK_ST_ENABLED;
+ return 1;
+}
+
/* parse a "disable health" command. It always returns 1. */
static int cli_parse_disable_health(char **args, struct appctx *appctx, void *private)
{
@@ -3615,6 +3631,28 @@
return 1;
}
+/* parse a "enable agent" command. It always returns 1. */
+static int cli_parse_enable_agent(char **args, struct appctx *appctx, void *private)
+{
+ struct server *sv;
+
+ if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
+ return 1;
+
+ sv = cli_find_server(appctx, args[2]);
+ if (!sv)
+ return 1;
+
+ if (!(sv->agent.state & CHK_ST_CONFIGURED)) {
+ appctx->ctx.cli.msg = "Agent was not configured on this server, cannot enable.\n";
+ appctx->st0 = STAT_CLI_PRINT;
+ return 1;
+ }
+
+ sv->agent.state |= CHK_ST_ENABLED;
+ return 1;
+}
+
/* parse a "enable health" command. It always returns 1. */
static int cli_parse_enable_health(char **args, struct appctx *appctx, void *private)
{
@@ -3649,8 +3687,10 @@
/* register cli keywords */
static struct cli_kw_list cli_kws = {{ },{
+ { { "disable", "agent", NULL }, "disable agent : disable agent checks (use 'set server' instead)", cli_parse_disable_agent, NULL },
{ { "disable", "health", NULL }, "disable health : disable health checks (use 'set server' instead)", cli_parse_disable_health, NULL },
{ { "disable", "server", NULL }, "disable server : disable a server for maintenance (use 'set server' instead)", cli_parse_disable_server, NULL },
+ { { "enable", "agent", NULL }, "enable agent : enable agent checks (use 'set server' instead)", cli_parse_enable_agent, NULL },
{ { "enable", "health", NULL }, "enable health : enable health checks (use 'set server' instead)", cli_parse_enable_health, NULL },
{ { "enable", "server", NULL }, "enable server : enable a disabled server (use 'set server' instead)", cli_parse_enable_server, NULL },
{ { "set", "maxconn", "server", NULL }, "set maxconn server : change a server's maxconn setting", cli_parse_set_maxconn_server, NULL },