vty/command: introduce a command to list attributes
Here is an example of listing all attributes:
OsmoBSC# show vty-attributes
Global attributes:
. This command is deprecated
. This command is hidden
. This command applies immediately
. This command applies on VTY node exit
Library specific attributes:
(no attributes)
Application specific attributes:
o This command applies on A-bis OML link (re)establishment
r This command applies on A-bis RSL link (re)establishment
or only a specific kind of attributes:
OsmoBSC# show vty-attributes application
Application specific attributes:
o This command applies on A-bis OML link (re)establishment
r This command applies on A-bis RSL link (re)establishment
Change-Id: I561114d7416e30cc06b7d49c0bc1217a76039c99
Related: SYS#4937
diff --git a/src/vty/command.c b/src/vty/command.c
index faad9fe..46fe854 100644
--- a/src/vty/command.c
+++ b/src/vty/command.c
@@ -2948,6 +2948,96 @@
return CMD_SUCCESS;
}
+enum {
+ ATTR_TYPE_GLOBAL = (1 << 0),
+ ATTR_TYPE_LIB = (1 << 1),
+ ATTR_TYPE_APP = (1 << 2),
+};
+
+static void print_attr_list(struct vty *vty, unsigned int attr_mask)
+{
+ const char *desc;
+ unsigned int i;
+ bool found;
+ char flag;
+
+ if (attr_mask & ATTR_TYPE_GLOBAL) {
+ vty_out(vty, " Global attributes:%s", VTY_NEWLINE);
+
+ for (i = 0; i < ARRAY_SIZE(cmd_attr_desc) - 1; i++) {
+ desc = cmd_attr_desc[i].str;
+ flag = '.'; /* FIXME: no flags defined */
+ vty_out(vty, " %c %s%s", flag, desc, VTY_NEWLINE);
+ }
+ }
+
+ if (attr_mask & ATTR_TYPE_LIB) {
+ vty_out(vty, " Library specific attributes:%s", VTY_NEWLINE);
+
+ for (i = 0, found = false; i < _OSMO_CORE_LIB_ATTR_COUNT; i++) {
+ if ((desc = cmd_lib_attr_desc[i]) == NULL)
+ continue;
+ found = true;
+
+ flag = cmd_lib_attr_letters[i];
+ if (flag == '\0')
+ flag = '.';
+
+ vty_out(vty, " %c %s%s", flag, desc, VTY_NEWLINE);
+ }
+
+ if (!found)
+ vty_out(vty, " (no attributes)%s", VTY_NEWLINE);
+ }
+
+ if (attr_mask & ATTR_TYPE_APP) {
+ vty_out(vty, " Application specific attributes:%s", VTY_NEWLINE);
+
+ for (i = 0, found = false; i < VTY_CMD_USR_ATTR_NUM; i++) {
+ if ((desc = host.app_info->usr_attr_desc[i]) == NULL)
+ continue;
+ found = true;
+
+ flag = host.app_info->usr_attr_letters[i];
+ if (flag == '\0')
+ flag = '.';
+
+ vty_out(vty, " %c %s%s", flag, desc, VTY_NEWLINE);
+ }
+
+ if (!found)
+ vty_out(vty, " (no attributes)%s", VTY_NEWLINE);
+ }
+}
+
+gDEFUN(show_vty_attr_all, show_vty_attr_all_cmd,
+ "show vty-attributes",
+ SHOW_STR "List of VTY attributes\n")
+{
+ print_attr_list(vty, 0xff);
+ return CMD_SUCCESS;
+}
+
+gDEFUN(show_vty_attr, show_vty_attr_cmd,
+ "show vty-attributes (application|library|global)",
+ SHOW_STR "List of VTY attributes\n"
+ "Application specific attributes only\n"
+ "Library specific attributes only\n"
+ "Global attributes only\n")
+{
+ unsigned int attr_mask = 0;
+
+ if (argv[0][0] == 'g') /* global */
+ attr_mask |= ATTR_TYPE_GLOBAL;
+ else if (argv[0][0] == 'l') /* library */
+ attr_mask |= ATTR_TYPE_LIB;
+ else if (argv[0][0] == 'a') /* application */
+ attr_mask |= ATTR_TYPE_APP;
+
+ print_attr_list(vty, attr_mask);
+ return CMD_SUCCESS;
+}
+
/* Help display function for all node. */
gDEFUN(config_list, config_list_cmd, "list", "Print command list\n")
{
@@ -3932,6 +4022,9 @@
install_lib_element(node, &config_help_cmd);
install_lib_element(node, &config_list_cmd);
+ install_lib_element(node, &show_vty_attr_all_cmd);
+ install_lib_element(node, &show_vty_attr_cmd);
+
install_lib_element(node, &config_write_terminal_cmd);
install_lib_element(node, &config_write_file_cmd);
install_lib_element(node, &config_write_memory_cmd);
@@ -3952,6 +4045,8 @@
static bool vty_command_is_common(struct cmd_element *cmd)
{
if (cmd == &config_help_cmd
+ || cmd == &show_vty_attr_all_cmd
+ || cmd == &show_vty_attr_cmd
|| cmd == &config_list_cmd
|| cmd == &config_write_terminal_cmd
|| cmd == &config_write_file_cmd
@@ -4035,6 +4130,8 @@
install_lib_element(VIEW_NODE, &config_list_cmd);
install_lib_element(VIEW_NODE, &config_exit_cmd);
install_lib_element(VIEW_NODE, &config_help_cmd);
+ install_lib_element(VIEW_NODE, &show_vty_attr_all_cmd);
+ install_lib_element(VIEW_NODE, &show_vty_attr_cmd);
install_lib_element(VIEW_NODE, &config_enable_cmd);
install_lib_element(VIEW_NODE, &config_terminal_length_cmd);
install_lib_element(VIEW_NODE, &config_terminal_no_length_cmd);