Получить статус интерфейса LTE

Здесь выкладываем скрипты
Ответить
corsair
Сообщения: 8
Зарегистрирован: 13 фев 2016, 19:25

21 янв 2019, 17:44

/interface lte monitor lte1 команда не поддерживается

Как еще можно получить статус интерфейса LTE


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

27 янв 2019, 15:58

Проверил - действительно не поддерживается. Похоже косяк разработчиков РоутерОС.
Точнее команда поддерживается, но внутреннюю переменную $status из нее выудить не возможно.
Пишется команда так - надо писать без указания типа интерфейса:

Для терминала:

{
:local Interfaceconnect;
/interface monitor lte1 once do={:set Interfaceconnect $status;}
:put $Interfaceconnect
}

Если из скрипта в лог то видно, что переменная "пустая":

:local Interfaceconnect;
:local InterfaceName "lte1"
/interface monitor $InterfaceName once do={:set Interfaceconnect $status;}
:log info $Interfaceconnect; :log info [:len $Interfaceconnect];


Кстати, чтобы не плодить темы не подскажите как получить статус интерфейса, для которого аналогичная команда monitor поддерживается, например (интерфейса ethernet или pptp-client) в переменную ?

Вот такая аналогичная конструкция позволяет его получить:


:local FreeVPNconnect;
:local VPNfree "pptp-out1"
/interface pptp-client monitor $VPNfree once do={:set FreeVPNconnect $status;}
:put $FreeVPNconnect

Тогда в переменной $FreeVPNconnect будет статус интерфейса pptp-out1, например "connected".
Но слишком криво как-то. Зачем обязательно это once do={, когда нужно просто сразу в переменную ...

Пробовал конструкции типа ниже и другие подобные варианты:

:local FreeVPNconnect [/interface pptp-client monitor $VPNfree get $status]

Так не работает. Как то не так пишу ? Где ошибка ?
Последний раз редактировалось Sertik 27 янв 2019, 20:03, всего редактировалось 4 раза.


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

27 янв 2019, 19:34

Сам спросил, сам отвечаю - по другому вероятно никак.
Вот что нашел в Mikrotik Wiki Manual Scripting:

Get values from looped interactive commands like "monitor"
Frequently asked question s how to get values in script returned by, for example, monitor command? First problem with such commands is that they are running infinitely until user action is applied, obviously you cannot do that from script. Instead you can run with additional parameter once, it will allow to execute command only once and stop. Another problem is getting variable value sin script, there is no as-value, there is no get, but they have do. What it does is allows to access variables returned by the command as in example below:

[admin@1p_DUT_wAP ac] /interface> monitor-traffic ether1 once do={:global myBps $"rx-bits-per-second" }
...
[admin@1p_DUT_wAP ac] /interface> :environment print
myBps=71464

Так что без конструкции ... monitor ... once do={ c присвоением внутренней переменной своей - никак не обойтись ...


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

22 июл 2019, 21:22

Кто-нибудь знает сейчас уже с появлением РОС 6.45 можно как то получить "registration-status" LTE-интерфейса в переменную скриптом ?
Или до сих пор нельзя ?


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

23 июл 2019, 09:56

Пока придумал только так:

:global ltecmd do={[/interface lte info lte1 once as-value];}
:put [$ltecmd]

И потом парсить весь "info" и искать в нем нужный параметр ...

Может как то поизящнее можно сразу отдельный параметр получить ?


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

23 июл 2019, 11:57

Пока получилось так:

:local typepar "registration-status";
:local ltename "lte2"
:local ltecmd [:tostr [/interface lte info $ltename once as-value]]

:local c [:pick $ltecmd [:find $ltecmd ("$typepar"."=")] [:len $ltecmd]];
:local ltestatus [:pick $c ([:find $c "="]+1) [:find $c ";"]]
:log info $ltestatus

Можно попробовать строку ltecmd в одномерный ключевой массив преобразовать, а потом по ключам извлекать нужные параметры ...


Чего не знаем то нагуглим
pepelxl
Сообщения: 12
Зарегистрирован: 23 июл 2013, 18:47

23 июл 2019, 20:39

Статус lte(набор параметров) будет плясать от модели модема. Что то они не до думали. Легче запросить статус через at-chat и распарсить его. Команды at более унифицированны .


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

23 июл 2019, 21:10

Статус lte(набор параметров) будет плясать от модели модема.
Согласен. Можно, конечно, действовать и через lte at-chat.
Но параметр "registration-status" в /interface lte info очень стабилен, он будет у большинства модемов.
И получив его от info не нужно будет его "расшифровывать". Там уже будет "registered", "unknown", "searching", "not searching", "denied" и т.д.., то есть сразу ясно что и как ...
Я работал с родным Микротиковским R11e-LTE (естественно он наиболее нормально поддерживается РОС, т.к. родной продукт) и версия Ros 6.45.1


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

24 июл 2019, 16:21

В итоге получился маленький скрипт, проверяющий статус всех LTE-интерфейсов на Микротике (в том числе если их несколько):

 check all LTE interfaces
# мелкоСкрипт проверки статуса всех LTE-интерфейсов на Микротике
# by Sertik 24/07/2019

# определяем нужные переменные и массивы

:local counter;
:local key 0;
:local typepar "registration-status";
:global lteIs ({});
:global ltestatus ({});

# Находим все lte-интерфейсы и помещаем их в массив $lteIs
:foreach counter in=[/interface lte find] do={
:set ($lteIs->$key) [/interface lte get $counter name];
:set $key ($key+1)
}
#:log warning $lteIs

# Для каждого найденного LTE-интерфейса определяем статус в сети и помещаем в ключевой массив ltestatus
# в котором ключ - имя LTE-интерфейса, статус в сети - значение элемента
:foreach lteinterface in=$lteIs do={
:local ltecmd [:tostr [/interface lte info $lteinterface once as-value]]
:local c [:pick $ltecmd [:find $ltecmd ("$typepar"."=")] [:len $ltecmd]];
:local iprint [:pick $c ([:find $c "="]+1) [:find $c ";"]]
:set ($ltestatus->$lteinterface) $iprint;
# :log info $iprint
}

:log info $ltestatus;

Применять можно по Вашему вкусу и желанию. Например, можно добавить проверку активного шлюза на каждом LTE-интерфейсе, пропинговать адреса поисковиков и тем самым определить, что LTE-интерфейс "живой" или "не живой", сохранить статус для других скриптов, использующих эти данные, например, для falover, оповестить администратора, что возможно, пора пополнить баланс Сим-карты LTE, который не может зарегистрироваться в мобильной сети и т.д...


Чего не знаем то нагуглим
Sertik
Сообщения: 687
Зарегистрирован: 15 сен 2017, 09:03

05 сен 2019, 16:22

Как выяснилось определить любой параметр из lte info, в том числе registration-status можно гораздо проще, чем я раньше городил огород поиска в строке:

:local info [/interface lte info lte1 once as-value];
:local rs ($info->"registration-status")
:log info $rs

Соответственно несложно заменить соответствующий текст в вышеприведенном скрипте ...


Чего не знаем то нагуглим
Ответить