mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-22 06:11:32 +02:00
MINOR: cli: implement experimental-mode
Experimental mode is similar to expert-mode. It can be used to access to features still in development.
This commit is contained in:
parent
5ba8335186
commit
18487fb532
@ -1677,11 +1677,21 @@ enable server <backend>/<server>
|
|||||||
This command is restricted and can only be issued on sockets configured for
|
This command is restricted and can only be issued on sockets configured for
|
||||||
level "admin".
|
level "admin".
|
||||||
|
|
||||||
|
experimental-mode [on|off]
|
||||||
|
Without options, this indicates whether the experimental mode is enabled or
|
||||||
|
disabled on the current connection. When passed "on", it turns the
|
||||||
|
experimental mode on for the current CLI connection only. With "off" it turns
|
||||||
|
it off.
|
||||||
|
|
||||||
|
The experimental mode is used to access to extra features still in
|
||||||
|
development. These features are currently not stable and should be used with
|
||||||
|
care. They may be subject to breaking changes accross versions.
|
||||||
|
|
||||||
expert-mode [on|off]
|
expert-mode [on|off]
|
||||||
Without options, this indicates whether the expert mode is enabled or
|
This command is similar to experimental-mode but is used to toggle the
|
||||||
disabled on the current connection. When passed "on", it turns the expert
|
expert mode.
|
||||||
mode on for the current CLI connection only. With "off" it turns it off. The
|
|
||||||
expert mode enables displaying of expert commands that can be extremely
|
The expert mode enables displaying of expert commands that can be extremely
|
||||||
dangerous for the process and which may occasionally help developers collect
|
dangerous for the process and which may occasionally help developers collect
|
||||||
important information about complex bugs. Any misuse of these features will
|
important information about complex bugs. Any misuse of these features will
|
||||||
likely lead to a process crash. Do not use this option without being invited
|
likely lead to a process crash. Do not use this option without being invited
|
||||||
@ -1984,11 +1994,13 @@ show cli level
|
|||||||
|
|
||||||
operator
|
operator
|
||||||
Decrease the CLI level of the current CLI session to operator. It can't be
|
Decrease the CLI level of the current CLI session to operator. It can't be
|
||||||
increased. It also drops expert mode. See also "show cli level".
|
increased. It also drops expert and experimental mode. See also "show cli
|
||||||
|
level".
|
||||||
|
|
||||||
user
|
user
|
||||||
Decrease the CLI level of the current CLI session to user. It can't be
|
Decrease the CLI level of the current CLI session to user. It can't be
|
||||||
increased. It also drops expert mode. See also "show cli level".
|
increased. It also drops expert and experimental mode. See also "show cli
|
||||||
|
level".
|
||||||
|
|
||||||
show activity
|
show activity
|
||||||
Reports some counters about internal events that will help developers and
|
Reports some counters about internal events that will help developers and
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
#define ACCESS_MASTER 0x0008 /* works with the master (and every other processes) */
|
#define ACCESS_MASTER 0x0008 /* works with the master (and every other processes) */
|
||||||
#define ACCESS_MASTER_ONLY 0x0010 /* only works with the master */
|
#define ACCESS_MASTER_ONLY 0x0010 /* only works with the master */
|
||||||
#define ACCESS_EXPERT 0x0020 /* access to dangerous commands reserved to experts */
|
#define ACCESS_EXPERT 0x0020 /* access to dangerous commands reserved to experts */
|
||||||
|
#define ACCESS_EXPERIMENTAL 0x0040
|
||||||
|
|
||||||
/* flags for appctx->st1 */
|
/* flags for appctx->st1 */
|
||||||
#define APPCTX_CLI_ST1_PROMPT (1 << 0)
|
#define APPCTX_CLI_ST1_PROMPT (1 << 0)
|
||||||
|
52
src/cli.c
52
src/cli.c
@ -103,7 +103,7 @@ static char *cli_gen_usage_msg(struct appctx *appctx, char * const *args)
|
|||||||
/* first, let's measure the longest match */
|
/* first, let's measure the longest match */
|
||||||
list_for_each_entry(kw_list, &cli_keywords.list, list) {
|
list_for_each_entry(kw_list, &cli_keywords.list, list) {
|
||||||
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
||||||
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT))
|
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT|ACCESS_EXPERIMENTAL))
|
||||||
continue;
|
continue;
|
||||||
if ((appctx->cli_level & ~kw->level & (ACCESS_MASTER_ONLY|ACCESS_MASTER)) ==
|
if ((appctx->cli_level & ~kw->level & (ACCESS_MASTER_ONLY|ACCESS_MASTER)) ==
|
||||||
(ACCESS_MASTER_ONLY|ACCESS_MASTER))
|
(ACCESS_MASTER_ONLY|ACCESS_MASTER))
|
||||||
@ -143,7 +143,7 @@ static char *cli_gen_usage_msg(struct appctx *appctx, char * const *args)
|
|||||||
if (args && args[length] && *args[length]) {
|
if (args && args[length] && *args[length]) {
|
||||||
list_for_each_entry(kw_list, &cli_keywords.list, list) {
|
list_for_each_entry(kw_list, &cli_keywords.list, list) {
|
||||||
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
||||||
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT))
|
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT|ACCESS_EXPERIMENTAL))
|
||||||
continue;
|
continue;
|
||||||
if ((appctx->cli_level & ~kw->level & (ACCESS_MASTER_ONLY|ACCESS_MASTER)) ==
|
if ((appctx->cli_level & ~kw->level & (ACCESS_MASTER_ONLY|ACCESS_MASTER)) ==
|
||||||
(ACCESS_MASTER_ONLY|ACCESS_MASTER))
|
(ACCESS_MASTER_ONLY|ACCESS_MASTER))
|
||||||
@ -226,9 +226,9 @@ static char *cli_gen_usage_msg(struct appctx *appctx, char * const *args)
|
|||||||
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
for (kw = &kw_list->kw[0]; kw->str_kw[0]; kw++) {
|
||||||
|
|
||||||
/* in a worker or normal process, don't display master-only commands
|
/* in a worker or normal process, don't display master-only commands
|
||||||
* nor expert mode commands if not in this mode.
|
* nor expert/experimental mode commands if not in this mode.
|
||||||
*/
|
*/
|
||||||
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT))
|
if (kw->level & ~appctx->cli_level & (ACCESS_MASTER_ONLY|ACCESS_EXPERT|ACCESS_EXPERIMENTAL))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* in master don't display commands that have neither the master bit
|
/* in master don't display commands that have neither the master bit
|
||||||
@ -730,6 +730,11 @@ static int cli_parse_request(struct appctx *appctx)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (kw->level & ~appctx->cli_level & ACCESS_EXPERIMENTAL) {
|
||||||
|
cli_err(appctx, "This command is restricted to experimental mode only.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
appctx->io_handler = kw->io_handler;
|
appctx->io_handler = kw->io_handler;
|
||||||
appctx->io_release = kw->io_release;
|
appctx->io_release = kw->io_release;
|
||||||
|
|
||||||
@ -1677,29 +1682,45 @@ static int cli_parse_set_lvl(char **args, char *payload, struct appctx *appctx,
|
|||||||
appctx->cli_level &= ~ACCESS_LVL_MASK;
|
appctx->cli_level &= ~ACCESS_LVL_MASK;
|
||||||
appctx->cli_level |= ACCESS_LVL_USER;
|
appctx->cli_level |= ACCESS_LVL_USER;
|
||||||
}
|
}
|
||||||
appctx->cli_level &= ~ACCESS_EXPERT;
|
appctx->cli_level &= ~(ACCESS_EXPERT|ACCESS_EXPERIMENTAL);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* parse and set the CLI expert-mode dynamically */
|
/* parse and set the CLI expert/experimental-mode dynamically */
|
||||||
static int cli_parse_expert_mode(char **args, char *payload, struct appctx *appctx, void *private)
|
static int cli_parse_expert_experimental_mode(char **args, char *payload, struct appctx *appctx, void *private)
|
||||||
{
|
{
|
||||||
|
int level;
|
||||||
|
char *level_str;
|
||||||
|
char *output = NULL;
|
||||||
|
|
||||||
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
|
if (!cli_has_level(appctx, ACCESS_LVL_ADMIN))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
if (!*args[1])
|
if (!strcmp(args[0], "expert-mode")) {
|
||||||
return (appctx->cli_level & ACCESS_EXPERT)
|
level = ACCESS_EXPERT;
|
||||||
? cli_msg(appctx, LOG_INFO, "expert-mode is ON\n")
|
level_str = "expert-mode";
|
||||||
: cli_msg(appctx, LOG_INFO, "expert-mode is OFF\n");
|
}
|
||||||
|
else if (!strcmp(args[0], "experimental-mode")) {
|
||||||
|
level = ACCESS_EXPERIMENTAL;
|
||||||
|
level_str = "experimental-mode";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
appctx->cli_level &= ~ACCESS_EXPERT;
|
if (!*args[1]) {
|
||||||
|
memprintf(&output, "%s is %s\n", level_str,
|
||||||
|
(appctx->cli_level & level) ? "ON" : "OFF");
|
||||||
|
return cli_dynmsg(appctx, LOG_INFO, output);
|
||||||
|
}
|
||||||
|
|
||||||
|
appctx->cli_level &= ~level;
|
||||||
if (strcmp(args[1], "on") == 0)
|
if (strcmp(args[1], "on") == 0)
|
||||||
appctx->cli_level |= ACCESS_EXPERT;
|
appctx->cli_level |= level;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int cli_parse_default(char **args, char *payload, struct appctx *appctx, void *private)
|
int cli_parse_default(char **args, char *payload, struct appctx *appctx, void *private)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -2928,7 +2949,8 @@ static struct cli_kw_list cli_kws = {{ },{
|
|||||||
{ { "operator", NULL }, "operator : lower the level of the current CLI session to operator", cli_parse_set_lvl, NULL, NULL, NULL, ACCESS_MASTER},
|
{ { "operator", NULL }, "operator : lower the level of the current CLI session to operator", cli_parse_set_lvl, NULL, NULL, NULL, ACCESS_MASTER},
|
||||||
{ { "user", NULL }, "user : lower the level of the current CLI session to user", cli_parse_set_lvl, NULL, NULL, NULL, ACCESS_MASTER},
|
{ { "user", NULL }, "user : lower the level of the current CLI session to user", cli_parse_set_lvl, NULL, NULL, NULL, ACCESS_MASTER},
|
||||||
{ { "_getsocks", NULL }, NULL, _getsocks, NULL },
|
{ { "_getsocks", NULL }, NULL, _getsocks, NULL },
|
||||||
{ { "expert-mode", NULL }, NULL, cli_parse_expert_mode, NULL }, // not listed
|
{ { "expert-mode", NULL }, NULL, cli_parse_expert_experimental_mode, NULL }, // not listed
|
||||||
|
{ { "experimental-mode", NULL }, NULL, cli_parse_expert_experimental_mode, NULL }, // not listed
|
||||||
{{},}
|
{{},}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user