From cf6c83e712733f41a870a9c077803bc2e29ac69e Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 25 Jul 2017 14:20:55 -0400 Subject: [PATCH] lib, vtysh: add `find COMMAND` Substring search through all defined commands in all nodes. Signed-off-by: Quentin Young --- lib/command.c | 12 ++++---- lib/command.h | 3 +- vtysh/vtysh.c | 79 ++++++++++++++++++++++++--------------------------- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/lib/command.c b/lib/command.c index 2899a7c2ba..4690a36be0 100644 --- a/lib/command.c +++ b/lib/command.c @@ -42,7 +42,6 @@ #include "command_graph.h" #include "qobj.h" #include "defaults.h" -#include "termtable.h" DEFINE_MTYPE(LIB, HOST, "Host config") DEFINE_MTYPE(LIB, STRVEC, "String vector") @@ -2431,16 +2430,19 @@ DEFUN(find, "Text to search for\n") { char *text = argv_concat(argv, argc, 1); + const struct cmd_node *node; + const struct cmd_element *cli; + vector clis; for (unsigned int i = 0; i < vector_active(cmdvec); i++) { - struct cmd_node *node = vector_slot(cmdvec, i); + node = vector_slot(cmdvec, i); if (!node) continue; - vector clis = node->cmd_vector; + clis = node->cmd_vector; for (unsigned int j = 0; j < vector_active(clis); j++) { - struct cmd_element *cli = vector_slot(clis, j); + cli = vector_slot(clis, j); if (strcasestr(cli->string, text)) - vty_out(vty, "(%s) %s", + vty_out(vty, " (%s) %s\n", node_names[node->node], cli->string); } } diff --git a/lib/command.h b/lib/command.h index 28aa1ac5dd..533b4b3289 100644 --- a/lib/command.h +++ b/lib/command.h @@ -68,7 +68,7 @@ struct host { char *motdfile; }; -/* List of CLI nodes. Please remember to update the names array below. */ +/* List of CLI nodes. Please remember to update the name array in command.c. */ enum node_type { AUTH_NODE, /* Authentication mode of vty interface. */ VIEW_NODE, /* View node. Default mode of vty interface. */ @@ -138,6 +138,7 @@ enum node_type { NODE_TYPE_MAX, /* maximum */ }; +extern vector cmdvec; extern const char *node_names[]; /* Node which has some commands and prompt string and configuration diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 666f3049d7..92e522b695 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -2582,9 +2582,39 @@ DEFUN (config_list, return cmd_list_cmds(vty, argc == 2); } +DEFUN(find, + find_cmd, + "find COMMAND...", + "Find CLI command containing text\n" + "Text to search for\n") +{ + char *text = argv_concat(argv, argc, 1); + const struct cmd_node *node; + const struct cmd_element *cli; + vector clis; + + for (unsigned int i = 0; i < vector_active(cmdvec); i++) { + node = vector_slot(cmdvec, i); + if (!node) + continue; + clis = node->cmd_vector; + for (unsigned int j = 0; j < vector_active(clis); j++) { + cli = vector_slot(clis, j); + if (strcasestr(cli->string, text)) + fprintf(stdout, " (%s) %s\n", + node_names[node->node], cli->string); + } + } + + XFREE(MTYPE_TMP, text); + + return CMD_SUCCESS; +} + static void vtysh_install_default(enum node_type node) { install_element(node, &config_list_cmd); + install_element(node, &find_cmd); } /* Making connection to protocol daemon. */ @@ -2876,48 +2906,13 @@ void vtysh_init_vty(void) install_node(&isis_node, NULL); install_node(&vty_node, NULL); - vtysh_install_default(VIEW_NODE); - vtysh_install_default(CONFIG_NODE); - vtysh_install_default(BGP_NODE); - vtysh_install_default(RIP_NODE); - vtysh_install_default(INTERFACE_NODE); - vtysh_install_default(LINK_PARAMS_NODE); - vtysh_install_default(NS_NODE); - vtysh_install_default(VRF_NODE); - vtysh_install_default(RMAP_NODE); - vtysh_install_default(ZEBRA_NODE); - vtysh_install_default(BGP_VPNV4_NODE); - vtysh_install_default(BGP_VPNV6_NODE); - vtysh_install_default(BGP_IPV4_NODE); - vtysh_install_default(BGP_IPV4M_NODE); - vtysh_install_default(BGP_IPV4L_NODE); - vtysh_install_default(BGP_IPV6_NODE); - vtysh_install_default(BGP_IPV6M_NODE); - vtysh_install_default(BGP_EVPN_NODE); - vtysh_install_default(BGP_EVPN_VNI_NODE); - vtysh_install_default(BGP_IPV6L_NODE); -#if ENABLE_BGP_VNC - vtysh_install_default(BGP_VRF_POLICY_NODE); - vtysh_install_default(BGP_VNC_DEFAULTS_NODE); - vtysh_install_default(BGP_VNC_NVE_GROUP_NODE); - vtysh_install_default(BGP_VNC_L2_GROUP_NODE); -#endif - vtysh_install_default(OSPF_NODE); - vtysh_install_default(EIGRP_NODE); - vtysh_install_default(BABEL_NODE); - vtysh_install_default(RIPNG_NODE); - vtysh_install_default(OSPF6_NODE); - vtysh_install_default(LDP_NODE); - vtysh_install_default(LDP_IPV4_NODE); - vtysh_install_default(LDP_IPV6_NODE); - vtysh_install_default(LDP_IPV4_IFACE_NODE); - vtysh_install_default(LDP_IPV6_IFACE_NODE); - vtysh_install_default(LDP_L2VPN_NODE); - vtysh_install_default(LDP_PSEUDOWIRE_NODE); - vtysh_install_default(ISIS_NODE); - vtysh_install_default(KEYCHAIN_NODE); - vtysh_install_default(KEYCHAIN_KEY_NODE); - vtysh_install_default(VTY_NODE); + struct cmd_node *node; + for (unsigned int i = 0; i < vector_active(cmdvec); i++) { + node = vector_slot(cmdvec, i); + if (!node || node->node == VIEW_NODE) + continue; + vtysh_install_default(node->node); + } install_element(VIEW_NODE, &vtysh_enable_cmd); install_element(ENABLE_NODE, &vtysh_config_terminal_cmd); -- 2.39.5