Скрипт

Обсуждение оборудования и его настройки
Ответить
master3sid3
Сообщения: 7
Зарегистрирован: 01 фев 2013, 15:00

Здравствуйте, возникла такая проблема. Пытаюсь настроить резервирование 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% рабочий?


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

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

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


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

только учтите, скрипты работают строго по значению метрики (т.е. 1 или 2) и по коменту маршрута (main и reserv).


master3sid3
Сообщения: 7
Зарегистрирован: 01 фев 2013, 15:00

Что-то у меня не захотело всёравно работать. Никакой реакции на скрипт с

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

: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.


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

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.


Аватара пользователя
simpl3x
Модератор
Сообщения: 1532
Зарегистрирован: 19 апр 2012, 14:03

все эти переменные создаются предыдущими скриптами
1.jpg


master3sid3
Сообщения: 7
Зарегистрирован: 01 фев 2013, 15:00

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

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

: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", при этом с терминала отрабатывает.
Взял похожую железку домой, буду на выходных мучить, может до чего-то её я до колупаю. Всё равно спасибо за советы.


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

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


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
master3sid3
Сообщения: 7
Зарегистрирован: 01 фев 2013, 15:00

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


master3sid3
Сообщения: 7
Зарегистрирован: 01 фев 2013, 15:00

Да и через веб не хочет, попробую RouterOS обновить может в ней косяк


Ответить