Subversion Repositories ALCASAR

Rev

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

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