From e1536bb734abb8f8b70a5a95265518fab26bfd2b Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Fri, 29 Aug 2025 14:37:05 +0100 Subject: [PATCH] Ctrl shell: Add help topics to auto complete --- apps/mosquitto_ctrl/ctrl_shell.h | 2 +- apps/mosquitto_ctrl/ctrl_shell_broker.c | 17 +++-- .../ctrl_shell_completion_tree.c | 4 +- apps/mosquitto_ctrl/ctrl_shell_dynsec.c | 75 ++++++++++--------- apps/mosquitto_ctrl/ctrl_shell_post_connect.c | 15 ++-- apps/mosquitto_ctrl/ctrl_shell_pre_connect.c | 13 +++- 6 files changed, 73 insertions(+), 53 deletions(-) diff --git a/apps/mosquitto_ctrl/ctrl_shell.h b/apps/mosquitto_ctrl/ctrl_shell.h index ffeb904e..0295c6d5 100644 --- a/apps/mosquitto_ctrl/ctrl_shell.h +++ b/apps/mosquitto_ctrl/ctrl_shell.h @@ -78,7 +78,7 @@ void completion_tree_arg_list_free(struct completion_tree_arg_list *arg_list); void completion_tree_arg_list_args_free(struct completion_tree_arg_list *arg_list); void completion_tree_cmd_free(struct completion_tree_cmd *cmd); void completion_tree_free(struct completion_tree_root *tree); -struct completion_tree_cmd *completion_tree_cmd_add(struct completion_tree_root *root, const char *name); +struct completion_tree_cmd *completion_tree_cmd_add(struct completion_tree_root *root, struct completion_tree_arg_list *help_arg_list, const char *name); struct completion_tree_arg_list *completion_tree_cmd_new_arg_list(void); void completion_tree_cmd_append_arg_list(struct completion_tree_cmd *cmd, struct completion_tree_arg_list *new_list); struct completion_tree_arg_list *completion_tree_cmd_add_arg_list(struct completion_tree_cmd *cmd); diff --git a/apps/mosquitto_ctrl/ctrl_shell_broker.c b/apps/mosquitto_ctrl/ctrl_shell_broker.c index 7c2aa2f1..7c7ab6f9 100644 --- a/apps/mosquitto_ctrl/ctrl_shell_broker.c +++ b/apps/mosquitto_ctrl/ctrl_shell_broker.c @@ -32,16 +32,21 @@ static struct completion_tree_root *commands_broker = NULL; static void command_tree_create(void) { + struct completion_tree_cmd *cmd; + struct completion_tree_arg_list *help_arg_list; + if(commands_broker) return; commands_broker = calloc(1, sizeof(struct completion_tree_root)); - completion_tree_cmd_add(commands_broker, "listPlugins"); - completion_tree_cmd_add(commands_broker, "listListeners"); - completion_tree_cmd_add(commands_broker, "disconnect"); - completion_tree_cmd_add(commands_broker, "help"); - completion_tree_cmd_add(commands_broker, "return"); - completion_tree_cmd_add(commands_broker, "exit"); + cmd = completion_tree_cmd_add(commands_broker, NULL, "help"); + help_arg_list = completion_tree_cmd_add_arg_list(cmd); + + completion_tree_cmd_add(commands_broker, help_arg_list, "listPlugins"); + completion_tree_cmd_add(commands_broker, help_arg_list, "listListeners"); + completion_tree_cmd_add(commands_broker, help_arg_list, "disconnect"); + completion_tree_cmd_add(commands_broker, help_arg_list, "return"); + completion_tree_cmd_add(commands_broker, help_arg_list, "exit"); } diff --git a/apps/mosquitto_ctrl/ctrl_shell_completion_tree.c b/apps/mosquitto_ctrl/ctrl_shell_completion_tree.c index 68f5c485..fd75d796 100644 --- a/apps/mosquitto_ctrl/ctrl_shell_completion_tree.c +++ b/apps/mosquitto_ctrl/ctrl_shell_completion_tree.c @@ -76,7 +76,7 @@ void completion_tree_free(struct completion_tree_root *tree) free(tree); } -struct completion_tree_cmd *completion_tree_cmd_add(struct completion_tree_root *root, const char *name) +struct completion_tree_cmd *completion_tree_cmd_add(struct completion_tree_root *root, struct completion_tree_arg_list *help_arg_list, const char *name) { struct completion_tree_cmd *new_node; @@ -88,6 +88,8 @@ struct completion_tree_cmd *completion_tree_cmd_add(struct completion_tree_root new_node->next = root->commands; root->commands = new_node; + completion_tree_arg_list_add_arg(help_arg_list, name); + return new_node; } diff --git a/apps/mosquitto_ctrl/ctrl_shell_dynsec.c b/apps/mosquitto_ctrl/ctrl_shell_dynsec.c index b2775dda..67b3b463 100644 --- a/apps/mosquitto_ctrl/ctrl_shell_dynsec.c +++ b/apps/mosquitto_ctrl/ctrl_shell_dynsec.c @@ -39,6 +39,7 @@ static void command_tree_create(void) { struct completion_tree_cmd *cmd; struct completion_tree_arg_list *arg_list; + struct completion_tree_arg_list *help_arg_list; completion_tree_arg_list_args_free(tree_clients); completion_tree_arg_list_args_free(tree_groups); @@ -63,20 +64,23 @@ static void command_tree_create(void) tree_roles->is_shared = true; } - cmd = completion_tree_cmd_add(commands_dynsec, "addClientRole"); + cmd = completion_tree_cmd_add(commands_dynsec, NULL, "help"); + help_arg_list = completion_tree_cmd_add_arg_list(cmd); + + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "addClientRole"); completion_tree_cmd_append_arg_list(cmd, tree_clients); completion_tree_cmd_append_arg_list(cmd, tree_roles); - cmd = completion_tree_cmd_add(commands_dynsec, "addGroupClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "addGroupClient"); completion_tree_cmd_append_arg_list(cmd, tree_groups); completion_tree_cmd_append_arg_list(cmd, tree_clients); - cmd = completion_tree_cmd_add(commands_dynsec, "addGroupRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "addGroupRole"); completion_tree_cmd_append_arg_list(cmd, tree_groups); completion_tree_cmd_append_arg_list(cmd, tree_roles); { - cmd = completion_tree_cmd_add(commands_dynsec, "addRoleACL"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "addRoleACL"); completion_tree_cmd_append_arg_list(cmd, tree_roles); arg_list = completion_tree_cmd_add_arg_list(cmd); @@ -92,58 +96,58 @@ static void command_tree_create(void) completion_tree_arg_list_add_arg(arg_list, "deny"); } - completion_tree_cmd_add(commands_dynsec, "createClient"); - completion_tree_cmd_add(commands_dynsec, "createGroup"); - completion_tree_cmd_add(commands_dynsec, "createRole"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "createClient"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "createGroup"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "createRole"); - cmd = completion_tree_cmd_add(commands_dynsec, "deleteClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "deleteClient"); completion_tree_cmd_append_arg_list(cmd, tree_clients); - cmd = completion_tree_cmd_add(commands_dynsec, "deleteGroup"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "deleteGroup"); completion_tree_cmd_append_arg_list(cmd, tree_groups); - cmd = completion_tree_cmd_add(commands_dynsec, "deleteRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "deleteRole"); completion_tree_cmd_append_arg_list(cmd, tree_roles); - cmd = completion_tree_cmd_add(commands_dynsec, "disableClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "disableClient"); completion_tree_cmd_append_arg_list(cmd, tree_clients); - cmd = completion_tree_cmd_add(commands_dynsec, "enableClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "enableClient"); completion_tree_cmd_append_arg_list(cmd, tree_clients); - completion_tree_cmd_add(commands_dynsec, "getAnonymousGroup"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "getAnonymousGroup"); - completion_tree_cmd_add(commands_dynsec, "getDetails"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "getDetails"); - cmd = completion_tree_cmd_add(commands_dynsec, "getClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "getClient"); completion_tree_cmd_append_arg_list(cmd, tree_clients); - completion_tree_cmd_add(commands_dynsec, "getDefaultACLAccess"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "getDefaultACLAccess"); - cmd = completion_tree_cmd_add(commands_dynsec, "getGroup"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "getGroup"); completion_tree_cmd_append_arg_list(cmd, tree_groups); - cmd = completion_tree_cmd_add(commands_dynsec, "getRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "getRole"); completion_tree_cmd_append_arg_list(cmd, tree_roles); - completion_tree_cmd_add(commands_dynsec, "listClients"); - completion_tree_cmd_add(commands_dynsec, "listGroups"); - completion_tree_cmd_add(commands_dynsec, "listRoles"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "listClients"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "listGroups"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "listRoles"); - cmd = completion_tree_cmd_add(commands_dynsec, "removeClientRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "removeClientRole"); completion_tree_cmd_append_arg_list(cmd, tree_clients); completion_tree_cmd_append_arg_list(cmd, tree_roles); - cmd = completion_tree_cmd_add(commands_dynsec, "removeGroupClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "removeGroupClient"); completion_tree_cmd_append_arg_list(cmd, tree_groups); completion_tree_cmd_append_arg_list(cmd, tree_clients); - cmd = completion_tree_cmd_add(commands_dynsec, "removeGroupRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "removeGroupRole"); completion_tree_cmd_append_arg_list(cmd, tree_groups); completion_tree_cmd_append_arg_list(cmd, tree_roles); { - cmd = completion_tree_cmd_add(commands_dynsec, "removeRoleACL"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "removeRoleACL"); completion_tree_cmd_append_arg_list(cmd, tree_roles); arg_list = completion_tree_cmd_add_arg_list(cmd); @@ -155,17 +159,17 @@ static void command_tree_create(void) completion_tree_arg_list_add_arg(arg_list, "unsubscribePattern"); } - cmd = completion_tree_cmd_add(commands_dynsec, "setAnonymousGroup"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "setAnonymousGroup"); completion_tree_cmd_append_arg_list(cmd, tree_groups); - cmd = completion_tree_cmd_add(commands_dynsec, "setClientId"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "setClientId"); completion_tree_cmd_append_arg_list(cmd, tree_clients); - cmd = completion_tree_cmd_add(commands_dynsec, "setClientPassword"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "setClientPassword"); completion_tree_cmd_append_arg_list(cmd, tree_clients); { - cmd = completion_tree_cmd_add(commands_dynsec, "modifyClient"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "modifyClient"); completion_tree_cmd_append_arg_list(cmd, tree_clients); arg_list = completion_tree_cmd_add_arg_list(cmd); @@ -174,7 +178,7 @@ static void command_tree_create(void) } { - cmd = completion_tree_cmd_add(commands_dynsec, "modifyGroup"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "modifyGroup"); completion_tree_cmd_append_arg_list(cmd, tree_groups); arg_list = completion_tree_cmd_add_arg_list(cmd); @@ -183,7 +187,7 @@ static void command_tree_create(void) } { - cmd = completion_tree_cmd_add(commands_dynsec, "modifyRole"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "modifyRole"); completion_tree_cmd_append_arg_list(cmd, tree_roles); arg_list = completion_tree_cmd_add_arg_list(cmd); @@ -193,7 +197,7 @@ static void command_tree_create(void) } { - cmd = completion_tree_cmd_add(commands_dynsec, "setDefaultACLAccess"); + cmd = completion_tree_cmd_add(commands_dynsec, help_arg_list, "setDefaultACLAccess"); arg_list = completion_tree_cmd_add_arg_list(cmd); completion_tree_arg_list_add_arg(arg_list, "publishClientReceive"); @@ -206,10 +210,9 @@ static void command_tree_create(void) completion_tree_arg_list_add_arg(arg_list, "deny"); } - completion_tree_cmd_add(commands_dynsec, "disconnect"); - completion_tree_cmd_add(commands_dynsec, "help"); - completion_tree_cmd_add(commands_dynsec, "return"); - completion_tree_cmd_add(commands_dynsec, "exit"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "disconnect"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "return"); + completion_tree_cmd_add(commands_dynsec, help_arg_list, "exit"); } diff --git a/apps/mosquitto_ctrl/ctrl_shell_post_connect.c b/apps/mosquitto_ctrl/ctrl_shell_post_connect.c index 4f6c772b..2677255e 100644 --- a/apps/mosquitto_ctrl/ctrl_shell_post_connect.c +++ b/apps/mosquitto_ctrl/ctrl_shell_post_connect.c @@ -30,15 +30,20 @@ static struct completion_tree_root *commands_post_connect = NULL; static void command_tree_create(void) { + struct completion_tree_cmd *cmd; + struct completion_tree_arg_list *help_arg_list; + if(commands_post_connect) return; commands_post_connect = calloc(1, sizeof(struct completion_tree_root)); - completion_tree_cmd_add(commands_post_connect, "broker"); - completion_tree_cmd_add(commands_post_connect, "disconnect"); - completion_tree_cmd_add(commands_post_connect, "dynsec"); - completion_tree_cmd_add(commands_post_connect, "help"); - completion_tree_cmd_add(commands_post_connect, "exit"); + cmd = completion_tree_cmd_add(commands_post_connect, NULL, "help"); + help_arg_list = completion_tree_cmd_add_arg_list(cmd); + + completion_tree_cmd_add(commands_post_connect, help_arg_list, "broker"); + completion_tree_cmd_add(commands_post_connect, help_arg_list, "disconnect"); + completion_tree_cmd_add(commands_post_connect, help_arg_list, "dynsec"); + completion_tree_cmd_add(commands_post_connect, help_arg_list, "exit"); } static void print_help(char **saveptr) diff --git a/apps/mosquitto_ctrl/ctrl_shell_pre_connect.c b/apps/mosquitto_ctrl/ctrl_shell_pre_connect.c index 58ecc342..cb94bfc9 100644 --- a/apps/mosquitto_ctrl/ctrl_shell_pre_connect.c +++ b/apps/mosquitto_ctrl/ctrl_shell_pre_connect.c @@ -31,14 +31,19 @@ static struct completion_tree_root *commands_pre_connect = NULL; static void command_tree_create(void) { + struct completion_tree_cmd *cmd; + struct completion_tree_arg_list *help_arg_list; + if(commands_pre_connect) return; commands_pre_connect = calloc(1, sizeof(struct completion_tree_root)); - completion_tree_cmd_add(commands_pre_connect, "auth"); - completion_tree_cmd_add(commands_pre_connect, "connect"); - completion_tree_cmd_add(commands_pre_connect, "help"); - completion_tree_cmd_add(commands_pre_connect, "exit"); + cmd = completion_tree_cmd_add(commands_pre_connect, NULL, "help"); + help_arg_list = completion_tree_cmd_add_arg_list(cmd); + + completion_tree_cmd_add(commands_pre_connect, help_arg_list, "auth"); + completion_tree_cmd_add(commands_pre_connect, help_arg_list, "connect"); + completion_tree_cmd_add(commands_pre_connect, help_arg_list, "exit"); }