Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    6.2 Проблема со скриптом dynDns

    6.2 Проблема со скриптом dynDns

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    6.2 Проблема со скриптом dynDns, RouterOS
     
    ahedx
    Guest
    #1
    0
    05.08.2013 10:26:00
    После обновления RouterOS с 6.1 на 6.2 возникла проблема с обновлением внешнего IP через скрипт DynDNS. Использую следующий скрипт:

    Устанавливаем необходимые переменные:
    `:local username "ahedxx"`
    `:local password "1642@1642"`
    `:local hostname " izone-me.dyndns.org "`
    `:global dyndnsForce`
    `:global previousIP`

    Выводим некоторую отладочную информацию:
    `:log info ("UpdateDynDNS: username = $username")`
    `:log info ("UpdateDynDNS: password = $password")`
    `:log info ("UpdateDynDNS: hostname = $hostname")`
    `:log info ("UpdateDynDNS: previousIP = $previousIP")`

    Получаем текущий IP-адрес из интернета (в случае двойной NAT):
    `/tool fetch mode=http address=“ checkip.dyndns.org ” src-path=“/” dst-path=“/dyndns.checkip.html”`
    `:delay 1`
    `:local result [/file get dyndns.checkip.html contents]`

    Парсим текущий IP-адрес:
    `:local resultLen [:len $result]`
    `:local startLoc [:find $result ": " -1]`
    `:set startLoc ($startLoc + 2)`
    `:local endLoc [:find $result “” -1]`
    `:local currentIP [:pick $result $startLoc $endLoc]`
    `:log info “UpdateDynDNS: currentIP = $currentIP”`

    Удалите # на следующей строке, чтобы принудительно обновлять каждый раз — полезно для отладки, но можно попасть в черный список DynDNS!
    `#:set dyndnsForce true`

    Определяем, нужно ли обновление DynDNS, больше информации по запросу обновлятора DynDNS:
    http://www.dyndns.com/developers/specs/syntax.html

    `:if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={`
    `:set dyndnsForce false`
    `:set previousIP $currentIP`
    `:log info “$currentIP or $previousIP”`
    `/tool fetch user=$username password=$password mode=http address=“ members.dyndns.org ” src-path=“nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no­” dst-path=“/dyndns.txt”`
    `:delay 1`
    `:local result [/file get dyndns.txt contents]`
    `:log info (“UpdateDynDNS: Dyndns update needed”)`
    `:log info ("UpdateDynDNS: Dyndns Update Result: ".$result)`
    `:put ("Dyndns Update Result: ".$result)`
    `} else={`
    `:log info (“UpdateDynDNS: No dyndns update needed”)`
    `}

    С уважением.
     
     
     
    efaden
    Guest
    #2
    0
    19.08.2013 11:11:00
    К слову, в версии 6.3 всё вернется обратно. В 6.2 глобальные переменные были nil, а локальные — nothing… После многочисленных проблем они меняют всё обратно к nothing в 6.3. Отправлено с моего SCH-I545 через Tapatalk 2.
     
     
     
    Netsplite
    Guest
    #3
    0
    21.08.2013 09:59:00
    Пытаюсь добавить новую обработку ошибок из 6.2 в скрипт, потому что если хостнейм не существует, то скрипт просто падает. Пытался добавить по примеру: http://wiki.mikrotik.com/wiki/Manual:Scripting#Catch_run-time_errors. Но on-error возвращает скриптовую ошибку и сбрасывает скрипт (ну, довольно иронично). Так что думаю, у них есть несколько багов, которые нужно поправить в 6.3. //Временно удалил previousIP, потому что работаю с 6.2, также добавил опцию исключения хостнеймов («!» префикс), чтобы можно было поместить динамические и статические хосты в один список. Еще пробовал добавить on-error к другим if-блокам, но результат был тот же.

    # Определяем переменные
    :local list
    :local comment
    :local newip
    :local oldip
    :log info "Ищем измененные динамические хосты"

    # Перебираем каждую запись в списке адресов.
    :foreach i in=[/ip firewall address-list find] do={

    # Получаем первые пять символов имени списка
     :set list [:pick [/ip firewall address-list get $i list] 0 5]

    # Если они 'host_', то, похоже, есть совпадение - обрабатываем
     :if ($list = "host_") do={

    # Получаем комментарий для этого элемента списка адресов (это имя хоста, которое нужно использовать)
       :set comment [/ip firewall address-list get $i comment]
       :set oldip [/ip firewall address-list get $i address]

    # Разрешаем его и устанавливаем запись списка адресов соответствующим образом.
       : if ($comment != "") do={
    : if ([:find $comment "!"] = 0) do={
                   :log info "Динамический хост имеет статический IP ($comment)";
                    } else={
                    :set newip [:resolve $comment];
    /ip firewall address-list set $i address=$newip;
                    :log info "Хост обновлен ( $comment -> $newip )";
                  }
         }  
       }
     } on-error={ :log info "Разрешение $comment не удалось"};
     :log info "Завершено обновление динамических хостов"
     
     
     
    eldersouza
    Guest
    #4
    0
    21.08.2013 16:45:00
    Привет, ahedx! Проблема в объявлении переменных без значения. Не знаю почему, но если ты добавишь “” (кавычки, без значения) в конце этих двух строк ниже, скрипт заработает нормально:

    :global dyndnsForce
    :global previousIPdynDNS

    Если оставлять эти переменные без значения и без кавычек, скрипт не запускается. Попробуй изменить свой скрипт на:

    :global dyndnsForce “”
    :global previousIPdynDNS “”

    Попробуй еще раз и скажи, заработало ли.
     
     
     
    henrysim
    Guest
    #5
    0
    23.08.2013 10:57:00
    Столкнулся с такой же проблемой, но решил её, изменив на это: global dyndnsForce ""
    :global previousIP "$previousIP" # Устанавливаем нужные переменные
    :local username "user"
    :local password "1234"
    :local hostname "host.dyndns.org"

    :global dyndnsForce ""
    :global previousIP "$previousIP"

    # выводим какую-то отладочную информацию
    :log info ("UpdateDynDNS: username = $username")
    :log info ("UpdateDynDNS: password = $password")
    :log info ("UpdateDynDNS: hostname = $hostname")
    :log info ("UpdateDynDNS: previousIP = $previousIP")

    # получаем текущий IP-адрес из интернета (на случай двойной NAT)
    /tool fetch mode=http address="checkip.dyndns.org" src-path="/" dst-path="/dyndns.checkip.html"
    :delay 1
    :local result [/file get dyndns.checkip.html contents]

    # разбираем полученный IP-адрес
    :local resultLen [:len $result]
    :local startLoc [:find $result ": " -1]
    :set startLoc ($startLoc + 2)
    :local endLoc [:find $result "</body>" -1]
    :local currentIP [:pick $result $startLoc $endLoc]
    :log info "UpdateDynDNS: currentIP = $currentIP"

    # Убери знак # с следующей строки, чтобы заставить обновление происходить каждый раз - полезно для отладки,
    # но из-за этого можно попасть в чёрный список DynDNS!

    #:set dyndnsForce true

    # Определяем, нужно ли обновление dyndns
    # подробнее об запросах обновлений dyndns тут http://www.dyndns.com/developers/specs/syntax.html

    :if (($currentIP != $previousIP) || ($dyndnsForce = true)) do={
    :set dyndnsForce false
    :set previousIP $currentIP
    :log info "$currentIP или $previousIP"
    /tool fetch user=$username password=$password mode=http address="members.dyndns.org" \
    src-path="nic/update?system=dyndns&hostname=$hostname&myip=$currentIP&wildcard=no­" \
    dst-path="/dyndns.txt"
    :delay 1
    :local result [/file get dyndns.txt contents]
    :log info ("UpdateDynDNS: Обновление dyndns нужно")
    :log info ("UpdateDynDNS: Результат обновления Dyndns: ".$result)
    :put ("Результат обновления Dyndns: ".$result)
    /tool e-mail send from=email@gmail.com server=173.194.77.108 to=me@gmail.com subject="Current IP is $currentIP"
    :log info "Email с новым IP-адресом отправлен"
    } else={
    :log info ("UpdateDynDNS: Обновление dyndns не требуется")
    }
     
     
     
    specialist
    Guest
    #6
    0
    25.08.2013 20:15:00
    На моем RB2011 с версией 6.2 этот скрипт не работает!!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры