[packages] multiwan: Modified failover, implemented a check to see if resolv.conf...
authorcraigc <craigc@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 30 Apr 2010 16:01:50 +0000 (16:01 +0000)
committercraigc <craigc@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 30 Apr 2010 16:01:50 +0000 (16:01 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/packages@21273 3c298f89-4303-0410-b956-a3cf2f4a3e73

net/multiwan/Makefile
net/multiwan/files/etc/config/multiwan
net/multiwan/files/usr/bin/multiwan

index 44e52b8..c709663 100644 (file)
@@ -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
index 430522c..51d4f5d 100644 (file)
@@ -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'
index d7da6ad..6068ba6 100755 (executable)
@@ -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 
 
-                refresh_routes
-                refresh_loadbalancer
-                refresh_dns
-
                 if [ "$ifname" != "x" -a "$ipaddr" != "x" -a "$gateway" != "x" ]; then
+               failover del $1
                 iprules_config $get_wanid
                 qos_init $1 $get_wanid
-               failover del $1
                 else
                failover add $1
                fi
+
+                refresh_routes
+                refresh_loadbalancer
+                refresh_dns
+
        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
 }