From 9b91bb50f849b929a90e398a189476d02f1758b5 Mon Sep 17 00:00:00 2001 From: Daniel Walton Date: Tue, 27 Sep 2016 16:37:38 +0000 Subject: [PATCH] pimd: Added json to 'show ip igmp group' Signed-off-by: Daniel Walton root@superm-redxp-05[quagga-pim]# vtysh -c 'show ip igmp group' Interface Address Group Mode Timer Srcs V Uptime br1 20.0.13.1 230.40.40.1 EXCL 00:03:24 1 3 00:01:28 root@superm-redxp-05[quagga-pim]# root@superm-redxp-05[quagga-pim]# root@superm-redxp-05[quagga-pim]# vtysh -c 'show ip igmp group json' | python -m json.tool { "br1": { "230.40.40.1": { "group": "230.40.40.1", "mode": "EXCLUDE", "source": "20.0.13.1", "sourcesCount": 1, "timer": "00:03:23", "uptime": "00:01:30", "version": 3 }, "address": "20.0.13.1", "flagBroadcast": true, "flagMulticast": true, "index": 96, "lanDelayEnabled": true, "name": "br1", "state": "up" } } root@superm-redxp-05[quagga-pim]# --- pimd/pim_cmd.c | 121 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 79 insertions(+), 42 deletions(-) diff --git a/pimd/pim_cmd.c b/pimd/pim_cmd.c index 74effbaa69..d9b70139c2 100644 --- a/pimd/pim_cmd.c +++ b/pimd/pim_cmd.c @@ -577,6 +577,9 @@ static void igmp_show_interfaces_single(struct vty *vty, const char *ifname, u_c json_object *json = NULL; json_object *json_row = NULL; + if (uj) + json = json_object_new_object(); + now = pim_time_monotonic_sec(); for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) { @@ -585,7 +588,7 @@ static void igmp_show_interfaces_single(struct vty *vty, const char *ifname, u_c if (!pim_ifp) continue; - if (strcmp(ifname, ifp->name)) + if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name)) continue; for (ALL_LIST_ELEMENTS_RO(pim_ifp->igmp_socket_list, sock_node, igmp)) { @@ -615,7 +618,6 @@ static void igmp_show_interfaces_single(struct vty *vty, const char *ifname, u_c mloop = pim_socket_mcastloop_get(pim_ifp->pim_sock_fd); if (uj) { - json = json_object_new_object(); json_row = json_object_new_object(); json_object_pim_ifp_add(json_row, ifp); @@ -634,8 +636,6 @@ static void igmp_show_interfaces_single(struct vty *vty, const char *ifname, u_c json_object_int_add(json_row, "timerStartupQueryInterval", sqi); json_object_object_add(json, ifp->name, json_row); - vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE); - json_object_free(json); } else { vty_out(vty, "Interface : %s%s", ifp->name, VTY_NEWLINE); @@ -672,13 +672,13 @@ static void igmp_show_interfaces_single(struct vty *vty, const char *ifname, u_c } } - if (!found_ifname) - { - if (uj) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "%% No such interface%s", VTY_NEWLINE); - } + if (uj) { + vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE); + json_object_free(json); + } else { + if (!found_ifname) + vty_out (vty, "%% No such interface%s", VTY_NEWLINE); + } } static void igmp_show_interface_join(struct vty *vty) @@ -768,6 +768,9 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch now = pim_time_monotonic_sec(); + if (uj) + json = json_object_new_object(); + for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), node, ifp)) { pim_ifp = ifp->info; @@ -777,7 +780,7 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch if (pim_ifp->pim_sock_fd < 0) continue; - if (strcmp(ifname, ifp->name)) + if (strcmp(ifname, "detail") && strcmp(ifname, ifp->name)) continue; found_ifname = 1; @@ -790,7 +793,6 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch mloop = pim_socket_mcastloop_get(pim_ifp->pim_sock_fd); if (uj) { - json = json_object_new_object(); json_row = json_object_new_object(); json_object_pim_ifp_add(json_row, ifp); @@ -871,10 +873,7 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch json_object_int_add(json_row, "propagationDelayHighest", pim_ifp->pim_neighbors_highest_propagation_delay_msec); json_object_int_add(json_row, "overrideInterval", pim_ifp->pim_override_interval_msec); json_object_int_add(json_row, "overrideIntervalHighest", pim_ifp->pim_neighbors_highest_override_interval_msec); - json_object_object_add(json, ifp->name, json_row); - vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE); - json_object_free(json); } else { vty_out(vty, "Interface : %s%s", ifp->name, VTY_NEWLINE); @@ -974,13 +973,13 @@ static void pim_show_interfaces_single(struct vty *vty, const char *ifname, u_ch } } - if (!found_ifname) - { - if (uj) - vty_out (vty, "{}%s", VTY_NEWLINE); - else - vty_out (vty, "%% No such interface%s", VTY_NEWLINE); - } + if (uj) { + vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE); + json_object_free(json); + } else { + if (!found_ifname) + vty_out (vty, "%% No such interface%s", VTY_NEWLINE); + } } @@ -1185,7 +1184,9 @@ static void pim_show_neighbors_single(struct vty *vty, const char *neighbor, u_c * The user can specify either the interface name or the PIM neighbor IP. * If this pim_ifp matches neither then skip. */ - if (strcmp(neighbor, ifp->name) && strcmp(neighbor, neigh_src_str)) + if (strcmp(neighbor, "detail") && + strcmp(neighbor, ifp->name) && + strcmp(neighbor, neigh_src_str)) continue; found_neighbor = 1; @@ -1777,15 +1778,21 @@ static void pim_show_rpf(struct vty *vty, u_char uj) } } -static void igmp_show_groups(struct vty *vty) +static void igmp_show_groups(struct vty *vty, u_char uj) { struct listnode *ifnode; struct interface *ifp; time_t now; + json_object *json = NULL; + json_object *json_iface = NULL; + json_object *json_row = NULL; now = pim_time_monotonic_sec(); - vty_out(vty, "Interface Address Group Mode Timer Srcs V Uptime %s", VTY_NEWLINE); + if (uj) + json = json_object_new_object(); + else + vty_out(vty, "Interface Address Group Mode Timer Srcs V Uptime %s", VTY_NEWLINE); /* scan interfaces */ for (ALL_LIST_ELEMENTS_RO (vrf_iflist (VRF_DEFAULT), ifnode, ifp)) { @@ -1814,20 +1821,45 @@ static void igmp_show_groups(struct vty *vty) pim_time_timer_to_hhmmss(hhmmss, sizeof(hhmmss), grp->t_group_timer); pim_time_uptime(uptime, sizeof(uptime), now - grp->group_creation); - vty_out(vty, "%-9s %-15s %-15s %4s %8s %4d %d %8s%s", - ifp->name, - ifaddr_str, - group_str, - grp->group_filtermode_isexcl ? "EXCL" : "INCL", - hhmmss, - grp->group_source_list ? listcount(grp->group_source_list) : 0, - igmp_group_compat_mode(igmp, grp), - uptime, - VTY_NEWLINE); + if (uj) { + json_object_object_get_ex(json, ifp->name, &json_iface); + if (!json_iface) { + json_iface = json_object_new_object(); + json_object_pim_ifp_add(json_iface, ifp); + json_object_object_add(json, ifp->name, json_iface); + } + + json_row = json_object_new_object(); + json_object_string_add(json_row, "source", ifaddr_str); + json_object_string_add(json_row, "group", group_str); + json_object_string_add(json_row, "mode", grp->group_filtermode_isexcl ? "EXCLUDE" : "INCLUDE"); + json_object_string_add(json_row, "timer", hhmmss); + json_object_int_add(json_row, "sourcesCount", grp->group_source_list ? listcount(grp->group_source_list) : 0); + json_object_int_add(json_row, "version", igmp_group_compat_mode(igmp, grp)); + json_object_string_add(json_row, "uptime", uptime); + json_object_object_add(json_iface, group_str, json_row); + + } else { + vty_out(vty, "%-9s %-15s %-15s %4s %8s %4d %d %8s%s", + ifp->name, + ifaddr_str, + group_str, + grp->group_filtermode_isexcl ? "EXCL" : "INCL", + hhmmss, + grp->group_source_list ? listcount(grp->group_source_list) : 0, + igmp_group_compat_mode(igmp, grp), + uptime, + VTY_NEWLINE); + } } /* scan igmp groups */ } /* scan igmp sockets */ } /* scan interfaces */ + + if (uj) { + vty_out (vty, "%s%s", json_object_to_json_string(json), VTY_NEWLINE); + json_object_free(json); + } } static void igmp_show_group_retransmission(struct vty *vty) @@ -2178,11 +2210,12 @@ DEFUN (clear_ip_pim_oil, DEFUN (show_ip_igmp_interface, show_ip_igmp_interface_cmd, - "show ip igmp interface [WORD] [json]", + "show ip igmp interface [detail|WORD] [json]", SHOW_STR IP_STR IGMP_STR "IGMP interface information\n" + "Detailed output\n" "interface name\n" "JavaScript Object Notation\n") { @@ -2210,13 +2243,15 @@ DEFUN (show_ip_igmp_join, DEFUN (show_ip_igmp_groups, show_ip_igmp_groups_cmd, - "show ip igmp groups", + "show ip igmp groups [json]", SHOW_STR IP_STR IGMP_STR - IGMP_GROUP_STR) + IGMP_GROUP_STR + "JavaScript Object Notation\n") { - igmp_show_groups(vty); + u_char uj = use_json(argc, argv); + igmp_show_groups(vty, uj); return CMD_SUCCESS; } @@ -2344,11 +2379,12 @@ DEFUN (show_ip_pim_hello, DEFUN (show_ip_pim_interface, show_ip_pim_interface_cmd, - "show ip pim interface [WORD] [json]", + "show ip pim interface [detail|WORD] [json]", SHOW_STR IP_STR PIM_STR "PIM interface information\n" + "Detailed output\n" "interface name\n" "JavaScript Object Notation\n") { @@ -2391,11 +2427,12 @@ DEFUN (show_ip_pim_local_membership, DEFUN (show_ip_pim_neighbor, show_ip_pim_neighbor_cmd, - "show ip pim neighbor [WORD] [json]", + "show ip pim neighbor [detail|WORD] [json]", SHOW_STR IP_STR PIM_STR "PIM neighbor information\n" + "Detailed output\n" "Name of interface or neighbor\n" "JavaScript Object Notation\n") { -- 2.39.5