Привет! У меня проблема с использованием этого скрипта http://wiki.mikrotik.com/wiki/Use_host_names_in_firewall_rules: при запуске из CLI получается: /system script> run resolvehostnames failure: dns name does not exist. И проблема возникает здесь, в конце скрипта выше: : if ($newip != $oldip) do={ :set newip [:resolve $comment] /ip firewall address-list set $i address=$newip} }. Пытался запустить этот скрипт как на ROS 5.14, так и на 5.22. Настройка точно такая же, как в вики, должно быть 100% всё в порядке. Есть какие-нибудь идеи?
Привет, skot! Большое спасибо за твой скрипт, он отлично работал, пока я был на v5.25, но пару дней назад обновился до v6.3, и он перестал обновлять адреса. Он все еще работает каждые 3 минуты, но теперь он этого не делает =( Ребят, какие-нибудь идеи, что могло измениться между v5.25 и v6.3? Или есть способ это исправить и заставить его снова работать?
Скрипт у меня работает отлично на v6.3, не знаю, почему у тебя перестал работать. Первым делом проверь логи. Посмотри записи [RESOLVE], возможно, там будет видно, где происходит сбой. Какая последняя запись [RESOLVE] появляется? Для дополнительного тестирования можешь заключить весь основной скрипт в скобки {}, а потом вставить его в терминал. Возможно, это поможет выявить ошибки в скрипте.
Привет, если ты использовал первый код, сделай небольшое изменение, и всё будет ок с новой версией прошивки: замени `:execute script=resolvehostnames-sub` на `:execute script="resolvehostnames-sub"`. Оригинальный скрипт будет работать с версией 6.31. Надеюсь, это тебе пригодится, Maxspeed.
Из этого кода: ros код
Задержка на X секунд, чтобы разрешить имя хоста:
:local delay 5 define variables: :global comment :global newip :local list :local oldip start logging /log info “[RESOLVE] - START”
Перебор каждой записи в списке адресов: :foreach i in=[/ip firewall address-list find] do={ очищаем переменную newip каждый раз: :set newip “” Получаем первые пять символов имени списка: :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] /log info “[RESOLVE] - checking $comment” :set oldip [/ip firewall address-list get $i address] /log info “[RESOLVE] - old ip: $oldip” /log info “[RESOLVE] - calling sub-script” :execute script=resolvehostnames-sub Этот скрипт не ждет разрешения под-скриптом имени хоста, поэтому нужно задержаться на время: :local counter 1 while ($counter <= $delay) do={ /log info “[RESOLVE] - waiting for hostname to resolve - attempt $counter” :delay 1s if length of new ip is greater than zero, break out of loop: :if ([:len $newip] > 0) do={ :set counter $delay } increment counter: :set counter ($counter + 1) } if new ip length is greater than zero, an ip was resolved: :if ([:len $newip] > 0) do={ /log info “[RESOLVE] - new ip: $newip” if newip does not equal oldip: :if ($newip != $oldip) do={ /log info “[RESOLVE] - ip has changed, updating address list” Set the address list entry accordingly /ip firewall address-list set $i address=$newip } else={ /log info “[RESOLVE] - new ip matches old ip, no change” } } else={ /log info “[RESOLVE] - did not get new ip, timed out” } } /log info “[RESOLVE] - END”
Убедись, что имя этого скрипта совпадает с именем, вызываемым из основного скрипта (resolvehostnames-sub): :global comment :global newip /log info “[RESOLVE] - trying to resolve $comment from sub-script” :set newip [:resolve $comment]