NTP через proxy или HTTPDate
NTP сервер работающий в корпоративной локальной сети по каким-то мне непонятным причинам довольно тормозной (и никто с этим ничего делать не хочет), поэтому я первым делом после установки системы установил ntpdate и благополучно забыл про него думая, что всё работает. Не так давно я обнаружил, что время на рабочем ПК заметно отстаёт. Оказалось, что ntpdate не умеет работать через proxy и ничего с этим не поделаешь. Беглый гуглёж показал, что я не одинок и самый простой вариант - это использовать заголовок Date из HTTP запроса какого нибудь сайта. Именно так я и решил сделать.
Создадим файл httpdate в директории /etc/cron.daily/
с таким содержанием:
#!/bin/bash
USERNAME="user"
PASSWORD="password"
HOST="proxy.example.com"
PORT="8080"
CHECKHOST="google.com" # Хост для проверки доступности сети
DATEHOST="http://google.com" # Хост с которого будем брать время
export http_proxy=http://$USERNAME:$PASSWORD@$HOST:$PORT
if ( ! ping -c5 -i1 -n -s10 -W1 $CHECKHOST &>/dev/null ); then
logger "HTTPDate: Network in unreachable."
exit 1
fi
date -s "$(wget -S - "$DATEHOST" 2>&1 |
grep -E '^[[:space:]]*[dD]ate:' |
sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//' |
head -1l | awk '{print $1, $3, $2, $5 ,"GMT", $4 }' |
sed 's/,//')" &>/dev/null
Даём права на исполнение:
chmod +x /etc/cron.daily/httpdate
В общем-то всё. Два разных адреса для проверки сети и получения времени из-за того, что ping не понимает адреса с http://, а wget не понимает без, и совершенно не хотелось нагромождать скрипт. Погрешность при таком методе синхронизации времени где-то 1-2 секунды если нет никаких проблем с сетью. Для меня такая погрешность не критична.