diff --git a/include/proto/server.h b/include/proto/server.h index 41bb31a15..d11150a7a 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 f627b40ab..ac66c6bbb 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: