diff --git a/net/multiwan/Makefile b/net/multiwan/Makefile index 44e52b82e..c709663e8 100644 --- a/net/multiwan/Makefile +++ b/net/multiwan/Makefile @@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk PKG_NAME:=multiwan -PKG_VERSION:=1.0.1 +PKG_VERSION:=1.0.2 PKG_RELEASE:=1 include $(INCLUDE_DIR)/package.mk diff --git a/net/multiwan/files/etc/config/multiwan b/net/multiwan/files/etc/config/multiwan index 430522cfe..51d4f5d7f 100644 --- a/net/multiwan/files/etc/config/multiwan +++ b/net/multiwan/files/etc/config/multiwan @@ -15,7 +15,7 @@ config 'interface' 'wan' config 'interface' 'wan2' option 'weight' '10' option 'health_interval' '10' - option 'icmp_hosts' 'dns' + option 'icmp_hosts' 'gateway' option 'timeout' '3' option 'health_fail_retries' '3' option 'health_recovery_retries' '5' diff --git a/net/multiwan/files/usr/bin/multiwan b/net/multiwan/files/usr/bin/multiwan index d7da6ad7d..6068ba63f 100755 --- a/net/multiwan/files/usr/bin/multiwan +++ b/net/multiwan/files/usr/bin/multiwan @@ -18,9 +18,13 @@ failover() { local failover_to local failover_to_wanid local failchk +local recovrychk local wanid local existing_failover +failchk=$(query_config failchk $2) +recvrychk=$(query_config recvrychk $2) + wanid=$(query_config wanid $2) failover_to=`uci -q -P /var/state get multiwan.${2}.failover_to` failover_to_wanid=$(query_config wanid $failover_to) @@ -28,6 +32,11 @@ failover_to_wanid=$(query_config wanid $failover_to) existing_failover=$(iptables -n -L FW${wanid}MARK -t mangle | echo $(expr $(wc -l) - 2)) add() { + + wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]//g") + wan_fail_map=$(echo $wan_fail_map $1[x]) + wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]//g") + if [ "$existing_failover" == "2" ]; then if [ "$failover_to" != "balancer" -a "$failover_to" != "disable" -a "$failover_to_wanid" != "$wanid" ]; then iptables -I FW${wanid}MARK 2 -t mangle -j FW${failover_to_wanid}MARK @@ -36,13 +45,21 @@ if [ "$existing_failover" == "2" ]; then fi fi mwnote "$1 has failed and is currently offline." + +query_config update } del() { + + wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]//g") + wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]//g") + if [ "$existing_failover" == "3" ]; then iptables -D FW${wanid}MARK 2 -t mangle fi mwnote "$1 has recovered and is back online!" + +query_config update } case $1 in @@ -76,15 +93,17 @@ else if [ "$new_fail_count" -lt "$health_fail_retries" ]; then wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]/$1\[${new_fail_count}\]/g") else - wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]/$1\[x\]/g") + failover add $1 + refresh_dns if [ "$weight" != "disable" ]; then refresh_loadbalancer fi - refresh_dns - failover add $1 fi fi fi + +query_config update + } recover_wan() { @@ -113,16 +132,16 @@ if [ "$failchk" == "x" ]; then if [ "$new_recovery_count" -lt "$health_recovery_retries" ]; then wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]/$1\[${new_recovery_count}\]/g") else - wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]//g") - wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]//g") + failover del $1 + refresh_dns if [ "$weight" != "disable" ]; then refresh_loadbalancer fi - refresh_dns - failover del $1 fi fi fi + +query_config update } acquire_wan_data() { @@ -155,10 +174,10 @@ check_old_map=`echo $wan_id_map 2>&1 | grep -o "$1\["` if [ -z $check_old_map ]; then wancount=`expr $wancount + 1` - wan_if_map="$wan_if_map $1[${ifname}] " - wan_id_map="$wan_id_map $1[${wancount}] " - wan_gw_map="$wan_gw_map $1[${gateway}] " - wan_ip_map="$wan_ip_map $1[${ipaddr}] " + wan_if_map="$wan_if_map $1[${ifname}]" + wan_id_map="$wan_id_map $1[${wancount}]" + wan_gw_map="$wan_gw_map $1[${gateway}]" + wan_ip_map="$wan_ip_map $1[${ipaddr}]" else old_ipaddr=$(query_config ipaddr $1) old_gateway=$(query_config gateway $1) @@ -176,25 +195,43 @@ check_old_map=`echo $wan_id_map 2>&1 | grep -o "$1\["` iptables -A MultiWanPostHandler -t mangle -o $ifname -m mark --mark 0x123 -j FW${get_wanid}MARK fi + if [ "$ifname" != "x" -a "$ipaddr" != "x" -a "$gateway" != "x" ]; then + failover del $1 + iprules_config $get_wanid + qos_init $1 $get_wanid + else + failover add $1 + fi + refresh_routes refresh_loadbalancer refresh_dns - if [ "$ifname" != "x" -a "$ipaddr" != "x" -a "$gateway" != "x" ]; then - iprules_config $get_wanid - qos_init $1 $get_wanid - failover del $1 - else - failover add $1 - fi fi else wancount=9 fi + +query_config update } query_config() { + +update_cache_data() { +rm /tmp/.mwan.cache > /dev/null 2>&1 +touch /tmp/.mwan.cache + +echo "# Automatically Generated by Multi-WAN Agent Script. Do not modify. #" > /tmp/.mwan.cache +echo "wan_if_map=\"$wan_if_map\"" >> /tmp/.mwan.cache +echo "wan_ip_map=\"$wan_ip_map\"" >> /tmp/.mwan.cache +echo "wan_gw_map=\"$wan_gw_map\"" >> /tmp/.mwan.cache +echo "wan_id_map=\"$wan_id_map\"" >> /tmp/.mwan.cache +echo "wan_fail_map=\"$wan_fail_map\"" >> /tmp/.mwan.cache +echo "wan_recovery_map=\"$wan_recovery_map\"" >> /tmp/.mwan.cache +} + case $1 in + update) update_cache_data;; ifname) echo $wan_if_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';; ipaddr) echo $wan_ip_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';; gateway) echo $wan_gw_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';; @@ -249,6 +286,9 @@ fi ip route flush cache +rm $jobfile > /dev/null 2>&1 +rm $jobfile.work > /dev/null 2>&1 +rm /tmp/.mwan.cache > /dev/null 2>&1 exit } @@ -482,6 +522,8 @@ do done fi done + +last_resolv_update=$(ls -l -e /tmp/resolv.conf.auto | awk -F " " '{print $5, $9}') } iptables_init() { @@ -873,11 +915,14 @@ bg_task() { local check_iptables local queued_task local bg_counter +local current_resolv_file bg_counter=0 while [ 1 ]; do +. /tmp/.mwan.cache + if [ "$bg_counter" -eq 5 ]; then check_iptables=$(iptables -n -L MultiWan -t mangle | grep "references" | awk -F "(" '{print $2}' | cut -d " " -f 1) @@ -888,6 +933,12 @@ check_iptables=$(iptables -n -L MultiWan -t mangle | grep "references" | awk -F exit fi +current_resolv_file=$(ls -l -e /tmp/resolv.conf.auto | awk -F " " '{print $5, $9}') + + if [ "$last_resolv_update" != "$current_resolv_file" ]; then + refresh_dns + fi + bg_counter=0 fi @@ -937,7 +988,6 @@ gateway=$(query_config gateway $group) if [ "$ifname" == "x" -o "$ipaddr" == "x" -o "$gateway" == "x" ]; then failover add $group -wan_fail_map="echo $wan_fail_map $group[x]" fi done }