Всем привет! Есть всем известный скрипт по смене или балансировке каналов между провайдерами. Многим этот скрипт известен, т.к. эта тема уже не раз мусолилась. В общем мой скрипт отрабатывает нормально в одну сторону :) С основного канала на резервный переключается всё ок, но вот когда обратно поднимается основной канал, скрипт не перескакивает обратно на основной, ну это понятно потому, что нету куска кода, который проверял бы это :) Я дописал проверочный кусочек и на основном канале всё ок, а когда переключается на резервный, он почему-то пытается постоянно перескачить на основной канал обратно, в следствии чего пропадают пинги при попытке переключиться. Собственно вот код :)
#!/bin/bash
. /usr/sbin/vars
OLDIF1=0
OLDIF2=0
LOG='/var/log/providers'
. /usr/sbin/routing.sh
while true; do
ping -c 3 -s 100 $GW1 -I $IF1 > /dev/null
if [ $? -ne 0 ]; then
echo $(date +%D-%T) prov1 is down!!! >> $LOG
NEWIF1=0
else
NEWIF1=1
fi
ping -c 3 -s 100 $GW2 -I $IF2 > /dev/null
if [ $? -ne 0 ]; then
echo $(date +%D-%T) prov2 is down!!! >> $LOG
NEWIF2=0
else
NEWIF2=1
fi
if (( ($NEWIF1!=$OLDIF1) || ($NEWIF2!=$OLDIF2) )); then
echo $(date +%D-%T) Changing channels >> $LOG
# elif (( ($NEWIF1==1) && ($NEWIF2==1) )); then
# echo $(date +%D-%T) Verifycation channels. Both channels is up. >> $LOG
# if ip route | grep 'default via $GW1 dev eth2' > /dev/null; then
# echo $(date +%D-%T) All clients stay on prov1!!! >> $LOG
# else
# ip route delete default
# ip route add default via $GW1 dev $IF1
# echo $(date +%D-%T) Changing channels from prov2 to prov1!!! >> $LOG
elif (( ($NEWIF1==1) && ($NEWIF2==0) )); then
echo $(date +%D-%T) All clients routes to prov1 >> $LOG
ip route delete default
ip route add default via $GW1 dev $IF1
systemctl restart openvpn@server.service
systemctl restart openvpn@client.service
elif (( ($NEWIF1==0) && ($NEWIF2==1) )); then
echo $(date +%D-%T) All clients routes to prov2 >> $LOG
ip route delete default
ip route add default via $GW2 dev $IF2
systemctl restart openvpn@server.service
systemctl restart openvpn@client.service
else
echo > /dev/null
fi
OLDIF1=$NEWIF1
OLDIF2=$NEWIF2
sleep 3
done
Код, который я добавил в изначально работающий скрипт, закоментирован. Может быть мой кусок поставить до сравнения значений newif и oldif?
А вообще я уже чет запутался :) Прошу помочь разобраться. Спасибо.
bash, iproute2