#!/bin/sh . /usr/share/libubox/jshn.sh . /lib/functions.sh read_mcast_stats() { local temp_igmp_file='/tmp/igmp_stats_'$$ local snooping_stats='/tmp/igmp_snooping_stats' local old_mod_time=$(date +%s 2>/dev/null -r "$snooping_stats") # Sending signal to mcproxy to dump multicast data in /tmp/igmp_snooping_stats local mcast_pids=$(pidof mcproxy) for pid in $mcast_pids do $(kill -10 $pid) done # Wait for signal is being processed by mcproxy if [ -n "$mcast_pids" ]; then for i in 1 2 3; do local new_mod_time=$(date +%s 2>/dev/null -r "$snooping_stats") [ -n "$new_mod_time" ] && [ "$new_mod_time" != "$old_mod_time" ] && break sleep 0.1 done fi cat "$snooping_stats" > "$temp_igmp_file" local mcast_addrs="" local ifaces="" while read line; do # reading each line case $line in br-*) found_iface=0 snoop_iface="$(echo $line | awk -F ' ' '{ print $1 }')" if [ -z "$ifaces" ]; then ifaces="$snoop_iface" continue fi IFS=" " for ifx in $ifaces; do if [ $ifx == $snoop_iface ]; then found_iface=1 break fi done if [ $found_iface -eq 0 ]; then ifaces="$ifaces $snoop_iface" continue fi ;; esac done < "$temp_igmp_file" while read line; do # reading each line case $line in br-*) found_ip=0 grp_ip="$(echo $line | awk -F ' ' '{ print $2 }')" if [ -z "$mcast_addrs" ]; then mcast_addrs="$grp_ip" continue fi IFS=" " for ip_addr in $mcast_addrs; do if [ $ip_addr == $grp_ip ]; then found_ip=1 break fi done if [ $found_ip -eq 0 ]; then mcast_addrs="$mcast_addrs $grp_ip" continue fi ;; esac done < "$temp_igmp_file" json_init json_add_array "snooping" IFS=" " for intf in $ifaces; do json_add_object "" json_add_string "interface" "$intf" json_add_array "groups" IFS=" " for gip_addr in $mcast_addrs; do grp_obj_added=0 while read line; do # reading each line case $line in br-*) snoop_iface="$(echo $line | awk -F ' ' '{ print $1 }')" if [ "$snoop_iface" != "$intf" ]; then continue fi grp_ip="$(echo $line | awk -F ' ' '{ print $2 }')" if [ "$grp_ip" != "$gip_addr" ]; then continue fi if [ $grp_obj_added -eq 0 ]; then json_add_object "" gip="$(ipcalc.sh $gip_addr | grep IP | awk '{print substr($0,4)}')" json_add_string "groupaddr" "$gip" json_add_array "clients" grp_obj_added=1 fi json_add_object "" host_ip="$(echo $line | awk -F ' ' '{ print $3 }')" h_ip="$(ipcalc.sh $host_ip | grep IP | awk '{print substr($0,4)}')" json_add_string "ipaddr" "$h_ip" src_port="$(echo $line | awk -F ' ' '{ print $4 }')" json_add_string "device" "$src_port" timeout="$(echo $line | awk -F ' ' '{ print $5 }')" json_add_int "timeout" "$timeout" json_close_object #close the associated device object ;; esac done < "$temp_igmp_file" if [ $grp_obj_added -eq 1 ]; then json_close_array #close the associated devices array json_close_object # close the groups object fi done # close the loop for group addresses json_close_array #close the groups array json_close_object # close the snooping object done # close the loop for interfaces json_close_array # close the snooping array json_dump rm -f "$temp_igmp_file" } case "$1" in list) echo '{ "stats":{} }' ;; call) case "$2" in stats) read_mcast_stats ;; esac ;; esac