Синхронизация времени NTP

Post new topic   Reply to topic    DD-WRT Forum Index -> Использование и установка DD-WRT
Goto page 1, 2  Next
Author Message
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Fri Mar 20, 2009 9:08    Post subject: Синхронизация времени NTP Reply with quote
Поставил в настройках маршрутизатора синхронизировать время, указал сервер time.nist.gov.
Проблема в том, что правильное время устанавливается только через час после включения или перезагрузки, видимо первая попытка синхронизации проваливается т.к. для подъема PPTP клиента требуется некоторое время.
Можно как то из скрипта принудительно заставить NTP клиент синхронизироваться?

Прошивка: DD-WRT v24-sp2 (02/21/09) mini-usb
Sponsor
SaintReset
DD-WRT Guru


Joined: 13 Jan 2009
Posts: 1732

PostPosted: Fri Mar 20, 2009 11:28    Post subject: Reply with quote
в теории за это отвечает ntpclient

НО! http://www.dd-wrt.com/phpBB2/viewtopic.php?t=43335

_________________
I can change this world, but G*d doesn`t give me the source (c)
Gooooглю за деньги
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Sat Mar 21, 2009 5:41    Post subject: Reply with quote
ntpclient похоже обрезанный, адекватно воспринимается только такая команда "ntpclient time.nist.gov", устанавливающая время без учета часового пояса, на любые дополнительные параметры выдает "gethostbyname: Success".

В различных местах, где обсуждалась эта проблема, нормального решения так и не найдено.

Появилась идея как это можно сделать. Сначала запрашиваем время ntpclient time.nist.gov, затем берем системное время в секундах (timestamp) "date +%s", добавляем к этому значению часовой пояс, переведя его в секунды, и устанавливаем в систему.

Однако появилась проблема, как установить время в секундах?
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Sat Mar 21, 2009 13:42    Post subject: Reply with quote
Сам спросил, сам сделал...

Решение:
Code:
timezoneH=3   #поправка в часах
timezoneM=0   #поправка в минутах
ntpclient `nvram get ntp_server`
date 1970.01.01-00:00:$((`date +%s`+$(($timezoneH*3600+$timezoneM*60))))
lang
DD-WRT Novice


Joined: 18 Dec 2008
Posts: 32

PostPosted: Sat Mar 21, 2009 16:35    Post subject: Reply with quote
А так нельзя?
Code:

H="+3"; M="+0"
ntpclient `nvram get ntp_server`
date --set "${H}hour ${M}min"

Часовой пояс - полдела. Еще неплохо иметь переход летнее-зимнее время Smile.
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Sun Mar 22, 2009 6:55    Post subject: Reply with quote
lang wrote:
А так нельзя?
Code:

H="+3"; M="+0"
ntpclient `nvram get ntp_server`
date --set "${H}hour ${M}min"

Часовой пояс - полдела. Еще неплохо иметь переход летнее-зимнее время Smile.

Не понимает он такой опции )
Судя по исходнику date.c, так нельзя делать.

Насчет перехода на летнее - зимнее время, я уже думал, в модуле ntp.c это делается достаточно громоздко, а если переделать это в скриптовые команды, будет листинг на пол экрана.

Есть такой модуль ntp.c в нем есть функция int do_ntp( void ), эта функция вызывается из модуля process_monitor.c когда синхронизируется время.
Может кто скомпилит бинарник при запуске которого будет вызываться функция int do_ntp( void ), тогда время будет четко переводиться в соответствии со всеми настройками в веб интерфейсе.

Есть еще один путь, это попросить разработчиков добавить несколько строк кода в ntpclient.c, чтоб по специальному ключу вызывалась функция int do_ntp( void ) из ntp.c.
У кого с английским хорошо, кто отважится?
lang
DD-WRT Novice


Joined: 18 Dec 2008
Posts: 32

PostPosted: Tue Mar 24, 2009 15:10    Post subject: Reply with quote
kenzo wrote:

Не понимает он такой опции

Да, похоже команда date из buzybox сильно урезана. На всякий случай, может пригодиться: команда date есть еще в пакете coreutils, она понимает опцию --set и date --set "${H}hour ${M}min" тоже.
kenzo wrote:

Может кто скомпилит бинарник при запуске которого будет вызываться функция int do_ntp( void ), тогда время будет четко переводиться в соответствии со всеми настройками в веб интерфейсе.

Что-то менять в бинарниках ntp клиента (как мне кажется) вряд ли оправдано, так как причина проблем с синхронизацией времени и с пробросом портов через веб-итерфейс - ошибка при установке PPTP соединения, которую разработчики пока не вполне исправили. Если ее убрать, например, с помощью скрипта, все это работает правильно.
SaintReset
DD-WRT Guru


Joined: 13 Jan 2009
Posts: 1732

PostPosted: Tue Mar 24, 2009 16:04    Post subject: Reply with quote
Разработчики не особо заморачиваются в общем-то над этим вопросом. Ибо, скорее всего, считают некритичным, что локальное время на роутере обновится на час раньше или позже. Лично я на это тоже забил... хотя, вынужден признать, что первое время это бесило по страшной силе.
_________________
I can change this world, but G*d doesn`t give me the source (c)
Gooooглю за деньги
lang
DD-WRT Novice


Joined: 18 Dec 2008
Posts: 32

PostPosted: Wed Mar 25, 2009 12:22    Post subject: Reply with quote
SaintReset wrote:
Разработчики не особо заморачиваются в общем-то над этим вопросом. Ибо, скорее всего, считают некритичным, что локальное время на роутере обновится на час раньше или позже.

Может быть, разработчики мало интересуются этим вопросом потому, что подключение к интернету по протоколу PPTP считают устаревшим? Во всяком случае, некоторое отсутствие интереса здесь наблюдается Sad.

При настройке PPTP подключения к интернету через Services->VPN, возникает ряд проблем, в том числе, проблема с синхронизацией времени. Их источник в том, что любая программа, работающая в составе DD-WRT, прочтя ячейку wan_ipaddr (Basic Setup->WAN_IP) будет считать, что это внешний адрес, хотя на самом деле это внутренний адрес в сети провайдера.

Известные неудобства с пробросом портов, возникающие по этой причине, наверное, можно терпеть. Последней каплей для меня было то, что порты, открытые во внутренней сети (httpd, telnet, ssh), оказались открытыми во внешнюю сеть. Стоит открыть порт 22 вовне на Linux машине и разрешить авторизацию ssh через пароль, и можно периодически (1-2 раза в неделю) наблюдать попытки взлома, идущие из самых разных уголков земного шара.

Мне показалось проще, пока Basic Setup->pptp не работает, перезапускать pptp клиент из скрипта, обеспечивая правильный IP в ячейке wan_ipaddr. (Проще, чем следить, чтобы порты не оказались случайно открытыми вовне после каких-то изменений в настройках.) Этим решается и вопрос синхронизации времени, и проблема проброса портов.
SaintReset
DD-WRT Guru


Joined: 13 Jan 2009
Posts: 1732

PostPosted: Wed Mar 25, 2009 12:32    Post subject: Reply with quote
кстати о зайчиках.
http://www.dd-wrt.com/phpBB2/viewtopic.php?t=44649

_________________
I can change this world, but G*d doesn`t give me the source (c)
Gooooглю за деньги
lang
DD-WRT Novice


Joined: 18 Dec 2008
Posts: 32

PostPosted: Wed Mar 25, 2009 14:57    Post subject: Reply with quote
Еще пост о зайчиках то же, к сожалению, без видимой реакции со стороны разработчиков. И еще один мой, на всякий случай. Но все же изменения к лучшему ожидаются?
SaintReset
DD-WRT Guru


Joined: 13 Jan 2009
Posts: 1732

PostPosted: Wed Mar 25, 2009 16:20    Post subject: Reply with quote
Прямой путь в багтрекер?.. Ибо чует моя душа, что после того, как они отремонтируют dhcpd и работу pptp клиента из раздела Basic setup, то кол-во русских воплей и матов на dd-wrt серьезно поуменьшится.
_________________
I can change this world, but G*d doesn`t give me the source (c)
Gooooглю за деньги
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Wed Mar 25, 2009 16:59    Post subject: Reply with quote
SaintReset wrote:
Прямой путь в багтрекер?.. Ибо чует моя душа, что после того, как они отремонтируют dhcpd и работу pptp клиента из раздела Basic setup, то кол-во русских воплей и матов на dd-wrt серьезно поуменьшится.

Если с английским боле менее надо обязательно регистрироваться и периодически туда отписываться, другие пути более долгие…


А покачто я написал скрипт синхронизации времени. Он помещается в startup и пытается синхронизировать время в течении 10 минут каждые 30 секунд, после успешной синхронизации скрипт завершает свою работу.

tzH=3 и tzM=0 это прибавка или вычитание от времени по Гринвичу, в зависимости от знака, часов и минут соответственно. Имя NTP сервера берется из настроек в веб интерфейсе. Скрипт не учитывает перехода на зимнее летнее время, если кто допишет эту функцию, буду рад видеть это решение.


Code:
(tzH=3
tzM=0
i=0;while [ $((i++)) -le 20 -a `/bin/date +%Y` -eq 1970 ];do
/usr/sbin/ntpclient `nvram get ntp_server`
if [ `/bin/date +%Y` -ne 1970 ];then
/bin/date 1970.01.01-00:00:$((`/bin/date +%s`+$(($tzH*3600+$tzM*60))))
break;fi
sleep 30
done) &
lang
DD-WRT Novice


Joined: 18 Dec 2008
Posts: 32

PostPosted: Thu Mar 26, 2009 3:56    Post subject: Reply with quote
kenzo wrote:
Скрипт не учитывает перехода на зимнее летнее время, если кто допишет эту функцию, буду рад видеть это решение.

Перевод на летнее время и обратно не так сложен, как кажется на первый взгляд. У нас часы переводятся в последнее воскресенье марта и в последнее воскресенье октября. Вот, в качестве примера, скрипты, которые переведут часы на час вперед и назад в нужные дни, если их вызывать ежедневно (по cron'у) - первый в два часа ночи, второй - в три:
Code:

[ $(date +%m) -eq 3 ] && [ $(date +%d) -gt 24 ] && [ $(date +%w) -eq  0 ] && date --set "+1hour"
[ $(date +%m) -eq 10 ] && [ $(date +%d) -gt 24 ] && [ $(date +%w) -eq  0 ] && date --set "-1hour"

Вам, вероятно, понадобится, не перевод часов, а просто изменение переменной tzH.
kenzo
DD-WRT User


Joined: 28 Feb 2009
Posts: 138

PostPosted: Sat Mar 28, 2009 5:06    Post subject: Reply with quote
lang wrote:

Перевод на летнее время и обратно не так сложен, как кажется на первый взгляд. У нас часы переводятся в последнее воскресенье марта и в последнее воскресенье октября. Вот, в качестве примера, скрипты, которые переведут часы на час вперед и назад в нужные дни, если их вызывать ежедневно (по cron'у) - первый в два часа ночи, второй - в три:
Code:

[ $(date +%m) -eq 3 ] && [ $(date +%d) -gt 24 ] && [ $(date +%w) -eq  0 ] && date --set "+1hour"
[ $(date +%m) -eq 10 ] && [ $(date +%d) -gt 24 ] && [ $(date +%w) -eq  0 ] && date --set "-1hour"

Вам, вероятно, понадобится, не перевод часов, а просто изменение переменной tzH.


Тут задача несколько сложней, нужно определить нахождение в периоде летнего времени, определение последнего воскресенья месяца наиболее сложная задача. Разработчики решили сильно не мудрить, а взяли заранее рассчитанные даты перевода стрелок до 2022 года для каждой зоны DST.
Короче я взял алгоритм определения летнего времени с ntp.с и убрал из него определение для других зон DST.

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

Code:
(tz=`nvram get time_zone | awk '{print $1*3600}'`
i=0;while [ $((i++)) -le 20 -a `/bin/date +%Y` -eq 1970 ];do
/usr/sbin/ntpclient `nvram get ntp_server`
if [ `/bin/date +%Y` -ne 1970 ];then
startDay="30 29 28 27 25 31 30 29 27 26 25 31 29 28 27"
endDay="26 25 31 30 28 27 26 25 30 29 28 27 25 31 30"
mon=`/bin/date +%m`;day=`/bin/date +%d`
let "yi=`/bin/date +%Y`-2008+1"
dbeg=`/bin/echo $startDay | awk "{print int($"$yi")}"`
dend=`/bin/echo $endDay | awk "{print int($"$yi")}"`
if [ $mon -gt 3 -a $mon -lt 10 ]||[ $mon -eq 3 -a $day -ge $dbeg ]||
[ $mon -eq 10 -a $day -le $dend ];then
if [ $mon -ne 10 ]||[ $day -ne $dend ]||[ `/bin/date +%H` -le 1 ]
then let "tz += 3600"; fi fi
/bin/date 1970.01.01-00:00:$((`/bin/date +%s`+$tz))
break;fi
sleep 30
done) &
Goto page 1, 2  Next Display posts from previous:    Page 1 of 2
Post new topic   Reply to topic    DD-WRT Forum Index -> Использование и установка DD-WRT All times are GMT

Navigation

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You cannot download files in this forum