]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: server: create new function cli_find_server() to find a server
authorWilly Tarreau <w@1wt.eu>
Wed, 23 Nov 2016 16:15:08 +0000 (17:15 +0100)
committerWilly Tarreau <w@1wt.eu>
Thu, 24 Nov 2016 15:59:27 +0000 (16:59 +0100)
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.

include/proto/server.h
src/server.c

index 41bb31a15b38009d854f64043f18e4b492c0fdcc..d11150a7a62c8d19114a79e7579654557c439659 100644 (file)
@@ -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);
index f627b40ab12ad4928a387dd3d21304e6d0115c98..ac66c6bbb00432edffd22dc812daec8aca98f806 100644 (file)
@@ -21,6 +21,7 @@
 #include <common/time.h>
 
 #include <types/global.h>
+#include <types/cli.h>
 #include <types/dns.h>
 
 #include <proto/checks.h>
@@ -3339,6 +3340,46 @@ int srv_init_addr(void)
        return return_code;
 }
 
+/* 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
+ * 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 <arg> 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 <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;
+}
+
 
 /*
  * Local variables: