diff --git a/lib/routemap.c b/lib/routemap.c index e0b0eb7a3cc5..e8a92cda0b08 100644 --- a/lib/routemap.c +++ b/lib/routemap.c @@ -1070,20 +1070,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); @@ -1099,7 +1096,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); } @@ -3145,13 +3142,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 bd283803fedc..a8867f1433b5 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -3391,6 +3391,107 @@ DEFUN (vtysh_show_running_config, return vtysh_write_terminal(self, vty, argc, argv); } +static void show_route_map_send(const char *route_map, const char *daemon, + 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 && daemon == NULL) + 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; + if (daemon && !strmatch(client->name, daemon)) + 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 && daemon == NULL) + vty_out(vty, "\"%s\":", vtysh_client[i].name); + + vtysh_client_execute_name(vtysh_client[i].name, command_line); + } + + if (json && daemon == NULL) + vty_out(vty, "}\n"); +} + +DEFUN (show_route_maps, + show_route_maps_cmd, + "show route-map ["DAEMONS_LIST"] [json]", + SHOW_STR + "route-map information\n" + DAEMONS_STR + JSON_STR) +{ + char *daemon = NULL; + bool json_format = false; + + if (argc == 4) { + json_format = true; + daemon = argv[2]->text; + } else if (argc == 3) { + if (!strcmp(argv[2]->text, "json")) + json_format = true; + else + daemon = argv[2]->text; + } + + show_route_map_send(NULL, daemon, json_format); + + return CMD_SUCCESS; +} + +DEFUN (show_route_map, + show_route_map_cmd, + "show route-map WORD ["DAEMONS_LIST"] [json]", + SHOW_STR + "route-map information\n" + "route-map name\n" + DAEMONS_STR + JSON_STR) +{ + char *route_map = argv[2]->arg; + char *daemon = NULL; + bool json_format = false; + + if (argc == 5) { + json_format = true; + daemon = argv[3]->text; + } else if (argc == 4) { + if (!strcmp(argv[3]->text, "json")) + json_format = true; + else + daemon = argv[3]->text; + } + + show_route_map_send(route_map, daemon, json_format); + + return CMD_SUCCESS; +} + DEFUN (vtysh_integrated_config, vtysh_integrated_config_cmd, "service integrated-vtysh-config", @@ -5042,6 +5143,9 @@ 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); + install_element(ENABLE_NODE, &show_route_maps_cmd); + /* "write terminal" command. */ install_element(ENABLE_NODE, &vtysh_write_terminal_cmd);