[Buildroot] [PATCH v5] package/ntp: sntp time sync script
Matthew Weber
matthew.weber at rockwellcollins.com
Wed Jan 16 12:43:12 UTC 2019
Arnout / Oscar,
On Tue, Dec 11, 2018 at 9:45 PM Matt Weber
<matthew.weber at rockwellcollins.com> wrote:
>
> This patch adds the installation of a startup script if the sntp
> utility is selected as an option. The utility is design to do a
> one time step/slew adjustment of the system time (similar to the
> ntpdate tool http://support.ntp.org/bin/view/Dev/DeprecatingNtpdate).
> One nice benefit over ntpdate is that sntp can run while ntpd is still
> running. However, ntpd may still need to be restarted if the time
> step was large enough.
>
> The script provides the ability to override the arguments as part of a
> /etc/defaults/sntp file.
>
> On a local LAN, the initial large step adjustment took less then
> one second to be retrieved and system time updated. If a user already
> has a RTC maintaining the time and the system was powered off for
> a long period of time, the script assumes a slew adjustment when
> +/- 128ms, rather then a time step(jump). This could be further
> tuned by a user with the /etc/defaults/sntp configuration file.
>
> One NTP pool server is being set as sntp uses all of the servers
> provided when the DNS is resolved as servers to attempt to retrieve
> time from before timing out. It looks like currently that is 4 servers
> per *pool.ntp.org hostname.
>
> Cc: Oscar Gomez Fuente <oscargomezf at gmail.com>
> Signed-off-by: Matthew Weber <matthew.weber at rockwellcollins.com>
Arnout, merge? Oscar tested the v4 before I did the changes for
Carlos's style of script so I didn't carry over his reviewed-by as
enough was touched....
> ---
> Changes
> v4 -> v5
> - Fixed permissions on S48sntp and S49ntp scripts
>
> [Arnout
> - Updated script to follow Carlos's recently merged syslog script
> refresh
> - Added kconfig help comment about the script
> - Added notes in S49sntp about behavior of the tool
> - shellcheck fixes
> - Moved touch of key database file into start function
>
> v3 -> v4
> - Updated S48sntp script to just use a single pool host which provides
> 4 NTP servers sntp will query before timing out
>
> v2 -> v3
> - Moved initial time set to a S48sntp script as originally suggested
> by Oscar and preferred by Arnout
> - Switched to sntp tool as it simplified the logic around when and
> how do we call the tool to perform this time sync (it handles
> when to slew/step and multiple servers at once)
>
> v1 -> v2
> [Arnout
> - Moved NTP_WAIT_DELAY above sourcing of configuration file
> - Switched to using unix time for current time check
> - Added comment on why redirection of stdout and stderr
> - Attempted to use the pid file but found it added more calls
> to the shell then using a variable, so switched back
> - Adjusted printout so the actual ntpd service start was aligned
> with the respecting Ok/Fail.
> - Dropped -g from the main service call as the "big" time jump
> should have already occurred with the one-shot ntpd -gq.
>
> v1
> Based on Oscar's v1 patch to add a ntpdate startup script.
> http://patchwork.ozlabs.org/patch/986852/
> ---
> package/ntp/Config.in | 7 ++++++-
> package/ntp/S48sntp | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++
> package/ntp/S49ntp | 0
> package/ntp/ntp.mk | 9 +++++++++
> 4 files changed, 70 insertions(+), 1 deletion(-)
> create mode 100644 package/ntp/S48sntp
> mode change 100755 => 100644 package/ntp/S49ntp
>
> diff --git a/package/ntp/Config.in b/package/ntp/Config.in
> index efd47e1..97d933b 100644
> --- a/package/ntp/Config.in
> +++ b/package/ntp/Config.in
> @@ -12,7 +12,12 @@ if BR2_PACKAGE_NTP
> config BR2_PACKAGE_NTP_SNTP
> bool "sntp"
> help
> - Simple network time protocol program
> + Simple network time protocol program (a replacement
> + for the ntpdate tool)
> +
> + A script is installed as S48sntp which will retrieve and
> + step the time if there is a large difference before ntpd
> + takes over the necessary slew adjustments in S49ntp.
>
> config BR2_PACKAGE_NTP_NTP_KEYGEN
> bool "ntp-keygen"
> diff --git a/package/ntp/S48sntp b/package/ntp/S48sntp
> new file mode 100644
> index 0000000..96d8d50
> --- /dev/null
> +++ b/package/ntp/S48sntp
> @@ -0,0 +1,55 @@
> +#!/bin/sh
> +
> +DAEMON="sntp"
> +# sntp uses all the IPs resolved for the hostname (i.e. pool.ntp.org has 4).
> +# It will try each until they either all timeout or time has been set. Thus
> +# default to only providing one NTP pool host.
> +SNTP_SERVERS="pool.ntp.org"
> +# Step if time delta is greater then 128ms, otherwise slew
> +SNTP_ARGS="-Ss -M 128"
> +SNTP_KEY_CACHE="/tmp/kod"
> +
> +# shellcheck source=/dev/null
> +[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
> +
> +start() {
> + printf 'Starting %s: ' "$DAEMON"
> + # Create key cache file to prevents warning that file is missing
> + touch $SNTP_KEY_CACHE
> + # shellcheck disable=SC2086 # we need the word splitting
> + /usr/bin/$DAEMON $SNTP_ARGS -K $SNTP_KEY_CACHE $SNTP_SERVERS
> + # sntp behavior
> + # - Does not background
> + # - Does not infinitely block
> + # - Time-out w/o network = ~2 sec
> + # - Time-out w/ network = ~5sec * # of servers
> + status=$?
> + if [ "$status" -eq 0 ]; then
> + echo "OK"
> + else
> + echo "FAIL"
> + fi
> + return "$status"
> +}
> +
> +stop() {
> + echo "Nothing to do, $DAEMON is not a daemon."
> +}
> +
> +restart() {
> + stop
> + sleep 1
> + start
> +}
> +
> +reload() {
> + echo "Nothing to do, $DAEMON does not support reload."
> +}
> +
> +case "$1" in
> + start|stop|restart|reload)
> + "$1";;
> + *)
> + echo "Usage: $0 {start|stop|restart|reload}"
> + exit 1
> +esac
> diff --git a/package/ntp/S49ntp b/package/ntp/S49ntp
> old mode 100755
> new mode 100644
> diff --git a/package/ntp/ntp.mk b/package/ntp/ntp.mk
> index af3c1aa..aad1cdd 100644
> --- a/package/ntp/ntp.mk
> +++ b/package/ntp/ntp.mk
> @@ -93,9 +93,18 @@ define NTP_INSTALL_TARGET_CMDS
> $(INSTALL) -m 644 package/ntp/ntpd.etc.conf $(TARGET_DIR)/etc/ntp.conf
> endef
>
> +# This script will step the time if there is a large difference
> +# before ntpd takes over the necessary slew adjustments
> +ifeq ($(BR2_PACKAGE_NTP_SNTP),y)
> +define NTP_INSTALL_INIT_SYSV_SNTP
> + $(INSTALL) -D -m 755 package/ntp/S48sntp $(TARGET_DIR)/etc/init.d/S48sntp
> +endef
> +endif
> +
> ifeq ($(BR2_PACKAGE_NTP_NTPD),y)
> define NTP_INSTALL_INIT_SYSV
> $(INSTALL) -D -m 755 package/ntp/S49ntp $(TARGET_DIR)/etc/init.d/S49ntp
> + $(NTP_INSTALL_INIT_SYSV_SNTP)
> endef
>
> define NTP_INSTALL_INIT_SYSTEMD
> --
> 1.9.1
>
More information about the buildroot
mailing list