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

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

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

Сообщение Vita077 »

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

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

Сообщение Chupaka »

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

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

Сообщение Vita077 »

Скрипт всё-таки предыдущий где переменные ":local". Он отрабатывает, в логах видно, но вместо значения "nochg" объявляется значение "good", при этом IP на сервисе DDNS не меняется - http://file.sampo.ru/2s4s2w/
Обрадовался я тому, что со скриптом с вики микротика со значением "good" сработало, но только 1 раз, больше сколько не пытался - ничего, даже в логах. Хост на сервисе могу выбрать только "А" (ipv.4)
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

"Хост на сервисе могу выбрать только "А" (ipv.4)" - а это что значит? Для чего это там выбирать надо?
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

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

Сообщение Vita077 »

Я так написал, может из-за этого какие-то проблемы. там такие варианты - http://file.sampo.ru/2n9w6g/
ну а сам скрипт который отрабатывает, но со значением ''good'' это - http://file.sampo.ru/qgw4ws/
ощущение такое, что DDNS принимает значение, но не применяет его, как буд то решает что передано оно не в том формате - это только мои предположения.
Дополнение: утром этот скрипт поставил в Scheduler, скрипт сработал со значением "good'', на сервисе IP поменялся. Как-то через раз работает, оставлю как есть пока, понаблюдаю.
Единственное - чтобы применить этот скрипт в профиле РРР, правильно понимаю, необходимо значение caller id использовать в виде переменной - $"caller-id"? Или есть ещё какие-нибудь синтаксические различия?
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

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

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

Сообщение Vita077 »

Всё-таки синтаксисы под Scheduler и PPP отличаются, одним $"caller-id" не обойтись. Добавление $"user" тоже не помогает. В логах тишина, только подключение vpn-клиента.
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Синтаксис везде один и тот же, а дальше вы льёте воду, которая не проясняет ситуацию. Давайте конкретику: что именно и куда добавляете? У пользователя именно этот профиль указан?
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

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

Сообщение Vita077 »

Да, именно этот. В скрипте просто меняю caller-id на $"caller-id", пробовал еще за find name= ставить $"user". Ставлю в секцию On во вкладку script PPP-профиля.
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

Если всё именно так, как вы пишете - то и не должно работать. Приводите конкретный код, а то мы тут непонятно что обсуждаем. И вставляйте его в сообщения, я не в файлы на сторонних сайтах, по которым невозможно искать нормально.
Vita077
Сообщения: 33
Зарегистрирован: 28 сен 2018, 12:38

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

Сообщение Vita077 »

Хорошо, постараюсь без словоблудия. Имеем скрипт, благодаря вам, который прекрасно отрабатывает в Scheduler, но не отрабатывает в профиле РРР при подключении vpn-клиента. Что в нем изменить, чтобы он заработал в профиле? Сам скрипт:

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

# Параметры подключения к NO-IP.com
:local ddnsuser "userlogin"
:local ddnspass "userpass"
:local ddnshostname "ddnshostname" 
:local ddnsinterface "<vpninterfacename>"

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

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

:local ddnsip [/ppp active get [find name="vpnclientlogin"] 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

  } 

}
Аватара пользователя
Chupaka
Сообщения: 3880
Зарегистрирован: 29 фев 2016, 15:26
Откуда: Минск
Контактная информация:

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

Сообщение Chupaka »

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

:local ddnsip $"caller-id"
Ответить