Страница 1 из 2

Скрипт переключения каналов инернет

Добавлено: 2013-01-07 9:41:34
net
Доброго времени суток,
в силу частого пропадания, в последнее время, одного канала интернет у меня на работе, начальство поручило написать скрипт, который должен переключать основной канал интернет на резервный, когда тот отсутствует, переключать обратно на основной при его появлении и отсилке на електронку уведомления об всем етом. Так как в програмировании я не силен, сварганил скрипт с того, что было. Поставил его в cron, синтаксис проходит, но не работает. Помогите разобратся где косяк(и). Сам скрипт здесь:

Код: Выделить всё

#!/bin/sh
#
SYSADMIN=root
MAIL="/usr/bin/mail"
CURRENT_DEFLT_GW="`/usr/bin/netstat -rn | grep default | awk '{print$2}'`"
GW1="1.1.1.1"
GW2="2.2.2.2"
PF_RULE_NO_BALANS="/etc/pf.conf_NO_BALANS"
LOG_FILE="/var/log/internet.log"

if ping1=$( /sbin/ping -q -c 3 -f -s 8 -o -t 2 $GW2 | grep "100.0% packet loss") && [ "$CURRENT_DEFLT_GW" != "$GW2" ] ;then
	/sbin/route change default 1.1.1.1
	/sbin/pfctl -F all -f $PF_RULE_NO_BALANS
	echo "----------------------------------------------------------------" >> $LOG_FILE
	echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet1 is fail. Change def GW and PF rule to Inet2 " >> $LOG_FILE 
	echo "----------------------------------------------------------------" >> $LOG_FILE
	HOSTNAME=`hostname`
	MSG="$HOSTNAME Inet1 is fail. Change def GW and PF rule to Inet2 !!!"
	#
	(
   	echo "Subject: $MSG"
   	echo " "
   	echo "$MSG"
   	echo " "
   	) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN
	exit 0
if ping1=$( /sbin/ping -q -c 3 -f -s 8 -o -t 2 $GW1 | grep "100.0% packet loss") && [ "$CURRENT_DEFLT_GW" != "$GW1" ] ;then
	/sbin/route change default 2.2.2.2
	/sbin/pfctl -F all -f $PF_RULE_NO_BALANS
	echo "----------------------------------------------------------------" >> $LOG_FILE
	echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet2 is fail. Change def GW and PF rule to Inet1 " >> $LOG_FILE 
	echo "----------------------------------------------------------------" >> $LOG_FILE
	HOSTNAME=`hostname`
	MSG="$HOSTNAME Inet1 is fail. Change def GW and PF rule to Inet2 !!!"
	#
	(
   	echo "Subject: $MSG"
   	echo " "
   	echo "$MSG"
   	echo " "
   	) | $MAIL -s "$MSG" $SYSADMIN
	exit 0
if ping1=$( /sbin/ping -c 1 $GW2 | grep "ttl=") && [ "$CURRENT_DEFLT_GW" != "$GW1" ] ;then
	/sbin/route change default 2.2.2.2
	/sbin/pfctl -F all -f $PF_RULE_NO_BALANS
	echo "----------------------------------------------------------------" >> $LOG_FILE
	echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet1 is back. Change def GW and PF rule to Inet1 " >> $LOG_FILE 
	echo "----------------------------------------------------------------" >> $LOG_FILE
	HOSTNAME=`hostname`
	MSG="$HOSTNAME Inet1 is back. Change def GW and PF rule to Inet1 !!!"
	#
	(
   	echo "Subject: $MSG"
   	echo " "
   	echo "$MSG"
   	echo " "
   	) | $MAIL -s "$MSG" $SYSADMIN
	exit 0
fi
fi
fi

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 16:57:22
mak_v_
сильно...выглядит как:
"Водитель я не сильный, нашел вчера 2 колеса от велика, связал их, залил бензин в канистру.....помогите, не моу найти педаль газа"...
Логи, вывод, что конкретно не работает.

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 18:49:42
net
mak_v_ писал(а):сильно...выглядит как:
"Водитель я не сильный, нашел вчера 2 колеса от велика, связал их, залил бензин в канистру.....помогите, не моу найти педаль газа"...
Логи, вывод, что конкретно не работает.
Извеняюсь, может, не ясно обьяснил: при пропадании одного (основного) канала интернет, скрипт дефолтный шлюз (GW1) должен перекинуть на резервный (GW2) и оставатся на нем до появления GW1, после этого послать сообщение на emаil о переключении каналов. При появлении GW1 скрипт из резервного канала (GW2) должен перейти на основной (GW1) и послать сообщение на emаil о переключении каналов. При падении основного канала и запуске скрипта из крона, он обрабатывается, но каналы не переключает. В логах полная тишина, иначе б сам разобрался.
Я так понимаю, на скрипт Вы даже не смотрели, так как знали б что он делает с первого взгляда, а юмористов у нас итак хватает.

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 18:56:21
mak_v_
юмористы, с кол-вом ответов 2 ингода действительно пробегают.
У самого кода-то работал подобный скрипт.
/var/log/messages
dmesg
ручная проверка

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 20:11:05
net
Не знаю чем поможет dmesg:

Код: Выделить всё

Fri Jan  4 13:15:22 EET 2013
Jan  4 13:15:34 srvinet healthd: A value of 255.00 for Chip Set Temperature with a range of (0.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #0 Temperature with a range of (10.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #1 Temperature with a range of (10.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #0 Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #1 Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for Case Fan Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for CPU #0 Core Voltage with a range of (1.95 <= n <= 2.05)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for CPU #1 Core Voltage with a range of (1.95 <= n <= 2.05)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for 3.3 Volt with a range of (3.14 <= n <= 3.47)
Jan  4 13:15:34 srvinet healthd: A value of 6.85 for 5 Volt with a range of (4.75 <= n <= 5.25)
Jan  4 13:15:34 srvinet healthd: A value of 15.50 for 12 Volt with a range of (10.80 <= n <= 13.20)
Jan  4 13:15:34 srvinet healthd: A value of -14.16 for -12 Volt with a range of (-13.20 <= n <= -10.80)
Jan  4 13:15:34 srvinet healthd: A value of -6.12 for -5 Volt with a range of (-5.50 <= n <= -4.50)
rl1: link state changed to UP
Jan  4 13:17:34 rl0: link state changed to DOWN
Jan  4 13:26:10 rl0: link state changed to UP
Jan  4 13:30:17 srvinet apcupsd[1336]: UPS Self Test completed: Battery OK
Как видно, основной канал интернета rl0 пропал в 13:17:34 и появился в 13:26:10. Скрипт в кроне исполняется каждую минуту. За это время он никак не отреагировал на падение канала.

На всякий случай, привожу cron:

Код: Выделить всё

#minute hour day_of_month month day_of_week comand
*/1 * * * * /usr/home/adminn/internet_fail.sh > /dev/null 2>&1

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 20:11:32
net
Не знаю чем поможет dmesg:

Код: Выделить всё

Fri Jan  4 13:15:22 EET 2013
Jan  4 13:15:34 srvinet healthd: A value of 255.00 for Chip Set Temperature with a range of (0.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #0 Temperature with a range of (10.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #1 Temperature with a range of (10.00 <= n <= 30.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #0 Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for CPU #1 Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 0.00 for Case Fan Cooling Fan with a range of (3000.00 <= n <= 9999.00)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for CPU #0 Core Voltage with a range of (1.95 <= n <= 2.05)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for CPU #1 Core Voltage with a range of (1.95 <= n <= 2.05)
Jan  4 13:15:34 srvinet healthd: A value of 4.08 for 3.3 Volt with a range of (3.14 <= n <= 3.47)
Jan  4 13:15:34 srvinet healthd: A value of 6.85 for 5 Volt with a range of (4.75 <= n <= 5.25)
Jan  4 13:15:34 srvinet healthd: A value of 15.50 for 12 Volt with a range of (10.80 <= n <= 13.20)
Jan  4 13:15:34 srvinet healthd: A value of -14.16 for -12 Volt with a range of (-13.20 <= n <= -10.80)
Jan  4 13:15:34 srvinet healthd: A value of -6.12 for -5 Volt with a range of (-5.50 <= n <= -4.50)
rl1: link state changed to UP
Jan  4 13:17:34 rl0: link state changed to DOWN
Jan  4 13:26:10 rl0: link state changed to UP
Jan  4 13:30:17 srvinet apcupsd[1336]: UPS Self Test completed: Battery OK
Как видно, основной канал интернета rl0 пропал в 13:17:34 и появился в 13:26:10. Скрипт в кроне исполняется каждую минуту. За это время он никак не отреагировал на падение канала.

На всякий случай, привожу cron:

Код: Выделить всё

#minute hour day_of_month month day_of_week comand
*/1 * * * * /usr/home/adminn/internet_fail.sh > /dev/null 2>&1

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 21:26:11
BirdGovorun
/var/log/cron, чего в нём?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 22:45:25
net
BirdGovorun писал(а):/var/log/cron, чего в нём?
Содержимое /var/log/cron:

Код: Выделить всё

an  7 20:30:00 srvinet /usr/sbin/cron[5181]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:31:00 srvinet /usr/sbin/cron[5496]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:31:00 srvinet /usr/sbin/cron[5497]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:32:00 srvinet /usr/sbin/cron[5809]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:32:00 srvinet /usr/sbin/cron[5810]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:33:00 srvinet /usr/sbin/cron[6123]: (operator) CMD (/usr/libexec/save-entropy)
Jan  7 20:33:00 srvinet /usr/sbin/cron[6124]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:33:00 srvinet /usr/sbin/cron[6125]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:34:00 srvinet /usr/sbin/cron[6447]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:34:00 srvinet /usr/sbin/cron[6448]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:35:00 srvinet /usr/sbin/cron[6761]: (root) CMD (/usr/libexec/atrun)
Jan  7 20:35:00 srvinet /usr/sbin/cron[6762]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:35:00 srvinet /usr/sbin/cron[6763]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:36:00 srvinet /usr/sbin/cron[7075]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:36:00 srvinet /usr/sbin/cron[7076]: (munin) CMD (/usr/local/bin/munin-cron)
Jan  7 20:37:00 srvinet /usr/sbin/cron[7388]: (root) CMD (/usr/home/adminn/internet_fail.sh > /dev/null 2>&1 )
Jan  7 20:37:00 srvinet /usr/sbin/cron[7389]: (munin) CMD (/usr/local/bin/munin-cron)

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-07 23:28:47
mak_v_
Уберите "перенаправление в бездну" и смотрите лог

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 0:10:21
net
mak_v_ писал(а):Уберите "перенаправление в бездну" и смотрите лог
Первое, что попало мне на ум после того, как не сработал скрипт. Тоже самое - тишина на всех фронтах. Просмотрите скрипт. Скорее всего, я чтото не так сделал, написал, поставил условие...... мне кажется, что разгадка очень простая, но я ее увидеть не могу, поетому и написал здесь :cry:

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 5:55:08
Charlz_Klug_
Когда запускаете вручную всё работает?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 7:02:13
net
Charlz_Klug_ писал(а):Когда запускаете вручную всё работает?
нет. канал, всеравно не переключается

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 8:31:35
dmtr
что такое ping1?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 11:43:31
net
dmtr писал(а):что такое ping1?
Скорее всего, здесь и косяк. Как нормально должна выглядеть строка:
if ping1=$( /sbin/ping -q -c 3 -f -s 8 -o -t 2 $GW2 | grep "100.0% packet loss") && [ "$CURRENT_DEFLT_GW" != "$GW2" ] ?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 11:52:26
Charlz_Klug_
net писал(а): нет. канал, всеравно не переключается
На консоль что выводится?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 12:21:18
net
Charlz_Klug_ писал(а):
net писал(а): нет. канал, всеравно не переключается
На консоль что выводится?
Ничего. Была б какаято ошибка - знал бы куда копать.

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 12:23:39
Charlz_Klug_
Применение if в sh:

Код: Выделить всё

[Charlz_Klug@Meleena]~>$ cat sample.sh
#!/bin/sh
if [ `date|grep -o 14` = "14" ] && [ `uname|grep -o FreeBSD` = "FreeBSD" ]
then echo "Now 14-th hour."
fi

[Charlz_Klug@Meleena]~>$
Ещё можно почитать тут.

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 12:44:54
Charlz_Klug_
Попробуйте такой вариант:

Код: Выделить всё

[Charlz_Klug@Meleena]~/Temp>$ cat exp.sh
#!/bin/sh
#
SYSADMIN=root
MAIL="/usr/bin/mail"
CURRENT_DEFLT_GW="`/usr/bin/netstat -rn | grep default | awk '{print$2}'`"
GW1="1.1.1.1"
GW2="2.2.2.2"
PF_RULE_NO_BALANS="/etc/pf.conf_NO_BALANS"
LOG_FILE="/var/log/internet.log"

if [ "`/sbin/ping -q -c 3 -f -s 8 -o -t 2 $GW2 | grep "100.0% packet loss"`" ] && [ $CURRENT_DEFLT_GW != $GW2 ]
then
   /sbin/route change default 1.1.1.1
   /sbin/pfctl -F all -f $PF_RULE_NO_BALANS
   echo "----------------------------------------------------------------" >> $LOG_FILE
   echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet1 is fail. Change def GW and PF rule to Inet2 " >> $LOG_FILE
   echo "----------------------------------------------------------------" >> $LOG_FILE
   HOSTNAME=`hostname`
   MSG="$HOSTNAME Inet1 is fail. Change def GW and PF rule to Inet2 !!!"
   #
   (
      echo "Subject: $MSG"
      echo " "
      echo "$MSG"
      echo " "
      ) | $APCUPSD_MAIL -s "$MSG" $SYSADMIN
   exit 0
fi

if [ "`/sbin/ping -q -c 3 -f -s 8 -o -t 2 $GW1 | grep "100.0% packet loss"`" ] && [ $CURRENT_DEFLT_GW != $GW1 ]
then
   /sbin/route change default 2.2.2.2
   /sbin/pfctl -F all -f $PF_RULE_NO_BALANS
   echo "----------------------------------------------------------------" >> $LOG_FILE
   echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet2 is fail. Change def GW and PF rule to Inet1 " >> $LOG_FILE
   echo "----------------------------------------------------------------" >> $LOG_FILE
   HOSTNAME=`hostname`
   MSG="$HOSTNAME Inet1 is fail. Change def GW and PF rule to Inet2 !!!"
   #
   (
      echo "Subject: $MSG"
      echo " "
      echo "$MSG"
      echo " "
      ) | $MAIL -s "$MSG" $SYSADMIN
   exit 0
fi

if [ "`/sbin/ping -c 1 $GW2 | grep "ttl="`" ] && [ $CURRENT_DEFLT_GW != $GW1 ]
then
   /sbin/route change default 2.2.2.2
   /sbin/pfctl -F all -f $PF_RULE_NO_BALANS
   echo "----------------------------------------------------------------" >> $LOG_FILE
   echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet1 is back. Change def GW and PF rule to Inet1 " >> $LOG_FILE
   echo "----------------------------------------------------------------" >> $LOG_FILE
   HOSTNAME=`hostname`
   MSG="$HOSTNAME Inet1 is back. Change def GW and PF rule to Inet1 !!!"
   #
   (
      echo "Subject: $MSG"
      echo " "
      echo "$MSG"
      echo " "
      ) | $MAIL -s "$MSG" $SYSADMIN
   exit 0
fi

[Charlz_Klug@Meleena]~/Temp>$

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 12:54:41
net
Поменял, как Вы сказали. Тепер выдает: [: missing ] и отсилает ето же сообщение на email

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 12:58:22
dmtr
перед then?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 13:09:17
net
dmtr писал(а):перед then?
Не указивает где именно ошибка. Пробовал ставить и убиреть ; перед then - ошибка таже

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 13:50:43
Charlz_Klug_
net писал(а):Поменял, как Вы сказали. Тепер выдает: [: missing ] и отсилает ето же сообщение на email
Ну, не знаю, не знаю. У меня всё работает:

Код: Выделить всё

Message 3:
From Charlz_Klug@Meleena.local Tue Jan  8 15:46:12 2013
Date: Tue, 8 Jan 2013 15:46:12 +0500 (UZT)
From: Ametov Imil Ilimdarovich <Charlz_Klug@Meleena.local>
To: root@Meleena.local
Subject: Meleena.local Inet1 is back. Change def GW and PF rule to Inet1 !!!

Subject: Meleena.local Inet1 is back. Change def GW and PF rule to Inet1 !!!

Meleena.local Inet1 is back. Change def GW and PF rule to Inet1 !!!

Код:

Код: Выделить всё

[Charlz_Klug@Meleena]~/Temp>$ cat exp.sh
#!/bin/sh
#
SYSADMIN=root
MAIL="/usr/bin/mail"
CURRENT_DEFLT_GW="`/usr/bin/netstat -rn | grep default | awk '{print$2}'`"
GW1="1.1.1.1"
GW2="192.168.7.0"
PF_RULE_NO_BALANS="/etc/pf.conf_NO_BALANS"
LOG_FILE="/var/log/internet.log"

if [ "`/sbin/ping -c 1 $GW2 | grep "ttl="`" ] && [ $CURRENT_DEFLT_GW != $GW1 ]
then
   echo "----------------------------------------------------------------" >> $LOG_FILE
   echo `date "+%d-%m-%Y%: %H:%M:%S"` "Inet1 is back. Change def GW and PF rule to Inet1 " >> $LOG_FILE
   echo "----------------------------------------------------------------" >> $LOG_FILE
   HOSTNAME=`hostname`
   MSG="$HOSTNAME Inet1 is back. Change def GW and PF rule to Inet1 !!!"
   #
   (
      echo "Subject: $MSG"
      echo " "
      echo "$MSG"
      echo " "
      ) | $MAIL -s "$MSG" $SYSADMIN
   exit 0
fi

[Charlz_Klug@Meleena]~/Temp>$

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 13:52:16
Charlz_Klug_
Вы точно ввели тот код что я написал? Скопировали в буфер и вставили в файл?

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-08 14:50:24
net
Charlz_Klug_ писал(а):Вы точно ввели тот код что я написал? Скопировали в буфер и вставили в файл?
Странно.....выставил код из условия в переменные и все заработало.
Charlz_Klug_, спасибо огромное за старания и помощь!!!!

Re: Скрипт переключения каналов инернет

Добавлено: 2013-01-09 6:22:04
Charlz_Klug_
net писал(а):Странно.....выставил код из условия в переменные и все заработало.
Charlz_Klug_, спасибо огромное за старания и помощь!!!!
Проблема грошовая, если бы вы покурили мануалы, то и сами бы всё разобрали. Не ленитесь.