net/mwan3: add status track ubus interface
authorFlorian Eckert <fe@dev.tdt.de>
Thu, 6 Apr 2017 13:17:17 +0000 (15:17 +0200)
committerFlorian Eckert <fe@dev.tdt.de>
Tue, 11 Apr 2017 07:46:20 +0000 (09:46 +0200)
Signed-off-by: Florian Eckert <fe@dev.tdt.de>
net/mwan3/files/usr/libexec/rpcd/mwan3 [new file with mode: 0755]
net/mwan3/files/usr/sbin/mwan3track

diff --git a/net/mwan3/files/usr/libexec/rpcd/mwan3 b/net/mwan3/files/usr/libexec/rpcd/mwan3
new file mode 100755 (executable)
index 0000000..028dafe
--- /dev/null
@@ -0,0 +1,126 @@
+#!/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
index 5cfff20ed4a26e00990e371efa579dc78efe7d66..4cf0409bc32df045b45715078bb94ca660238b45 100755 (executable)
@@ -8,6 +8,10 @@ INTERFACE=""
 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
 }
 
@@ -19,6 +23,7 @@ main() {
 
        INTERFACE=$1
        echo "$$" > /var/run/mwan3track-$1.pid
+       mkdir -p /var/run/mwan3track/$1
        trap clean_up SIGINT SIGTERM
 
        config_load mwan3
@@ -37,7 +42,9 @@ main() {
        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
@@ -46,8 +53,10 @@ main() {
                        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
 
@@ -61,6 +70,7 @@ main() {
                        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
@@ -74,6 +84,7 @@ main() {
                        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
@@ -83,10 +94,16 @@ main() {
                                $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