The attached patch modifies the multiwan script to fix a network name
parsing issue that I ran into.  Previously, the multiwan script did not
differentiate between networks with similar suffixes.  For example the
script treated 2 networks names "wan" and "testwan" as identical.

The patch alters the parsing and increments the revision/version in the
makefile.

Signed-off-by: Nick Podolak <[email protected]>
From c8dacaac47259dff35b04da64ef39f0525b8f591 Mon Sep 17 00:00:00 2001
From: Nick Podolak <[email protected]>
Date: Wed, 20 Nov 2013 14:38:16 -0500
Subject: [PATCH] multiwan: fixes parsing of network names

---
 net/multiwan/Makefile               |    4 +--
 net/multiwan/files/usr/bin/multiwan |   47 +++++++++++++++++------------------
 2 files changed, 25 insertions(+), 26 deletions(-)

diff --git a/net/multiwan/Makefile b/net/multiwan/Makefile
index f5161cc..7ba29ce 100644
--- a/net/multiwan/Makefile
+++ b/net/multiwan/Makefile
@@ -8,8 +8,8 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=multiwan
-PKG_VERSION:=1.0.22
-PKG_RELEASE:=2
+PKG_VERSION:=1.0.23
+PKG_RELEASE:=3
 
 include $(INCLUDE_DIR)/package.mk
 
diff --git a/net/multiwan/files/usr/bin/multiwan b/net/multiwan/files/usr/bin/multiwan
index 34cfa54..3a2108d 100755
--- a/net/multiwan/files/usr/bin/multiwan
+++ b/net/multiwan/files/usr/bin/multiwan
@@ -27,9 +27,9 @@ failover() {
 
     add() {
 
-	wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]//g")
+	wan_fail_map=$(echo $wan_fail_map | sed -e "s/^${1}\[${failchk}\]//g" -e "s/\]${1}\[${failchk}\]/\]/g")
 	wan_fail_map="$wan_fail_map${1}[x]"
-	wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]//g")
+	wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/^${1}\[${recvrychk}\]//g" -e "s/\]${1}\[${recvrychk}\]/\]/g")
 	update_cache
 
 	if [ "$existing_failover" == "2" ]; then
@@ -46,8 +46,8 @@ failover() {
 
     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")
+	wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/^${1}\[${recvrychk}\]//g" -e "s/\]${1}\[${recvrychk}\]/\]/g")
+	wan_fail_map=$(echo $wan_fail_map | sed -e "s/^${1}\[${failchk}\]//g" -e "s/\]${1}\[${failchk}\]/\]/g")
 	update_cache
 
 	if [ "$existing_failover" == "3" ]; then
@@ -64,13 +64,12 @@ failover() {
 
 fail_wan() {
     local new_fail_count
-
     local health_fail_retries=$(uci_get_state multiwan ${1} health_fail_retries)
     local weight=$(uci_get_state multiwan ${1} weight)
 
     local failchk=$(query_config failchk $1)
     local recvrychk=$(query_config recvrychk $1)
-    wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/${1}\[${recvrychk}\]//g")
+    wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/^${1}\[${recvrychk}\]//g" -e "s/\]${1}\[${recvrychk}\]/\]/g")
 
     if [ -z "$failchk" ]; then
 	failchk=1
@@ -80,7 +79,7 @@ fail_wan() {
     if [ "$failchk" != "x" ]; then
 	new_fail_count=$(($failchk + 1))
 	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")
+	    wan_fail_map=$(echo $wan_fail_map | sed -e "s/^${1}\[${failchk}\]/$1\[${new_fail_count}\]/g" -e "s/\]${1}\[${failchk}\]/\]$1\[${new_fail_count}\]/g")
 	else
 	    failover add $1
 	    refresh_dns
@@ -103,7 +102,7 @@ recover_wan() {
     local wanid=$(query_config wanid $1)
 
     if [ ! -z "$failchk" -a "$failchk" != "x" ]; then
-	wan_fail_map=$(echo $wan_fail_map | sed -e "s/${1}\[${failchk}\]//g")
+	wan_fail_map=$(echo $wan_fail_map | sed -e "s/^${1}\[${failchk}\]//g" -e "s/\]${1}\[${failchk}\]/\]/g")
 	update_cache
     fi
 
@@ -117,7 +116,7 @@ recover_wan() {
 	else
 	    new_recovery_count=$(($recvrychk + 1))
 	    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")
+		wan_recovery_map=$(echo $wan_recovery_map | sed -e "s/^${1}\[${recvrychk}\]/$1\[${new_recovery_count}\]/g" -e "s/\]${1}\[${recvrychk}\]/\]$1\[${new_recovery_count}\]/g")
 		update_cache
 	    else
 		failover del $1
@@ -142,7 +141,7 @@ acquire_wan_data() {
     network_get_ipaddr  ipaddr  ${1} || ipaddr=x
     network_get_gateway gateway ${1} || gateway=x
 
-    check_old_map=$(echo $wan_id_map 2>&1 | grep -o "$1\[")
+    check_old_map=$(echo $wan_id_map 2>&1 | grep -o -e "^$1\[" -e "\]$1\[")
 
     if [ -z $check_old_map ]; then
 	wancount=$(($wancount + 1))
@@ -160,9 +159,9 @@ acquire_wan_data() {
 	old_ifname=$(query_config ifname $1)
 	get_wanid=$(query_config wanid $1)
 
-	wan_if_map=$(echo $wan_if_map | sed -e "s/${1}\[${old_ifname}\]/$1\[${ifname}\]/g")
-	wan_ip_map=$(echo $wan_ip_map | sed -e "s/${1}\[${old_ipaddr}\]/$1\[${ipaddr}\]/g")
-	wan_gw_map=$(echo $wan_gw_map | sed -e "s/${1}\[${old_gateway}\]/$1\[${gateway}\]/g")
+	wan_if_map=$(echo $wan_if_map | sed -e "s/^${1}\[${old_ifname}\]/$1\[${ifname}\]/g" -e "s/\]${1}\[${old_ifname}\]/\]$1\[${ifname}\]/g")
+	wan_ip_map=$(echo $wan_ip_map | sed -e "s/^${1}\[${old_ipaddr}\]/$1\[${ipaddr}\]/g" -e "s/\]${1}\[${old_ipaddr}\]/\]$1\[${ipaddr}\]/g")
+	wan_gw_map=$(echo $wan_gw_map | sed -e "s/^${1}\[${old_gateway}\]/$1\[${gateway}\]/g" -e "s/\]${1}\[${old_gateway}\]/\]$1\[${gateway}\]/g")
 
 	if [ "$old_ifname" != "$ifname" ]; then
 	    iptables -D MultiWanPreHandler -t mangle -i $old_$ifname -m state --state NEW -j FW${get_wanid}MARK
@@ -205,14 +204,14 @@ update_cache() {
 
 query_config() {
     case $1 in
-	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}';;
-	wanid) echo $wan_id_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
-	failchk) echo $wan_fail_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
-	recvrychk) echo $wan_recovery_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
-	monitor) echo $wan_monitor_map | grep -o "$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
-	group) echo $wan_id_map | grep -o "\w*\[$2\]" | awk -F "[" '{print $1}';;
+        ifname) echo $wan_if_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        ipaddr) echo $wan_ip_map | grep -o  -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        gateway) echo $wan_gw_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        wanid) echo $wan_id_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        failchk) echo $wan_fail_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        recvrychk) echo $wan_recovery_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        monitor) echo $wan_monitor_map | grep -o -e "^$2\[\w*.*\]" -e "\]$2\[\w*.*\]" | awk -F "[" '{print $2}' | awk -F "]" '{print $1}';;
+        group) echo $wan_id_map | grep -o "\w*\[$2\]" | awk -F "[" '{print $1}';;
     esac
 }
 
@@ -801,7 +800,7 @@ monitor_wan() {
 	network_get_device  ifname  ${1} || ifname=x
 	network_get_ipaddr  ipaddr  ${1} || ipaddr=x
 	network_get_gateway gateway ${1} || gateway=x
-
+	
 	if [ "$ifname_cur" != "$ifname" -o "$ipaddr_cur" != "$ipaddr" -o "$gateway_cur" != "$gateway" ]; then
 	    add_task "$1" acquire
 	    if [ "${health_monitor%.*}" = 'parallel' ]; then
@@ -840,7 +839,7 @@ monitor_wan() {
 		add_task "$1" fail
 	    else
 		add_task "$1" pass
-	    fi       	        
+	    fi
 
 	elif [ "$icmp_hosts" == "disable" ]; then 
 	    add_task "$1" pass
@@ -859,7 +858,7 @@ monitor_wan() {
 add_task() {
     local group=$1
     local task=$2
-    grep -o "$group.$task" $jobfile >&- 2>&- || echo "$group.$task" >> $jobfile
+    grep -o "^$group.$task" $jobfile >&- 2>&- || echo "$group.$task" >> $jobfile
 }
 
 # For health_monitor "parallel", start a background monitor for each group.
-- 
1.7.9.5

_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to