Change in libosmocore[master]: vty: introduce the expert mode and a command to enable it

This is merely a historical archive of years 2008-2021, before the migration to mailman3.

A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.

fixeria gerrit-no-reply at lists.osmocom.org
Tue Oct 20 23:25:18 UTC 2020


fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmocore/+/20815 )


Change subject: vty: introduce the expert mode and a command to enable it
......................................................................

vty: introduce the expert mode and a command to enable it

Change-Id: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f
Related: SYS#4910
---
M include/osmocom/vty/command.h
M include/osmocom/vty/vty.h
M src/vty/command.c
M tests/vty/vty_transcript_test.c
M tests/vty/vty_transcript_test.vty
5 files changed, 126 insertions(+), 13 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/15/20815/1

diff --git a/include/osmocom/vty/command.h b/include/osmocom/vty/command.h
index 2cb45dd..92701fc 100644
--- a/include/osmocom/vty/command.h
+++ b/include/osmocom/vty/command.h
@@ -24,6 +24,7 @@
 #pragma once
 
 #include <stdio.h>
+#include <stdbool.h>
 #include <sys/types.h>
 #include "vector.h"
 
@@ -65,6 +66,9 @@
 
 	/*! VTY application information */
 	const struct vty_app_info *app_info;
+
+	/*! Whether the expert mode is enabled. */
+	bool expert_mode;
 };
 
 /*! There are some command levels which called from command node. */
diff --git a/include/osmocom/vty/vty.h b/include/osmocom/vty/vty.h
index 4e83b1b..6a82d7e 100644
--- a/include/osmocom/vty/vty.h
+++ b/include/osmocom/vty/vty.h
@@ -32,7 +32,7 @@
 #define VTY_CMD_USR_ATTR_NUM 32
 /* Flag characters reserved for global VTY attributes */
 #define VTY_CMD_ATTR_FLAGS_RESERVED \
-	{ '.', '!', '@' }
+	{ '.', '!', '@', '^' }
 
 /*! VTY events */
 enum event {
diff --git a/src/vty/command.c b/src/vty/command.c
index d8649f5..0edfce5 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -624,7 +624,7 @@
 
 static const struct value_string cmd_attr_desc[] = {
 	{ CMD_ATTR_DEPRECATED,		"This command is deprecated" },
-	{ CMD_ATTR_HIDDEN,		"This command is hidden" },
+	{ CMD_ATTR_HIDDEN,		"This command is hidden (check expert mode)" },
 	{ CMD_ATTR_IMMEDIATE,		"This command applies immediately" },
 	{ CMD_ATTR_NODE_EXIT,		"This command applies on VTY node exit" },
 	/* CMD_ATTR_LIB_COMMAND is intentionally skipped */
@@ -639,6 +639,8 @@
 static char cmd_attr_get_flag(unsigned int attr)
 {
 	switch (attr) {
+	case CMD_ATTR_HIDDEN:
+		return '^';
 	case CMD_ATTR_IMMEDIATE:
 		return '!';
 	case CMD_ATTR_NODE_EXIT:
@@ -796,8 +798,11 @@
 			elem = vector_slot(cnode->cmd_vector, j);
 			if (!vty_command_is_common(elem))
 				continue;
-			if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))
-				vty_dump_element(elem, print_func, data, newline);
+			if (elem->attr & CMD_ATTR_DEPRECATED)
+				continue;
+			if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))
+				continue;
+			vty_dump_element(elem, print_func, data, newline);
 		}
 	}
 	print_func(data, "  </node>%s", newline);
@@ -834,8 +839,11 @@
 			elem = vector_slot(cnode->cmd_vector, j);
 			if (vty_command_is_common(elem))
 				continue;
-			if (!(elem->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN)))
-				vty_dump_element(elem, print_func, data, newline);
+			if (elem->attr & CMD_ATTR_DEPRECATED)
+				continue;
+			if (!host.expert_mode && (elem->attr & CMD_ATTR_HIDDEN))
+				continue;
+			vty_dump_element(elem, print_func, data, newline);
 		}
 
 		print_func(data, "  </node>%s", newline);
@@ -2007,7 +2015,9 @@
 		if (!cmd_element)
 			continue;
 
-		if (cmd_element->attr & (CMD_ATTR_DEPRECATED|CMD_ATTR_HIDDEN))
+		if (cmd_element->attr & CMD_ATTR_DEPRECATED)
+			continue;
+		if (!host.expert_mode && (cmd_element->attr & CMD_ATTR_HIDDEN))
 			continue;
 
 		strvec = cmd_element->strvec;
@@ -2867,7 +2877,10 @@
 }
 
 /* Enable command */
-DEFUN(enable, config_enable_cmd, "enable", "Turn on privileged mode command\n")
+DEFUN(enable, config_enable_cmd,
+      "enable [expert-mode]",
+      "Turn on privileged mode command\n"
+      "Enable the expert mode (show hidden commands)\n")
 {
 	/* If enable password is NULL, change to ENABLE_NODE */
 	if ((host.enable == NULL && host.enable_encrypt == NULL) ||
@@ -2876,6 +2889,8 @@
 	else
 		vty->node = AUTH_ENABLE_NODE;
 
+	host.expert_mode = argc > 0;
+
 	return CMD_SUCCESS;
 }
 
@@ -2885,6 +2900,9 @@
 {
 	if (vty->node == ENABLE_NODE)
 		vty->node = VIEW_NODE;
+
+	host.expert_mode = false;
+
 	return CMD_SUCCESS;
 }
 
@@ -3083,7 +3101,9 @@
 
 			if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)
 				continue;
-			if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))
+			if (cmd->attr & CMD_ATTR_DEPRECATED)
+				continue;
+			if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))
 				continue;
 			if (~cmd->usrattr & ((unsigned)1 << f))
 				continue;
@@ -3111,7 +3131,9 @@
 	char *ptr = &char_mask[0];
 
 	/* Mutually exclusive global attributes */
-	if (cmd->attr & CMD_ATTR_IMMEDIATE)
+	if (cmd->attr & CMD_ATTR_HIDDEN)
+		*(ptr++) = cmd_attr_get_flag(CMD_ATTR_HIDDEN);
+	else if (cmd->attr & CMD_ATTR_IMMEDIATE)
 		*(ptr++) = cmd_attr_get_flag(CMD_ATTR_IMMEDIATE);
 	else if (cmd->attr & CMD_ATTR_NODE_EXIT)
 		*(ptr++) = cmd_attr_get_flag(CMD_ATTR_NODE_EXIT);
@@ -3170,7 +3192,9 @@
 	for (i = 0; i < vector_active(cnode->cmd_vector); i++) {
 		if ((cmd = vector_slot(cnode->cmd_vector, i)) == NULL)
 			continue;
-		if (cmd->attr & (CMD_ATTR_DEPRECATED | CMD_ATTR_HIDDEN))
+		if (cmd->attr & CMD_ATTR_DEPRECATED)
+			continue;
+		if (!host.expert_mode && (cmd->attr & CMD_ATTR_HIDDEN))
 			continue;
 		if (!argc)
 			vty_out(vty, "  %s%s", cmd->string, VTY_NEWLINE);
@@ -4244,6 +4268,7 @@
 	host.lines = -1;
 	host.motd = default_motd;
 	host.motdfile = NULL;
+	host.expert_mode = false;
 
 	/* Install top nodes. */
 	install_node_bare(&view_node, NULL);
diff --git a/tests/vty/vty_transcript_test.c b/tests/vty/vty_transcript_test.c
index abe3702..c9ecf18 100644
--- a/tests/vty/vty_transcript_test.c
+++ b/tests/vty/vty_transcript_test.c
@@ -232,6 +232,23 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN_DEPRECATED(cfg_attr_deprecated,
+		 cfg_attr_deprecated_cmd,
+		 "foo-deprecated",
+		 "This command is deprecated\n")
+{
+	return CMD_WARNING;
+}
+
+DEFUN_HIDDEN(cfg_attr_hidden,
+	     cfg_attr_hidden_cmd,
+	     "foo-hidden [expert-mode]",
+	     "This command is hidden\n"
+	     "But can be seen in the expert mode\n")
+{
+	return CMD_SUCCESS;
+}
+
 DEFUN_ATTR(cfg_attr_immediate, cfg_attr_immediate_cmd,
 	   "foo-immediate",
 	   "Applies immediately\n",
@@ -293,6 +310,15 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN_ATTR_USRATTR(cfg_attr_hidden_app_attr_unbelievable,
+		   cfg_attr_hidden_app_attr_unbelievable_cmd,
+		   CMD_ATTR_HIDDEN, X(TEST_ATTR_UNBELIEVABLE),
+		   "app-hidden-unbelievable",
+		   "Hidden, but still unbelievable help message\n")
+{
+	return CMD_SUCCESS;
+}
+
 static void init_vty_cmds()
 {
 	install_element_ve(&single0_cmd);
@@ -302,6 +328,8 @@
 
 	install_element(CONFIG_NODE, &cfg_attr_test_cmd);
 	install_node(&attr_test_node, NULL);
+	install_element(ATTR_TEST_NODE, &cfg_attr_deprecated_cmd);
+	install_element(ATTR_TEST_NODE, &cfg_attr_hidden_cmd);
 	install_element(ATTR_TEST_NODE, &cfg_attr_immediate_cmd);
 	install_element(ATTR_TEST_NODE, &cfg_attr_node_exit_cmd);
 
@@ -311,6 +339,7 @@
 
 	install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_magnificent_cmd);
 	install_element(ATTR_TEST_NODE, &cfg_app_attr_unbelievable_wonderful_cmd);
+	install_element(ATTR_TEST_NODE, &cfg_attr_hidden_app_attr_unbelievable_cmd);
 }
 
 int main(int argc, char **argv)
diff --git a/tests/vty/vty_transcript_test.vty b/tests/vty/vty_transcript_test.vty
index 2c618d8..7b8241e 100644
--- a/tests/vty/vty_transcript_test.vty
+++ b/tests/vty/vty_transcript_test.vty
@@ -87,6 +87,7 @@
 
 vty_transcript_test> show vty-attributes
   Global attributes:
+    ^  This command is hidden (check expert mode)
     !  This command applies immediately
     @  This command applies on VTY node exit
   Library specific attributes:
@@ -104,7 +105,7 @@
 vty_transcript_test(config)# attribute-test
 
 vty_transcript_test(config-attr-test)# list
-...
+... !foo-(hidden|deprecated)
   foo-immediate
   foo-node-exit
   app-unbelievable
@@ -112,9 +113,10 @@
   app-wonderful
   app-unbelievable-magnificent
   app-unbelievable-wonderful
+... !app-hidden-*
 
 vty_transcript_test(config-attr-test)# list with-flags
-...
+... !foo-(hidden|deprecated)
   ! ...  foo-immediate
   @ ...  foo-node-exit
   . u..  app-unbelievable
@@ -122,3 +124,56 @@
   . ..w  app-wonderful
   . um.  app-unbelievable-magnificent
   . u.w  app-unbelievable-wonderful
+... !app-hidden-*
+
+vty_transcript_test(config-attr-test)# foo-deprecated?
+% There is no matched command.
+vty_transcript_test(config-attr-test)# foo-hidden?
+% There is no matched command.
+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?
+% There is no matched command.
+
+vty_transcript_test(config-attr-test)# end
+vty_transcript_test# disable
+
+vty_transcript_test> enable?
+  enable  Turn on privileged mode command
+vty_transcript_test> enable ?
+  [expert-mode]  Enable the expert mode (show hidden commands)
+
+vty_transcript_test> enable expert-mode
+vty_transcript_test# configure terminal
+vty_transcript_test(config)# attribute-test
+
+vty_transcript_test(config-attr-test)# list
+... !foo-deprected
+  foo-hidden [expert-mode]
+  foo-immediate
+  foo-node-exit
+  app-unbelievable
+  app-magnificent
+  app-wonderful
+  app-unbelievable-magnificent
+  app-unbelievable-wonderful
+  app-hidden-unbelievable
+
+vty_transcript_test(config-attr-test)# list with-flags
+... !foo-deprected
+  ^ ...  foo-hidden [expert-mode]
+  ! ...  foo-immediate
+  @ ...  foo-node-exit
+  . u..  app-unbelievable
+  . .m.  app-magnificent
+  . ..w  app-wonderful
+  . um.  app-unbelievable-magnificent
+  . u.w  app-unbelievable-wonderful
+  ^ u..  app-hidden-unbelievable
+
+vty_transcript_test(config-attr-test)# foo-deprecated?
+% There is no matched command.
+vty_transcript_test(config-attr-test)# foo-hidden?
+  foo-hidden  This command is hidden
+vty_transcript_test(config-attr-test)# foo-hidden ?
+  [expert-mode]  But can be seen in the expert mode
+vty_transcript_test(config-attr-test)# app-hidden-unbelievable?
+  app-hidden-unbelievable  Hidden, but still unbelievable help message

-- 
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/20815
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Ie69c2a19b22fb31d7bd7f6412f0aeac86ea5048f
Gerrit-Change-Number: 20815
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201020/a2b49d88/attachment.htm>


More information about the gerrit-log mailing list