vty XML export: avoid repeating common node commands for each node

We use 'show online-help' to generate VTY reference manuals. It is not helpful
to include the common node commands on each and every node level, it clutters
the actual useful help.

Have a separate first section called 'Common Commands', but omit them
elsewhere.

Change-Id: Ie802eccad80887968b10269ff9c0e9797268e0d4
This commit is contained in:
Neels Hofmeyr 2017-10-19 02:44:57 +02:00 committed by Harald Welte
parent 53aa0f51b8
commit 69054e28ad
1 changed files with 45 additions and 0 deletions

View File

@ -645,6 +645,8 @@ static int vty_dump_element(struct cmd_element *cmd, struct vty *vty)
return 0;
}
static bool vty_command_is_common(struct cmd_element *cmd);
/*
* Dump all nodes and commands associated with a given node as XML to the VTY.
*/
@ -655,6 +657,29 @@ static int vty_dump_nodes(struct vty *vty)
vty_out(vty, "<vtydoc xmlns='urn:osmocom:xml:libosmocore:vty:doc:1.0'>%s", VTY_NEWLINE);
/* Only once, list all common node commands. Use the CONFIG node to find common node commands. */
vty_out(vty, " <node id='_common_cmds_'>%s", VTY_NEWLINE);
vty_out(vty, " <name>Common Commands</name>%s", VTY_NEWLINE);
vty_out(vty, " <description>These commands are available on all VTY nodes. They are listed"
" here only once, to unclutter the VTY reference.</description>%s", VTY_NEWLINE);
for (i = 0; i < vector_active(cmdvec); ++i) {
struct cmd_node *cnode;
cnode = vector_slot(cmdvec, i);
if (!cnode)
continue;
if (cnode->node != CONFIG_NODE)
continue;
for (j = 0; j < vector_active(cnode->cmd_vector); ++j) {
struct cmd_element *elem;
elem = vector_slot(cnode->cmd_vector, j);
if (!vty_command_is_common(elem))
continue;
vty_dump_element(elem, vty);
}
}
vty_out(vty, " </node>%s", VTY_NEWLINE);
for (i = 0; i < vector_active(cmdvec); ++i) {
struct cmd_node *cnode;
cnode = vector_slot(cmdvec, i);
@ -682,6 +707,8 @@ static int vty_dump_nodes(struct vty *vty)
for (j = 0; j < vector_active(cnode->cmd_vector); ++j) {
struct cmd_element *elem;
elem = vector_slot(cnode->cmd_vector, j);
if (vty_command_is_common(elem))
continue;
vty_dump_element(elem, vty);
}
@ -3648,6 +3675,24 @@ static void install_basic_node_commands(int node)
}
}
/*! Return true if a node is installed by install_basic_node_commands(), so
* that we can avoid repeating them for each and every node during 'show
* running-config' */
static bool vty_command_is_common(struct cmd_element *cmd)
{
if (cmd == &config_help_cmd
|| cmd == &config_list_cmd
|| cmd == &config_write_terminal_cmd
|| cmd == &config_write_file_cmd
|| cmd == &config_write_memory_cmd
|| cmd == &config_write_cmd
|| cmd == &show_running_config_cmd
|| cmd == &config_exit_cmd
|| cmd == &config_end_cmd)
return true;
return false;
}
/**
* Write the current running config to a given file
* \param[in] vty the vty of the code