Я предоставляю этот скрипт как альтернативу примеру скрипта, приведённому в примерах по адресу http://wiki.mikrotik.com/wiki/Manual:Scripting-examples#Allow_use_of_ntp.org_pool_service_for_NTP. Скрипт работает аналогично, используя пул-сервис ntp.org для настройки и установки IP-адресов NTP-серверов в конфигурации SNTP-клиента Mikrotik. Скрипт, который я представляю, основан на примере кода по указанной ссылке. Он проще, компактнее и представляет собой одиночный скрипт, который не зависит от глобальных переменных.
Этот скрипт не использует и не отправляет электронные письма, поэтому для некоторых пользователей он может быть не подходящей альтернативой. Скрипт довольно легко настраивается и используется. Сохраните скрипт в ROS, задайте имя скрипта, установите массив arrNtpSystems с основным и вторичным NTP-пулом на основе данных с http://www.pool.ntp.org. По умолчанию скрипт настроен для Северной Америки. Запланируйте регулярный запуск скрипта.
# SetNtpServers — проверка и установка NTP-серверов из NTP-пула # v1.2 Проверено и разработано на ROS v5.7 # # При необходимости измените следующую строку, имя в progName должно совпадать с именем скрипта :local progName "SetNtpServers";
# Массив NTP-пулов для использования (проверьте на www.pool.ntp.org), один или максимум два — основной и резервный # Измените следующую строку и переменную массива в зависимости от вашего региона (по умолчанию — Северная Америка). :local arrNtpSystems ("0.north-america.pool.ntp.org", "1.north-america.pool.ntp.org"); # В качестве альтернативы можно использовать пул для США: #:local arrNtpSystems ("0.us.pool.ntp.org", "1.us.pool.ntp.org"); # # Дальнейших изменений не требуется. :put "$progName: Запуск..."; :log info "$progName: Запуск..."; :set arrNtpSystems [ :toarray $arrNtpSystems ]; :if (( [ :len $arrNtpSystems ] < 1 ) or ( [ :len $arrNtpSystems ] > 2 )) do={ :put "$progName: ОШИБКА — массив NTP-систем (\$arrNtpSystems) должен содержать один или два DNS-имени."; :log info "$progName: ОШИБКА — массив NTP-систем (\$arrNtpSystems) должен содержать один или два DNS-имени."; } else={ :local arrRosNtpSetting ("primary-ntp", "secondary-ntp"); :local i 0; :foreach strNtpSystem in ($arrNtpSystems) do={ :local ipAddrNtpSystem [ :resolve $strNtpSystem ]; :local strRosNtpSetting [ :pick $arrRosNtpSetting $i ]; :local strCurrentNtpIp [ /system ntp client get $strRosNtpSetting ]; :put "$progName: DNS-имя NTP-сервера $strNtpSystem разрешилось в $ipAddrNtpSystem."; :log info "$progName: DNS-имя NTP-сервера $strNtpSystem разрешилось в $ipAddrNtpSystem."; :put "$progName: Текущая настройка $strRosNtpSetting — $strCurrentNtpIp."; :log info "$progName: Текущая настройка $strRosNtpSetting — $strCurrentNtpIp."; :if ( [ :toip $ipAddrNtpSystem ] != [ :toip $strCurrentNtpIp ] ) do={ :put "$progName: Изменяем настройку $strRosNtpSetting на $ipAddrNtpSystem."; :log info "$progName: Изменяем настройку $strRosNtpSetting на $ipAddrNtpSystem."; :local strCommand [ :parse "/system ntp client set $strRosNtpSetting=\"$ipAddrNtpSystem\"" ]; $strCommand; } else={ :put "$progName: Для настройки $strRosNtpSetting изменений не требуется."; :log info "$progName: Для настройки $strRosNtpSetting изменений не требуется."; } :set i ($i + 1); } } :put "$progName: Готово."; :log info "$progName: Готово.";
Создайте запись планировщика с примерно таким содержанием: /system scheduler add comment="Check and set NTP servers" disabled=no interval=12h name=SetNtpServers on-event=SetNtpServers policy=read,write,test start-date=oct/01/2011 start-time=00:00:00
Этот скрипт отличный, но у меня проблема с версией ОС 6.2. Кто-нибудь знает решение? В целом, с написанием скриптов я не очень! Логи показывают, что всё нормально, но в ntp-клиенте изменений нет. Пост уже старый, но может кто-то ещё ищет ответ.
У меня есть несколько роутеров без доступа в интернет. Когда пытаюсь использовать какой-то роутер в качестве NTP-сервера, на клиентах выскакивает ошибка «server-not-synchronized». Версия 6.11 (последняя).
Я нашёл простое, но опасное решение, если у вас есть свободный Linux-бокс. Можно подстроить его под вашу сеть и добавить в cron. Ещё понадобится sshpass — сейчас он есть практически во всех Linux-дистрибутивах.
#!/bin/bash
# имя пользователя и пароль sshuser="admin" passwrd="blablabla_this_is_not_my_real_password"
Могу подтвердить, что скрипт NTP работает без изменений на версии v6.21.1. Я заметил, что прошло немного времени, прежде чем время действительно обновилось. Также убедитесь, что вы указали ваш часовой пояс в меню Система → Часы.
Да, добавь это в планировщик, чтобы получать обновления. Если ты не используешь пакет NTP, просто введи доменное имя в server-dns-names, и при каждом обновлении RouterOS будет проверять IP. (Кстати, это список через запятую.)
Конечно, если он у вас есть. Некоторые просто хотят, чтобы их роутер сам синхронизировал время по NTP… или у них нет лишнего устройства для настройки NTP-сервера, как это бывает в небольших домашних или офисных сетях.