]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib,vtysh: fix show route map JSON output
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Mon, 20 Nov 2023 20:32:19 +0000 (17:32 -0300)
committerMergify <37929162+mergify[bot]@users.noreply.github.com>
Tue, 28 Nov 2023 13:48:22 +0000 (13:48 +0000)
Move the command from 'lib' to 'vtysh' so we can properly format the
JSON output in a correct manner.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
(cherry picked from commit 570fdc55fd65899cd4376193e833594af6bca093)

lib/routemap.c
vtysh/vtysh.c

index 010d4bff0b77d20194ced01afab186c30af4dd94..683943eb6d31ed5f689a4cc24dc6556c50fa1b31 100644 (file)
@@ -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;
index acc984ced70cd20f9524da8018fa3215b4025396..ffc81117a67194b4a1a1ec61a03d314af6a4a50b 100644 (file)
@@ -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);