summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Sharp <donaldsharp72@gmail.com>2023-11-28 09:18:00 -0500
committerGitHub <noreply@github.com>2023-11-28 09:18:00 -0500
commitf5be225e63506535e5b06b0868d2f8b6b5004cd0 (patch)
tree7cd041ca78d102fce10d336c05b15b6ef1986136
parent32d25b73752d2216889d2d984accaad62b9f3611 (diff)
parent3a63f70a827bbe8d0ba557b3ff85e4e14dff64c6 (diff)
Merge pull request #14893 from FRRouting/mergify/bp/stable/8.5/pr-14856
lib: fix show route map JSON display (backport #14856)
-rw-r--r--doc/user/zebra.rst2
-rw-r--r--lib/routemap.c25
-rw-r--r--vtysh/vtysh.c59
3 files changed, 70 insertions, 16 deletions
diff --git a/doc/user/zebra.rst b/doc/user/zebra.rst
index c05a29af4e..64083b8d3e 100644
--- a/doc/user/zebra.rst
+++ b/doc/user/zebra.rst
@@ -1308,8 +1308,6 @@ zebra Terminal Mode Commands
.. clicmd:: show ip prefix-list [NAME]
-.. clicmd:: show route-map [NAME]
-
.. clicmd:: show ip protocol
.. clicmd:: show ip forward
diff --git a/lib/routemap.c b/lib/routemap.c
index 010d4bff0b..683943eb6d 100644
--- a/lib/routemap.c
+++ b/lib/routemap.c
@@ -1047,20 +1047,17 @@ static int vty_show_route_map(struct vty *vty, const char *name, bool use_json)
{
struct route_map *map;
json_object *json = NULL;
- json_object *json_proto = NULL;
- if (use_json) {
+ if (use_json)
json = json_object_new_object();
- json_proto = json_object_new_object();
- json_object_object_add(json, frr_protonameinst, json_proto);
- } else
+ else
vty_out(vty, "%s:\n", frr_protonameinst);
if (name) {
map = route_map_lookup_by_name(name);
if (map) {
- vty_show_route_map_entry(vty, map, json_proto);
+ vty_show_route_map_entry(vty, map, json);
} else if (!use_json) {
vty_out(vty, "%s: 'route-map %s' not found\n",
frr_protonameinst, name);
@@ -1076,7 +1073,7 @@ static int vty_show_route_map(struct vty *vty, const char *name, bool use_json)
list_sort(maplist, sort_route_map);
for (ALL_LIST_ELEMENTS_RO(maplist, ln, map))
- vty_show_route_map_entry(vty, map, json_proto);
+ vty_show_route_map_entry(vty, map, json);
list_delete(&maplist);
}
@@ -3141,13 +3138,13 @@ DEFPY (rmap_clear_counters,
}
-DEFUN (rmap_show_name,
- rmap_show_name_cmd,
- "show route-map [WORD] [json]",
- SHOW_STR
- "route-map information\n"
- "route-map name\n"
- JSON_STR)
+DEFUN_NOSH (rmap_show_name,
+ rmap_show_name_cmd,
+ "show route-map [WORD] [json]",
+ SHOW_STR
+ "route-map information\n"
+ "route-map name\n"
+ JSON_STR)
{
bool uj = use_json(argc, argv);
int idx = 0;
diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c
index acc984ced7..ffc81117a6 100644
--- a/vtysh/vtysh.c
+++ b/vtysh/vtysh.c
@@ -3280,6 +3280,63 @@ DEFUN (vtysh_show_running_config,
return vtysh_write_terminal(self, vty, argc, argv);
}
+static void show_route_map_send(const char *route_map, bool json)
+{
+ unsigned int i;
+ bool first = true;
+ char command_line[128];
+
+ snprintf(command_line, sizeof(command_line), "show route-map ");
+ if (route_map)
+ strlcat(command_line, route_map, sizeof(command_line));
+ if (json)
+ strlcat(command_line, " json", sizeof(command_line));
+
+ if (json)
+ vty_out(vty, "{");
+
+ for (i = 0; i < array_size(vtysh_client); i++) {
+ const struct vtysh_client *client = &vtysh_client[i];
+ bool is_connected = true;
+
+ if (!CHECK_FLAG(client->flag, VTYSH_RMAP))
+ continue;
+
+ for (; client; client = client->next)
+ if (client->fd < 0)
+ is_connected = false;
+
+ if (!is_connected)
+ continue;
+
+ if (json && !first)
+ vty_out(vty, ",");
+ else
+ first = false;
+
+ if (json)
+ vty_out(vty, "\"%s\":", vtysh_client[i].name);
+
+ vtysh_client_execute_name(vtysh_client[i].name, command_line);
+ }
+
+ if (json)
+ vty_out(vty, "}\n");
+}
+
+DEFPY (show_route_map,
+ show_route_map_cmd,
+ "show route-map [WORD]$route_map [json]$json",
+ SHOW_STR
+ "route-map information\n"
+ "route-map name\n"
+ JSON_STR)
+{
+ show_route_map_send(route_map, !!json);
+
+ return CMD_SUCCESS;
+}
+
DEFUN (vtysh_integrated_config,
vtysh_integrated_config_cmd,
"service integrated-vtysh-config",
@@ -4908,6 +4965,8 @@ void vtysh_init_vty(void)
install_element(ENABLE_NODE, &vtysh_copy_running_config_cmd);
install_element(ENABLE_NODE, &vtysh_copy_to_running_cmd);
+ install_element(ENABLE_NODE, &show_route_map_cmd);
+
/* "write terminal" command. */
install_element(ENABLE_NODE, &vtysh_write_terminal_cmd);