Проверка IP LTE-интерфейса и отправка его на ddns

Автоматизация при помощи встроенного скриптового языка и RouterOS API
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

имеете ввиду эту? - http://192.168.25.1/html/home.html тут все нормально - корректно отображается
как-то странно через раз. Более корректно страница http://192.168.25.1/api/monitoring/status отображается в IE v.11 - http://file.sampo.ru/t2rj94/ интересно понять причину появления ошибок. Ошибка пропадает, если предварительно зайти на главную страницу или вообще просто на http://192.168.25.1/ - хотя тоже через раз. Есть программка "API+HiLink", которая отрабатывает корректно, правда она настроена на дефолтный адрес 192.168.8.1 - http://file.sampo.ru/28d4j5/,
нашел тут - http://4pda.ru/forum/index.php?showtopi ... ry45767985
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Ну, значит, дёргаете главную, потом API, opentag "<WanIPAddress>", closetag "</WanIPAddress>" - и вот уже скрипт вытянул WAN Address :)
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

Дергать главную придется вручную? Как-то можно это вмонтировать в скрипт, чтобы автоматом, что то вроде сначала -
:local result [//tool fetch url="http://192.168.25.1/index.html" mode=http];
потом - :local result [/tool fetch url="http://192.168.25.1/api/monitoring/status" as-value output=user];
Ещё нашел - для того чтобы скрипт ошибку не выдавал, нужно в сторону curl смотреть, может так - /tool fetch сurl=..?
И далее, скрипт вытаскивает IP, как ему передать его в скрипт отправки на ddns? К примеру вот в этот - http://file.sampo.ru/vdsg2q/
Возможность прятать длинный текст под спойлер не вижу, поэтому текстовыми файликами скидываю.
И да, простите если утомил...
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Длинный текст скрипта отлично прячется в теги [code]

В том скрипте адрес определяется в строке ":local ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ]" — вот сюда и надо вставить результат работы скрипта выше.

/tool fetch curl? Где вы про такое прочитали?
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

пока ничего в логах не вижу, страничка api в файл не выгружается, при попытке в терминале загружать странички последовательно, в файле "status" все та же ошибка - 125002. Чтобы избавиться от неё предлагают, как я предполагал, использовать "правильные" куки с первоначальным открытием главной страницы - https://vxlabs.com/stats-for-huawei-lte-routers/. Похоже микротик не может их обработать или получить, в отличие от браузеров. Или, как вариант, забирать ID со страницы - http://192.168.25.1/api/webserver/SesTokInfo и уже потом с ним заходить на страницу status - http://4pda.ru/forum/index.php?showtopi ... ry71117849
В общем, пока затык на ошибке 125002.
Правильно понимаю - должно в списке файлов появиться 2 файла - 1 - данные со статусом, 2 - после отработки скрипта с IP адресом?
пока скрипт имеет вид примерно такой -

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

{
:local result [/tool fetch url="http://192.168.25.1/html/home.html" keep-result=no];
:local result [/tool fetch url="http://192.168.25.1/api/monitoring/status" as-value output=user];
:if ($result->"status" = "finished") do={
:local data $result->"data";
:local opentag ""<WanIPAddress>";
:local closetag "</WanIPAddress>";
:put [:pick $data ([:find $data $opentag] + [:len $opentag]) [:find $data $closetag]]
}
}
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Судя по 4pda, токен надо пихать в заголовки запроса. RouterOS ни так, ни в куки не умеет, увы.

P.S. keep-result=no говорит, что файл сохранять не надо, поэтому по первой команде он не появится на роутере.
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

Я решил "отложить бубен и перестать танцевать". Ситуация в моем случае мало кому пригодиться, при прямом доступе в интернет через модем HiLink, пользователи просто прикрутят скрипт ddns к LTE-интерфейсу. В моем же случае можно взять Caller ID vpn-клиента,в поднятом туннеле через необходимый LTE-интерфейс HiLink модема, на VPN-сервере. Если не трудно, поправьте пожалуйста синтаксис в скрипте ddns, который приводил немного выше. Пока он отправляет локальный IP сервера к которому клиент подключается. Думаю куда корректно поставить переменную $"caller-id".
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Chupaka писал(а): 05 окт 2018, 00:43 В том скрипте адрес определяется в строке ":local ddnsip [ /ip address get [/ip address find interface=$ddnsinterface ] address ]" — вот сюда и надо вставить результат работы скрипта выше.
Ну, либо caller-id :)
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

а можно явным образом готовую строчку написать? Простите, я что-то запутался...
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

:local ddnsip "$"caller-id""; - как-то так, видимо :)
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

Тут ему еще надо указать с какого интерфейса забирать, что-то вроде -
:local ddnsip "$"caller-id" find interface=$ddnsinterface'', пока ни так ни так не работает. Может надо ввести локальную переменную в описание глобальный переменных? Типа - :local "caller-id"
Дополнение - а не может быть, что переменная $''caller-id'' применима только для скриптов в профиле РРР? Что-то я её кручу-верчу по-всякому - ''не выходит каменный цветок''...
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Конечно только для скриптов в профиле PPP. Если хочется в Scheduler - надо забирать из /ppp active, видимо.
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

И как это примерно будет выглядеть в Scheduler? -
:local ddnsip [ /ip address get [/ppp active find where name=$ddnsinterface address=$"caller-id" ] address ]
в то же время параметр $"caller-id" только для РРР профиля, как значение передать другим параметром не знаю.
https://forum.mikrotik.com/viewtopic.php?t=61188
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Будет выглядеть как

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

:local ddnsip [/ppp active get [find name="ЛОГИН"] caller-id]
Это, я так понимаю, на стороне VPN-сервера надо выполнять.
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

да, на стороне vpn-сервера. В данном случае caller id vpn-клиента и будет искомый ip hilink модема, который оператор сотовой связи ему присваивает при поднятии соединения. Вот его как раз и надо передать на сервер DDNS.
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Тогда - так, как я и написал. Опять же, ничего не мешает этот скрипт выполнять из PPP-профиля, а не дёргать по Scheduler'у
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

пока не работает, полный скрипт имеет такой вид, смущает строка local ddnsinterface "имя vpn-интерфейса" - что все-таки тут указывать логин или имя интерфейса, имя в ROS указывается в угловых скобках <vpn-клиент>. По идее с вашей модификацией переменная local ddnsinterface уже и не нужна. Плюс наверное можно убрать действие "Из полученного на интерфейс IP исключаем маску"

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

 # Параметры подключения к NO-IP.comlocal ddnsinterface
:local ddnsuser "user name"
:local ddnspass "password"
:local ddnshostname "...ddns.net" 
:local ddnsinterface "имя vpn-интерфейса"

# Описание глобальных переменных
:global ddnslastip
:local str
:local ddnsip
:local ip
:local caller id

:if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" }

:local ddnsip [/ppp active get [find name="...ddns.net"] caller-id]

:if ([ :typeof $ddnsip ] = nil ) do={
   :log info ("ServiceDNS: No ip address on $ddnsinterface .")
} else={

# Из полученного на интерфейс IP исключаем маску
   :for i from=( [:len $ddnsip] - 1) to=0 do={ 
      :if ( [:pick $ddnsip $i] = "/") do={ 
       :set ddnsip [:pick $ddnsip 0 $i];
      } 
   }

  :if ($ddnsip != $ddnslastip) do={

    :log info ("ServiceDNS: $ddnshostname -> $ddnsip")

# Отправляем новый IP адрес на сервер No-IP с помощью HTTP запроса
    :local str "/nic/update?hostname=$ddnshostname&myip=$ddnsip"
    /tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshostname)
    :delay 1 

# Сохраняем результаты в лог файлах
    :local str [/file find name="ServiceDNS.$ddnshostname"];
    :log info [/file get $str contents];
    /file remove $str
    :global ddnslastip $ddnsip

  } 

}
Последний раз редактировалось Vita077 07 окт 2018, 18:25, всего редактировалось 1 раз.
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Она не должна смущать хотя бы потому, что эта переменная нигде не используется, потому что мы ведь выше выбрали другой способ получения адреса - из caller-id.

name="...ddns.net" - вы уверены, что имя пользователя, под которым клиент подключается к серверу, у вас оканчивается на ddns.net?..

":local caller id" - эта конструкция создаёт переменную caller и присваивает ей строку с текстом "id" - это именно то, что предполагалось делать?..
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

да, у меня логин клиента к vpn-серверу имеет вид такой же что и доменное имя ddns - сделано умышленно, чтобы не писать комментарии к логинам - так наглядно понятно для каких целей он создан
":local caller id" - если так, я уберу её, local ip тоже не нужна теперь
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

В лог что-нибудь пишется при выполнении скрипта?
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

да, он забирает callerd id корректно, но почему-то отправляет внешний IP сервера VPN, 10.202 который - http://file.sampo.ru/76jf63/ но к внешнему другой домен прикручен, из-за этого ddns его и не меняет
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Что именно неправильно и куда отправляется? Там разные ddns-имена на скриншоте почти везде замазаны, или там одно и то же?
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

Зашел на - https://wiki.mikrotik.com/wiki/Dynamic_ ... for_dynDNS скопировал скрипт, заменил строку с IP адресом на предложенную Вами, получилось обновить IP на DDNS. Огромное Вам спасибо за помощь! В итоге скрипт будет иметь такой вид:

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

# Define User Variables
:global ddnsuser "DYNDNSUSER"
:global ddnspass "DYNDNSPASS"
:global ddnshost "DYNDNSHOST"

# Define Global Variables
:global ddnsip
:global ddnslastip
:if ([ :typeof $ddnslastip ] = nil ) do={ :global ddnslastip "0" }

:global ddnsinterface
:global ddnssystem ("mt-" . [/system package get system version] )

# Define Local Variables
:local int

# Loop thru interfaces and look for ones containing
# default gateways without routing-marks
:foreach int in=[/ip route find dst-address=0.0.0.0/0 active=yes ] do={
  :if ([:typeof [/ip route get $int routing-mark ]] != str ) do={
     :global ddnsinterface [/ip route get $int interface]
  }
}

# Grab the current IP address on that interface.
:global ddnsip [/ppp active get [find name="VPNLOGIN"] caller-id]

# Did we get an IP address to compare?
:if ([ :typeof $ddnsip ] = nil ) do={
   :log info ("DynDNS: No ip address present on " . $ddnsinterface . ", please check.")
} else={
  :if ($ddnsip != $ddnslastip) do={
    :log info "DynDNS: Sending UPDATE!"
    :local str "/nic/update?hostname=$ddnshost&myip=$ddnsip&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG"
    /tool fetch address=members.dyndns.org src-path=$str mode=http user=$ddnsuser \
        password=$ddnspass dst-path=("/DynDNS.".$ddnshost)
    :delay 1
    :local str [/file find name="DynDNS.$ddnshost"];
    /file remove $str
    :global ddnslastip $ddnsip
  }
}
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Vita077 »

Рано обрадовался - сработало вручную 1 раз и пока все. Теперь ни логов, ни обновлений IP нет.
Аватара пользователя
Chupaka
Сообщения: 3878
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

Re: Проверка IP LTE-интерфейса и отправка его на ddns

Сообщение Chupaka »

Вам просто посочувствовать, или вы всё же покажете, что и куда добавляете, чтобы хоть кто-нибудь попытался помочь? :)
Ответить