The master process does not need all the keywords of the cli, add 2
flags to chose which keyword to use.

It might be useful to activate some of them in a debug mode later...
---
 include/types/cli.h    |  1 +
 include/types/global.h |  2 ++
 src/cli.c              | 22 ++++++++++++++++++++++
 3 files changed, 25 insertions(+)

diff --git a/include/types/cli.h b/include/types/cli.h
index 4e7e6b124..913167a47 100644
--- a/include/types/cli.h
+++ b/include/types/cli.h
@@ -31,6 +31,7 @@ struct cli_kw {
        int (*io_handler)(struct appctx *appctx);
        void (*io_release)(struct appctx *appctx);
        void *private;
+       int level; /* this is the level needed to show the keyword usage and to 
use it */
 };
 
 struct cli_kw_list {
diff --git a/include/types/global.h b/include/types/global.h
index 66ae6da83..a5d948e25 100644
--- a/include/types/global.h
+++ b/include/types/global.h
@@ -76,6 +76,8 @@
 #define ACCESS_LVL_MASK     0x3
 
 #define ACCESS_FD_LISTENERS 0x4  /* expose listeners FDs on stats socket */
+#define ACCESS_MASTER       0x8  /* works with the master (and every other 
processes) */
+#define ACCESS_MASTER_ONLY  0x10 /* only works with the worker */
 
 /* SSL server verify mode */
 enum {
diff --git a/src/cli.c b/src/cli.c
index 8a4fbc52c..87227a35f 100644
--- a/src/cli.c
+++ b/src/cli.c
@@ -93,6 +93,8 @@ static struct cli_kw_list cli_keywords = {
 
 extern const char *stat_status_codes[];
 
+extern int master;
+
 static struct proxy *mworker_proxy; /* CLI proxy of the master */
 
 static char *cli_gen_usage_msg(struct appctx *appctx)
@@ -113,8 +115,20 @@ static char *cli_gen_usage_msg(struct appctx *appctx)
        list_for_each_entry(kw_list, &cli_keywords.list, list) {
                kw = &kw_list->kw[0];
                while (kw->str_kw[0]) {
+
+                       /* in a worker or normal process, don't display master 
only commands */
+                       if (master == 0 && (kw->level & ACCESS_MASTER_ONLY))
+                               goto next_kw;
+
+                       /* in master don't displays if we don't have the master 
bits */
+                       if (master == 1 && !(kw->level & 
(ACCESS_MASTER_ONLY|ACCESS_MASTER)))
+                               goto next_kw;
+
                        if (kw->usage)
                                chunk_appendf(tmp, "  %s\n", kw->usage);
+
+next_kw:
+
                        kw++;
                }
        }
@@ -465,6 +479,14 @@ static int cli_parse_request(struct appctx *appctx)
        if (!kw)
                return 0;
 
+       /* in a worker or normal process, don't display master only commands */
+       if (master == 0 && (kw->level & ACCESS_MASTER_ONLY))
+               return 0;
+
+       /* in master don't displays if we don't have the master bits */
+       if (master == 1 && !(kw->level & (ACCESS_MASTER_ONLY|ACCESS_MASTER)))
+               return 0;
+
        appctx->io_handler = kw->io_handler;
        appctx->io_release = kw->io_release;
        /* kw->parse could set its own io_handler or ip_release handler */
-- 
2.16.4


Reply via email to