|
|
d1681e |
From fb84f6c69385e35f3a62504dfebc11b21ff4082a Mon Sep 17 00:00:00 2001
|
|
|
d1681e |
From: N Balachandran <nbalacha@redhat.com>
|
|
|
d1681e |
Date: Mon, 6 Nov 2017 09:30:54 +0530
|
|
|
d1681e |
Subject: [PATCH 075/128] cli: gluster help changes
|
|
|
d1681e |
|
|
|
d1681e |
gluster cli help now shows only the top level
|
|
|
d1681e |
help commands. gluster <component> help will now show
|
|
|
d1681e |
help commands for <component>.
|
|
|
d1681e |
|
|
|
d1681e |
> BUG: 1474768
|
|
|
d1681e |
> Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
|
|
d1681e |
> BUG: 1509786
|
|
|
d1681e |
> https://review.gluster.org/#/c/18666/
|
|
|
d1681e |
> Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
|
|
d1681e |
|
|
|
d1681e |
(cherry picked from commit 89dc54f50c9f800ca4446ea8fe736e4860588845)
|
|
|
d1681e |
Change-Id: I263f53a0870d80ef4cfaad455fdaa47e2ac4423b
|
|
|
d1681e |
BUG: 1498730
|
|
|
d1681e |
Signed-off-by: N Balachandran <nbalacha@redhat.com>
|
|
|
d1681e |
Reviewed-on: https://code.engineering.redhat.com/gerrit/123525
|
|
|
d1681e |
Tested-by: RHGS Build Bot <nigelb@redhat.com>
|
|
|
d1681e |
Reviewed-by: Atin Mukherjee <amukherj@redhat.com>
|
|
|
d1681e |
---
|
|
|
d1681e |
cli/src/cli-cmd-global.c | 3 +
|
|
|
d1681e |
cli/src/cli-cmd-misc.c | 77 ++++++++--
|
|
|
d1681e |
cli/src/cli-cmd-parser.c | 20 ++-
|
|
|
d1681e |
cli/src/cli-cmd-peer.c | 9 +-
|
|
|
d1681e |
cli/src/cli-cmd-snapshot.c | 5 +
|
|
|
d1681e |
cli/src/cli-cmd-volume.c | 347 ++++++++++++++++++++++++++++++++++++++-------
|
|
|
d1681e |
cli/src/cli.c | 2 +-
|
|
|
d1681e |
7 files changed, 387 insertions(+), 76 deletions(-)
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-global.c b/cli/src/cli-cmd-global.c
|
|
|
d1681e |
index 881506b..1f9cb54 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-global.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-global.c
|
|
|
d1681e |
@@ -68,11 +68,14 @@ cli_cmd_global_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
count = (sizeof (global_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
cli_cmd_sort (cmd, count);
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\ngluster global commands");
|
|
|
d1681e |
+ cli_out ("========================\n");
|
|
|
d1681e |
for (global_cmd = cmd; global_cmd->pattern; global_cmd++)
|
|
|
d1681e |
if (_gf_false == global_cmd->disable)
|
|
|
d1681e |
cli_out ("%s - %s", global_cmd->pattern,
|
|
|
d1681e |
global_cmd->desc);
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
GF_FREE (cmd);
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-misc.c b/cli/src/cli-cmd-misc.c
|
|
|
d1681e |
index 9f8c159..c887515 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-misc.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-misc.c
|
|
|
d1681e |
@@ -23,6 +23,9 @@ extern struct rpc_clnt *global_rpc;
|
|
|
d1681e |
extern rpc_clnt_prog_t *cli_rpc_prog;
|
|
|
d1681e |
|
|
|
d1681e |
extern struct cli_cmd volume_cmds[];
|
|
|
d1681e |
+extern struct cli_cmd bitrot_cmds[];
|
|
|
d1681e |
+extern struct cli_cmd quota_cmds[];
|
|
|
d1681e |
+extern struct cli_cmd tier_cmds[];
|
|
|
d1681e |
extern struct cli_cmd cli_probe_cmds[];
|
|
|
d1681e |
extern struct cli_cmd cli_log_cmds[];
|
|
|
d1681e |
extern struct cli_cmd cli_system_cmds[];
|
|
|
d1681e |
@@ -38,37 +41,76 @@ cli_cmd_quit_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
|
|
d1681e |
exit (0);
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+
|
|
|
d1681e |
+static gf_boolean_t
|
|
|
d1681e |
+cli_is_help_command (const char *pattern)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ /* FixFixFix
|
|
|
d1681e |
+ * This is not the best way to determine whether
|
|
|
d1681e |
+ * this is a help command
|
|
|
d1681e |
+ */
|
|
|
d1681e |
+ if (strstr (pattern, "help"))
|
|
|
d1681e |
+ return _gf_true;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ return _gf_false;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+
|
|
|
d1681e |
int
|
|
|
d1681e |
cli_cmd_display_help (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
const char **words, int wordcount)
|
|
|
d1681e |
{
|
|
|
d1681e |
- struct cli_cmd *cmd[] = {volume_cmds, cli_probe_cmds,
|
|
|
d1681e |
- cli_misc_cmds, snapshot_cmds,
|
|
|
d1681e |
- global_cmds, NULL};
|
|
|
d1681e |
- struct cli_cmd *cmd_ind = NULL;
|
|
|
d1681e |
- int i = 0;
|
|
|
d1681e |
+ struct cli_cmd *cmd[] = {cli_misc_cmds, cli_probe_cmds,
|
|
|
d1681e |
+ volume_cmds, bitrot_cmds, quota_cmds,
|
|
|
d1681e |
+#if !defined(__NetBSD__)
|
|
|
d1681e |
+ tier_cmds,
|
|
|
d1681e |
+#endif
|
|
|
d1681e |
+ snapshot_cmds, global_cmds, NULL};
|
|
|
d1681e |
+ struct cli_cmd *cmd_ind = NULL;
|
|
|
d1681e |
+ int i = 0;
|
|
|
d1681e |
+ gf_boolean_t list_all = _gf_false;
|
|
|
d1681e |
|
|
|
d1681e |
/* cli_system_cmds commands for internal usage
|
|
|
d1681e |
they are not exposed
|
|
|
d1681e |
*/
|
|
|
d1681e |
- for (i=0; cmd[i]!=NULL; i++)
|
|
|
d1681e |
- for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++)
|
|
|
d1681e |
- if (_gf_false == cmd_ind->disable)
|
|
|
d1681e |
- cli_out ("%s - %s", cmd_ind->pattern,
|
|
|
d1681e |
- cmd_ind->desc);
|
|
|
d1681e |
|
|
|
d1681e |
+ /* If "help all" */
|
|
|
d1681e |
+ if (wordcount == 2)
|
|
|
d1681e |
+ list_all = _gf_true;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ for (i = 0; cmd[i] != NULL; i++) {
|
|
|
d1681e |
+ for (cmd_ind = cmd[i]; cmd_ind->pattern; cmd_ind++) {
|
|
|
d1681e |
+ if ((_gf_false == cmd_ind->disable) &&
|
|
|
d1681e |
+ cli_is_help_command (cmd_ind->pattern)) {
|
|
|
d1681e |
+ if (list_all && (cmd_ind->cbk)) {
|
|
|
d1681e |
+ cmd_ind->cbk (state, in_word, words,
|
|
|
d1681e |
+ wordcount);
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
+ cli_out (" %-25s- %s", cmd_ind->pattern,
|
|
|
d1681e |
+ cmd_ind->desc);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+
|
|
|
d1681e |
+struct cli_cmd cli_help_cmds[] = {
|
|
|
d1681e |
+ { "help [all]",
|
|
|
d1681e |
+ cli_cmd_display_help,
|
|
|
d1681e |
+ "display help for command classes"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { NULL, NULL, NULL }
|
|
|
d1681e |
+};
|
|
|
d1681e |
+
|
|
|
d1681e |
+
|
|
|
d1681e |
struct cli_cmd cli_misc_cmds[] = {
|
|
|
d1681e |
{ "quit",
|
|
|
d1681e |
cli_cmd_quit_cbk,
|
|
|
d1681e |
"quit"},
|
|
|
d1681e |
-
|
|
|
d1681e |
- { "help",
|
|
|
d1681e |
- cli_cmd_display_help,
|
|
|
d1681e |
- "display command options"},
|
|
|
d1681e |
-
|
|
|
d1681e |
{ "exit",
|
|
|
d1681e |
cli_cmd_quit_cbk,
|
|
|
d1681e |
"exit"},
|
|
|
d1681e |
@@ -84,7 +126,12 @@ cli_cmd_misc_register (struct cli_state *state)
|
|
|
d1681e |
struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
for (cmd = cli_misc_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
+ ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
+ if (ret)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
+ for (cmd = cli_help_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
if (ret)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-parser.c b/cli/src/cli-cmd-parser.c
|
|
|
d1681e |
index a35fc74..c95b262 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-parser.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-parser.c
|
|
|
d1681e |
@@ -1189,8 +1189,13 @@ cli_cmd_quota_parse (const char **words, int wordcount, dict_t **options)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
- if (wordcount < 4)
|
|
|
d1681e |
+ if (wordcount < 4) {
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if ((wordcount == 3) && !(strcmp (words[2], "help"))) {
|
|
|
d1681e |
+ ret = 1;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
volname = (char *)words[2];
|
|
|
d1681e |
if (!volname) {
|
|
|
d1681e |
@@ -5588,15 +5593,22 @@ cli_cmd_bitrot_parse (const char **words, int wordcount, dict_t **options)
|
|
|
d1681e |
GF_ASSERT (words);
|
|
|
d1681e |
GF_ASSERT (options);
|
|
|
d1681e |
|
|
|
d1681e |
- dict = dict_new ();
|
|
|
d1681e |
- if (!dict)
|
|
|
d1681e |
- goto out;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ /* Hack to print out bitrot help properly */
|
|
|
d1681e |
+ if ((wordcount == 3) && !(strcmp (words[2], "help"))) {
|
|
|
d1681e |
+ ret = 1;
|
|
|
d1681e |
+ return ret;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
if (wordcount < 4 || wordcount > 5) {
|
|
|
d1681e |
gf_log ("cli", GF_LOG_ERROR, "Invalid syntax");
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+ dict = dict_new ();
|
|
|
d1681e |
+ if (!dict)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+
|
|
|
d1681e |
volname = (char *)words[2];
|
|
|
d1681e |
if (!volname) {
|
|
|
d1681e |
ret = -1;
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-peer.c b/cli/src/cli-cmd-peer.c
|
|
|
d1681e |
index 4802f71..7df60bc 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-peer.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-peer.c
|
|
|
d1681e |
@@ -264,7 +264,7 @@ struct cli_cmd cli_probe_cmds[] = {
|
|
|
d1681e |
|
|
|
d1681e |
{ "peer help",
|
|
|
d1681e |
cli_cmd_peer_help_cbk,
|
|
|
d1681e |
- "Help command for peer "},
|
|
|
d1681e |
+ "display help for peer commands"},
|
|
|
d1681e |
|
|
|
d1681e |
{ "pool list",
|
|
|
d1681e |
cli_cmd_pool_list_cbk,
|
|
|
d1681e |
@@ -281,17 +281,20 @@ cli_cmd_peer_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
struct cli_cmd *probe_cmd = NULL;
|
|
|
d1681e |
int count = 0;
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\ngluster peer commands");
|
|
|
d1681e |
+ cli_out ("======================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
cmd = GF_CALLOC (1, sizeof (cli_probe_cmds), cli_mt_cli_cmd);
|
|
|
d1681e |
memcpy (cmd, cli_probe_cmds, sizeof (cli_probe_cmds));
|
|
|
d1681e |
count = (sizeof (cli_probe_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
cli_cmd_sort (cmd, count);
|
|
|
d1681e |
|
|
|
d1681e |
-
|
|
|
d1681e |
-
|
|
|
d1681e |
for (probe_cmd = cmd; probe_cmd->pattern; probe_cmd++)
|
|
|
d1681e |
cli_out ("%s - %s", probe_cmd->pattern, probe_cmd->desc);
|
|
|
d1681e |
|
|
|
d1681e |
GF_FREE (cmd);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-snapshot.c b/cli/src/cli-cmd-snapshot.c
|
|
|
d1681e |
index e79128c..88b4737 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-snapshot.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-snapshot.c
|
|
|
d1681e |
@@ -140,9 +140,14 @@ cli_cmd_snapshot_help_cbk (struct cli_state *state,
|
|
|
d1681e |
count = (sizeof (snapshot_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
cli_cmd_sort (cmd, count);
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\ngluster snapshot commands");
|
|
|
d1681e |
+ cli_out ("=========================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
for (snap_cmd = cmd; snap_cmd->pattern; snap_cmd++)
|
|
|
d1681e |
if (_gf_false == snap_cmd->disable)
|
|
|
d1681e |
cli_out ("%s - %s", snap_cmd->pattern, snap_cmd->desc);
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
GF_FREE (cmd);
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/cli/src/cli-cmd-volume.c b/cli/src/cli-cmd-volume.c
|
|
|
d1681e |
index ca9da0a..a1e5c51 100644
|
|
|
d1681e |
--- a/cli/src/cli-cmd-volume.c
|
|
|
d1681e |
+++ b/cli/src/cli-cmd-volume.c
|
|
|
d1681e |
@@ -36,7 +36,19 @@ extern rpc_clnt_prog_t cli_quotad_clnt;
|
|
|
d1681e |
|
|
|
d1681e |
int
|
|
|
d1681e |
cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
- const char **words, int wordcount);
|
|
|
d1681e |
+ const char **words, int wordcount);
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
+cli_cmd_bitrot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount);
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
+cli_cmd_quota_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount);
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
+cli_cmd_tier_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount);
|
|
|
d1681e |
|
|
|
d1681e |
int
|
|
|
d1681e |
cli_cmd_volume_info_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
|
|
d1681e |
@@ -1293,9 +1305,12 @@ cli_cmd_volume_tier_cbk (struct cli_state *state,
|
|
|
d1681e |
|
|
|
d1681e |
|
|
|
d1681e |
if (wordcount < 4) {
|
|
|
d1681e |
- cli_usage_out (word->pattern);
|
|
|
d1681e |
- if (wordcount == 3 && !strcmp(words[2], "help"))
|
|
|
d1681e |
+ if (wordcount == 3 && !strcmp(words[2], "help")) {
|
|
|
d1681e |
+ cli_cmd_tier_help_cbk (state, word, words, wordcount);
|
|
|
d1681e |
ret = 0;
|
|
|
d1681e |
+ } else {
|
|
|
d1681e |
+ cli_usage_out (word->pattern);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
@@ -1719,6 +1734,8 @@ out:
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+
|
|
|
d1681e |
+
|
|
|
d1681e |
int
|
|
|
d1681e |
cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
|
|
d1681e |
const char **words, int wordcount)
|
|
|
d1681e |
@@ -1746,6 +1763,13 @@ cli_cmd_bitrot_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+ if (ret == 1) {
|
|
|
d1681e |
+ /* this is 'volume bitrot help' */
|
|
|
d1681e |
+ cli_cmd_bitrot_help_cbk (state, word, words, wordcount);
|
|
|
d1681e |
+ ret = 0;
|
|
|
d1681e |
+ goto out2;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
frame = create_frame (THIS, THIS->ctx->pool);
|
|
|
d1681e |
if (!frame) {
|
|
|
d1681e |
ret = -1;
|
|
|
d1681e |
@@ -1834,7 +1858,7 @@ out:
|
|
|
d1681e |
#endif
|
|
|
d1681e |
|
|
|
d1681e |
CLI_STACK_DESTROY (frame);
|
|
|
d1681e |
-
|
|
|
d1681e |
+out2:
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
@@ -1866,6 +1890,12 @@ cli_cmd_quota_cbk (struct cli_state *state, struct cli_cmd_word *word,
|
|
|
d1681e |
}
|
|
|
d1681e |
} else {
|
|
|
d1681e |
ret = cli_cmd_quota_parse (words, wordcount, &options);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ if (ret == 1) {
|
|
|
d1681e |
+ cli_cmd_quota_help_cbk (state, word, words, wordcount);
|
|
|
d1681e |
+ ret = 0;
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
if (ret < 0) {
|
|
|
d1681e |
cli_usage_out (word->pattern);
|
|
|
d1681e |
parse_err = 1;
|
|
|
d1681e |
@@ -3157,7 +3187,159 @@ out:
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
+
|
|
|
d1681e |
+/* This is a bit of a hack to display the help. The current bitrot cmd
|
|
|
d1681e |
+ * format does not work well when registering the cmds.
|
|
|
d1681e |
+ * Ideally the should have been of the form
|
|
|
d1681e |
+ * gluster volume bitrot <subcommand> <volumename> ...
|
|
|
d1681e |
+ */
|
|
|
d1681e |
+
|
|
|
d1681e |
+struct cli_cmd bitrot_cmds[] = {
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot help",
|
|
|
d1681e |
+ cli_cmd_bitrot_help_cbk,
|
|
|
d1681e |
+ "display help for volume bitrot commands"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot <VOLNAME> {enable|disable}",
|
|
|
d1681e |
+ NULL, /*cli_cmd_bitrot_cbk,*/
|
|
|
d1681e |
+ "Enable/disable bitrot for volume <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot <VOLNAME> scrub-throttle {lazy|normal|aggressive}",
|
|
|
d1681e |
+ NULL, /*cli_cmd_bitrot_cbk,*/
|
|
|
d1681e |
+ "Set the speed of the scrubber for volume <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot <VOLNAME> scrub-frequency {hourly|daily|weekly|biweekly"
|
|
|
d1681e |
+ "|monthly}",
|
|
|
d1681e |
+ NULL, /*cli_cmd_bitrot_cbk,*/
|
|
|
d1681e |
+ "Set the frequency of the scrubber for volume <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot <VOLNAME> scrub {pause|resume|status|ondemand}",
|
|
|
d1681e |
+ NULL, /*cli_cmd_bitrot_cbk,*/
|
|
|
d1681e |
+ "Pause/resume the scrubber for <VOLNAME>. Status displays the status of "
|
|
|
d1681e |
+ "the scrubber. ondemand starts the scrubber immediately."
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume bitrot <VOLNAME> {enable|disable}\n"
|
|
|
d1681e |
+ "volume bitrot <volname> scrub-throttle {lazy|normal|aggressive}\n"
|
|
|
d1681e |
+ "volume bitrot <volname> scrub-frequency {hourly|daily|weekly|biweekly"
|
|
|
d1681e |
+ "|monthly}\n"
|
|
|
d1681e |
+ "volume bitrot <volname> scrub {pause|resume|status|ondemand}",
|
|
|
d1681e |
+ cli_cmd_bitrot_cbk,
|
|
|
d1681e |
+ NULL
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { NULL, NULL, NULL }
|
|
|
d1681e |
+};
|
|
|
d1681e |
+
|
|
|
d1681e |
+
|
|
|
d1681e |
+struct cli_cmd quota_cmds[] = {
|
|
|
d1681e |
+
|
|
|
d1681e |
+ /* Quota commands */
|
|
|
d1681e |
+ {"volume quota help",
|
|
|
d1681e |
+ cli_cmd_quota_help_cbk,
|
|
|
d1681e |
+ "display help for volume quota commands"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume quota <VOLNAME> {enable|disable|list [<path> ...]| "
|
|
|
d1681e |
+ "list-objects [<path> ...] | remove <path>| remove-objects <path> | "
|
|
|
d1681e |
+ "default-soft-limit <percent>}",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ "Enable/disable and configure quota for <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ "Set maximum size for <path> for <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ "Set the maximum number of entries allowed in <path> for <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {"volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ "Set quota timeout for <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume inode-quota <VOLNAME> enable",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ "Enable/disable inode-quota for <VOLNAME>"
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume quota <VOLNAME> {enable|disable|list [<path> ...]| "
|
|
|
d1681e |
+ "list-objects [<path> ...] | remove <path>| remove-objects <path> | "
|
|
|
d1681e |
+ "default-soft-limit <percent>}\n"
|
|
|
d1681e |
+ "volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]}\n"
|
|
|
d1681e |
+ "volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]}\n"
|
|
|
d1681e |
+ "volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}",
|
|
|
d1681e |
+ cli_cmd_quota_cbk,
|
|
|
d1681e |
+ NULL
|
|
|
d1681e |
+ },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { NULL, NULL, NULL }
|
|
|
d1681e |
+};
|
|
|
d1681e |
+
|
|
|
d1681e |
+struct cli_cmd tier_cmds[] = {
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier help",
|
|
|
d1681e |
+ cli_cmd_tier_help_cbk,
|
|
|
d1681e |
+ "display help for volume tier commands"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> status",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "Display tier status for <VOLNAME>"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> start [force]",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "Start the tier service for <VOLNAME>"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> stop [force]",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "Stop the tier service for <VOLNAME>"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "Attach a hot tier to <VOLNAME>"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "Detach the hot tier from <VOLNAME>"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume attach-tier <VOLNAME> [<replica COUNT>] <NEW-BRICK>...",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "NOTE: this is old syntax, will be deprecated in next release. "
|
|
|
d1681e |
+ "Please use gluster volume tier <vol> attach "
|
|
|
d1681e |
+ "[<replica COUNT>] <NEW-BRICK>..."},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume detach-tier <VOLNAME> "
|
|
|
d1681e |
+ "<start|stop|status|commit|force>",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ "NOTE: this is old syntax, will be deprecated in next release. "
|
|
|
d1681e |
+ "Please use gluster volume tier <vol> detach "
|
|
|
d1681e |
+ "{start|stop|commit} [force]"},
|
|
|
d1681e |
+
|
|
|
d1681e |
+ { "volume tier <VOLNAME> status\n"
|
|
|
d1681e |
+ "volume tier <VOLNAME> start [force]\n"
|
|
|
d1681e |
+ "volume tier <VOLNAME> stop\n"
|
|
|
d1681e |
+ "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]\n"
|
|
|
d1681e |
+ "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>\n",
|
|
|
d1681e |
+ cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
+ NULL },
|
|
|
d1681e |
+
|
|
|
d1681e |
+ {NULL, NULL, NULL}
|
|
|
d1681e |
+
|
|
|
d1681e |
+ };
|
|
|
d1681e |
+
|
|
|
d1681e |
struct cli_cmd volume_cmds[] = {
|
|
|
d1681e |
+ { "volume help",
|
|
|
d1681e |
+ cli_cmd_volume_help_cbk,
|
|
|
d1681e |
+ "display help for volume commands"},
|
|
|
d1681e |
+
|
|
|
d1681e |
{ "volume info [all|<VOLNAME>]",
|
|
|
d1681e |
cli_cmd_volume_info_cbk,
|
|
|
d1681e |
"list information of all volumes"},
|
|
|
d1681e |
@@ -3190,29 +3372,6 @@ struct cli_cmd volume_cmds[] = {
|
|
|
d1681e |
cli_cmd_volume_rename_cbk,
|
|
|
d1681e |
"rename volume <VOLNAME> to <NEW-VOLNAME>"},*/
|
|
|
d1681e |
|
|
|
d1681e |
-#if !defined(__NetBSD__)
|
|
|
d1681e |
- { "volume tier <VOLNAME> status\n"
|
|
|
d1681e |
- "volume tier <VOLNAME> start [force]\n"
|
|
|
d1681e |
- "volume tier <VOLNAME> stop\n"
|
|
|
d1681e |
- "volume tier <VOLNAME> attach [<replica COUNT>] <NEW-BRICK>... [force]\n"
|
|
|
d1681e |
- "volume tier <VOLNAME> detach <start|stop|status|commit|[force]>\n",
|
|
|
d1681e |
- cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
- "Tier translator specific operations."},
|
|
|
d1681e |
-
|
|
|
d1681e |
- { "volume attach-tier <VOLNAME> [<replica COUNT>] <NEW-BRICK>...",
|
|
|
d1681e |
- cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
- "NOTE: this is old syntax, will be depreciated in next release. "
|
|
|
d1681e |
- "Please use gluster volume tier <vol> attach "
|
|
|
d1681e |
- "[<replica COUNT>] <NEW-BRICK>..."},
|
|
|
d1681e |
-
|
|
|
d1681e |
- { "volume detach-tier <VOLNAME> "
|
|
|
d1681e |
- " <start|stop|status|commit|force>",
|
|
|
d1681e |
- cli_cmd_volume_tier_cbk,
|
|
|
d1681e |
- "NOTE: this is old syntax, will be depreciated in next release. "
|
|
|
d1681e |
- "Please use gluster volume tier <vol> detach "
|
|
|
d1681e |
- "{start|stop|commit} [force]"},
|
|
|
d1681e |
-#endif
|
|
|
d1681e |
-
|
|
|
d1681e |
{ "volume add-brick <VOLNAME> [<stripe|replica> <COUNT> "
|
|
|
d1681e |
"[arbiter <COUNT>]] <NEW-BRICK> ... [force]",
|
|
|
d1681e |
cli_cmd_volume_add_brick_cbk,
|
|
|
d1681e |
@@ -3240,9 +3399,6 @@ struct cli_cmd volume_cmds[] = {
|
|
|
d1681e |
cli_cmd_volume_set_cbk,
|
|
|
d1681e |
"set options for volume <VOLNAME>"},
|
|
|
d1681e |
|
|
|
d1681e |
- { "volume help",
|
|
|
d1681e |
- cli_cmd_volume_help_cbk,
|
|
|
d1681e |
- "display help for the volume command"},
|
|
|
d1681e |
|
|
|
d1681e |
{ "volume log <VOLNAME> rotate [BRICK]",
|
|
|
d1681e |
cli_cmd_log_rotate_cbk,
|
|
|
d1681e |
@@ -3273,19 +3429,6 @@ struct cli_cmd volume_cmds[] = {
|
|
|
d1681e |
cli_cmd_volume_profile_cbk,
|
|
|
d1681e |
"volume profile operations"},
|
|
|
d1681e |
|
|
|
d1681e |
- { "volume quota <VOLNAME> {enable|disable|list [<path> ...]| "
|
|
|
d1681e |
- "list-objects [<path> ...] | remove <path>| remove-objects <path> | "
|
|
|
d1681e |
- "default-soft-limit <percent>} |\n"
|
|
|
d1681e |
- "volume quota <VOLNAME> {limit-usage <path> <size> [<percent>]} |\n"
|
|
|
d1681e |
- "volume quota <VOLNAME> {limit-objects <path> <number> [<percent>]} |\n"
|
|
|
d1681e |
- "volume quota <VOLNAME> {alert-time|soft-timeout|hard-timeout} {<time>}",
|
|
|
d1681e |
- cli_cmd_quota_cbk,
|
|
|
d1681e |
- "quota translator specific operations"},
|
|
|
d1681e |
-
|
|
|
d1681e |
- { "volume inode-quota <VOLNAME> enable",
|
|
|
d1681e |
- cli_cmd_quota_cbk,
|
|
|
d1681e |
- "quota translator specific operations"},
|
|
|
d1681e |
-
|
|
|
d1681e |
{ "volume top <VOLNAME> {open|read|write|opendir|readdir|clear} [nfs|brick <brick>] [list-cnt <value>] |\n"
|
|
|
d1681e |
"volume top <VOLNAME> {read-perf|write-perf} [bs <size> count <count>] [brick <brick>] [list-cnt <value>]",
|
|
|
d1681e |
cli_cmd_volume_top_cbk,
|
|
|
d1681e |
@@ -3329,26 +3472,99 @@ struct cli_cmd volume_cmds[] = {
|
|
|
d1681e |
" or all option. gluster volume get all all is to get all global "
|
|
|
d1681e |
"options"
|
|
|
d1681e |
},
|
|
|
d1681e |
- {"volume bitrot <VOLNAME> {enable|disable} |\n"
|
|
|
d1681e |
- "volume bitrot <volname> scrub-throttle {lazy|normal|aggressive} |\n"
|
|
|
d1681e |
- "volume bitrot <volname> scrub-frequency {hourly|daily|weekly|biweekly"
|
|
|
d1681e |
- "|monthly} |\n"
|
|
|
d1681e |
- "volume bitrot <volname> scrub {pause|resume|status|ondemand}",
|
|
|
d1681e |
- cli_cmd_bitrot_cbk,
|
|
|
d1681e |
- "Bitrot translator specific operation. For more information about "
|
|
|
d1681e |
- "bitrot command type 'man gluster'"
|
|
|
d1681e |
- },
|
|
|
d1681e |
+
|
|
|
d1681e |
{ "volume reset-brick <VOLNAME> <SOURCE-BRICK> {{start} |"
|
|
|
d1681e |
" {<NEW-BRICK> commit}}",
|
|
|
d1681e |
cli_cmd_volume_reset_brick_cbk,
|
|
|
d1681e |
"reset-brick operations"},
|
|
|
d1681e |
|
|
|
d1681e |
+
|
|
|
d1681e |
{ NULL, NULL, NULL }
|
|
|
d1681e |
};
|
|
|
d1681e |
|
|
|
d1681e |
int
|
|
|
d1681e |
+cli_cmd_quota_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
+ struct cli_cmd *quota_cmd = NULL;
|
|
|
d1681e |
+ int count = 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cmd = GF_CALLOC (1, sizeof (quota_cmds), cli_mt_cli_cmd);
|
|
|
d1681e |
+ memcpy (cmd, quota_cmds, sizeof (quota_cmds));
|
|
|
d1681e |
+ count = (sizeof (quota_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
+ cli_cmd_sort (cmd, count);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\ngluster quota commands");
|
|
|
d1681e |
+ cli_out ("=======================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
+ for (quota_cmd = cmd; quota_cmd->pattern; quota_cmd++)
|
|
|
d1681e |
+ if ((_gf_false == quota_cmd->disable) && (quota_cmd->desc))
|
|
|
d1681e |
+ cli_out ("%s - %s", quota_cmd->pattern,
|
|
|
d1681e |
+ quota_cmd->desc);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
+ GF_FREE (cmd);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
+cli_cmd_bitrot_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
+ struct cli_cmd *bitrot_cmd = NULL;
|
|
|
d1681e |
+ int count = 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cmd = GF_CALLOC (1, sizeof (bitrot_cmds), cli_mt_cli_cmd);
|
|
|
d1681e |
+ memcpy (cmd, bitrot_cmds, sizeof (bitrot_cmds));
|
|
|
d1681e |
+ count = (sizeof (bitrot_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
+ cli_cmd_sort (cmd, count);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\ngluster bitrot commands");
|
|
|
d1681e |
+ cli_out ("========================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
+ for (bitrot_cmd = cmd; bitrot_cmd->pattern; bitrot_cmd++)
|
|
|
d1681e |
+ if ((_gf_false == bitrot_cmd->disable) && (bitrot_cmd->desc))
|
|
|
d1681e |
+ cli_out ("%s - %s", bitrot_cmd->pattern,
|
|
|
d1681e |
+ bitrot_cmd->desc);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
+ GF_FREE (cmd);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
+cli_cmd_tier_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
+ const char **words, int wordcount)
|
|
|
d1681e |
+{
|
|
|
d1681e |
+ struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
+ struct cli_cmd *tier_cmd = NULL;
|
|
|
d1681e |
+ int count = 0;
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cmd = GF_CALLOC (1, sizeof (tier_cmds), cli_mt_cli_cmd);
|
|
|
d1681e |
+ memcpy (cmd, tier_cmds, sizeof (tier_cmds));
|
|
|
d1681e |
+ count = (sizeof (tier_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
+ cli_cmd_sort (cmd, count);
|
|
|
d1681e |
+
|
|
|
d1681e |
+ cli_out ("\ngluster tier commands");
|
|
|
d1681e |
+ cli_out ("======================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
+ for (tier_cmd = cmd; tier_cmd->pattern; tier_cmd++) {
|
|
|
d1681e |
+ if ((_gf_false == tier_cmd->disable) && tier_cmd->desc) {
|
|
|
d1681e |
+ cli_out ("%s - %s", tier_cmd->pattern, tier_cmd->desc);
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
+ GF_FREE (cmd);
|
|
|
d1681e |
+ return 0;
|
|
|
d1681e |
+}
|
|
|
d1681e |
+
|
|
|
d1681e |
+int
|
|
|
d1681e |
cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
- const char **words, int wordcount)
|
|
|
d1681e |
+ const char **words, int wordcount)
|
|
|
d1681e |
{
|
|
|
d1681e |
struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
struct cli_cmd *vol_cmd = NULL;
|
|
|
d1681e |
@@ -3359,10 +3575,14 @@ cli_cmd_volume_help_cbk (struct cli_state *state, struct cli_cmd_word *in_word,
|
|
|
d1681e |
count = (sizeof (volume_cmds) / sizeof (struct cli_cmd));
|
|
|
d1681e |
cli_cmd_sort (cmd, count);
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\ngluster volume commands");
|
|
|
d1681e |
+ cli_out ("========================\n");
|
|
|
d1681e |
+
|
|
|
d1681e |
for (vol_cmd = cmd; vol_cmd->pattern; vol_cmd++)
|
|
|
d1681e |
if (_gf_false == vol_cmd->disable)
|
|
|
d1681e |
cli_out ("%s - %s", vol_cmd->pattern, vol_cmd->desc);
|
|
|
d1681e |
|
|
|
d1681e |
+ cli_out ("\n");
|
|
|
d1681e |
GF_FREE (cmd);
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
@@ -3374,11 +3594,32 @@ cli_cmd_volume_register (struct cli_state *state)
|
|
|
d1681e |
struct cli_cmd *cmd = NULL;
|
|
|
d1681e |
|
|
|
d1681e |
for (cmd = volume_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
+ ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
+ if (ret)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+ for (cmd = bitrot_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
+ ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
+ if (ret)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
|
|
|
d1681e |
+ for (cmd = quota_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
if (ret)
|
|
|
d1681e |
goto out;
|
|
|
d1681e |
}
|
|
|
d1681e |
+
|
|
|
d1681e |
+#if !defined(__NetBSD__)
|
|
|
d1681e |
+ for (cmd = tier_cmds; cmd->pattern; cmd++) {
|
|
|
d1681e |
+ ret = cli_cmd_register (&state->tree, cmd);
|
|
|
d1681e |
+ if (ret)
|
|
|
d1681e |
+ goto out;
|
|
|
d1681e |
+ }
|
|
|
d1681e |
+
|
|
|
d1681e |
+#endif
|
|
|
d1681e |
+
|
|
|
d1681e |
out:
|
|
|
d1681e |
return ret;
|
|
|
d1681e |
}
|
|
|
d1681e |
diff --git a/cli/src/cli.c b/cli/src/cli.c
|
|
|
d1681e |
index 18ca5c8..ce06366 100644
|
|
|
d1681e |
--- a/cli/src/cli.c
|
|
|
d1681e |
+++ b/cli/src/cli.c
|
|
|
d1681e |
@@ -515,7 +515,7 @@ cli_usage_out (const char *usage)
|
|
|
d1681e |
if (!usage || usage[0] == '\0')
|
|
|
d1681e |
return -1;
|
|
|
d1681e |
|
|
|
d1681e |
- cli_err ("Usage: %s", usage);
|
|
|
d1681e |
+ cli_err ("\nUsage:\n%s\n", usage);
|
|
|
d1681e |
return 0;
|
|
|
d1681e |
}
|
|
|
d1681e |
|
|
|
d1681e |
--
|
|
|
d1681e |
1.8.3.1
|
|
|
d1681e |
|