​​​Hi there, since this issue really bugged me as well (why generate tons of public NTP traffic if you have a server in-house?! [1]) I proudly present my /etc/default/ntpdate:
https://gist.github.com/ste-fan/7b9b5bcf6656f59c280f [2] I tried to clean Jan's "one"-liner up a bit. Basically it still does the same wonderful thing, but here's a quick changelog: * updated DHCP lease folder to /var/lib/NetworkManager + of course there we must consider *.lease files only * rewrote the whole method as a function (hopefully easier to read) * reduced the use of redirection and temporary variables using slightly more complex sed scripts and utilizing more of find's capabilites * added debug output that responds to ntpdate's -d option and will also be logged to syslog if the -s option is given (which is provided by /etc/network/if-up.d/ntpdate) * nevertheless there is no namespace pollution, thanks to + exclusively local function variables + unsetting function definitions after execution * the upper (default) config part can be left as is! + if NTP servers are found in the latest lease, NTPSERVERS will get updated + otherwise it won't be touched (keeping the above specified servers) + NTPDATE_USE_NTP_CONF can be left "yes" if you don't have any ntp(d).conf* files that could be read by ntpdate-debian (namely: /var/lib/ntp/ntp.conf.dhcp /etc/ntp.conf /etc/openntpd/ntpd.conf) Well, now I hope someone finds this useful! Cheers ~ste-fan [1] OK, you could configure the in-house NTP server statically on each client. But ntpdate was made for PCs that do not run 24/7 and even Laptops that move around, right? So we need a dynamic approach with fallback NTP servers that are used if the current DHCP server does not supply NTP server information. [2] # The settings in this file are used by the program ntpdate-debian, but not # by the upstream program ntpdate. # Set to "yes" to take the server list from /etc/ntp.conf, from package ntp, # so you only have to keep it in one place. NTPDATE_USE_NTP_CONF=yes # List of NTP servers to use (Separate multiple servers with spaces.) # Not used if NTPDATE_USE_NTP_CONF is yes. NTPSERVERS="ntp.ubuntu.com" # Additional options to pass to ntpdate NTPOPTIONS="" # extract NTP servers from latest DHCP lease (if option was given by server) get_debug_opts() { local opt debug_opt=false debug_syslog=false for opt in "$@" $( xargs -0 < /proc/$$/cmdline ); do case "$opt" in -d) debug_opt=true ;; -s) debug_syslog=true ;; esac done return 0 } dhcp_ntp_debug_msg() { if $debug_opt; then echo "$(LC_ALL=C date +'%_d %b %H:%M:%S')" "ntpdate[$$]:" \ '(DCHP)' "$@" if $debug_syslog; then logger --tag "ntpdate[$$]" '(DCHP)' "$@" fi fi return 0 } get_dhcp_ntp_servers() { local debug_opt debug_syslog leasefiledir recentleasefile ntpservers leasefiledir=/var/lib/NetworkManager # check whether we are in debug mode and logging to syslog get_debug_opts $NTPOPTIONS # get most recent lease file that is not older than 1 minute recentleasefile=$( find $leasefiledir ! -type d -iname '*.lease' \ ! -mmin +1 -printf '%T@ %p\n' 2>/dev/null \ | sort -k 1nr | sed 's/^\S\+ //; 1q' ) if [ -n "$recentleasefile" ]; then dhcp_ntp_debug_msg 'Found a recent lease file:' \ $( basename $recentleasefile ) # extract NTP servers, if any (check only latest lease in file) ntpservers=$( sed '1,/lease\s\+{/d /option ntp-servers/!d s/^.*ntp-servers\s\+\(.\+\);$/\1/; s/,/ /g' \ $recentleasefile ) if [ -n "$ntpservers" ]; then dhcp_ntp_debug_msg 'Found NTP server(s) in latest lease:' \ $ntpservers NTPSERVERS="$ntpservers" else dhcp_ntp_debug_msg 'Latest lease does not contain any NTP servers.' fi else dhcp_ntp_debug_msg 'There is no recent lease file.' fi return 0 } get_dhcp_ntp_servers unset get_debug_opts dhcp_ntp_debug_msg get_dhcp_ntp_servers ​