скрипт переключения wan

Статус: Offline
Реєстрація: 09.02.2007
Повідом.: 27218
скрипт переключения wan

Есть 2 провайдера, 2 WAN интерфейса на роутере, для одних серваков канал АДСЛ, в теории стабильный, но лучше не засирать, для других - канал локального провайдера, потенциально нестабильный. Задача - написать скрипт который бы проверял нестабильный канал и переключал всех на АДСЛ в случае падения канала локального провайдера. Нагуглил скрипт, есть по нему вопросы, т.к. не совсем понимаю некоторые места

#!/bin/bash

# опрашиваемый узел основного провайдера
HOST=10.1.0.254

# шлюз к основному провайдеру
GW1=10.1.0.1
# шлюз к резервному провайдеру
GW2=10.2.0.1

ping -q -c 1 ${HOST} > /dev/null 2>&1 комбинация /dev/null 2>&1 куда загоняет результаты?

if [ $? -eq 0 ]; then что такое $? -eq 0 ? Как я понимаю, это условие прохождения пинга ,но откуда берётся что он прошёл?
....ping -q -c 1 ${GW1} > /dev/null 2>&1
....if [ $? -eq 0 ]; then
........ip route change default via ${GW1}
....else
........ip route change default via ${GW2}
....fi
else
....ip route change default via ${GW2}
fi

Ну и в общем по самому скрипту. Он пингует какой-то узел основного провайдера. Но как быть если его узел доступен, а инет - нет? Допустим пущу пинг я на 8.8.8.8 вместо узла провайдера, если система в штатном режиме - всё ок. Если канал упал - оно переключит его на GW2. А теперь самое интересное - проходит минута, крон снова запускает скрипт, идут пинги на 8.8.8.8 (через GW2), потом идёт проверка условия пинга на шлюз GW1, а шлюз-то пингуется, хотя инета нет. Скрипт переключает шлюз на GW1, и минуту, пока он снова не запустится, инет лежит. Потом снова переключение на GW2 и т.д., короче инет минуту будет, минуту - нет. Можно конечно после проверки пинга на шлюз локального провайдера и переключения на него делать ещё одну проверку пинга на 8.8.8.8, и если не идёт - менять обратно на GW2, но это как-то коряво. Кто какие решения в данном случае использовал?
 
что такое $? -eq 0 ? Как я понимаю, это условие прохождения пинга ,но откуда берётся что он прошёл?
$? - это будет твое значение, взятое по адресу, равное &1.

комбинация /dev/null 2>&1 куда загоняет результаты?
Результат ping -q -c 1 ${HOST} сбрасывается в битовое ведро /dev/null и, чтоб не потерять значение, пристаивает его переменной &1.

Ша я набросаю проверку пинга для канал упал-поднялся, а процесс переключения уже потом
 
Процесс переключения я буду iproute делать, у меня есть таблица с адресами которые идут через локалу, и ипроутом им присваивается шлюз и сетевуха локального провайдера. Т.е. при потере пинга мне надо менять этот шлюз и сетевуху на АДСЛ канал и всё, там ничего сложного
 
###down ping###
#hosts ip
IP_LIST="192.168.10.1"
#кол-во пингов
COUNT=4
###
#проверка переменной на признак down
# ping_tmp - это пременная хранящаяся в текстовом файле в виде 192.168.10.1 down = 0 ,причем #пробелы принципиальны!!! если 0, то все хорошо, и если 1 - значит всему 3,14....здец

ping_tmp=$(grep down /bash/ping_tmp | awk '{print $4}')
if [ $ping_tmp -eq 0 ]; then
#проверить массив
for myhost in ${IP_LIST}; do
count=$(ping -c $COUNT $myhost | grep 'received' | awk -F',' '{ print $2 }' | awk '{ print $1 }')
if [ $count -eq 0 ]; then
#100% failed
(
#здесь выполнить необходимые действия
echo "$myhost down = 1" > /bash/ping_tmp
) |
fi
done
fi

далее нужен зеркальный скриптик, для проверки, когда канал поднялся. И запускаем по крону, скрипт ,например, каждые 5 минут, а скриптик PING_DOWN PING_UP, например, кажде 8 минут.


ЗЫ Как-то так.....
 
Останнє редагування:
Результат ping -q -c 1 ${HOST} сбрасывается в битовое ведро /dev/null и, чтоб не потерять значение, пристаивает его переменной &1.

а разве синтаксис 2>&1 это не переназначение потока stderr в stdout? :confused:
 
Ещё 1 вопрос. Есть папки, которые маунтятся в фстабе с удалённого сервака, через канал по умолчанию. Если этот канал падает - то маунтить через другой. Проблема в том что другой канал включается вручную как аварийный вариант, и между падением первого и включением второго проходит некоторое время, до 5 минут. я набросал примерную логику переключения каналов

ping 192.168.100.25
if ping=true
if flagE=false
umount all
mount 192.168.100.25
flagE=true
flagW=false
fi
else if ping 192.168.0.45=true
if flagW=false
umount all
mount 192.168.0.45
flagW=true
flagE=false
fi
fi

сначала пингуется основной канал, если пинг проходит - смотрится состояние флага (были ли примонтированы разделы). Если да - скрипт завершает работу, если нет - размонтируется всё что надо, монтируются через этот канал, флаг ставится в положение true, флаг монтирования другого канала в false. Если пинги на основной канал не прошли - пингуется резервный. Если пинги идут, смотрится состояние флага, если true - разделы уже были примонтированы, если false - монтируются, флаг резервного канала ставится в true, основного - в false
Вопрос собственно как лучше записывать состояния флагов? Скрипт будет вызываться по крону, так что думаю надо сохранять в файлик (или 2 файлика). Может есть ещё какие-то более правильные способы?
 
я использовал -
Тільки зареєстровані користувачі бачать весь контент у цьому розділі
(способ 2) - работает стабильно уже на многих тачках (+ немнгого саи допиливал под каждого провайдера покусочку)

Тільки зареєстровані користувачі бачать весь контент у цьому розділі
Тільки зареєстровані користувачі бачать весь контент у цьому розділі

- тоже самое, только в профиль.
 
Что касается резервирования каналов в том виде в котором он мне нужен, т.е. если падает основной - переключать на резервный, когда основной поднимется - переключать на основной, то скрипт занял всего ок. 7 строчек :))) Линух в этом смысле рулит, даже не представляю как бы я в винде решал такие вопросы
 
пиздец, ну и сложности, вы ещё зебру прикрутите, что бы бжп юзать :)
 
Нет
echo $a > file - перезаписывает файл
echo $a >> file - дописывает $a в конец файла
 
ну просто феерический пиздец.
перенаправление вывода...

ASDev
Ты удалил конечно, но в мыло оно все равно пришло :)

Есть ещё и | и даже <
 
Та я чё-то подумал что добавляет, потом написал, через минуту проверил и удалил :))) А шо делать, учиться никогда не поздно... А если бы ещё люди на разных форумах и в разных мануалах не допускали ошибки - вообще заебись было бы :D А то бывает 3-4 варианта пробуешь пока заработает
 
Та я чё-то подумал что добавляет, потом написал, через минуту проверил и удалил :))) А шо делать, учиться никогда не поздно... А если бы ещё люди на разных форумах и в разных мануалах не допускали ошибки - вообще заебись было бы :D А то бывает 3-4 варианта пробуешь пока заработает

ну перенаправление вывода это же основы основ...
Или ты никогда не видел нечто подобное:

echo 'geom_mirror_load=YES' >> /boot/loader.conf
А ещё лучше
echo 'mysql_enable="YES"' >> /etc/rc.conf

P.S. Обьяснять, почему в последнем примере используются и одинарные и двойные кавычки? и что такое экранирование символа?
 
Так, проясню ситуацию сразу - тапками не кидать, линуху я учился в основном сам. 10 лет назад в институте конечно был курс по системному программизму под линух, но там сами преподы его боялись :D Поэтому решаю проблемы по мере поступления. Баш-скрипты тоже не писал, поэтому насчёт синтаксиса и хитрожопых конструкций пока ещё туплю. Но т.к. опыт с языками программирования достаточно обширный - то исходя из различных примеров делаю то что мне нужно
 
Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Тільки зареєстровані користувачі бачать весь контент у цьому розділі

Тільки зареєстровані користувачі бачать весь контент у цьому розділі


Тільки зареєстровані користувачі бачать весь контент у цьому розділі
 
Назад
Зверху Знизу