]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib, vtysh: add `find COMMAND`
authorQuentin Young <qlyoung@cumulusnetworks.com>
Tue, 25 Jul 2017 18:20:55 +0000 (14:20 -0400)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Thu, 27 Jul 2017 02:58:52 +0000 (22:58 -0400)
Substring search through all defined commands in all nodes.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
lib/command.c
lib/command.h
vtysh/vtysh.c

index 2899a7c2ba219825218057f63fe33a56e3ad665b..4690a36be0b3e3cd739fa8c8771c8c21c37b4421 100644 (file)
@@ -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);
                }
        }
index 28aa1ac5dd5b1246389c11604f5f76b22588f99a..533b4b32894a5994df5c0f3d9409642eea62ce00 100644 (file)
@@ -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
index 666f3049d7c87cf5f96b3cc429f24bf50cc60048..92e522b6951d61102f41a94cf7746c152442415b 100644 (file)
@@ -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);