iopsys-feed/mcastmngr/files/linux/usr/libexec/rpcd/mcast
2025-01-23 09:28:31 +00:00

162 lines
3.6 KiB
Bash
Executable file

#!/bin/sh
. /usr/share/libubox/jshn.sh
. /lib/functions.sh
readonly TEMPFILE="/tmp/snooping_stats_"$$
meld_files() {
local type="$1"
tail -n +2 "/proc/net/${type}_snooping" >> "$TEMPFILE"
}
read_snooping_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 < "$TEMPFILE"
while read line; do
# reading each line
case $line in
br-*)
found_ip=0
grp_ip="$(echo $line | awk -F ' ' '{ print $7 }')"
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 < "$TEMPFILE"
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 $7 }')"
if [ "$grp_ip" != "$gip_addr" ]; then
continue
fi
if [ $grp_obj_added -eq 0 ]; then
json_add_object ""
if [ -n "$(echo $gip_addr | grep -oE "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$")" ]; then
gip="$(ipcalc.sh $gip_addr | grep IP | awk '{print substr($0,4)}')"
else
gip="$(sipcalc -6 "$gip_addr" | awk '/^Compressed address/{print $4}')"
fi
json_add_string "groupaddr" "$gip"
json_add_array "clients"
grp_obj_added=1
fi
json_add_object ""
host_ip="$(echo $line | awk -F ' ' '{ print $8 }')"
if [ -n "$(echo $host_ip | grep -oE "^((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])$")" ]; then
h_ip="$(ipcalc.sh $host_ip | grep IP | awk '{print substr($0,4)}')"
else
h_ip="$(sipcalc -6 "$host_ip" | awk '/^Compressed address/{print $4}')"
fi
json_add_string "ipaddr" "$h_ip"
src_port="$(echo $line | awk -F ' ' '{ print $2 }')"
json_add_string "device" "$src_port"
timeout="$(echo $line | awk -F ' ' '{ print $9 }')"
json_add_int "timeout" "$timeout"
json_close_object #close the associated device object
;;
esac
done < "$TEMPFILE"
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
}
read_mcast_stats() {
echo -n > "$TEMPFILE"
json_init
json_add_array "snooping"
meld_files "igmp"
meld_files "mld"
read_snooping_file
json_close_array # close the snooping array
json_dump
rm -f "$TEMPFILE"
}
case "$1" in
list)
echo '{ "stats":{} }'
;;
call)
case "$2" in
stats)
out="$(read_mcast_stats)"
if [ -z "${out}" ]; then
echo '{}'
else
echo "${out}"
fi
;;
esac
;;
esac