Как стать автором
Обновить

Комментарии 17

Минусы, от которых так и не смог избавиться:
Хранение полученных от Яндекса ответов в файлах. По другому не смог сделать


Посмотрите в сторону выводы нужной информации в лог, а дальше парсите лог, будет скрипт больше, но зато экономия на записи в nand
Так в том то и дело, что fetch не умеет выводить информацию. Он только скачивает.

/tool fetch url=«www.mikrotik.com/index.html» mode=http
Создаст на диске файл index.html

Если сделать как-то так:
:local var1 [/tool fetch url=«www.mikrotik.com/index.html» mode=http]
То результат будет довольно странный на мой взгляд. Если файл скачался – будет пустая переменная, если ошибка – будет описание ошибки.

[Klajnor@MikroTik] > :local var1 [/tool fetch url="http://www.mikrotik.com/index.html" mode=http]; :put $var1; :put [:len $var1]
  status: finished


0



[Klajnor@MikroTik] > :local var1 [/tool fetch url="http://www.mikrotik.com/indeks.html" mode=http]; :put $var1; :put [:len $var1] 
  status: failed

failure: closing connection: <404 Not Found> 54.242.175.225:80 (4)

Здесь имя файла заведомо неправильное. Получаем 404 ошибку, что ожидаемо. Но выполнение после этого остановится, убедиться в этом можно заменив переменную на глобальную. Переменная просто не будет объявлена.
Я незнаком с api yandex.
id записи статична?
если да то, можно обойтиcь простым запросом :resolve к dns серверу yandex. и получить текущий Ip для домена.
при выполнении fetch keep-result=no не будет вывод сохранять в файл.

Да, keep-result=no не сохраняет в файл, но и не возвращает результата.
У меня в скрипте 2 запроса и результат мне нужен.
И да, id записи статичен.
На счёт получать текущий IP от яндекса через резолв — подумаю. Идея хорошая.
Посмотрел. Кажется :resolve не умеет резолвить используя указанный DNS сервер. Только используя общие настройки роутера. Этот вариант мне не подходит, т.к. у провайдера на DNS серверах запись обновляется с задержкой 5-10 минут, получится что скрипт будет стучаться на яндекс 2-3 раза для обновления записи.
у вас же в руках маршрутизатор ловить output tcp/udp 53 трафик и отправляйте на yandex

создайте правило, перед выполнение включайте это правило, потом выключайте, а также в начале чистите кэш для данной записи.

Просто если id статично зачем вам получать ответ от сервера, можно ведь проверить явно запросом dns.
А также данный скрипт должен выполняться только при включении, и при сменен ip адреса.
Не, перенаправлять DNS запросы на сервера яндекса правилом — я считаю, что это слишком большое извращение.
ID статично. Я по этому ID ищу в XML данные по этому записи.
Как запускать скрипт только при смене IP? Мне приходит в голову только парсить лог, но если только таким способом — то этот вариант тоже не лучше
получаешь свой ip
заносишь его адрес лист
сверяешь текущий ip c адрес листом
если совпадает то молчишь
если разные выполняешь запрос на изменение зоны
проверяешь
меняешь в адрес листе
Так и у меня запрос на изменение записи делается только при условии ($YaDNSCurrentIP != $YaDNSPreviousIP) or ($YaDNSCurrentIP != $YaDNSDomainRecord) = true
$YaDNSPreviousIP — IP взятый с интерфейса в момент прошлой попытки обновления, которая вернула OK
$YaDNSDomainRecord — IP этой записи полученный запросом с яндекса.

Если текущий IP не совпадает с одним из них — делается попытка изменения. Если попытка изменения прошла неудачно или если яндекс вернул OK, но почему-то не записал новые данные — скрипт через 5 минут сделает ещё один запрос на изменение

А зачем собственно предыдущий IP сравнивать с текущим через API? просто резолв не подходит разве? результат то должен быть одинаковым, иначе смысла в этом скрипте нет.
да и впринципе вы же в скрипте проверяете результат выполнения смены айпи адреса, если возврат ОК 200, то IP надо полагать сменился, можно просто предыдущий айпишник в глобальную переменную загнать и только с ним и сверять например.
в результате запись файла в микротик будет не каждый раз при запуске скрипта, а только в том случае когда айпи адрес сменился, в моём случае это примерно раз в месяц, а в общем у всех как я понимаю в среднем раз в сутки или реже.
Возможно и излишне. Сделано скорее для подстраховки, т.к. мой скрипт для DynDNS иногда отрабатывал без ошибок, но запись в DNS не обновлялась. Было это где-то 1 раз из 20. Решил просто ещё одним принудительным запуском скрипта.

У меня IP сменяется раз в сутки, в 5.30 принудительно переподключаюсь, т.к. раньше у провайдера была проблема, что на оборудовании оставались зависшие соединения. Сейчас такой проблемы уже нет, так что переподключение оставлено тоже на всякий случай.
Но у провайдера время сессии ограничено 72 часами.

Про резолв – я выше в комментариях ответил.
С dns.he.net/ это сделать намного проще.
Спасибо, по Вашему мануалу все получилось.

Есть только одна проблема: если запись имела вид XXX.domain.ru, то при обновлении XXX удаляется.
Я понимаю, что для этого надо добавлять свойство subdomain, только вот у меня не получилось…
Обновил пост.
На прошивке 6.15, видимо, всё поломалось :(
Не может получить текущий IP интерфейса, который получаю по DHCP, ну а дальше и делать ничего не делает.
У меня работает. На pastebin новая версия. Изменений с момента поста минимум.
В какой-то версии у меня оставались старые адреса в списке и не делался запрос к API яндекса.

И что пишет в лог?
Добавьте после строки
:local YaDNSCurrentIP [:pick $YaDNSYaDNSCurrentIPMask 0 [:find $YaDNSYaDNSCurrentIPMask "/"]]

строку
:log info "UpdateYaDNS: YaDNSCurrentIP = $YaDNSCurrentIP"
Пробую скрипт запустить на микротике. И получаю ошибку no_auth. Работает ли у Вас скрипт и сейчас? Мне кажется яндекс поменял api. В документации везде api2 фигурирует
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории