Не работает скрипт переключения на 3g модем

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
zavsc
Сообщения: 4
Зарегистрирован: 18 сен 2022, 17:26

Нашёл в интернете скрипт переключения на 3г модем при отсутствии интернета, переписал под себя и при запуске оно выдаёт ошибку syntax error (line 52 column 89) помогите исправить...
вместо example.ru мой домен на котором лижет скрипт отправки уведомлений в телеграмм (микротик всё ещё не умеет в ру символы, поэтому работает мой скрипт)
Версия ROS 6.49.7

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

:local firstInterface "ether5";
:local secondInterface "ppp-out1";
:local pingTo1 "8.8.8.8";
:local pingTo2 "77.88.8.8";
:local pingCount 3;
:local stableConnectFrom 60;
:local firstInterfaceName $firstInterface;
:local secondInterfaceName $secondInterface;
:local clearArp do={
 :local dumplist [/ip arp find]
 :foreach i in=$dumplist do={
 /ip arp remove $i
 }
 :log warning ("ARP cleaned");
}
:local reconnect3G do={
 :log warning ("Rebooting 3G before using");
 /interface ppp-client set $nameInterface disable=yes;
 :delay 1s;
 /interface ppp-client set $nameInterface disable=no;
}
:log info ("Start ping to $pingTo1 and $pingTo2");

/interface ethernet {
 :if ( [get $firstInterface disable] = true) do={
 set $firstInterface disable=no;
 :delay 2s;
 }
}
# Check SECOND interface
/interface ppp-client {
 :if ( [get $secondInterface disable] = true) do={
 set $secondInterface disable=no;
 :delay 8s;
 }
}
/ip route {
 # Set objects to variables
 :set firstInterface [find dst-address="0.0.0.0/0" gateway=$firstInterfaceName];
 :set secondInterface [find dst-address="0.0.0.0/0" gateway=$secondInterfaceName];
 # Check routes
 :if ( [get $firstInterface distance] != 2 ) do={
 set $firstInterface distance=2;
 :log warning ("Distance for " . $firstInterfaceName . " corrected");
 }
 :if ( [get $secondInterface distance] != 1 && [get $secondInterface distance] != 3) do={
 set $secondInterface distance=3;
 :log warning ("Distance for " . $secondInterfaceName . " corrected");
 }
 :local pingStatus \
 ((( [/ping $pingTo1 interface=$firstInterfaceName count=$pingCount] + \
 [/ping $pingTo2 interface=$firstInterfaceName count=$pingCount] ) / ($pingCount * 2)) *
100);

 :if ($pingStatus < $stableConnectFrom) do={
 :log error ("RTK no internet!");
 :if ( [get $secondInterface distance] != 1 ) do={
 $reconnect3G nameInterface=$secondInterfaceName;
 set $secondInterface distance=1;
 :log warning ("Distance for " . $secondInterfaceName . " changed");
 $clearArp;
 :execute {/tool fetch url="http://example.ru/off.php" keep-result=no}
 }
 } else={
 :log warning ("RTK connected");
 :if ( [get $secondInterface distance] != 3 ) do={
 :execute {/tool fetch url="http://example.ru/on.php" keep-result=no}
 set $secondInterface distance=3;
 :log warning ("Distance for " . $secondInterfaceName . " changed");
 $clearArp;
 }
 }
}
:log info ("End ping"); 


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Вы уверены, что у Вас ppp-out интерфейс у модема ? Сейчас уже многие используют lte, потому и спрашиваю.
Кстати, использовать свой домен для отправки сообщений в Телеграм не нужно, для этого уже созданы скрипты и функции для Микротик.
Ошибку в Вашем скрипте "сходу" не нашёл, вроде всё логично. Возможно она синтаксическая. Погляжу повнимательнее, найду напишу.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Я бы выкинул вообще вот эту функцию. Что она делает ? Это совершенно бесполезно на мой взгляд.

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

 :local dumplist [/ip arp find]
 :foreach i in=$dumplist do={
 /ip arp remove $i
 }
 :log warning ("ARP cleaned");
}
Кроме того её можно заменить одной строкой, для того чтобы всё стереть не нужно перебирать записи:

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

[/ip arp remove find]


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Пойдем дальше:

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

/interface ethernet {
 :if ( [get $firstInterface disable] = true) do={
 set $firstInterface disable=no;
 :delay 2s;
 }
}
# Check SECOND interface
/interface ppp-client {
 :if ( [get $secondInterface disable] = true) do={
 set $secondInterface disable=no;
 :delay 8s;
 }
}
Тут нужно выкинуть лишние скобки вот так:

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

/interface ethernet 
 :if ( [get $firstInterface disable] = true) do={
 set $firstInterface disable=no;
 :delay 2s;
}

# Check SECOND interface
/interface ppp-client 
 :if ( [get $secondInterface disable] = true) do={
 set $secondInterface disable=no;
 :delay 8s;
}


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Идём дальше:
Имейте ввиду, что если у Вас таких маршрутов нет, скрипт выдаст ошибку, так как Вы не оставляете ему других шансов:

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

 :set firstInterface [find dst-address="0.0.0.0/0" gateway=$firstInterfaceName];
 :set secondInterface [find dst-address="0.0.0.0/0" gateway=$secondInterfaceName];


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
zavsc
Сообщения: 4
Зарегистрирован: 18 сен 2022, 17:26

Sertik писал(а): 21 ноя 2023, 10:54 Вы уверены, что у Вас ppp-out интерфейс у модема ? Сейчас уже многие используют lte, потому и спрашиваю.
Кстати, использовать свой домен для отправки сообщений в Телеграм не нужно, для этого уже созданы скрипты и функции для Микротик.
Ошибку в Вашем скрипте "сходу" не нашёл, вроде всё логично. Возможно она синтаксическая. Погляжу повнимательнее, найду напишу.
Да у меня 3g модем.


zavsc
Сообщения: 4
Зарегистрирован: 18 сен 2022, 17:26

Sertik писал(а): 21 ноя 2023, 11:31 Я бы выкинул вообще вот эту функцию. Что она делает ? Это совершенно бесполезно на мой взгляд.

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

 :local dumplist [/ip arp find]
 :foreach i in=$dumplist do={
 /ip arp remove $i
 }
 :log warning ("ARP cleaned");
}
Кроме того её можно заменить одной строкой, для того чтобы всё стереть не нужно перебирать записи:

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

[/ip arp remove find]
Жалуется теперь вот на это:

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

 [/ping $pingTo2 interface=$firstInterfaceName count=$pingCount] ) / ($pingCount * 2)) *
Полный код:

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

 :local pingStatus \
 ((( [/ping $pingTo1 interface=$firstInterfaceName count=$pingCount] + \
 [/ping $pingTo2 interface=$firstInterfaceName count=$pingCount] ) / ($pingCount * 2)) *
100);


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Не знаю, так как проверить не могу. Ошибок в Вашем скрипте нет. Если я буду у себя его запускать он мне маршруты побъёт. Есть конечно выход - сделать доп. маршруты меченные и с ними пробовать, но время нужно.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
-13-
Сообщения: 125
Зарегистрирован: 18 мар 2021, 12:45

а не проще все это сделать средствами ROS, например резервирование через рекурсивную маршрутизацию?


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Меня могут закидать грязными тряпками, но по моему этот механизм уже не работает.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Ответить