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

Скрипт

Добавлено: 01 фев 2013, 15:20
master3sid3
Здравствуйте, возникла такая проблема. Пытаюсь настроить резервирование 2-х каналов интернет посредством скриптов которые должны менять значение distance на gateway-ях по ситуации. Если работает основной интернет то трафик идёт через шлюз первого провайдера с distance=1, в это время на резервном канале значение distance=2, если пропадает интернет на основном канале скриптом значения distance на двух шлюзах меняются местами, тем самим делает из резервного канала как-бы основной, и когда на основном канале интернет появляется всё возвращаться обратно. Было реализовано следующим образом:
1-й скрипт определяет доступность шлюза провайдера:

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

:global PingCount 3;
:global CheckIp1 193.239.255.130;
:global CheckIp2 82.144.202.129;
:global isp1 [/ping $CheckIp1 count=$PingCount];
:global isp2 [/ping $CheckIp2 count=$PingCount];

Скрипт запускается каждые 30 секунд.
Два вторых скрипта которые задают глобальные переменные для выполнения условия:

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

:global maingw [/ip route get [find comment="main"] distance];

и

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

:global backgw [/ip route get [find comment="reserv"] distance];

Выполняется каждые 35 секунд.
ну и последний скрипт который должен переводить на резервный канал:

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

:if (($isp1=0)  && ($backgw=2)); do={ /ip route set distance=2 number=0; :ip route set distance=1 number=1:} 

и

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

:if (($isp1=$PingCount) && ($maingw=2)) do={ /ip route set [find comment="reserv"] distance=2; /ip route set [find comment="main"] distance=1;}

Выполняются с интервалом в 1 минуту и 1:10.

Проблема в том что вот те самые скрипты которые выполняют переключение и не работают, в окне скриптов показывает что скрипт выполнен но на самом деле нечего не срабатывает, при этом если вручную вбить данную команду в консоль то всё проходит отлично и переключает так как нужно.
Добавлял в начало и в конец скрипта строки

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

:log info "test"
чтобы определить на каком этапе скрипт не проходит и пришел к выводу что он не отрабатывает вообще, т.е. не воспринимает команду :if в скрипте.
Подскажите можно его заставить работать или какой-нибуть альтернативный метод который 100% рабочий?

Re: Скрипт

Добавлено: 01 фев 2013, 16:29
simpl3x
:if (($isp1=0) && ($backgw=2)); do={ /ip route set distance=2 number=0; :ip route set distance=1 number=1:}

лишние элементы в коде, без них все работает, проверил на тестовой железке.

Re: Скрипт

Добавлено: 01 фев 2013, 16:31
simpl3x
только учтите, скрипты работают строго по значению метрики (т.е. 1 или 2) и по коменту маршрута (main и reserv).

Re: Скрипт

Добавлено: 01 фев 2013, 20:15
master3sid3
Что-то у меня не захотело всёравно работать. Никакой реакции на скрипт с

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

:if (($isp1=0) && ($backgw=2)) do={ /ip route set distance=2 number=0; :ip route set distance=1 number=1}


Даже если прописать в скрипте

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test"}

не выводит никаких сообщений в лог если запускать из скрипта, с консоли опять таки всё нормально работает.
моеж есть какая-то разница в версиях ОС. У меня железяка rb750 с routerOS 5.9.

Re: Скрипт

Добавлено: 01 фев 2013, 21:36
simpl3x
master3sid3 писал(а):Что-то у меня не захотело всёравно работать. Никакой реакции на скрипт с

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

:if (($isp1=0) && ($backgw=2)) do={ /ip route set distance=2 number=0; :ip route set distance=1 number=1}


Даже если прописать в скрипте

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test"}

не выводит никаких сообщений в лог если запускать из скрипта, с консоли опять таки всё нормально работает.
моеж есть какая-то разница в версиях ОС. У меня железяка rb750 с routerOS 5.9.


тут важно понимать, что происходит в этом коде.

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test"}

если переменная $isp1=0 И $backgw=2 то выводим в лог-ерор слово тест, в остальных случаях ничо не делаем.
замените на

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test-passed"} else { :log error "test-not-passed"}

и что то вы увидете.
предполагаю, что у вас просто какая то из переменных не попадает под if.

Re: Скрипт

Добавлено: 01 фев 2013, 21:39
simpl3x
все эти переменные создаются предыдущими скриптами
1.jpg

Re: Скрипт

Добавлено: 01 фев 2013, 23:04
master3sid3
тут важно понимать, что происходит в этом коде.

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test"}

если переменная $isp1=0 И $backgw=2 то выводим в лог-ерор слово тест, в остальных случаях ничо не делаем.
замените на

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

:if (($isp1=0) && ($backgw=2)) do={ :log error "test-passed"} else { :log error "test-not-passed"}

и что то вы увидете.
предполагаю, что у вас просто какая то из переменных не попадает под if.


Вот что самое обидное, это то, что даже этот скрипт не отрабатывается через "run script", при этом с терминала отрабатывает.
Взял похожую железку домой, буду на выходных мучить, может до чего-то её я до колупаю. Всё равно спасибо за советы.

Re: Скрипт

Добавлено: 02 фев 2013, 11:37
podarok66
Помнится, у меня были проблемы с запуском скриптов, созданных или отредактированных через Wibfig. Тоже гадал несколько дней. Затем переделал все через Winbox, и все стало отрабатывать как надо. Странно, но факт. У Вас не та ли самая ситуация?

Re: Скрипт

Добавлено: 02 фев 2013, 13:02
master3sid3
Да нет, скрипты я делал сразу в винбоксе, хотя за идею сделать через веб спасибо :D

Re: Скрипт

Добавлено: 02 фев 2013, 13:15
master3sid3
Да и через веб не хочет, попробую RouterOS обновить может в ней косяк