помогите разобрать пример скрипта execute из wiki

Обсуждение ПО и его настройки
Ответить
pepelxl
Сообщения: 164
Зарегистрирован: 23 июл 2013, 18:47

на этой официальной странице есть такой пример:

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

{
:local j [:execute {/interface print follow where [:log info ~Sname~]}];
:delay 10s;
:do { /system script job remove $j } on-error={}
}
Я не могу понять что тут пытаются донести и как это работает.
Я немного развернул скрипт:

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

{
:local j [:execute {/interface print follow where [:log info ~Sname~]}];
:log info [:len $j]
:log info [:typeof $j]
:log info [/system script job print detail as-value]
:delay 10s;
:do { /system script job remove $j } on-error={:log info "no ID"}
}
в логе получаю выхлоп
16:30:00 script,info 4
16:30:00 script,info id
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info ~Sname~
16:30:00 script,info .id=*60e;.nextid=*61b;owner=pepelxl;policy=local;telnet;ssh;ftp;reboot;read;write;policy;test;winbox;password;web;sniff;sensitive;api;romon;dude;tikapp;
started=jun/21/2020 16:18:01;type=login;.id=*61b;.nextid=*61c;owner=pepelxl;parent=*60e;policy=local;telnet;ssh;ftp;reboot;read;write;policy;test;winbox;password;web;sniff;s
ensitive;api;romon;dude;tikapp;started=jun/21/2020 16:30:00;type=command;.id=*61c;owner=pepelxl;policy=local;telnet;ssh;ftp;reboot;read;write;policy;test;winbox;password;web
;sniff;sensitive;api;romon;dude;tikapp;started=jun/21/2020 16:30:00;type=command
16:30:10 script,error script error: interrupted

В общем то не понята вся конструкция которую пытались донести до меня.
1- с начала мы видим объявление follow - на кой они его здесь применили?
2- потом включили перебор сравнения по where но вместо значение указали действие log, которое ни чего не возвращает для where.
видимо из-за этой конструкции идёт перебор всех значений и 7 раз печатается ~Sname~ (у меня 7 интерфейсов)
3- Далее видно, что переменной j присвоен тип id и значение 4, а НЕТ ни четвёртого терминала, ни терминала с id равным четырём. Так и хочется спросить - какого х...?
4- в конце лога видно, что скрипт падает в ошибку, и вот тут я вообще не понимаю что её вызывает? какое поведение скрипта? Однако если из вызова мы уберём follow, то вполне предсказуемо увидим в логе - no ID.

Вообще исследую возможности по парсингу логов "на лету", так как все примеры из wiki требуют циклический запуск скрипта по расписанию. А вот если бы можно было запустить одновременно два аргумента follow и as-value, то скрипт продолжал бы работу по появлению записи, вот это было бы то что надо. Ну или добраться до консоли из скрипта(local, ssh, telnet) вот тогда тоже можно было бы использовать follow.


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

В общем то не понята вся конструкция которую пытались донести до меня.
Думаю, что конкретно до Вас, ничего донести не пытались, пример в Wiki предназначен для всех.
Он просто выдернут из контекста какого-то скрипта для демонстрации работы :execute и не более того. Чего Вы к нему привязались ? Найдите автора скрипта и его спросите, а лучше обратитесь в официальную поддержку Микротик, Вам там всё разъяснят ...


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

Теперь я знаю для чего это нужно. print follow where бесконечно отслеживает появление новой записи где-либо. В примере поста отслеживается появление нового интерфейса в списке интерфейсов. Проблема как выйти из режима отслеживания ? В терминале по ctrl-C, а в скрипте ? - ну, конечно, с помощью job.

Вот тут чуваки с оф. форума придумали, как это можно использовать подцепив ещё свои любые функции:

https://forum.mikrotik.com/viewtopic.php?t=207973

Удобно использовать для отслеживания определенных событий - появления/изменения/удаления новых записей в любых списках и логе. Я использую для мониторинга /wireless registration-table, /ppp active и т.п....

Например, у меня все подключаемые wifi-клиенты занесены в access-list и имеют комментарии. Тогда, подключение любого отслеживается так:

:global wifiEventHandler do={
:if ([:len $2]>0) do={
/log warning "On $1 is added a new client $2"}
:return 0
}

:execute {
:global EventHandler
/wireless registration-table print follow-only where $uptime<5s & [$EventHandler "wifi" $comment]
}

Задание на "отслеживание" в фоне постоянно висит в /system script job (после запуска и до перезагрузки роутера) и выполняется только при появлении новой записи в /wireless registration-table. Главное тут, что функция пользователя - в данном случае EventHandler может сразу свободно оперировать всеми читаемыми свойствами отслеженной записи (в примере - свойство сomment). То есть для отслеживания таким способом не нужно самостоятельно парсить log или перебирать циклами типа :foreach списки интерфейсов, адресс-листов, лизов DHCP-сервера и т.д... Простая команда типа /log print follow-only where ... позволяет отслеживать новые записи с заданными свойствами.


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