В ситуации, когда Mikrotik стоит за спутниковым модемом, резонно собирать и централизованно хранить инфу о параметрах соединения, как и в случае с GSM-модемами.
Способ реализации для спутниковых модемов Hughes HN92XX в этой заметке.
К великой радости, данные модемы показывают параметры в виде статичных html-страниц:
Осталось только их скачать и распарсить.
Подготовка
В моём случае, спутниковый модем подключается к порту ether1-gateway, на котором поднят DHCP-клиент с дистанцией шлюза 1.
Соответственно, чтобы получить IP-адрес модема, нужно узнать статус DHCP-клиента и если он получил параметры, то взять из таблицы маршрутизации шлюз с метрикой 1.
Для работы с Web в Mikrotik‘ах есть команда fetch из группы tool. Команда может рабртать с HTTP, HTTPS, FTP, поддерживает Basic auth, ей можно отправлять GET-запросы с параметрами на сервер и т.д., но есть в ней фатальный недостаток — она не умеет писать результат в переменную или на какой-нибудь RAM-диск. Поиски решения проблемы, привили меня на оф. форум микротика, где в теме о DynDNS поднимался вопрос: «а не сотрётся ли до дыр флеш память если раз в 5 минут писать на флешку?». Как я понял — разработчик, ответил, что писать результат в переменную и/или сделать RAM-диск — хорошая мысль и они подумают об этом. Ветка датировалась прошлым десятилетием…
Так как основной инфой для меня является SiteID и серийный номер модема, которые не меняются так уж часто и в целях заботы о флешке, было решено делать опрос раз в, приблизительно, 7 дней.
Что значит «приблизительно»? Т. к. встроенных функций вычисления разности дат в Mikrotik’ах нет, а писать точный алгоритм длинно, муторно да и, откровенно говоря, не нужно, я принял, что в месяце 30 дней.
Ну а дальше всё просто: смотрим код html’ки и парсим функциями find/pick
Скрипт
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
:local serial [/system routerboard get value-name="serial-number"] :local osver [:pick [/system resource get value-name=version] 0 [:find [/system resource get value-name=version] " "]] :local url "example.com:443" :local user "user" :local pass "pass" #Если DHCP-клиент получил адрес, значит там что-то похожее на модем, иначе не делаем ничего if ([/ip dhcp-client find where interface="ether1-gateway" and status="bound"]!="") do={ :local satupd 0 #Если файл существует, смотрим не просрочен ли он и если да - выставляем флаг if ( [:len [/file find name="modem.html"]]!=0 ) do={ :local months ("jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"); :local fmonth ([ :find $months [pick [/file get modem.html creation-time] 0 3] -1 ] + 1) :local fday [pick [/file get modem.html creation-time] 4 6] :local month ([ :find $months [pick [/system clock get date] 0 3] -1 ] + 1) :local day [pick [/system clock get date] 4 6] #Проверка, что файл старше 7 дней #Видел в инете полную реализацию сравнения дат, но она на полтора экрана if ( $month = $fmonth ) do={ if ( ($day - 7) >= fday ) do={ :set satupd 1 } } else={ if ( ($month - fmonth) > 1 ) do={ :set satupd 1 } else={ if ( ($day-7+30) >= fday ) do={ :set satupd 1 } } } } else={:set satupd 1} #Если файла нет или он устарел if ( satupd=1 ) do={ #Получаем IP-адрес модема local modem [/ip route get [/ip route find where dst-address~"0.0.0.0" and distance=1] gateway] #Скачиваем страницу с системной инфой #если такой страницы нет (на другом конце не модем, другая ревизия и т.д.), то команда кинет исключение и скрипт завершится /tool fetch dst-path=modem.html mode=http [:put ("http://$modem/sys_info/")] :delay 1 Получаем содержимое файла в переменную (здесь, наверное, стоило бы размер файла проверить...) :local info [/file get modem.html contents ] #Собственно парсим... :local pstart [:find $info "Site ID" 0] :local siteid [:pick $info ($pstart+34) [:find $info "<" ($pstart+34)]] :local pstart [:find $info "Serial Number" 0] :local modemsn [:pick $info ($pstart+39) [:find $info "<" ($pstart+39)]] :local pstart [:find $info "Software Release" 0] :local fwversion [:pick $info ($pstart+42) [:find $info "<" ($pstart+42)]] #Скачиваем страницу с инфой о подключении /tool fetch dst-path=modem.html mode=http [:put ("http://$modem/sys_status/")] :delay 1 #Снова парсим... :local info [/file get modem.html contents ] :local pstart [:find $info "Signal Strength" 0] :local signal [:pick $info ($pstart+46) [:find $info " " ($pstart+46)]] #Отправляем добытое на сервер /tool fetch mode=https keep-result=no user=$user password=$pass [:put ("https://$url\?serial=$serial&modemsn=$modemsn&signal=$signal&siteid=$siteid&fwversion=$fwversion")] } } |
Ну и теперь это можно присоседить к скрипту из заметки про GSM и в зависимости от типа подключения нам будут приходить релевантные данные.