Subversion Repositories ALCASAR

Rev

Rev 1068 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log

Rev 1068 Rev 1078
1
#!/bin/bash
1
#!/bin/bash
2
# $Id: alcasar-load_balancing.sh 1068 2013-04-10 05:20:10Z franck $
2
# $Id: alcasar-load_balancing.sh 1078 2013-05-02 16:40:54Z franck $
3
 
3
 
4
# Generic Load balancer for multiple WAN links - version 1.1 (04 Feb 2011)
4
# Generic Load balancer for multiple WAN links - version 1.1 (04 Feb 2011)
5
# (c) 2011 Pau Oliva Fora - http://pof.eslack.org
5
# (c) 2011 Pau Oliva Fora - http://pof.eslack.org
6
#
6
#
7
# Licensed under GPLv3 - for full terms see:
7
# Licensed under GPLv3 - for full terms see:
8
# http://www.gnu.org/licenses/gpl-3.0.html
8
# http://www.gnu.org/licenses/gpl-3.0.html
9
#
9
#
10
# Adapted and debugged (adr et ping -S) by ALCASAR Team (3abtux@alcasar.net)
10
# Adapted and debugged (adr et ping -S) by ALCASAR Team (3abtux@alcasar.net)
11
# (c) 2013  3abtux - http://www.alcasar.net
11
# (c) 2013  3abtux - http://www.alcasar.net
12
#
12
#
13
# Specify each WAN link in a separate column, example:
13
# Specify each WAN link in a separate column, example:
14
# In this example we have 3 wan links (vlanXXX interfaces) attached to a single
14
# In this example we have 3 wan links (vlanXXX interfaces) attached to a single
15
# physical interface because we use a vlan-enabled switch between the balancer
15
# physical interface because we use a vlan-enabled switch between the balancer
16
# machine and the ADSL routers we want to balance. The weight parameter should
16
# machine and the ADSL routers we want to balance. The weight parameter should
17
# be kept to a low integer, in this case the ADSL line connected to vlan101 and
17
# be kept to a low integer.
18
# vlan102 is 4Mbps and the ADSL line connected to vlan100 is 8Mbps (twice fast)
-
 
19
# so the WEIGHT value in vlan100 is 2 because it is two times faster.
-
 
20
#
18
#
21
#
19
#
22
# Modified by ALCASAR team :
20
# Modified by ALCASAR team :
23
 
21
 
24
 
22
 
-
 
23
prog="alcasar-load_balancing.sh"
-
 
24
pidfile="/var/run/alcasar-load_balancing.pid"
-
 
25
 
25
###############################
26
###############################
26
# MAIN PARAMETERs Configuration
27
# MAIN PARAMETERs Configuration
27
###############################
28
###############################
-
 
29
 
-
 
30
DIR_ETC="/usr/local/etc"
-
 
31
CONF_FILE="$DIR_ETC/alcasar.conf"
28
# enable link failover watchdog? set to "yes" or "no".
32
MULTIWAN=`grep MULTIWAN= $CONF_FILE|cut -d"=" -f2`
29
WATCHDOG="yes"
33
MULTIWAN=${MULTIWAN:=off}
-
 
34
FAILOVER=`grep FAILOVER= $CONF_FILE|cut -d"=" -f2`
30
SLEEP="30"
35
FAILOVER=${FAILOVER:=30}
-
 
36
 
31
 
37
 
32
# space separated list of public IPs to ping in watchdog mode
38
# space separated list of public IPs to ping in watchdog mode
33
# set this to some public ip addresses pingable and always on.
39
# set this to some public ip addresses pingable and always on.
34
TESTIPS="8.8.8.8 192.0.32.10"
40
TESTIPS="8.8.8.8 192.0.32.10"
35
 
41
 
36
# set to 1 when testing, set to 0 when happy with the results
42
# set to 1 when testing, set to 0 when happy with the results
37
VERBOSE=1
43
VERBOSE=0
38
 
44
 
39
# CONFIGURATION ENDS HERE
45
# CONFIGURATION ENDS HERE
40
###############################
46
###############################
41
 
47
 
42
 
48
 
43
 
-
 
44
if [ $(whoami) != "root" ]; then
49
if [ $(whoami) != "root" ]; then
45
        echo "You must be root to run this!" ; echo ; exit 1
50
        echo "You must be root to run this!" ; echo ; exit 1
46
fi
51
fi
47
 
52
 
48
# Adapter for ALCASAR project
53
# Adapter for ALCASAR project
49
CONF_FILE="/usr/local/etc/alcasar.conf"
54
CONF_FILE="/usr/local/etc/alcasar.conf"
50
 
55
 
51
# Virtual interfaces creating
56
# Virtual interfaces creating
52
function create_eth () {
57
function create_eth () {
53
	routecmd="ip route replace default scope global"
58
	routecmd="ip route replace default scope global"
54
	NBIFACE=`grep "^WAN" $CONF_FILE | wc -l`	# Nbre interfaces virtuelles
59
	NBIFACE=`grep "^WAN" $CONF_FILE | wc -l`	# Nbre interfaces virtuelles
55
	i=0
60
	i=0
56
	while [ $i -le $NBIFACE ]
61
	while [ $i -le $NBIFACE ]
57
	do
62
	do
58
		INT="WAN$i"
63
		INT="WAN$i"
59
		echo $INT
64
		echo $INT
60
		ACTIVE=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $1}'`	# Active
65
		ACTIVE=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $1}'`	# Active
61
		WT=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# WEIGHT
66
		WT=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# WEIGHT
62
		WT=${WT:-1}
67
		WT=${WT:-1}
63
		IP=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $3}' | cut -d"/" -f1`	# @IP
68
		IP=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $3}' | cut -d"/" -f1`	# @IP
64
 
69
 
65
		if [ $i -ne 0 ]; then
70
		if [ $i -ne 0 ]; then
66
			[ -e /etc/sysconfig/network-scripts/ifcfg-eth0:$i ] && ifdown eth0:$i && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:$i
71
			[ -e /etc/sysconfig/network-scripts/ifcfg-eth0:$i ] && ifdown eth0:$i && rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:$i
67
			IFACE=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $2}'`	# IFACE
72
			IFACE=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $2}'`	# IFACE
68
			IP_NET=`grep "^$INT=" $CONF_FILE | awk -F'"' '{print $2}' | awk -F, '{ print $3}'`	# IP
73
			IP_NET=`grep "^$INT=" $CONF_FILE | awk -F'"' '{print $2}' | awk -F, '{ print $3}'`	# IP
69
			NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
74
			NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
70
			GW=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
75
			GW=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
71
			MTU=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $6}'`	# MTU
76
			MTU=`grep "$INT=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $6}'`	# MTU
72
 
77
 
73
			# Config eth0:$i (Internet)
78
			# Config eth0:$i (Internet)
74
			cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth0:$i
79
			cat <<EOF > /etc/sysconfig/network-scripts/ifcfg-eth0:$i
75
DEVICE=$IFACE
80
DEVICE=$IFACE
76
BOOTPROTO=static
81
BOOTPROTO=static
77
IPADDR=`echo $IP | cut -d"/" -f1`
82
IPADDR=`echo $IP | cut -d"/" -f1`
78
NETMASK=`ipcalc -m $IP_NET | cut -d= -f2`
83
NETMASK=`ipcalc -m $IP_NET | cut -d= -f2`
79
NETWORK=`ipcalc -n $IP_NET | cut -d= -f2`
84
NETWORK=`ipcalc -n $IP_NET | cut -d= -f2`
80
MTU=$MTU
85
MTU=$MTU
81
ONBOOT=yes
86
ONBOOT=yes
82
NOZEROCONF=yes
87
NOZEROCONF=yes
83
MII_NOT_SUPPORTED=yes
88
MII_NOT_SUPPORTED=yes
84
IPV6INIT=no
89
IPV6INIT=no
85
IPV6TO4INIT=no
90
IPV6TO4INIT=no
86
ACCOUNTING=no
91
ACCOUNTING=no
87
USERCTL=no
92
USERCTL=no
88
EOF
93
EOF
89
			echo "ifup eth0:$i"
94
			echo "ifup eth0:$i"
90
			ifup eth0:$i
95
			ifup eth0:$i
91
			NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
96
			NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
92
		else
97
		else
93
			IFACE="eth0"
98
			IFACE="eth0"
94
			IP_NET=`grep "^PUBLIC_IP=" $CONF_FILE | awk -F'=' '{print $2}'`			# IP/MSK
99
			IP_NET=`grep "^PUBLIC_IP=" $CONF_FILE | awk -F'=' '{print $2}'`			# IP/MSK
95
			IP=`grep "^PUBLIC_IP=" $CONF_FILE | awk -F= '{ print $2 }' | cut -d"/" -f1`	# @IP
100
			IP=`grep "^PUBLIC_IP=" $CONF_FILE | awk -F= '{ print $2 }' | cut -d"/" -f1`	# @IP
96
			GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`				# @GW
101
			GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`				# @GW
97
#			MTU=`grep "^PUBLIC_MTU=" $CONF_FILE | awk -F= '{print $2}'`			# MTU
102
#			MTU=`grep "^PUBLIC_MTU=" $CONF_FILE | awk -F= '{print $2}'`			# MTU
98
		fi # End
103
		fi # End
99
 
104
 
100
		NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
105
		NET="`ipcalc -n $IP_NET | cut -d"=" -f2`/`ipcalc -p $IP_NET|cut -d"=" -f2`"
101
		if [ "$PARAM" == "add" ]; then	
106
		if [ "$PARAM" == "add" ]; then	
102
			set -x
107
			set -x
103
			table=$(($i + 1))
108
			table=$(($i + 1))
104
			ip route ${PARAM} ${NET} dev ${IFACE} src ${IP} table $table
109
			ip route ${PARAM} ${NET} dev ${IFACE} src ${IP} table $table
105
			ip route ${PARAM} default via ${GW} table $table
110
			ip route ${PARAM} default via ${GW} table $table
106
			ip rule ${PARAM} from ${IP} table $table
111
			ip rule ${PARAM} from ${IP} table $table
107
			set +x
112
			set +x
108
		fi
113
		fi
109
		echo "	Iface: ${IFACE}"
114
		echo "	Iface: ${IFACE}"
110
		echo "	IP: ${IP}"
115
		echo "	IP: ${IP}"
111
		echo "	IP_NET: ${IP_NET}"
116
		echo "	IP_NET: ${IP_NET}"
112
		echo "	NET: ${NET}"
117
		echo "	NET: ${NET}"
113
		echo "	GW: ${GW}"
118
		echo "	GW: ${GW}"
114
		echo "	Weight: ${WT}"
119
		echo "	Weight: ${WT}"
115
		echo "	MTU : ${MTU}"
120
		echo "	MTU : ${MTU}"
116
		echo
121
		echo
117
		routecmd="${routecmd} nexthop via ${GW} dev ${IFACE} weight ${WT}"
122
		routecmd="${routecmd} nexthop via ${GW} dev ${IFACE} weight ${WT}"
118
		i=$(($i + 1))
123
		i=$(($i + 1))
119
	done # End While
124
	done # End While
120
 
125
 
121
	if [ "$PARAM" == "add" ]; then	
126
	if [ "$PARAM" == "add" ]; then	
122
		echo "[] Balanced routing:"
127
		echo "[] Balanced routing:"
123
		# suppress default route
128
		# suppress default route
124
		ip route del default scope global
129
		ip route del default scope global
125
		set -x
130
		set -x
126
		${routecmd}
131
		${routecmd}
127
		set +x
132
		set +x
128
		echo
133
		echo
129
	fi
134
	fi
130
	
135
	
131
} # end create_eth
136
} # end create_eth
132
 
137
 
133
###########################
138
###########################
134
# Fonction virtual Interfaces deleting
139
# Fonction virtual Interfaces deleting
135
###########################
140
###########################
136
delete_eth () {
141
delete_eth () {
137
	IFACE_COUNT=`ls -l /etc/sysconfig/network-scripts/ifcfg-eth0:* | wc -l`
142
	IFACE_COUNT=`ls -l /etc/sysconfig/network-scripts/ifcfg-eth0:* | wc -l`
138
	echo $IFACE_COUNT
143
	echo $IFACE_COUNT
139
	while [ $IFACE_COUNT -ne 0 ]
144
	while [ $IFACE_COUNT -ne 0 ]
140
	do
145
	do
141
		i=$IFACE_COUNT	
146
		i=$IFACE_COUNT	
142
		echo "ifdown eth0:$i"
147
		echo "ifdown eth0:$i"
143
		ifdown eth0:$i
148
		ifdown eth0:$i
144
		rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:$i
149
		rm -f /etc/sysconfig/network-scripts/ifcfg-eth0:$i
145
		IFACE_COUNT=$(($IFACE_COUNT - 1))
150
		IFACE_COUNT=$(($IFACE_COUNT - 1))
146
	done
151
	done
147
	ip route del default scope global
152
	ip route del default scope global
148
#	ip route add default gw 192.168.1.1
153
#	ip route add default gw 192.168.1.1
149
}
154
}
150
	
155
	
151
 
156
 
152
# do not modify below this line unless you know what you're doing :)
157
# do not modify below this line unless you know what you're doing :)
153
function getvalue() {
158
function getvalue() {
154
        index=$1
159
        index=$1
155
        VAR=$2
160
        VAR=$2
156
 
161
 
157
        n=1
162
        n=1
158
        for f in ${VAR} ; do
163
        for f in ${VAR} ; do
159
                if [ "${n}" == "${index}" ]; then
164
                if [ "${n}" == "${index}" ]; then
160
                        echo "$f"
165
                        echo "$f"
161
                        break
166
                        break
162
                fi
167
                fi
163
                n=$(($n++))
168
                n=$(($n++))
164
        done
169
        done
165
}
170
}
166
 
171
 
167
######################
172
######################
168
# Fonction de FailOver
173
# Fonction de FailOver
169
######################
174
######################
170
function failover () {
175
function failover () {
171
 
176
 
172
	echo "[] Watchdog started"
177
	echo "[] Watchdog started"
173
	# 0 == all links ok, 1 == some link down
178
	# 0 == all links ok, 1 == some link down
174
	STATE=0
179
	STATE=0
175
	
180
	
176
	DOWNCOUNT_BAK=0
181
	DOWNCOUNT_BAK=0
177
	DOWN_BAK=""
182
	DOWN_BAK=""
178
	NBIFACE=`grep "^WAN" $CONF_FILE | wc -l`	# Nbre interfaces virtuelles
183
	NBIFACE=`grep "^WAN" $CONF_FILE | wc -l`	# Nbre interfaces virtuelles
179
	echo "Nombre interfaces =  "$NBIFACE
184
	echo "Nombre interfaces =  "$NBIFACE
180
	WANIFACE[0]="eth0"	# eth0 par défaut
185
	WANIFACE[0]="eth0"	# eth0 par défaut
181
	c=0
186
	c=0
182
	while [ $c -le $NBIFACE ]; do
187
	while [ $c -le $NBIFACE ]; do
183
		ITH=(`grep "WAN$c=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $2}'`)	# IFACE
188
		ITH=(`grep "WAN$c=" $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $2}'`)	# IFACE
184
		echo $ITH
189
		echo $ITH
185
		WANIFACE="${WANIFACE} $ITH"
190
		WANIFACE="${WANIFACE} $ITH"
186
		echo $WANIFACE
191
		echo $WANIFACE
187
		c=$(($c + 1))
192
		c=$(($c + 1))
188
	done
193
	done
189
	echo "Liste des interfaces : "${WANIFACE[*]}
194
	echo "Liste des interfaces : "${WANIFACE[*]}
190
	# Failover test
195
	# Failover test
191
	while : ; do
196
	while : ; do
192
	
197
	
193
		if [ $VERBOSE -eq 1 ]; then
198
		if [ $VERBOSE -eq 1 ]; then
194
			echo "[] Sleeping, state=$STATE"
199
			echo "[] Sleeping, state=$STATE"
195
		fi
200
		fi
196
		sleep $SLEEP
201
		sleep $FAILOVER
197
	
202
	
198
		IFINDEX=1
203
		IFINDEX=1
199
		DOWN=""			# liste des interfaces down
204
		DOWN=""			# liste des interfaces down
200
		DOWNCOUNT=0		# nombre d'interface down
205
		DOWNCOUNT=0		# nombre d'interface down
201
		for iface in $WANIFACE ; do
206
		for iface in $WANIFACE ; do
202
			COUNT=0		# compteur de test
207
			COUNT=0		# compteur de test
203
			FAIL=0		# Nombre de fois down
208
			FAIL=0		# Nombre de fois down
204
			# Recup de l'adresse IP dynamiquement          A tester avec le tableau ... ip=${ETH[$i:2]} basé sur iface=${ETH[$i:1]}
209
			# Recup de l'adresse IP dynamiquement          A tester avec le tableau ... ip=${ETH[$i:2]} basé sur iface=${ETH[$i:1]}
205
			IP=`ifconfig $iface |grep "inet adr" |cut -f 2 -d ":" |awk '{print $1}'`
210
			IP=`ifconfig $iface |grep "inet adr" |cut -f 2 -d ":" |awk '{print $1}'`
206
			if [ $i -ne 0 ]; then
211
			if [ $i -ne 0 ]; then
207
				GW=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
212
				GW=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
208
				WT=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# @WT
213
				WT=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# @WT
209
			else
214
			else
210
				GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`			# @GW
215
				GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`			# @GW
211
			fi	
216
			fi	
212
			for TESTIP in $TESTIPS ; do
217
			for TESTIP in $TESTIPS ; do
213
				COUNT=$(($COUNT + 1))
218
				COUNT=$(($COUNT + 1))
214
				ping -W 3 -I $IP -c 1 $TESTIP > /dev/null 2>&1
219
				ping -W 3 -I $IP -c 1 $TESTIP > /dev/null 2>&1
215
#				ping -W 3 -I $IP -c 1 $TESTIP
220
#				ping -W 3 -I $IP -c 1 $TESTIP
216
				# Si ping de la première adresse --> ok  --> stop du test pour l'interface testée
221
				# Si ping de la première adresse --> ok  --> stop du test pour l'interface testée
217
				if [ $? -eq 0 ]; then
222
				if [ $? -eq 0 ]; then
218
					break
223
					break
219
				else 
224
				else 
220
					# sinon on compte une erreur
225
					# sinon on compte une erreur
221
					FAIL=$(($FAIL + 1))
226
					FAIL=$(($FAIL + 1))
222
				fi
227
				fi
223
			done # End of test sur un serveur Internet
228
			done # End of test sur un serveur Internet
224
			# Affichage du nombre de down
229
			# Affichage du nombre de down
225
			echo "FAIL=$FAIL"
230
			echo "FAIL=$FAIL"
226
			# Si nombre de fois down = nombre de tests -->  Iface down --> log dans fichier log avec l'heure
231
			# Si nombre de fois down = nombre de tests -->  Iface down --> log dans fichier log avec l'heure
227
			if [ $FAIL -eq $COUNT ]; then
232
			if [ $FAIL -eq $COUNT ]; then
228
				echo "`date +%F-%Hh%mm%Ss` : [WARN] $iface is down!"
233
				echo "`date +%F-%Hh%mm%Ss` : [WARN] $iface is down!"
229
				# Si etat différent de 1 (déjà tombé) --> changement de l'état général en default
234
				# Si etat différent de 1 (déjà tombé) --> changement de l'état général en default
230
				if [ $STATE -ne 1 ]; then
235
				if [ $STATE -ne 1 ]; then
231
					echo "Switching state $STATE -> 1"
236
					echo "Switching state $STATE -> 1"
232
					STATE=1
237
					STATE=1
233
				fi
238
				fi
234
				# Rajout de l'iface dans la liste des interfaces down
239
				# Rajout de l'iface dans la liste des interfaces down
235
				DOWN="${DOWN} $IFINDEX"
240
				DOWN="${DOWN} $IFINDEX"
236
				echo "DOWN=$DOWN"
241
				echo "DOWN=$DOWN"
237
				# Nombre d'interface down
242
				# Nombre d'interface down
238
				DOWNCOUNT=$(($DOWNCOUNT + 1))
243
				DOWNCOUNT=$(($DOWNCOUNT + 1))
239
				echo "DOWNCOUNT=$DOWNCOUNT"
244
				echo "DOWNCOUNT=$DOWNCOUNT"
240
			fi
245
			fi
241
			IFINDEX=$(($IFINDEX + 1))
246
			IFINDEX=$(($IFINDEX + 1))
242
			echo "IFINDEX =$IFINDEX"
247
			echo "IFINDEX =$IFINDEX"
243
		done # End Test Interface in WANIFACE
248
		done # End Test Interface in WANIFACE
244
 
249
 
245
		#  0 Passerelle down et état précédent différent (retour à la normale)) --> mise à la normale des passerelles 
250
		#  0 Passerelle down et état précédent différent (retour à la normale)) --> mise à la normale des passerelles 
246
#		if [ $DOWNCOUNT -eq 0 ] && [ $DOWNCOUNT -ne $DOWNCOUNT_BAK ]; then
251
#		if [ $DOWNCOUNT -eq 0 ] && [ $DOWNCOUNT -ne $DOWNCOUNT_BAK ]; then
247
		if [ $DOWNCOUNT -eq 0 ] ; then
252
		if [ $DOWNCOUNT -eq 0 ] ; then
248
			if [ $STATE -eq 1 ]; then
253
			if [ $STATE -eq 1 ]; then
249
				echo
254
				echo
250
				echo "[] All links up and running :)"
255
				echo "[] All links up and running :)"
251
				set -x
256
				set -x
252
				${routecmd}
257
				${routecmd}
253
				set +x
258
				set +x
254
				# Changement de l'état en normal
259
				# Changement de l'état en normal
255
				STATE=0
260
				STATE=0
256
				echo "Switching state 1 -> 0"
261
				echo "Switching state 1 -> 0"
257
			fi # End retour etat normal
262
			fi # End retour etat normal
258
			# if no interface is down, go to the next cycle
263
			# if no interface is down, go to the next cycle
259
			continue
264
			continue
260
		# cas ou au moins une passerelle down mais état identique au précédent Test --> rien à changer
265
		# cas ou au moins une passerelle down mais état identique au précédent Test --> rien à changer
261
		else
266
		else
262
			if [ "$DOWN_BAK" == "$DOWN" ]; then
267
			if [ "$DOWN_BAK" == "$DOWN" ]; then
263
			echo "DOWN_BAK == DOWN = $DOWN"
268
			echo "DOWN_BAK == DOWN = $DOWN"
264
				continue	# --> état identique test precedent --> boucle suivante
269
				continue	# --> état identique test precedent --> boucle suivante
265
		# cas ou au moins une passerelle down mais état différent de test précédent --> remplacement par nouvelle règle
270
		# cas ou au moins une passerelle down mais état différent de test précédent --> remplacement par nouvelle règle
266
			else
271
			else
267
				cmd="ip route replace default scope global"
272
				cmd="ip route replace default scope global"
268
				IFINDEX=1
273
				IFINDEX=1
269
				suffix=""
274
				suffix=""
270
				# Pour chaque interface --> traitement et application de la règle de routage
275
				# Pour chaque interface --> traitement et application de la règle de routage
271
				for iface in $WANIFACE ; do
276
				for iface in $WANIFACE ; do
272
					echo "-------------------------"
277
					echo "-------------------------"
273
					echo "iface=$iface"
278
					echo "iface=$iface"
274
					echo "Index = " $IFINDEX
279
					echo "Index = " $IFINDEX
275
					FAILIF=0
280
					FAILIF=0
276
					# Pour chaque interface down --> 
281
					# Pour chaque interface down --> 
277
					echo "Interfaces DOWN = $DOWN"
282
					echo "Interfaces DOWN = $DOWN"
278
					for lnkdwn in $DOWN ; do
283
					for lnkdwn in $DOWN ; do
279
						echo "LINKDOWN = "$lnkdown
284
						echo "LINKDOWN = "$lnkdown
280
						if [ $lnkdwn -eq $IFINDEX ]; then
285
						if [ $lnkdwn -eq $IFINDEX ]; then
281
							FAILIF=1
286
							FAILIF=1
282
							break			
287
							break			
283
						else
288
						else
284
							continue
289
							continue
285
						fi
290
						fi
286
					done # End linkdown in DOWN
291
					done # End linkdown in DOWN
287
					# Interface en etat normal --> rajout de la règle en mode nexthop
292
					# Interface en etat normal --> rajout de la règle en mode nexthop
288
					if [ $FAILIF -eq 0 ]; then
293
					if [ $FAILIF -eq 0 ]; then
289
						IP=`ifconfig $iface |grep "inet adr" |cut -f 2 -d ":" |awk '{print $1}'`
294
						IP=`ifconfig $iface |grep "inet adr" |cut -f 2 -d ":" |awk '{print $1}'`
290
						if [ $iface != "eth0" ]; then
295
						if [ $iface != "eth0" ]; then
291
							GW=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
296
							GW=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $4}'`		# @GW
292
							WT=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# @GW
297
							WT=`grep "$iface," $CONF_FILE | awk -F'"' '{ print $2 }' | awk -F, '{ print $5}'`		# @GW
293
						else
298
						else
294
							GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`			# @GW
299
							GW=`grep "^GW=" $CONF_FILE | awk -F= '{print $2}'`			# @GW
295
						fi	
300
						fi	
296
						echo "GW=$GW"
301
						echo "GW=$GW"
297
						echo "WT=$WT"
302
						echo "WT=$WT"
298
						echo "suffix=$sufix"
303
						echo "suffix=$sufix"
299
						suffix="${suffix} nexthop via ${GW} dev ${iface} weight ${WT:-1}"
304
						suffix="${suffix} nexthop via ${GW} dev ${iface} weight ${WT:-1}"
300
					fi # End interface = noFAIL
305
					fi # End interface = noFAIL
301
					IFINDEX=$(($IFINDEX + 1))
306
					IFINDEX=$(($IFINDEX + 1))
302
				done # End  iface IN WANIFACE
307
				done # End  iface IN WANIFACE
303
				# Commande globale
308
				# Commande globale
304
				cmd="ip route replace default scope global $suffix"
309
				cmd="ip route replace default scope global $suffix"
305
			
310
			
306
				if [ $VERBOSE -eq 1 ]; then
311
				if [ $VERBOSE -eq 1 ]; then
307
					set -x
312
					set -x
308
			#		echo "Avec commentaire : " ${cmd}
313
			#		echo "Avec commentaire : " ${cmd}
309
					${cmd}
314
					${cmd}
310
					set +x
315
					set +x
311
					echo
316
					echo
312
				else
317
				else
313
					${cmd} 2>/dev/null
318
					${cmd} 2>/dev/null
314
					echo ${cmd}
319
					echo ${cmd}
315
				fi # end Application de la commande de routage globale
320
				fi # end Application de la commande de routage globale
316
			fi #
321
			fi #
317
			DOWN_BAK=$DOWN	# Enregistrement de l'etat
322
			DOWN_BAK=$DOWN	# Enregistrement de l'etat
318
		fi # End 
323
		fi # End 
319
	done
324
	done
320
} # End of Failover
325
} # End of Failover
321
 
326
 
322
 
327
 
323
#################
328
#################
324
# Main
329
# Main
325
#################
330
#################
326
 
331
 
327
echo "[] Load balancer for multiple WAN interfaces - v2.1"
332
echo "[] Load balancer for multiple WAN interfaces - v2.1"
328
echo "[] (c) 2011 Pau Oliva Fora <pof> @eslack.org"
333
echo "[] (c) 2011 Pau Oliva Fora <pof> @eslack.org"
329
echo "[] (c) 2013 3abtux ALCASAR  <3abtux> @alcasar.net"
334
echo "[] (c) 2013 3abtux ALCASAR  <3abtux> @alcasar.net"
330
echo
335
echo
331
 
336
 
332
case $1 in
337
case $1 in
333
	create) 
338
	create) 
334
		create_eth  		
339
		create_eth  		
335
	;;
340
	;;
336
	delete) 
341
	delete) 
337
		delete_eth  		
342
		delete_eth  		
338
	;;
343
	;;
339
	fail) 
-
 
340
		failover 		
-
 
341
	;;
-
 
342
	start) 
344
	start) 
343
		PARAM="add"
-
 
344
		create_eth  		
345
                if [ "$MULTIWAN" != "on" ] && [ "$MULTIWAN" != "On" ]; then 
345
		if [ $WATCHDOG != "yes" ]; then
346
		    echo "The MultiGateway is not activated !"
346
			exit 0
347
		    exit 0
347
		fi
348
		fi
-
 
349
                PARAM="add"
-
 
350
                create_eth
348
		ip route flush cache
351
                ip route flush cache
-
 
352
                if [ $FAILOVER -eq 0 ]; then 
-
 
353
		      echo "The MultiWAN Mode is actived but not failover connectivity !"
349
#		RETVAL=$?
354
		      exit 0
350
#		echo
355
		fi
-
 
356
                echo "Starting down $prog: "
351
#		[ $RETVAL -eq 0 ] && touch /var/lock/subsys/alcasar-load_balancing
357
                pid=`pidof -x "alcasar-load_balancing.sh"`
-
 
358
                if [ $pid != "" ]; then
-
 
359
                        echo $pid > $pidfile
-
 
360
                fi
352
		touch /var/lock/subsys/alcasar-load_balancing
361
                touch /var/lock/subsys/alcasar-load_balancing
353
		failover
362
                failover
354
	;;
363
	;;
355
	stop) 
364
	stop) 
356
		PARAM="del"
365
		PARAM="del"
357
		prog="alcasar-load_balancing.sh"
366
		echo "Shutting down $prog: "
-
 
367
                if [ -f $pidfile ]; then
358
	        gprintf $"Shutting down $prog: "
368
                        pid=`cat $pidfile`
-
 
369
                        kill -9 $pid
-
 
370
                else
-
 
371
                        echo "$prog is not running."
-
 
372
                        exit 1
359
		killproc $prog
373
                fi
360
		RETVAL=$?
374
                RETVAL=$?
361
	        echo
375
                echo
362
	        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/alcasar-load_balancing
376
                [ $RETVAL -eq 0 ] && rm -f $pidfile && rm -f /var/lock/subsys/alcasar-load_balancing
-
 
377
                echo "Delete of virtual interfaces"
-
 
378
                delete_eth
-
 
379
                echo "Network restart"
-
 
380
                service network restart 2>&1 > /dev/null
-
 
381
                ip route
-
 
382
       
-
 
383
	;;
-
 
384
	status)
-
 
385
                echo "Checking  $prog : "
-
 
386
                if [ -f $pidfile ]; then
-
 
387
                        pid=`cat $pidfile`
-
 
388
                        CHECK=`ps -p $pid --no-heading | awk {'printf $1'}`
-
 
389
                        if [ "$CHECK" = "" ]; then
-
 
390
                                echo "$prog is NOT running."
-
 
391
                        else
-
 
392
                                echo "$prog is running !"
-
 
393
                        fi
-
 
394
                else
-
 
395
                                echo "$prog is Not running."
363
		return $RETVAL
396
                fi	
-
 
397
	;;
-
 
398
	fail) 
364
		ip route
399
		failover 		
365
	;;
400
	;;
366
	*) 
401
	*) 
367
		echo "Usage: $0 [start|stop|create|delete]" ; echo ; exit 1
402
		echo "Usage: $0 [start|stop|status|create|delete]" ; echo ; exit 1
368
	;;
403
	;;
369
esac
404
esac
370
 
405
 
371
exit 0
406
exit 0
372
 
407