Merge pull request #4688 from TDT-GmbH/mwan3-features

net/mwan3: add new feature and bug fixes
This commit is contained in:
Hannu Nyman 2017-08-10 21:22:44 +03:00 committed by GitHub
commit 860e158103
7 changed files with 151 additions and 32 deletions

View File

@ -8,8 +8,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mwan3
PKG_VERSION:=2.6.1
PKG_RELEASE:=1
PKG_VERSION:=2.6.2
PKG_RELEASE:=2
PKG_MAINTAINER:=Florian Eckert <fe@dev.tdt.de>
PKG_LICENSE:=GPLv2
@ -39,6 +39,22 @@ endef
define Build/Compile
endef
define Package/mwan3/postinst
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
/etc/init.d/rpcd restart
fi
exit 0
endef
define Package/mwan3/postrm
#!/bin/sh
if [ -z "$${IPKG_INSTROOT}" ]; then
/etc/init.d/rpcd restart
fi
exit 0
endef
define Package/mwan3/install
$(CP) ./files/* $(1)
endef

View File

@ -0,0 +1,45 @@
#!/bin/sh
. /lib/functions.sh
. /lib/mwan3/mwan3.sh
. /lib/functions/network.sh
[ "$ACTION" = "ifup" -o "$ACTION" = "ifdown" ] || exit 1
[ -n "$INTERFACE" ] || exit 2
if [ "$ACTION" = "ifup" ]; then
[ -n "$DEVICE" ] || exit 3
fi
config_load mwan3
config_get local_source globals local_source 'none'
[ "${local_source}" = "none" ] && {
exit 0
}
[ "${local_source}" = "$INTERFACE" ] || {
exit 0
}
mwan3_lock
src_ip=$(uci -q -P /var/state get mwan3.globals.src_ip 2>/dev/null)
[ "${src_ip}" != "" ] && {
ip route del default via "${src_ip}" dev lo 1>/dev/null 2>&1
ip addr del "${src_ip}/32" dev lo 1>/dev/null 2>&1
}
usleep 10000
[ "$ACTION" = "ifup" ] && {
network_get_ipaddr src_ip "${local_source}"
if [ "${src_ip}" = "" ]; then
$LOG warn "Unable to set source ip for own initiated traffic (${local_source})"
else
ip addr add "${src_ip}/32" dev lo
ip route add default via "${src_ip}" dev lo
uci -q -P /var/state set mwan3.globals.src_ip="${src_ip}"
fi
}
mwan3_unlock
exit 0

View File

@ -3,6 +3,7 @@
. /lib/functions.sh
. /lib/functions/network.sh
. /lib/mwan3/mwan3.sh
. /usr/share/libubox/jshn.sh
[ "$ACTION" == "ifup" -o "$ACTION" == "ifdown" ] || exit 1
[ -n "$INTERFACE" ] || exit 2
@ -11,10 +12,13 @@ if [ "$ACTION" == "ifup" ]; then
[ -n "$DEVICE" ] || exit 3
fi
mwan3_lock
mwan3_set_connected_iptables
mwan3_unlock
config_load mwan3
config_get enabled $INTERFACE enabled 0
config_get initial_state $INTERFACE initial_state "online"
[ "$enabled" == "1" ] || exit 0
if [ "$ACTION" == "ifup" ]; then
@ -42,24 +46,39 @@ if [ "$ACTION" == "ifup" ]; then
[ -n "$gateway" ] || exit 9
fi
if [ "$initial_state" = "offline" ]; then
json_load "$(ubus call mwan3 status '{"section":"interfaces"}')"
json_select "interfaces"
json_select "${INTERFACE}"
json_get_var running running
json_get_var status status
else
status=online
running=1
fi
mwan3_lock
$LOG notice "$ACTION interface $INTERFACE (${DEVICE:-unknown})"
$LOG notice "Execute "$ACTION" event on interface $INTERFACE (${DEVICE:-unknown})"
case "$ACTION" in
ifup)
mwan3_set_general_rules
mwan3_set_general_iptables
mwan3_create_iface_rules $INTERFACE $DEVICE
mwan3_create_iface_iptables $INTERFACE $DEVICE
mwan3_create_iface_route $INTERFACE $DEVICE
mwan3_track $INTERFACE $DEVICE ${src_ip}
mwan3_set_policies_iptables
mwan3_set_user_rules
mwan3_flush_conntrack $INTERFACE $DEVICE "ifup"
if [ ${running} -eq 1 -a "${status}" = "online" ]; then
mwan3_create_iface_rules $INTERFACE $DEVICE
mwan3_create_iface_route $INTERFACE $DEVICE
mwan3_track $INTERFACE $DEVICE ${src_ip} "online"
mwan3_set_policies_iptables
mwan3_set_user_rules
mwan3_flush_conntrack $INTERFACE $DEVICE "ifup"
else
$LOG notice "Starting tracker on interface $INTERFACE (${DEVICE:-unknown})"
mwan3_track $INTERFACE $DEVICE "offline"
fi
;;
ifdown)
mwan3_delete_iface_rules $INTERFACE
mwan3_delete_iface_iptables $INTERFACE
mwan3_delete_iface_route $INTERFACE
mwan3_delete_iface_ipset_entries $INTERFACE
mwan3_track_signal $INTERFACE $DEVICE

View File

@ -5,9 +5,11 @@ IP6="ip -6"
IPS="ipset"
IPT4="iptables -t mangle -w"
IPT6="ip6tables -t mangle -w"
LOG="logger -t mwan3 -p"
LOG="logger -t mwan3[$$] -p"
CONNTRACK_FILE="/proc/net/nf_conntrack"
MWAN3_STATUS_DIR="/var/run/mwan3track"
# mwan3's MARKing mask (at least 3 bits should be set)
MMX_MASK=0xff00
@ -65,6 +67,10 @@ mwan3_unlock() {
lock -u /var/run/mwan3.lock
}
mwan3_lock_clean() {
rm -rf /var/run/mwan3.lock
}
mwan3_get_iface_id()
{
local _tmp _iface _iface_count
@ -449,9 +455,9 @@ mwan3_track()
}
config_list_foreach $1 track_ip mwan3_list_track_ips
kill $(pgrep -f "mwan3track $1") &> /dev/null
kill $(pgrep -f "mwan3track $1 $2") &> /dev/null
if [ -n "$track_ips" ]; then
[ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track "$1" "$2" "$3" $track_ips &
[ -x /usr/sbin/mwan3track ] && /usr/sbin/mwan3track "$1" "$2" "$3" "$4" $track_ips &
fi
}
@ -459,7 +465,7 @@ mwan3_track_signal()
{
local pid
pid="$(pgrep -f "mwan3track $1")"
pid="$(pgrep -f "mwan3track $1 $2")"
if [ "${pid}" != "" ]; then
kill -USR1 "${pid}"
else
@ -789,7 +795,7 @@ mwan3_report_iface_status()
config_list_foreach $1 track_ip mwan3_list_track_ips
if [ -n "$track_ips" ]; then
if [ -n "$(pgrep -f "mwan3track $1")" ]; then
if [ -n "$(pgrep -f "mwan3track $1 $device")" ]; then
tracking="active"
else
tracking="down"
@ -919,3 +925,13 @@ mwan3_flush_conntrack()
$LOG warning "connection tracking not enabled"
fi
}
mwan3_track_clean()
{
rm -rf "$MWAN3_STATUS_DIR/${1}" &> /dev/null
[ -d "$MWAN3_STATUS_DIR" ] && {
if [ -z "$(ls -A "$MWAN3_STATUS_DIR")" ]; then
rm -rf "$MWAN3_STATUS_DIR"
fi
}
}

View File

@ -1,10 +1,10 @@
#!/bin/sh
. /lib/functions.sh
. /lib/functions/network.sh
. /usr/share/libubox/jshn.sh
MWAN3_STATUS_DIR="/var/run/mwan3track"
MWAN3_PID_FILE="/var/run/mwan3track"
IPS="ipset"
IPT4="iptables -t mangle -w"
@ -34,18 +34,28 @@ get_mwan3_status() {
local iface="${1}"
local iface_select="${2}"
local running="0"
local pid
local age=0
local pid device time_p time_n
network_get_device device $1
if [ "${iface}" = "${iface_select}" ] || [ "${iface_select}" = "" ]; then
pid="$(pgrep -f "mwan3track $iface_selected")"
pid="$(pgrep -f "mwan3track $iface $device")"
if [ "${pid}" != "" ]; then
running="1"
fi
time_p="$(cat "$MWAN3_STATUS_DIR/${iface}/TIME")"
[ -z "${time_p}" ] || {
time_n="$(date +'%s')"
let age=time_n-time_p
}
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_int age "$age"
json_add_int "score" "$(cat "$MWAN3_STATUS_DIR/${iface}/SCORE")"
json_add_int "lost" "$(cat "$MWAN3_STATUS_DIR/${iface}/LOST")"
json_add_int "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"

View File

@ -36,7 +36,9 @@ ifdown()
ACTION=ifdown INTERFACE=$1 /sbin/hotplug-call iface
kill $(pgrep -f "mwan3track $1") &> /dev/null
kill $(pgrep -f "mwan3track $1 $2") &> /dev/null
mwan3_delete_iface_iptables $1
mwan3_track_clean $1
}
ifup()
@ -121,6 +123,9 @@ stop()
killall mwan3track &> /dev/null
config_load mwan3
config_foreach mwan3_track_clean interface
for IP in "$IP4" "$IP6"; do
for route in $($IP route list table all | sed 's/.*table \([^ ]*\) .*/\1/' | awk '{print $1}' | awk '{for(i=1;i<=NF;i++) if($i+0>0) if($i+0<255) {print;break}}'); do
@ -153,6 +158,8 @@ stop()
for ipset in $($IPS -n list | grep mwan3 | grep -E '_v4|_v6'); do
$IPS -q destroy $ipset
done
mwan3_lock_clean
}
restart() {

View File

@ -10,12 +10,6 @@ IFDOWN_EVENT=0
clean_up() {
$LOG notice "Stopping mwan3track for interface \"${INTERFACE}\""
if [ "$(pgrep -f "mwan3track ${INTERFACE}")" = "" ]; then
rm -rf "/var/run/mwan3track/${INTERFACE}" &> /dev/null
fi
if [ -z "$(ls -A "/var/run/mwan3track")" ]; then
rm -rf "/var/run/mwan3track"
fi
exit 0
}
@ -51,11 +45,13 @@ validate_track_method() {
main() {
local reliability count timeout interval failure_interval
local recovery_interval down up size
local keep_failure_interval
[ -z "$3" ] && echo "Error: should not be started manually" && exit 0
[ -z "$5" ] && echo "Error: should not be started manually" && exit 0
INTERFACE=$1
DEVICE=$2
STATUS=$3
mkdir -p /var/run/mwan3track/$1
trap clean_up SIGINT SIGTERM
trap if_down SIGUSR1
@ -74,16 +70,22 @@ main() {
config_get up $1 up 5
config_get size $1 size 56
config_get failure_interval $1 failure_interval $interval
config_get_bool keep_failure_interval $1 keep_failure_interval 0
config_get recovery_interval $1 recovery_interval $interval
local score=$(($down+$up))
local track_ips=$(echo $* | cut -d ' ' -f 4-99)
local track_ips=$(echo $* | cut -d ' ' -f 5-99)
local host_up_count=0
local lost=0
local sleep_time=0
local turn=0
echo "offline" > /var/run/mwan3track/$1/STATUS
if [ "$STATUS" = "offline" ]; then
echo "offline" > /var/run/mwan3track/$1/STATUS
score=0
else
echo "online" > /var/run/mwan3track/$1/STATUS
fi
while true; do
sleep_time=$interval
@ -111,6 +113,9 @@ main() {
if [ $score -lt $up ]; then
score=0
[ ${keep_failure_interval} -eq 1 ] && {
sleep_time=$failure_interval
}
else
sleep_time=$failure_interval
fi
@ -138,8 +143,8 @@ main() {
if [ $score -eq $up ]; then
$LOG notice "Interface $1 ($2) is online"
echo "online" > /var/run/mwan3track/$1/STATUS
env -i ACTION=ifup INTERFACE=$1 DEVICE=$2 /sbin/hotplug-call iface
rm -rf "/var/run/mwan3track/${1}" &> /dev/null
exit 0
fi
fi
@ -149,6 +154,7 @@ main() {
echo "${lost}" > /var/run/mwan3track/$1/LOST
echo "${score}" > /var/run/mwan3track/$1/SCORE
echo "${turn}" > /var/run/mwan3track/$1/TURN
echo "$(date +'%s')" > /var/run/mwan3track/$1/TIME
host_up_count=0
sleep "${sleep_time}" &