From: Willy Tarreau Date: Wed, 23 Nov 2016 16:15:08 +0000 (+0100) Subject: MINOR: server: create new function cli_find_server() to find a server X-Git-Tag: v1.7.0~57 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21b069dca83e2bc29d720e74f22848d8c24aa48d;p=thirdparty%2Fhaproxy.git MINOR: server: create new function cli_find_server() to find a server Several CLI commands require a server, so let's have a function to look this one up and prepare the appropriate error message and the appctx's state in case of failure. --- diff --git a/include/proto/server.h b/include/proto/server.h index 41bb31a15b..d11150a7a6 100644 --- a/include/proto/server.h +++ b/include/proto/server.h @@ -48,6 +48,7 @@ void apply_server_state(void); void srv_compute_all_admin_states(struct proxy *px); int srv_set_addr_via_libc(struct server *srv, int *err_code); int srv_init_addr(void); +struct server *cli_find_server(struct appctx *appctx, char *arg); /* functions related to server name resolution */ int snr_update_srv_status(struct server *s); diff --git a/src/server.c b/src/server.c index f627b40ab1..ac66c6bbb0 100644 --- a/src/server.c +++ b/src/server.c @@ -21,6 +21,7 @@ #include #include +#include #include #include @@ -3339,6 +3340,46 @@ int srv_init_addr(void) return return_code; } +/* Expects to find a backend and a server in under the form /, + * and returns the pointer to the server. Otherwise, display adequate error messages + * on the CLI, sets the CLI's state to STAT_CLI_PRINT and returns NULL. This is only + * used for CLI commands requiring a server name. + * Important: the is modified to remove the '/'. + */ +struct server *cli_find_server(struct appctx *appctx, char *arg) +{ + struct proxy *px; + struct server *sv; + char *line; + + /* split "backend/server" and make 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; +} + /* * Local variables: