#!/bin/sh . /lib/functions.sh . /lib/functions/network.sh . /usr/share/libubox/jshn.sh . /lib/mwan3/common.sh IPS="ipset" IPT4="iptables -t mangle -w" IPT6="ip6tables -t mangle -w" report_connected_v4() { local address if [ -n "$($IPT4 -S mwan3_connected 2> /dev/null)" ]; then for address in $($IPS -o save list mwan3_connected_v4 | grep add | cut -d " " -f 3); do json_add_string "" "${address}" done fi } report_connected_v6() { [ $NO_IPV6 -ne 0 ] && return local address if [ -n "$($IPT6 -S mwan3_connected 2> /dev/null)" ]; then for address in $($IPS -o save list mwan3_connected_v6 | grep add | cut -d " " -f 3); do json_add_string "" "${address}" done fi } report_policies() { local ipt="$1" local policy="$2" local percent total_weight weight iface total_weight=$($ipt -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | head -1 | awk '{print $3}') for iface in $($ipt -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '{print $1}'); do weight=$($ipt -S $policy | grep -v '.*--comment "out .*" .*$' | cut -s -d'"' -f2 | awk '$1 == "'$iface'"' | awk '{print $2}') percent=$(($weight*100/$total_weight)) json_add_object json_add_string interface "$iface" json_add_int percent "$percent" json_close_object done } report_policies_v4() { local policy for policy in $($IPT4 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do json_add_array "${policy##*mwan3_policy_}" report_policies "$IPT4" "$policy" json_close_array done } report_policies_v6() { [ $NO_IPV6 -ne 0 ] && return local policy for policy in $($IPT6 -S | awk '{print $2}' | grep mwan3_policy_ | sort -u); do json_add_array "${policy##*mwan3_policy_}" report_policies "$IPT6" "$policy" json_close_array done } get_age() { local time_p time_u iface="$1" time_p="$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/TIME")" [ -z "${time_p}" ] || { time_n="$(get_uptime)" echo $((time_n-time_p)) } } get_offline_time() { local time_n time_d iface iface="$1" time_d="$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/OFFLINE")" [ -z "${time_d}" ] || [ "${time_d}" = "0" ] || { time_n="$(get_uptime)" echo $((time_n-time_d)) } } get_mwan3_status() { local iface="${1}" local iface_select="${2}" local running="0" local age=0 local online=0 local offline=0 local enabled time_p time_n time_u time_d status track_status up uptime if [ "${iface}" != "${iface_select}" ] && [ "${iface_select}" != "" ]; then return fi track_status="$(mwan3_get_mwan3track_status "$1")" [ "$track_status" = "active" ] && running="1" age=$(get_age "$iface") online=$(get_online_time "$iface") offline=$(get_offline_time "$iface") config_get enabled "$iface" enabled 0 if [ -d "${MWAN3_STATUS_DIR}" ]; then network_get_uptime uptime "$iface" network_is_up "$iface" && up="1" if [ -f "$MWAN3TRACK_STATUS_DIR/${iface}/STATUS" ]; then status="$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/STATUS")" else status="notracking" fi else uptime=0 up=0 status="unknown" fi json_add_object "${iface}" json_add_int age "$age" json_add_int online "${online}" json_add_int offline "${offline}" json_add_int uptime "${uptime}" json_add_int "score" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/SCORE")" json_add_int "lost" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LOST")" json_add_int "turn" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/TURN")" json_add_string "status" "${status}" json_add_boolean "enabled" "${enabled}" json_add_boolean "running" "${running}" json_add_boolean "up" "${up}" json_add_array "track_ip" for file in $MWAN3TRACK_STATUS_DIR/${iface}/TRACK_*; do [ -z "${file#*/TRACK_OUTPUT}" ] && continue [ -z "${file#*/TRACK_\*}" ] && continue track="${file#*/TRACK_}" json_add_object json_add_string ip "${track}" json_add_string status "$(cat "${file}")" json_add_int latency "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LATENCY_${track}")" json_add_int packetloss "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LOSS_${track}")" json_close_object done json_close_array json_close_object } main () { case "$1" in list) json_init json_add_object "status" json_add_string "section" "x" json_add_string "interface" "x" json_add_string "policies" "x" json_close_object json_dump ;; call) case "$2" in status) local section iface read input; json_load "$input" json_get_var section section json_get_var iface interface config_load mwan3 json_init case "$section" in interfaces) json_add_object interfaces config_foreach get_mwan3_status interface "${iface}" json_close_object ;; connected) json_add_object connected json_add_array ipv4 report_connected_v4 json_close_array json_add_array ipv6 report_connected_v6 json_close_array json_close_object ;; policies) json_add_object policies json_add_object ipv4 report_policies_v4 json_close_object json_add_object ipv6 report_policies_v6 json_close_object json_close_object ;; *) # interfaces json_add_object interfaces config_foreach get_mwan3_status interface json_close_object # connected json_add_object connected json_add_array ipv4 report_connected_v4 json_close_array json_add_array ipv6 report_connected_v6 json_close_array json_close_object # policies json_add_object policies json_add_object ipv4 report_policies_v4 json_close_object json_add_object ipv6 report_policies_v6 json_close_object json_close_object ;; esac json_dump ;; esac ;; esac } main "$@"