Netwatch и глобальные переменные

Обсуждение ПО и его настройки
Ответить
Jav
Сообщения: 10
Зарегистрирован: 19 ноя 2019, 17:30

? Как получить доступ из Netwatch до глобальных переменных ?

Вопрос становится интересным сам по себе (в сферическом вакууме). Но уж если Вы зануда и без практической задачи ни куда, то, например, такая постановка.

Задача:
1) тестировать несколько адресов
2) при появлении в сети (Up) послать сообщение в Telegram
3) при отключении (Down) записать в глобальную переменную дату+время падения и указывать ее в Telegram при подъеме. Так легко будет понятно сколько не было связи.

Для отправки сообщений в Telegram об Up и Down, да еще по нескольким адресам придется множество раз писать длинную строчку подключения. А уж как ее обслуживать потом (например, поменять)? Трудоемко. Естественное желание определить эту строку в глобальную переменную в одном месте и использовать потом во всех местах. где надо.

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

/ tool fetch url="https://api.telegram.org/bot<You:Tocen>/sendMessage?chat_id=&text=Bla-Bla-Bla"
Но вот из Netwatch больше не получается даже считать глобальную переменную! Ибо для этого надо использовать права Policy 'policy'. (Как правильно обозвать это "масло масленое"?) А у Netwatch их отобрали! Об этом написано: RouterOS changelogs
• V6.42 *) netwatch - limit to read, write, test and reboot policies for Netwatch script execution;
• V6.43 *) console - added error log message when netwatch tries to execute script with insufficient permissions;


Вот и возник вопрос: Как получить доступ из Netwatch до глобальных переменных?


Я много потратил времени, провел экспериментов, и нащупал один путь. Немного кривоватый, но работающий на 'RouterOS v6.46.5 (stable)".
 Способ Jav определить глобальную переменную в одном месте
1) в самом Netwatch получить доступ до переменной никак не получилось. Поэтому весь скрипт в Up/Down будет в единственной строке вызова другого скрипта script1 :

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

/system script run script1
2) в script1 в лоб тоже не получится считать глобальную переменную. Ошибки не будет, но она будет с пустым значением. Поэтому, из script1 мы сначала вызовем функцию FuncZ :

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

:global FuncZ
/system script run FuncZ
/log info ("Test script1. FuncZ=" .[$FuncZ])
3) В функции FuncZ мы присваиваем значение глобальной переменной gv и возвращаем его через :return :

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

:global FuncZ do={
:global gv
:set gv Test
:return $gv
}
А вот теперь эта значение этой переменной становится доступным и в script1 ! После выполнения мы увидим в логе заветное «Test script1. FuncZ=Test».
Теперь мы можем сделать script_2… script_N и все они будут получать данные из одного источника. И даже в обычных скриптах, вне Netwatch, теперь можно будет работать с этой же глобальной переменной gv привычным образом. Отправлять телеграммы станет намного удобнее, указав в место "Test" длинную телеграммовскую строку.

Минусы:
- Правильнее назвать это глобальная «константа», а не «переменная». Значение задается в едином месте, а используется во многих. Но вот изменить его можно только изменив программу. (Написать Script_Write, изменяющий скрипт, для функции FuncZ, вызванной из другого скрипта script1, который вызван из Netwatch? …. Это возможно и заработает, но выглядит уж очень заумно)
- Можно только читать глобальные переменные/константы. Но изменять (или удалять) их не получится.
- Сразу из Netwatch невозможно запустить функцию FuncZ. Ошибку не выдаст, но и результата не будет.
- Во всех скриптах и функции надо ставить галочку dont-require-permissions = yes
- Я не совсем красиво выполню задачу: Да, я отправлю Up сообщение «Поднялся IP=x.x.x.x» я смогу. Но не получится ни дописать «…. который упал в ЧЧ:ММ», ни сбросить глобальную переменную Down_HHMM.
- Хотя бы раз надо запустить скрипт FuncZ на выполнение функции вне Netwath, что бы создалась глобальная переменная gv для прочих скриптов. Например, при запуске роутера или подъеме WAN.

В этом способе много минусов, но другого я пока не нашел. Подскажите, как можно получить доступ из Netwatch до глобальных переменных?

Послесловие_1. Я знаю, что конкретно эту задачу можно решить повторив работу Netwatch на скриптах + периодический запуск. Пожалуйста, не надо уводить разговор на эту тему. Вопрос я задал в самом начале, остальное лишь пример.
Послесловие_2. Мне кажется, что Netwatch просто убили ограничением по правам. Но раз есть инструмент и его не удалили, то значит он зачем-то еще нужен. И хочется научиться пользоваться им.


Давайте жить дружно!
MikroTik RB951G-2HnD
KARaS'b
Сообщения: 1199
Зарегистрирован: 29 сен 2011, 09:16

Я конечно не так глубоко подкован в скриптоведении на микротике, но одно могу сказать точно, нетвоч очень топорный инструмент, если вы что-то проверяете на доступность нетвочем, то давно уже должны были напороться на его особенность - потерян один пакет, значит все плохо и нетвоч отрабатывает, а потерять пакет полностью можно даже между двумя устройствами соединенными метровым пачкордом. Сочините лучше простенький скрипт по проверке доступности чего вам надо и выпадением хотя бы 3 пакетов, это будет как минимум надежней и вам будут доступны все ваши желания в скрипте.
Вот вам даже пример с пингом двух хостов по 2 пакета.

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

:local PingCount 2;
:local One 8.8.8.8;
:local Too 93.158.134.3;
:local ResultOne [/ping count=$PingCount $One];
:local ResultToo [/ping count=$PingCount $Too];
:if ($ResultOne=0 && $ResultToo=0) do={/system script run down}


Chai
Сообщения: 63
Зарегистрирован: 25 авг 2017, 08:13

Я запускал с компьютера постоянный пинг до восьмерок и до днс-сервера с выводом в лог, потому что случалось срабатывание нетвотча, из лога следует, что несколько раз в день но эти ресурсы пропускали свой ответ. Вышел из положения тем, что увеличил таймаут до 5 секунд.


Ответить