diff options
| author | Donald Sharp <donaldsharp72@gmail.com> | 2023-11-28 09:18:00 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-11-28 09:18:00 -0500 |
| commit | f5be225e63506535e5b06b0868d2f8b6b5004cd0 (patch) | |
| tree | 7cd041ca78d102fce10d336c05b15b6ef1986136 | |
| parent | 32d25b73752d2216889d2d984accaad62b9f3611 (diff) | |
| parent | 3a63f70a827bbe8d0ba557b3ff85e4e14dff64c6 (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.rst | 2 | ||||
| -rw-r--r-- | lib/routemap.c | 25 | ||||
| -rw-r--r-- | vtysh/vtysh.c | 59 |
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); |
