From a83a533139f64434b68ebc3ae9a65a013b04cc34 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 25 Jul 2017 17:28:19 -0400 Subject: lib: add CLI node names Adds an array of descriptive names for each CLI node, plus a runtime check to make sure folks don't forget to update it. Signed-off-by: Quentin Young --- lib/command.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 103 insertions(+), 6 deletions(-) (limited to 'lib/command.c') diff --git a/lib/command.c b/lib/command.c index d97ad9db3c..2899a7c2ba 100644 --- a/lib/command.c +++ b/lib/command.c @@ -42,11 +42,80 @@ #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") DEFINE_MTYPE(LIB, COMPLETION, "Completion item") +const char *node_names[] = { + "auth", // AUTH_NODE, + "view", // VIEW_NODE, + "auth enable", // AUTH_ENABLE_NODE, + "enable", // ENABLE_NODE, + "config", // CONFIG_NODE, + "service", // SERVICE_NODE, + "debug", // DEBUG_NODE, + "vrf debug", // VRF_DEBUG_NODE, + "vmc debug", // DEBUG_VNC_NODE, + "aaa", // AAA_NODE, + "keychain", // KEYCHAIN_NODE, + "leychain key", // KEYCHAIN_KEY_NODE, + "logical-router", // NS_NODE, + "vrf", // VRF_NODE, + "interface", // INTERFACE_NODE, + "zebra", // ZEBRA_NODE, + "table", // TABLE_NODE, + "rip", // RIP_NODE, + "ripng", // RIPNG_NODE, + "babel", // BABEL_NODE, + "eigrp", // EIGRP_NODE, + "bgp", // BGP_NODE, + "bgp vpnv4", // BGP_VPNV4_NODE, + "bgp vpnv56", // BGP_VPNV6_NODE, + "bgp ipv4 unicast", // BGP_IPV4_NODE, + "bgp ipv4 multicast", // BGP_IPV4M_NODE, + "bgp ipv4 labeled unicast", // BGP_IPV4L_NODE, + "bgp ipv6", // BGP_IPV6_NODE, + "bgp ipv6 multicast", // BGP_IPV6M_NODE, + "bgp ipv6 labeled unicast", // BGP_IPV6L_NODE, + "bgp vrf policy", // BGP_VRF_POLICY_NODE, + "bgp vnc defaults", // BGP_VNC_DEFAULTS_NODE, + "bgp vnc nve", // BGP_VNC_NVE_GROUP_NODE, + "bgp vnc l2", // BGP_VNC_L2_GROUP_NODE, + "rfp defaults", // RFP_DEFAULTS_NODE, + "bgp evpn", // BGP_EVPN_NODE, + "ospf", // OSPF_NODE, + "ospf6", // OSPF6_NODE, + "ldp", // LDP_NODE, + "ldp ipv4", // LDP_IPV4_NODE, + "ldp ipv6", // LDP_IPV6_NODE, + "ldp ipv4 interface", // LDP_IPV4_IFACE_NODE, + "ldp ipv6 interface", // LDP_IPV6_IFACE_NODE, + "ldp l2vpn", // LDP_L2VPN_NODE, + "ldp", // LDP_PSEUDOWIRE_NODE, + "isis", // ISIS_NODE, + "pim", // PIM_NODE, + "masc", // MASC_NODE, + "irdp", // IRDP_NODE, + "static ip", // IP_NODE, + "ipv4 access list", // ACCESS_NODE, + "ipv4 prefix list", // PREFIX_NODE, + "ipv6 access list", // ACCESS_IPV6_NODE, + "ipv6 prefix list", // PREFIX_IPV6_NODE, + "AS list", // AS_LIST_NODE, + "community list", // COMMUNITY_LIST_NODE, + "routemap", // RMAP_NODE, + "smux", // SMUX_NODE, + "dump", // DUMP_NODE, + "forwarding", // FORWARDING_NODE, + "protocol", // PROTOCOL_NODE, + "mpls", // MPLS_NODE, + "vty", // VTY_NODE, + "link-params", // LINK_PARAMS_NODE, + "bgp evpn vni", // BGP_EVPN_VNI_NODE, +}; + /* Command vector which includes some level of command lists. Normally each daemon maintains each own cmdvec. */ vector cmdvec = NULL; @@ -2355,6 +2424,32 @@ DEFUN (no_banner_motd, return CMD_SUCCESS; } +DEFUN(find, + find_cmd, + "find COMMAND...", + "Find CLI command containing text\n" + "Text to search for\n") +{ + char *text = argv_concat(argv, argc, 1); + + for (unsigned int i = 0; i < vector_active(cmdvec); i++) { + struct cmd_node *node = vector_slot(cmdvec, i); + if (!node) + continue; + vector clis = node->cmd_vector; + for (unsigned int j = 0; j < vector_active(clis); j++) { + struct cmd_element *cli = vector_slot(clis, j); + if (strcasestr(cli->string, text)) + vty_out(vty, "(%s) %s", + node_names[node->node], cli->string); + } + } + + XFREE(MTYPE_TMP, text); + + return CMD_SUCCESS; +} + /* Set config filename. Called from vty.c */ void host_config_set(const char *filename) { @@ -2375,6 +2470,7 @@ void install_default(enum node_type node) install_element(node, &config_end_cmd); install_element(node, &config_help_cmd); install_element(node, &config_list_cmd); + install_element(node, &find_cmd); install_element(node, &config_write_cmd); install_element(node, &show_running_config_cmd); @@ -2389,6 +2485,9 @@ void install_default(enum node_type node) * terminal = -1 -- watchfrr / no logging, but minimal config control */ void cmd_init(int terminal) { + if (array_size(node_names) != NODE_TYPE_MAX) + assert(!"Update the CLI node description array!"); + qobj_init(); varhandlers = list_new(); @@ -2416,6 +2515,8 @@ void cmd_init(int terminal) /* Each node's basic commands. */ install_element(VIEW_NODE, &show_version_cmd); + install_element(ENABLE_NODE, &show_startup_config_cmd); + if (terminal) { install_element(VIEW_NODE, &config_list_cmd); install_element(VIEW_NODE, &config_exit_cmd); @@ -2428,20 +2529,16 @@ void cmd_init(int terminal) install_element(VIEW_NODE, &show_commandtree_cmd); install_element(VIEW_NODE, &echo_cmd); install_element(VIEW_NODE, &autocomplete_cmd); - } + install_element(VIEW_NODE, &find_cmd); - if (terminal) { install_element(ENABLE_NODE, &config_end_cmd); install_element(ENABLE_NODE, &config_disable_cmd); install_element(ENABLE_NODE, &config_terminal_cmd); install_element(ENABLE_NODE, ©_runningconf_startupconf_cmd); install_element(ENABLE_NODE, &config_write_cmd); install_element(ENABLE_NODE, &show_running_config_cmd); - } - install_element(ENABLE_NODE, &show_startup_config_cmd); - - if (terminal) { install_element(ENABLE_NODE, &config_logmsg_cmd); + install_default(CONFIG_NODE); thread_cmd_init(); -- cgit v1.2.3 From cf6c83e712733f41a870a9c077803bc2e29ac69e Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Tue, 25 Jul 2017 14:20:55 -0400 Subject: 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(-) (limited to 'lib/command.c') 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); -- cgit v1.2.3 From c652f6f633c3c64acccf0438cdb6ab268afd0f0c Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Thu, 27 Jul 2017 15:03:31 -0400 Subject: lib: correct some node name typos Signed-off-by: Quentin Young --- lib/command.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib/command.c') diff --git a/lib/command.c b/lib/command.c index 4690a36be0..7781fb02e6 100644 --- a/lib/command.c +++ b/lib/command.c @@ -56,7 +56,7 @@ const char *node_names[] = { "service", // SERVICE_NODE, "debug", // DEBUG_NODE, "vrf debug", // VRF_DEBUG_NODE, - "vmc debug", // DEBUG_VNC_NODE, + "vnc debug", // DEBUG_VNC_NODE, "aaa", // AAA_NODE, "keychain", // KEYCHAIN_NODE, "leychain key", // KEYCHAIN_KEY_NODE, @@ -71,7 +71,7 @@ const char *node_names[] = { "eigrp", // EIGRP_NODE, "bgp", // BGP_NODE, "bgp vpnv4", // BGP_VPNV4_NODE, - "bgp vpnv56", // BGP_VPNV6_NODE, + "bgp vpnv6", // BGP_VPNV6_NODE, "bgp ipv4 unicast", // BGP_IPV4_NODE, "bgp ipv4 multicast", // BGP_IPV4M_NODE, "bgp ipv4 labeled unicast", // BGP_IPV4L_NODE, @@ -102,7 +102,7 @@ const char *node_names[] = { "ipv4 prefix list", // PREFIX_NODE, "ipv6 access list", // ACCESS_IPV6_NODE, "ipv6 prefix list", // PREFIX_IPV6_NODE, - "AS list", // AS_LIST_NODE, + "as list", // AS_LIST_NODE, "community list", // COMMUNITY_LIST_NODE, "routemap", // RMAP_NODE, "smux", // SMUX_NODE, -- cgit v1.2.3 From 9d356c939f26f864a77f9bce007efd2b567a7466 Mon Sep 17 00:00:00 2001 From: Quentin Young Date: Mon, 31 Jul 2017 11:03:32 -0400 Subject: lib: s/leychain/keychain Signed-off-by: Quentin Young --- lib/command.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/command.c') diff --git a/lib/command.c b/lib/command.c index 7781fb02e6..f28a55ec6d 100644 --- a/lib/command.c +++ b/lib/command.c @@ -59,7 +59,7 @@ const char *node_names[] = { "vnc debug", // DEBUG_VNC_NODE, "aaa", // AAA_NODE, "keychain", // KEYCHAIN_NODE, - "leychain key", // KEYCHAIN_KEY_NODE, + "keychain key", // KEYCHAIN_KEY_NODE, "logical-router", // NS_NODE, "vrf", // VRF_NODE, "interface", // INTERFACE_NODE, -- cgit v1.2.3