--- /dev/null
+#!/bin/sh
+
+. /lib/functions.sh
+. /usr/share/libubox/jshn.sh
+
+MWAN3_STATUS_DIR="/var/run/mwan3track"
+MWAN3_PID_FILE="/var/run/mwan3track"
+
+IPS="/usr/sbin/ipset"
+IPT4="/usr/sbin/iptables -t mangle -w"
+IPT6="/usr/sbin/ip6tables -t mangle -w"
+
+report_connected_v4() {
+ local address
+
+ if [ -n "$($IPT4 -S mwan3_connected 2> /dev/null)" ]; then
+ for address in $($IPS list mwan3_connected_v4 | tail -n +8); do
+ json_add_string "" "${address}"
+ done
+ fi
+}
+
+report_connected_v6() {
+ local address
+
+ if [ -n "$($IPT6 -S mwan3_connected 2> /dev/null)" ]; then
+ for address in $($IPS list mwan3_connected_v6 | tail -n +8); do
+ json_add_string "" "${address}"
+ done
+ fi
+}
+
+get_mwan3_status() {
+ local iface="${1}"
+ local iface_select="${2}"
+ local running="0"
+ local pid=""
+ local status=""
+
+ if [ "${iface}" = "${iface_select}" ] || [ "${iface_select}" = "" ]; then
+ if [ -f "${MWAN3_PID_FILE}-${iface}.pid" ]; then
+ pid="$(cat "${MWAN3_PID_FILE}-${iface}.pid")"
+ status="$(pgrep -f mwan3track | grep "${pid}")"
+ if [ "${status}" != "" ]; then
+ running="1"
+ fi
+ fi
+
+ json_add_object "${iface}"
+ json_add_string "score" "$(cat "$MWAN3_STATUS_DIR/${iface}/SCORE")"
+ json_add_string "lost" "$(cat "$MWAN3_STATUS_DIR/${iface}/LOST")"
+ json_add_string "turn" "$(cat "$MWAN3_STATUS_DIR/${iface}/TURN")"
+ json_add_string "status" "$(cat "$MWAN3_STATUS_DIR/${iface}/STATUS")"
+ json_add_boolean "running" "${running}"
+ json_add_array "track_ip"
+ for file in $MWAN3_STATUS_DIR/${iface}/*; do
+ track="${file#*/TRACK_}"
+ if [ "${track}" != "${file}" ]; then
+ json_add_object
+ json_add_string ip "${track}"
+ json_add_string status "$(cat "${file}")"
+ json_close_object
+ fi
+ done
+ json_close_array
+ json_close_object
+ fi
+}
+
+case "$1" in
+ list)
+ json_init
+ json_add_object "status"
+ json_add_string "section" "x"
+ json_add_string "interface" "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
+ ;;
+ *)
+ # 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
+ ;;
+ esac
+ json_dump
+ ;;
+ esac
+ ;;
+esac
clean_up() {
$LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
rm "/var/run/mwan3track-${INTERFACE}.pid" &> /dev/null
+ rm -rf "/var/run/mwan3track/${INTERFACE}" &> /dev/null
+ if [ -z "$(ls -A "/var/run/mwan3track")" ]; then
+ rm -rf "/var/run/mwan3track"
+ fi
exit 0
}
INTERFACE=$1
echo "$$" > /var/run/mwan3track-$1.pid
+ mkdir -p /var/run/mwan3track/$1
trap clean_up SIGINT SIGTERM
config_load mwan3
local host_up_count=0
local lost=0
local sleep_time=0
+ local turn=0
+ echo "offline" > /var/run/mwan3track/$1/STATUS
while true; do
sleep_time=$interval
ping -I $2 -c $count -W $timeout -s $size -q $track_ip &> /dev/null
if [ $? -eq 0 ]; then
let host_up_count++
+ echo "up" > /var/run/mwan3track/$1/TRACK_${track_ip}
else
let lost++
+ echo "down" > /var/run/mwan3track/$1/TRACK_${track_ip}
fi
done
fi
if [ $score -eq $up ]; then
+ echo "offline" > /var/run/mwan3track/$1/STATUS
$LOG notice "Interface $1 ($2) is offline"
env -i ACTION=ifdown INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
score=0
lost=0
if [ $score -gt $up ]; then
+ echo "online" > /var/run/mwan3track/$1/STATUS
score=$(($down+$up))
elif [ $score -le $up ]; then
sleep_time=$recovery_interval
$LOG notice "Interface $1 ($2) is online"
env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
rm /var/run/mwan3track-$1.pid
+ rm -rf "/var/run/mwan3track/${1}" &> /dev/null
exit 0
fi
fi
+ let turn++
+ echo "${lost}" > /var/run/mwan3track/$1/LOST
+ echo "${score}" > /var/run/mwan3track/$1/SCORE
+ echo "${turn}" > /var/run/mwan3track/$1/TURN
+
host_up_count=0
sleep $sleep_time
done