aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2017-09-20 15:39:37 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2017-09-27 14:04:09 +0000
commitf4f23bd6829f78741cfd586f0ca9a290f221242e (patch)
treec50ce8201efe6d42e873dd650e20fd7e641b1b99
parent607275c30be14266c4f1724b29a7cddea2062802 (diff)
vty: install 'exit', 'end',... commands on *all* nodes
In many callers of the VTY API, we are lacking the vty_install_default() step at certain node levels. This creates nodes that lack the 'exit' command, and hence the only way to exit such a node is to restart the telnet session. Historically, the VTY looked for missing commands on the immediate parent node, and hence possibly found the parent's 'exit' command when the local node was missing it. That is why we so far did not notice the missing default commands. Furthermore, some callers call install_default() instead of vty_install_default(). Only vty_install_default() also includes the 'exit' and 'end' commands. There is no reason why there are two sets of default commands. To end this confusion, to catch all missing 'exit' commands and to prevent this from re-appearing in the future, simply *always* install all default commands implicitly when calling install_node(). In cmd_init(), there are some top-level nodes that apparently do not want the default commands installed. Keep those the way they are, by changing the invocation to new install_node_bare() ({VIEW,AUTH,AUTH_ENABLE}_NODE). Make both install_default() and vty_install_default() no-ops so that users of the API may still call them without harm. Do not yet deprecate yet, which follows in Icf5d83f641e838cebcccc635a043e94ba352abff. Drop all invocations to these two functions found in libosmocore. Change-Id: I5021c64a787b63314e0f2f1cba0b8fc7bff4f09b
-rw-r--r--include/osmocom/vty/command.h5
-rw-r--r--src/ctrl/control_vty.c1
-rw-r--r--src/gb/gprs_bssgp_vty.c1
-rw-r--r--src/gb/gprs_ns_vty.c1
-rw-r--r--src/vty/command.c42
-rw-r--r--src/vty/logging_vty.c1
-rw-r--r--src/vty/stats_vty.c1
-rw-r--r--src/vty/vty.c1
-rw-r--r--tests/vty/vty_test.c3
9 files changed, 31 insertions, 25 deletions
diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h
index 58f248fe..8fbdb7b7 100644
--- a/include/osmocom/vty/command.h
+++ b/include/osmocom/vty/command.h
@@ -27,6 +27,8 @@
#include <sys/types.h>
#include "vector.h"
+#include <osmocom/core/defs.h>
+
/*! \defgroup command VTY Command
* @{
* \file command.h */
@@ -363,9 +365,6 @@ void install_element(int node_type, struct cmd_element *);
void install_element_ve(struct cmd_element *cmd);
void sort_node(void);
-/* This is similar to install_default() but it also creates
- * 'exit' and 'end' commands.
- */
void vty_install_default(int node_type);
/* Concatenates argv[shift] through argv[argc-1] into a single NUL-terminated
diff --git a/src/ctrl/control_vty.c b/src/ctrl/control_vty.c
index 97f42de5..a968bc01 100644
--- a/src/ctrl/control_vty.c
+++ b/src/ctrl/control_vty.c
@@ -82,7 +82,6 @@ int ctrl_vty_init(void *ctx)
ctrl_vty_ctx = ctx;
install_element(CONFIG_NODE, &cfg_ctrl_cmd);
install_node(&ctrl_node, config_write_ctrl);
- vty_install_default(L_CTRL_NODE);
install_element(L_CTRL_NODE, &cfg_ctrl_bind_addr_cmd);
return 0;
diff --git a/src/gb/gprs_bssgp_vty.c b/src/gb/gprs_bssgp_vty.c
index dc786a14..f7878469 100644
--- a/src/gb/gprs_bssgp_vty.c
+++ b/src/gb/gprs_bssgp_vty.c
@@ -211,7 +211,6 @@ int bssgp_vty_init(void)
install_element(CONFIG_NODE, &cfg_bssgp_cmd);
install_node(&bssgp_node, config_write_bssgp);
- vty_install_default(L_BSSGP_NODE);
return 0;
}
diff --git a/src/gb/gprs_ns_vty.c b/src/gb/gprs_ns_vty.c
index 4bd50970..f94d9c2c 100644
--- a/src/gb/gprs_ns_vty.c
+++ b/src/gb/gprs_ns_vty.c
@@ -594,7 +594,6 @@ int gprs_ns_vty_init(struct gprs_ns_inst *nsi)
install_element(CONFIG_NODE, &cfg_ns_cmd);
install_node(&ns_node, config_write_ns);
- vty_install_default(L_NS_NODE);
install_element(L_NS_NODE, &cfg_nse_nsvci_cmd);
install_element(L_NS_NODE, &cfg_nse_remoteip_cmd);
install_element(L_NS_NODE, &cfg_nse_remoteport_cmd);
diff --git a/src/vty/command.c b/src/vty/command.c
index 8ad2e975..21b26b4e 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -149,8 +149,10 @@ static const char *node_name_from_prompt(const char *prompt, char *name_buf, siz
return name_buf;
}
-/*! Install top node of command vector. */
-void install_node(struct cmd_node *node, int (*func) (struct vty *))
+static void install_basic_node_commands(int node);
+
+/*! Install top node of command vector, without adding basic node commands. */
+static void install_node_bare(struct cmd_node *node, int (*func) (struct vty *))
{
vector_set_index(cmdvec, node->node, node);
node->func = func;
@@ -159,6 +161,13 @@ void install_node(struct cmd_node *node, int (*func) (struct vty *))
node_name_from_prompt(node->prompt, node->name, sizeof(node->name));
}
+/*! Install top node of command vector. */
+void install_node(struct cmd_node *node, int (*func) (struct vty *))
+{
+ install_node_bare(node, func);
+ install_basic_node_commands(node->node);
+}
+
/* Compare two command's string. Used in sort_node (). */
static int cmp_node(const void *p, const void *q)
{
@@ -3599,8 +3608,23 @@ void host_config_set(const char *filename)
host.config = talloc_strdup(tall_vty_cmd_ctx, filename);
}
+/*! Deprecated, now happens implicitly when calling install_node().
+ * Users of the API may still attempt to call this function, hence
+ * leave it here as a no-op. */
void install_default(int node)
{
+}
+
+/*! Deprecated, now happens implicitly when calling install_node().
+ * Users of the API may still attempt to call this function, hence
+ * leave it here as a no-op. */
+void vty_install_default(int node)
+{
+}
+
+/*! Install common commands like 'exit' and 'list'. */
+static void install_basic_node_commands(int node)
+{
install_element(node, &config_help_cmd);
install_element(node, &config_list_cmd);
@@ -3609,11 +3633,6 @@ void install_default(int node)
install_element(node, &config_write_memory_cmd);
install_element(node, &config_write_cmd);
install_element(node, &show_running_config_cmd);
-}
-
-void vty_install_default(int node)
-{
- install_default(node);
install_element(node, &config_exit_cmd);
@@ -3681,10 +3700,10 @@ void cmd_init(int terminal)
host.motdfile = NULL;
/* Install top nodes. */
- install_node(&view_node, NULL);
+ install_node_bare(&view_node, NULL);
install_node(&enable_node, NULL);
- install_node(&auth_node, NULL);
- install_node(&auth_enable_node, NULL);
+ install_node_bare(&auth_node, NULL);
+ install_node_bare(&auth_enable_node, NULL);
install_node(&config_node, config_write_host);
/* Each node's basic commands. */
@@ -3701,7 +3720,6 @@ void cmd_init(int terminal)
}
if (terminal) {
- vty_install_default(ENABLE_NODE);
install_element(ENABLE_NODE, &config_disable_cmd);
install_element(ENABLE_NODE, &config_terminal_cmd);
install_element (ENABLE_NODE, &copy_runningconfig_startupconfig_cmd);
@@ -3714,8 +3732,6 @@ void cmd_init(int terminal)
install_element(ENABLE_NODE, &config_terminal_length_cmd);
install_element(ENABLE_NODE, &config_terminal_no_length_cmd);
install_element(ENABLE_NODE, &echo_cmd);
-
- vty_install_default(CONFIG_NODE);
}
install_element(CONFIG_NODE, &hostname_cmd);
diff --git a/src/vty/logging_vty.c b/src/vty/logging_vty.c
index 01480b10..0ab76861 100644
--- a/src/vty/logging_vty.c
+++ b/src/vty/logging_vty.c
@@ -776,7 +776,6 @@ void logging_vty_add_cmds()
install_element_ve(&show_alarms_cmd);
install_node(&cfg_log_node, config_write_log);
- vty_install_default(CFG_LOG_NODE);
install_element(CFG_LOG_NODE, &logging_fltr_all_cmd);
install_element(CFG_LOG_NODE, &logging_use_clr_cmd);
install_element(CFG_LOG_NODE, &logging_prnt_timestamp_cmd);
diff --git a/src/vty/stats_vty.c b/src/vty/stats_vty.c
index 57cdd308..a4c73fa0 100644
--- a/src/vty/stats_vty.c
+++ b/src/vty/stats_vty.c
@@ -594,7 +594,6 @@ void osmo_stats_vty_add_cmds()
install_element(CONFIG_NODE, &cfg_stats_interval_cmd);
install_node(&cfg_stats_node, config_write_stats);
- vty_install_default(CFG_STATS_NODE);
install_element(CFG_STATS_NODE, &cfg_stats_reporter_local_ip_cmd);
install_element(CFG_STATS_NODE, &cfg_no_stats_reporter_local_ip_cmd);
diff --git a/src/vty/vty.c b/src/vty/vty.c
index 3d9c0d64..aef73b3a 100644
--- a/src/vty/vty.c
+++ b/src/vty/vty.c
@@ -1798,7 +1798,6 @@ void vty_init(struct vty_app_info *app_info)
install_element(ENABLE_NODE, &terminal_monitor_cmd);
install_element(ENABLE_NODE, &terminal_no_monitor_cmd);
- vty_install_default(VTY_NODE);
install_element(VTY_NODE, &vty_login_cmd);
install_element(VTY_NODE, &no_vty_login_cmd);
install_element(VTY_NODE, &vty_bind_cmd);
diff --git a/tests/vty/vty_test.c b/tests/vty/vty_test.c
index fe50e4c2..2542baf3 100644
--- a/tests/vty/vty_test.c
+++ b/tests/vty/vty_test.c
@@ -386,17 +386,14 @@ void test_vty_add_cmds()
{
install_element(CONFIG_NODE, &cfg_level1_cmd);
install_node(&level1_node, NULL);
- vty_install_default(LEVEL1_NODE);
install_element(LEVEL1_NODE, &cfg_level1_child_cmd);
install_element(LEVEL1_NODE, &cfg_level2_cmd);
install_node(&level2_node, NULL);
- vty_install_default(LEVEL2_NODE);
install_element(LEVEL2_NODE, &cfg_level2_child_cmd);
install_element(LEVEL2_NODE, &cfg_level3_cmd);
install_node(&level3_node, NULL);
- vty_install_default(LEVEL3_NODE);
install_element(LEVEL3_NODE, &cfg_level3_child_cmd);
}