diff mbox series

[1/1] package/ntpsec: new package

Message ID 20211212200741.18143-1-guillaume.bressaix@gmail.com
State Changes Requested
Headers show
Series [1/1] package/ntpsec: new package | expand

Commit Message

Guillaume Bres Dec. 12, 2021, 8:07 p.m. UTC
From: Peter Seiderer <ps.report@gmx.net>

- set 'CC=gcc' to avoid cross-compile failure (see [1]):

  /bin/sh: line 1: .../build/ntpsec-1_2_0/build/host/ntpd/keyword-gen: cannot execute binary file: Exec format error

  Waf: Leaving directory `.../build/ntpsec-1_2_0/build/host'
  Build failed
   -> task in 'ntp_keyword.h' failed with exit status 126 (run with -v to display more information)

- set '-std=gnu99"' to avoid compile failure with old compilers

- explicit set PYTHON_CONFIG

- add patch 001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch to
  fix ntptime jfmt5/ofmt5 jfmt6/ofmt6 related compile failure

- add SYSV init file (S49ntp)

- add example ntpd.conf (with legacy option enabled and provide skeleton
  for NTS configuration)

- add config option for NTS support

- depend on python3 (omit python2 to reduce test effort)

- add ntp user/group and run ntpd as restricted user

- add libcap dependency (compile time optional but needed for droproot
  support)

- submit latest ntpsec version 1.2.1

- lib ntpc import in python is fixed by specifying the --libdir flag.
  -> removed the symlink trick

- add --refclock=all flags to configure, see notes down below

- add leap second management options & ntpviz

- improved Config.in:
  libbsd is required
  openssl is only needed when NTS encryption is enabled
  (depend on python3 only to simply things)
  improved classic mode help description
  improved early-drop-root feature description

- early droproot should be an option: adapt libcap accordingly

- corrected CC=gcc to CC=$(HOSTCC) in ntpsec.mk

- provide service script for systemd infra along sysv infra

- I don't think we need the patch if we restrict to !BR2_TOOLCHAIN_UCLIBC
  IMO it's better to keep the patch and allow all toolchains.
  I usually have glibc, but I just ran a sanity check on my zedboard with uclibc,
  it passed.

- used on zynq_zed_defconfig and beaglebone_defconfig
  daemon automatically started
  ntpq works fine

[1] https://gitlab.com/NTPsec/ntpsec/-/issues/694

Signed-off-by: Peter Seiderer <ps.report@gmx.net>
Signed-off-by: Guillaume W. Bres <guillaume.bressaix@gmail.com>

---
notes on refclocks: https://docs.ntpsec.org/latest/refclock.html
  "For security reasons, we will no longer support any refclock
  that requires a closed-source driver to run", see webpage.

  --refclock=all is hardcoded at the moment

  One must compile ntpsec with the 'refclock' option
  if they want to drive or interact with hardware.

  In any case, refclocks are not critical for both buildtime & runtime:

     [+] ./configure is smart enough to disable a refclock
     if requirements are not met. In the submitted context,
     this happens for refclock=gpsd without BR2_PACKAGE_GPSD
     selected by user

     [+] some refclocks naturally require a specific hw support
     with related kernel driver.
     This is not buildtime critical because build does not care
     about hw support.
     This is not runtime critical either because any missing
     hw support or unfeasible hardware access ends up as a logged
     error message. It is up to the user to correct it in the
     submitted context: example: 'nmea/gps' receivers without kernel support
     or hardware not plugged in.

ntpd / ntpsec should be mutualy exclusive if we harcode S49ntp as the service script

---
 DEVELOPERS                                         |  1 +
 package/Config.in                                  |  1 +
 ...-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch | 61 ++++++++++++++++
 package/ntpsec/Config.in                           | 68 +++++++++++++++++
 package/ntpsec/S49ntp                              | 58 +++++++++++++++
 package/ntpsec/ntpd.etc.conf                       | 33 +++++++++
 package/ntpsec/ntpd.service                        | 15 ++++
 package/ntpsec/ntpsec.hash                         |  4 +
 package/ntpsec/ntpsec.mk                           | 85 ++++++++++++++++++++++
 9 files changed, 326 insertions(+)
 create mode 100644 package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
 create mode 100644 package/ntpsec/Config.in
 create mode 100644 package/ntpsec/S49ntp
 create mode 100644 package/ntpsec/ntpd.etc.conf
 create mode 100644 package/ntpsec/ntpd.service
 create mode 100644 package/ntpsec/ntpsec.hash
 create mode 100644 package/ntpsec/ntpsec.mk

Comments

Peter Seiderer Dec. 15, 2021, 8:43 p.m. UTC | #1
Hello Guillaume,

thanks of interest, testing and improvement of the ntpsec patch, some comments below...

On Sun, 12 Dec 2021 21:07:41 +0100, guillaume.bressaix@gmail.com wrote:

> From: Peter Seiderer <ps.report@gmx.net>
> 
> - set 'CC=gcc' to avoid cross-compile failure (see [1]):
> 
>   /bin/sh: line 1: .../build/ntpsec-1_2_0/build/host/ntpd/keyword-gen: cannot execute binary file: Exec format error
> 
>   Waf: Leaving directory `.../build/ntpsec-1_2_0/build/host'
>   Build failed
>    -> task in 'ntp_keyword.h' failed with exit status 126 (run with -v to display more information)  
> 
> - set '-std=gnu99"' to avoid compile failure with old compilers
> 
> - explicit set PYTHON_CONFIG
> 
> - add patch 001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch to
>   fix ntptime jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
> 
> - add SYSV init file (S49ntp)
> 
> - add example ntpd.conf (with legacy option enabled and provide skeleton
>   for NTS configuration)
> 
> - add config option for NTS support
> 
> - depend on python3 (omit python2 to reduce test effort)
> 
> - add ntp user/group and run ntpd as restricted user
> 
> - add libcap dependency (compile time optional but needed for droproot
>   support)
> 
> - submit latest ntpsec version 1.2.1

Interesting, not listed as release, but tagged and downloadable...

> 
> - lib ntpc import in python is fixed by specifying the --libdir flag.
>   -> removed the symlink trick  

Fine..., will test it...

> 
> - add --refclock=all flags to configure, see notes down below
> 
> - add leap second management options & ntpviz
> 
> - improved Config.in:
>   libbsd is required

Are you sure? With the original patch ntpsec builds fine without libbsd available...

>   openssl is only needed when NTS encryption is enabled

A build without NTS and without openssl gives:

	Checking for OpenSSL/libcrypto (via pkg-config)                 : not found 
	Checking for OpenSSL's crypto library                           : not found 
	The configuration failed

>   (depend on python3 only to simply things)
>   improved classic mode help description
>   improved early-drop-root feature description
> 
> - early droproot should be an option: adapt libcap accordingly

This will break (the hard coded) '-u npt:npt' option from package/ntpsec/S49ntp,
any reason to avoid the security feature?

> 
> - corrected CC=gcc to CC=$(HOSTCC) in ntpsec.mk

Good point...

> 
> - provide service script for systemd infra along sysv infra

Better done as an extra patch (easier to review)....

> 
> - I don't think we need the patch if we restrict to !BR2_TOOLCHAIN_UCLIBC
>   IMO it's better to keep the patch and allow all toolchains.
>   I usually have glibc, but I just ran a sanity check on my zedboard with uclibc,
>   it passed.

Not important for the commit log...

> 
> - used on zynq_zed_defconfig and beaglebone_defconfig
>   daemon automatically started
>   ntpq works fine
> 
> [1] https://gitlab.com/NTPsec/ntpsec/-/issues/694
> 
> Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> Signed-off-by: Guillaume W. Bres <guillaume.bressaix@gmail.com>
> 
> ---
> notes on refclocks: https://docs.ntpsec.org/latest/refclock.html
>   "For security reasons, we will no longer support any refclock
>   that requires a closed-source driver to run", see webpage.
> 
>   --refclock=all is hardcoded at the moment
> 
>   One must compile ntpsec with the 'refclock' option
>   if they want to drive or interact with hardware.
> 
>   In any case, refclocks are not critical for both buildtime & runtime:
> 
>      [+] ./configure is smart enough to disable a refclock
>      if requirements are not met. In the submitted context,
>      this happens for refclock=gpsd without BR2_PACKAGE_GPSD
>      selected by user
> 
>      [+] some refclocks naturally require a specific hw support
>      with related kernel driver.
>      This is not buildtime critical because build does not care
>      about hw support.
>      This is not runtime critical either because any missing
>      hw support or unfeasible hardware access ends up as a logged
>      error message. It is up to the user to correct it in the
>      submitted context: example: 'nmea/gps' receivers without kernel support
>      or hardware not plugged in.

Would prefer one option per refclock to reduce dependencies...

> 
> ntpd / ntpsec should be mutualy exclusive if we harcode S49ntp as the service script
> 
> ---
>  DEVELOPERS                                         |  1 +
>  package/Config.in                                  |  1 +
>  ...-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch | 61 ++++++++++++++++
>  package/ntpsec/Config.in                           | 68 +++++++++++++++++
>  package/ntpsec/S49ntp                              | 58 +++++++++++++++
>  package/ntpsec/ntpd.etc.conf                       | 33 +++++++++
>  package/ntpsec/ntpd.service                        | 15 ++++
>  package/ntpsec/ntpsec.hash                         |  4 +
>  package/ntpsec/ntpsec.mk                           | 85 ++++++++++++++++++++++
>  9 files changed, 326 insertions(+)
>  create mode 100644 package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
>  create mode 100644 package/ntpsec/Config.in
>  create mode 100644 package/ntpsec/S49ntp
>  create mode 100644 package/ntpsec/ntpd.etc.conf
>  create mode 100644 package/ntpsec/ntpd.service
>  create mode 100644 package/ntpsec/ntpsec.hash
>  create mode 100644 package/ntpsec/ntpsec.mk
> 
> diff --git a/DEVELOPERS b/DEVELOPERS
> index 3023526..32b5e87 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -2196,6 +2196,7 @@ F:	package/iwd/
>  F:	package/libevdev/
>  F:	package/libuev/
>  F:	package/log4cplus/
> +F:	package/ntpsec/
>  F:	package/postgresql/
>  F:	package/python-colorzero/
>  F:	package/python-flask-wtf/
> diff --git a/package/Config.in b/package/Config.in
> index 5720830..544a0fd 100644
> --- a/package/Config.in
> +++ b/package/Config.in
> @@ -2271,6 +2271,7 @@ endif
>  	source "package/nmap/Config.in"
>  	source "package/noip/Config.in"
>  	source "package/ntp/Config.in"
> +	source "package/ntpsec/Config.in"
>  	source "package/nuttcp/Config.in"
>  	source "package/odhcp6c/Config.in"
>  	source "package/odhcploc/Config.in"
> diff --git a/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> new file mode 100644
> index 0000000..c2838fe
> --- /dev/null
> +++ b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> @@ -0,0 +1,61 @@
> +From 4015a1183d2f79dad6dd675ca5e0d329825f3fa3 Mon Sep 17 00:00:00 2001
> +From: Peter Seiderer <ps.report@gmx.net>
> +Date: Mon, 4 Oct 2021 22:25:58 +0200
> +Subject: [PATCH] ntptime: fix jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
> +MIME-Version: 1.0
> +Content-Type: text/plain; charset=UTF-8
> +Content-Transfer-Encoding: 8bit
> +
> +Use same define guard for definiton as for usage ('HAVE_STRUCT_NTPTIMEVAL_TAI'
> +instead of 'NTP_API && NTP_API > 3').
> +
> +Fixes:
> +
> +  ../../ntptime/ntptime.c: In function ‘main’:
> +  ../../ntptime/ntptime.c:349:17: error: ‘jfmt5’ undeclared (first use in this function); did you mean ‘jfmt6’?
> +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> +        |                 ^~~~~
> +        |                 jfmt6
> +  ../../ntptime/ntptime.c:349:17: note: each undeclared identifier is reported only once for each function it appears in
> +  ../../ntptime/ntptime.c:349:25: error: ‘ofmt5’ undeclared (first use in this function); did you mean ‘ofmt6’?
> +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> +        |                         ^~~~~
> +        |                         ofmt6
> +  ../../ntptime/ntptime.c:321:15: warning: unused variable ‘jfmt6’ [-Wunused-variable]
> +    321 |   const char *jfmt6 = "";
> +        |               ^~~~~
> +  ../../ntptime/ntptime.c:311:15: warning: unused variable ‘ofmt6’ [-Wunused-variable]
> +    311 |   const char *ofmt6 = "\n";
> +        |               ^~~~~
> +
> +[Upstream: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1245]
> +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> +---
> + ntptime/ntptime.c | 4 ++--
> + 1 file changed, 2 insertions(+), 2 deletions(-)
> +
> +diff --git a/ntptime/ntptime.c b/ntptime/ntptime.c
> +index ff861cb..5d58593 100644
> +--- a/ntptime/ntptime.c
> ++++ b/ntptime/ntptime.c
> +@@ -305,7 +305,7 @@ main(
> + 		const char *ofmt2 = "  time %s, (.%0*d),\n";
> + 		const char *ofmt3 = "  maximum error %lu us, estimated error %lu us";
> + 		const char *ofmt4 = "  ntptime=%x.%x unixtime=%x.%0*d %s";
> +-#if defined NTP_API && NTP_API > 3
> ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> + 		const char *ofmt5 = ", TAI offset %ld\n";
> + #else
> + 		const char *ofmt6 = "\n";
> +@@ -315,7 +315,7 @@ main(
> + 		const char *jfmt2 = "\"time\":\"%s\",\"fractional-time\":\".%0*d\",";
> + 		const char *jfmt3 = "\"maximum-error\":%lu,\"estimated-error\":%lu,";
> + 		const char *jfmt4 = "\"raw-ntp-time\":\"%x.%x\",\"raw-unix-time\":\"%x.%0*d %s\",";
> +-#if defined NTP_API && NTP_API > 3
> ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> + 		const char *jfmt5 = "\"TAI-offset\":%d,";
> + #else
> + 		const char *jfmt6 = "";
> +-- 
> +2.33.0
> +
> diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
> new file mode 100644
> index 0000000..9044aa4
> --- /dev/null
> +++ b/package/ntpsec/Config.in
> @@ -0,0 +1,68 @@
> +comment "ntpsec needs a toolchain w/ wchar, thread, dynamic library"
> +	depends on BR2_STATIC_LIBS
> +	depends on !BR2_USE_WCHAR
> +	depends on !BR2_TOOLCHAIN_HAS_THREADS # libbsd
> +
> +comment "ntpsec needs libbsd"
> +	depends on !BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> +	depends on !BR2_STATIC_LIBS # libbsd
> +
> +comment "ntpsec needs python3"
> +	depends on !BR2_PACKAGE_PYTHON3
> +
> +config BR2_PACKAGE_NTPSEC
> +	bool "ntpsec"
> +	depends on !BR2_STATIC_LIBS # libbsd
> +	depends on BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> +	depends on BR2_TOOLCHAIN_HAS_THREADS # libbsd
> +	depends on BR2_PACKAGE_PYTHON3
> +	select BR2_PACKAGE_LIBCAP
> +	select BR2_PACKAGE_LIBBSD
> +	select BR2_PACKAGE_PPS_TOOLS # refclock(pps)
> +	help
> +	  NTPsec is a secure, hardened, and improved
> +	  implementation of Network Time Protocol derived
> +	  from NTP Classic, Dave Mills’s original.
> +
> +	  Provides things like ntpd, ntpdate, ntpq, etc...
> +
> +	  https://www.ntpsec.org/
> +
> +if BR2_PACKAGE_NTPSEC
> +
> +config BR2_PACKAGE_NTPSEC_CLASSIC_MODE
> +	bool "ntpsec-classic"
> +	help
> +	  Enable strict configuration and log-format compatibility
> +	  with NTP Classic.
> +	  This option is not recommended as it makes the module
> +	  less efficient.
> +
> +config BR2_PACKAGE_NTPSEC_NTS
> +	bool "ntpsec-nts"
> +	select BR2_PACKAGE_OPENSSL
> +	help
> +	  Enable Network Time Security (NTS) support.
> +
> +comment "ntpsec-ntploggpsd needs gpsd"
> +	depends on !BR2_PACKAGE_GPSD
> +
> +config BR2_PACKAGE_NTPSEC_LEAP_SMEAR
> +	bool "ntpsec-leap-smear"
> +	help
> +	  Activates leap second smearing,
> +	  https://docs.ntpsec.org/latest/leapsmear.html
> +
> +config BR2_PACKAGE_NTPSEC_LEAP_TESTING
> +	bool "ntpsec-leap-testing"
> +	help
> +	  Enables leap seconds on other than 1st day of month
> +
> +config BR2_PACKAGE_NTPSEC_EARLY_DROPROOT
> +	bool "ntpsec-early-droproot"
> +	help
> +	  Drops root privileges as early as possible.
> +	  This requires the refclock devices to be owned
> +	  by owner/group running 'ntpd'
> +
> +endif
> diff --git a/package/ntpsec/S49ntp b/package/ntpsec/S49ntp
> new file mode 100644
> index 0000000..f3db514
> --- /dev/null
> +++ b/package/ntpsec/S49ntp
> @@ -0,0 +1,58 @@
> +#!/bin/sh
> +#
> +# Starts Network Time Protocol daemon
> +#
> +
> +DAEMON="ntpd"
> +PIDFILE="/var/run/$DAEMON.pid"
> +
> +NTPD_ARGS="-g -u ntp:ntp -s /var/run/ntp"
> +
> +# shellcheck source=/dev/null
> +[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
> +
> +mkdir -p /var/run/ntp && chown ntp:ntp /var/run/ntp
> +
> +start() {
> +	printf 'Starting %s: ' "$DAEMON"
> +	# shellcheck disable=SC2086 # we need the word splitting
> +	start-stop-daemon -S -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" \
> +		-- $NTPD_ARGS -p "$PIDFILE"
> +	status=$?
> +	if [ "$status" -eq 0 ]; then
> +		echo "OK"
> +	else
> +		echo "FAIL"
> +	fi
> +	return "$status"
> +}
> +
> +stop() {
> +	printf 'Stopping %s: ' "$DAEMON"
> +	start-stop-daemon -K -q -p "$PIDFILE"
> +	status=$?
> +	if [ "$status" -eq 0 ]; then
> +		rm -f "$PIDFILE"
> +		echo "OK"
> +	else
> +		echo "FAIL"
> +	fi
> +	return "$status"
> +}
> +
> +restart() {
> +	stop
> +	sleep 1
> +	start
> +}
> +
> +case "$1" in
> +	start|stop|restart)
> +		"$1";;
> +	reload)
> +		# Restart, since there is no true "reload" feature.
> +		restart;;
> +	*)
> +		echo "Usage: $0 {start|stop|restart|reload}"
> +		exit 1
> +esac
> diff --git a/package/ntpsec/ntpd.etc.conf b/package/ntpsec/ntpd.etc.conf
> new file mode 100644
> index 0000000..e0f45c1
> --- /dev/null
> +++ b/package/ntpsec/ntpd.etc.conf
> @@ -0,0 +1,33 @@
> +#
> +# legacy NTP configuration
> +#
> +pool 0.pool.ntp.org iburst
> +pool 1.pool.ntp.org iburst
> +pool 2.pool.ntp.org iburst
> +pool 3.pool.ntp.org iburst
> +
> +#
> +# NTS configuration
> +#
> +# Notes:
> +#  - uncomment the following lines to enable NTS support (but
> +#    make sure the initial clock is up-to-date (otherwise the
> +#    NTS certificate validation will fail with 'NTSc: certificate invalid:
> +#    9=>certificate is not yet valid' as on boards without RTC support)
> +#    and/or keep at least one line from the legacy NTP lines
> +#  - enable BR2_PACKAGE_CA_CERTIFICATES to gain access to the certificate
> +#    files
> +#
> +# server time.cloudflare.com nts  # Global, anycast
> +# server nts.ntp.se:4443 nts      # Sweden
> +# server ntpmon.dcs1.biz nts      # Singapore
> +# server ntp1.glypnod.com nts     # San Francisco
> +# server ntp2.glypnod.com nts     # London
> +#
> +# ca /usr/share/ca-certificates/mozilla
> +
> +# Allow only time queries, at a limited rate, sending KoD when in excess.
> +# Allow all local queries (IPv4, IPv6)
> +restrict default nomodify nopeer noquery limited kod
> +restrict 127.0.0.1
> +restrict [::1]
> diff --git a/package/ntpsec/ntpd.service b/package/ntpsec/ntpd.service
> new file mode 100644
> index 0000000..b7db4a2
> --- /dev/null
> +++ b/package/ntpsec/ntpd.service
> @@ -0,0 +1,15 @@
> +[Unit]
> +Description=Network Time Service
> +After=network.target
> +
> +[Service]
> +Type=forking
> +PIDFile=/run/ntpd.pid
> +# Turn off DNSSEC validation for hostname look-ups, since those need the
> +# correct time to work, but we likely won't acquire that without NTP. Let's
> +# break this chicken-and-egg cycle here.
> +Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
> +ExecStart=/usr/sbin/ntpd @NTPD_EXTRA_ARGS@ -g -p /run/ntpd.pid

The @NTPD_EXTRA_ARGS@ handling needs the sed command instead of the
simple install one (see package/ntp/ntp.mk)...

> +
> +[Install]
> +WantedBy=multi-user.target
> diff --git a/package/ntpsec/ntpsec.hash b/package/ntpsec/ntpsec.hash
> new file mode 100644
> index 0000000..49dc4e4
> --- /dev/null
> +++ b/package/ntpsec/ntpsec.hash
> @@ -0,0 +1,4 @@
> +# Locally calculated
> +sha256  71c9f4bde6953bbc048bbaf278da81c451a56cc08d6772542b4ad37c67d72e89  ntpsec-NTPsec_1_2_1.tar.bz2
> +sha256  b4db4de3317c3b0554ed91eb692968800bdfd6ad2c16ffbeee8ce4895ed91da4  LICENSE.adoc
> +sha256  d3b21470adadd9abd9c6d675378f8c371ac5a4ea6dbec91859e02fadca3c0856  docs/copyright.adoc
> diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
> new file mode 100644
> index 0000000..55b4bb0
> --- /dev/null
> +++ b/package/ntpsec/ntpsec.mk
> @@ -0,0 +1,85 @@
> +################################################################################
> +#
> +# ntpsec
> +#
> +################################################################################
> +
> +NTPSEC_VERSION_MAJOR = 1
> +NTPSEC_VERSION_MINOR = 2
> +NTPSEC_VERSION_POINT = 1
> +NTPSEC_VERSION = $(NTPSEC_VERSION_MAJOR)_$(NTPSEC_VERSION_MINOR)_$(NTPSEC_VERSION_POINT)
> +NTPSEC_SOURCE = ntpsec-NTPsec_$(NTPSEC_VERSION).tar.bz2
> +NTPSEC_SITE = https://gitlab.com/NTPsec/ntpsec/-/archive/NTPsec_$(NTPSEC_VERSION)
> +NTPSEC_LICENSE = BSD-2-Clause NTP BSD-3-Clause MIT
> +NTPSEC_LICENSE_FILES = LICENSE.adoc docs/copyright.adoc
> +
> +NTPSEC_CPE_ID_VENDOR = ntpsec
> +NTPSEC_CPE_ID_VERSION = $(NTPSEC_VERSION_MAJOR).$(NTPSEC_VERSION_MINOR)
> +NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
> +
> +NTPSEC_DEPENDENCIES = \
> +	$(if $(BR2_PACKAGE_PYTHON),python,python3) \
> +	libbsd \
> +	pps-tools
> +
> +NTPSEC_PYVER = $(if $(BR2_PACKAGE_PYTHON),python$(PYTHON_VERSION_MAJOR),python$(PYTHON3_VERSION_MAJOR))
> +
> +NTPSEC_CONF_OPTS = \
> +	CC=$(HOSTCC) \
> +	PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/$(if $(BR2_PACKAGE_PYTHON),python,python3)-config" \
> +	--cross-compiler="$(TARGET_CC)" \
> +	--cross-cflags="$(TARGET_CFLAGS) -std=gnu99" \
> +	--cross-ldflags="$(TARGET_LDFLAGS)" \
> +	--notests \
> +	--disable-mdns-registration \
> +	--enable-pylib=ffi \
> +	--nopyc \
> +	--nopyo \
> +	--nopycache \
> +	--disable-doc \
> +	--disable-manpage \
> +	--refclock=all \
> +	--libdir=/usr/lib/$(NTPSEC_PYVER)/site-packages/ntp
> +
> +ifeq ($(BR2_PACKAGE_NTPSEC_CLASSIC_MODE),y)
> +NTPSEC_CONF_OPTS += --enable-classic-mode
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NTPSEC_NTS),y)
> +NTPSEC_DEPENDENCIES += openssl
> +else
> +NTPSEC_CONF_OPTS += --disable-nts
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NTPSEC_EARLY_DROPROOT),y)
> +NTPSEC_DEPENDENCIES += libcap
> +NTPSEC_CONF_OPTS += --enable-early-droproot
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_SMEAR),y)
> +NTPSEC_CONF_OPTS += --enable-leap-smear
> +endif
> +
> +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_TESTING),y)
> +NTPSEC_CONF_OPTS += --enable-leap-testing
> +endif
> +
> +define NTPSEC_INSTALL_NTPSEC_CONF
> +	$(INSTALL) -m 644 package/ntpsec/ntpd.etc.conf $(TARGET_DIR)/etc/ntp.conf
> +endef
> +NTPSEC_POST_INSTALL_TARGET_HOOKS += NTPSEC_INSTALL_NTPSEC_CONF
> +
> +define NTPSEC_INSTALL_INIT_SYSV
> +	$(INSTALL) -D -m 755 $(NTPSEC_PKGDIR)/S49ntp $(TARGET_DIR)/etc/init.d/S49ntp
> +endef
> +
> +define NTPSEC_INSTALL_INIT_SYSTEMD
> +	$(INSTALL) -D -m 644 $(NTPSEC_PKGDIR)/ntpd.service \
> +		$(TARGET_DIR)/usr/lib/systemd/system/ntpd.service
> +endef
> +
> +define NTPSEC_USERS
> +	ntp -1 ntp -1 * - - - ntpd user
> +endef
> +
> +$(eval $(waf-package))

Will prepare an update of my original patch with the version update and some of
your findings..., feel free to provide your improvements as add-on patches ;-)

Regards,
Peter
Guillaume Bres Dec. 15, 2021, 9:21 p.m. UTC | #2
Hello Peter,

> Will prepare an update of my original patch with the version update and
some of
> your findings..., feel free to provide your improvements as add-on
patches ;-)
sounds good, i'll wait for your v2 and will test it on my side

> Better done as an extra patch (easier to review)....
ok let's do that later

>  libbsd is required
>> Are you sure?
>> With the original patch ntpsec builds fine without libbsd available...
it's listed in the dependencies for this pkg in debian.
Ran a quick grep in their sources, it's clearly in their CI basic
requirements too, but I cant figure where they actually use it. They
clearly pass -lbsd to the linker though.

>Would prefer one option per refclock to reduce dependencies...
I tried to do so at first, but am failing at correctly concatenating the
refclocks in a comma separated string.
Expected format is "refclocks=gpsd,nmea,shm"
Order does not matter. It is very important to only have valid refclocks in
the submitted string otherwise configure fails. refclocks=",nmea,shm" and
refclocks="shm," would fail.

>Would prefer one option per refclock to reduce dependencies...
Actually there are no dependencies related to refclocks, it's up to the
user to provide a correct kernel config for specific hardware though. Only
"gpsd" will have unmet requirements at the moment and would get dropped out
by configure (smart detection). If you can provide a proper interface to
concatenate the string, that would be useful (I'm not a good at shell
scripting). If we do so, I would recommend we stick to the list of actively
maintained refclocks (URL in my reply to v1)


Guillaume W. Bres
Software engineer
<guillaume.bressaix@gmail.com>


Le mer. 15 déc. 2021 à 21:43, Peter Seiderer <ps.report@gmx.net> a écrit :

> Hello Guillaume,
>
> thanks of interest, testing and improvement of the ntpsec patch, some
> comments below...
>
> On Sun, 12 Dec 2021 21:07:41 +0100, guillaume.bressaix@gmail.com wrote:
>
> > From: Peter Seiderer <ps.report@gmx.net>
> >
> > - set 'CC=gcc' to avoid cross-compile failure (see [1]):
> >
> >   /bin/sh: line 1: .../build/ntpsec-1_2_0/build/host/ntpd/keyword-gen:
> cannot execute binary file: Exec format error
> >
> >   Waf: Leaving directory `.../build/ntpsec-1_2_0/build/host'
> >   Build failed
> >    -> task in 'ntp_keyword.h' failed with exit status 126 (run with -v
> to display more information)
> >
> > - set '-std=gnu99"' to avoid compile failure with old compilers
> >
> > - explicit set PYTHON_CONFIG
> >
> > - add patch
> 001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch to
> >   fix ntptime jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
> >
> > - add SYSV init file (S49ntp)
> >
> > - add example ntpd.conf (with legacy option enabled and provide skeleton
> >   for NTS configuration)
> >
> > - add config option for NTS support
> >
> > - depend on python3 (omit python2 to reduce test effort)
> >
> > - add ntp user/group and run ntpd as restricted user
> >
> > - add libcap dependency (compile time optional but needed for droproot
> >   support)
> >
> > - submit latest ntpsec version 1.2.1
>
> Interesting, not listed as release, but tagged and downloadable...
>
> >
> > - lib ntpc import in python is fixed by specifying the --libdir flag.
> >   -> removed the symlink trick
>
> Fine..., will test it...
>
> >
> > - add --refclock=all flags to configure, see notes down below
> >
> > - add leap second management options & ntpviz
> >
> > - improved Config.in:
> >   libbsd is required
>
> Are you sure? With the original patch ntpsec builds fine without libbsd
> available...
>
> >   openssl is only needed when NTS encryption is enabled
>
> A build without NTS and without openssl gives:
>
>         Checking for OpenSSL/libcrypto (via pkg-config)                 :
> not found
>         Checking for OpenSSL's crypto library                           :
> not found
>         The configuration failed
>
> >   (depend on python3 only to simply things)
> >   improved classic mode help description
> >   improved early-drop-root feature description
> >
> > - early droproot should be an option: adapt libcap accordingly
>
> This will break (the hard coded) '-u npt:npt' option from
> package/ntpsec/S49ntp,
> any reason to avoid the security feature?
>
> >
> > - corrected CC=gcc to CC=$(HOSTCC) in ntpsec.mk
>
> Good point...
>
> >
> > - provide service script for systemd infra along sysv infra
>
> Better done as an extra patch (easier to review)....
>
> >
> > - I don't think we need the patch if we restrict to !BR2_TOOLCHAIN_UCLIBC
> >   IMO it's better to keep the patch and allow all toolchains.
> >   I usually have glibc, but I just ran a sanity check on my zedboard
> with uclibc,
> >   it passed.
>
> Not important for the commit log...
>
> >
> > - used on zynq_zed_defconfig and beaglebone_defconfig
> >   daemon automatically started
> >   ntpq works fine
> >
> > [1] https://gitlab.com/NTPsec/ntpsec/-/issues/694
> >
> > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > Signed-off-by: Guillaume W. Bres <guillaume.bressaix@gmail.com>
> >
> > ---
> > notes on refclocks: https://docs.ntpsec.org/latest/refclock.html
> >   "For security reasons, we will no longer support any refclock
> >   that requires a closed-source driver to run", see webpage.
> >
> >   --refclock=all is hardcoded at the moment
> >
> >   One must compile ntpsec with the 'refclock' option
> >   if they want to drive or interact with hardware.
> >
> >   In any case, refclocks are not critical for both buildtime & runtime:
> >
> >      [+] ./configure is smart enough to disable a refclock
> >      if requirements are not met. In the submitted context,
> >      this happens for refclock=gpsd without BR2_PACKAGE_GPSD
> >      selected by user
> >
> >      [+] some refclocks naturally require a specific hw support
> >      with related kernel driver.
> >      This is not buildtime critical because build does not care
> >      about hw support.
> >      This is not runtime critical either because any missing
> >      hw support or unfeasible hardware access ends up as a logged
> >      error message. It is up to the user to correct it in the
> >      submitted context: example: 'nmea/gps' receivers without kernel
> support
> >      or hardware not plugged in.
>
> Would prefer one option per refclock to reduce dependencies...
>
> >
> > ntpd / ntpsec should be mutualy exclusive if we harcode S49ntp as the
> service script
> >
> > ---
> >  DEVELOPERS                                         |  1 +
> >  package/Config.in                                  |  1 +
> >  ...-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch | 61 ++++++++++++++++
> >  package/ntpsec/Config.in                           | 68
> +++++++++++++++++
> >  package/ntpsec/S49ntp                              | 58 +++++++++++++++
> >  package/ntpsec/ntpd.etc.conf                       | 33 +++++++++
> >  package/ntpsec/ntpd.service                        | 15 ++++
> >  package/ntpsec/ntpsec.hash                         |  4 +
> >  package/ntpsec/ntpsec.mk                           | 85
> ++++++++++++++++++++++
> >  9 files changed, 326 insertions(+)
> >  create mode 100644
> package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> >  create mode 100644 package/ntpsec/Config.in
> >  create mode 100644 package/ntpsec/S49ntp
> >  create mode 100644 package/ntpsec/ntpd.etc.conf
> >  create mode 100644 package/ntpsec/ntpd.service
> >  create mode 100644 package/ntpsec/ntpsec.hash
> >  create mode 100644 package/ntpsec/ntpsec.mk
> >
> > diff --git a/DEVELOPERS b/DEVELOPERS
> > index 3023526..32b5e87 100644
> > --- a/DEVELOPERS
> > +++ b/DEVELOPERS
> > @@ -2196,6 +2196,7 @@ F:      package/iwd/
> >  F:   package/libevdev/
> >  F:   package/libuev/
> >  F:   package/log4cplus/
> > +F:   package/ntpsec/
> >  F:   package/postgresql/
> >  F:   package/python-colorzero/
> >  F:   package/python-flask-wtf/
> > diff --git a/package/Config.in b/package/Config.in
> > index 5720830..544a0fd 100644
> > --- a/package/Config.in
> > +++ b/package/Config.in
> > @@ -2271,6 +2271,7 @@ endif
> >       source "package/nmap/Config.in"
> >       source "package/noip/Config.in"
> >       source "package/ntp/Config.in"
> > +     source "package/ntpsec/Config.in"
> >       source "package/nuttcp/Config.in"
> >       source "package/odhcp6c/Config.in"
> >       source "package/odhcploc/Config.in"
> > diff --git
> a/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> > new file mode 100644
> > index 0000000..c2838fe
> > --- /dev/null
> > +++
> b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> > @@ -0,0 +1,61 @@
> > +From 4015a1183d2f79dad6dd675ca5e0d329825f3fa3 Mon Sep 17 00:00:00 2001
> > +From: Peter Seiderer <ps.report@gmx.net>
> > +Date: Mon, 4 Oct 2021 22:25:58 +0200
> > +Subject: [PATCH] ntptime: fix jfmt5/ofmt5 jfmt6/ofmt6 related compile
> failure
> > +MIME-Version: 1.0
> > +Content-Type: text/plain; charset=UTF-8
> > +Content-Transfer-Encoding: 8bit
> > +
> > +Use same define guard for definiton as for usage
> ('HAVE_STRUCT_NTPTIMEVAL_TAI'
> > +instead of 'NTP_API && NTP_API > 3').
> > +
> > +Fixes:
> > +
> > +  ../../ntptime/ntptime.c: In function ‘main’:
> > +  ../../ntptime/ntptime.c:349:17: error: ‘jfmt5’ undeclared (first use
> in this function); did you mean ‘jfmt6’?
> > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > +        |                 ^~~~~
> > +        |                 jfmt6
> > +  ../../ntptime/ntptime.c:349:17: note: each undeclared identifier is
> reported only once for each function it appears in
> > +  ../../ntptime/ntptime.c:349:25: error: ‘ofmt5’ undeclared (first use
> in this function); did you mean ‘ofmt6’?
> > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > +        |                         ^~~~~
> > +        |                         ofmt6
> > +  ../../ntptime/ntptime.c:321:15: warning: unused variable ‘jfmt6’
> [-Wunused-variable]
> > +    321 |   const char *jfmt6 = "";
> > +        |               ^~~~~
> > +  ../../ntptime/ntptime.c:311:15: warning: unused variable ‘ofmt6’
> [-Wunused-variable]
> > +    311 |   const char *ofmt6 = "\n";
> > +        |               ^~~~~
> > +
> > +[Upstream: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1245]
> > +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > +---
> > + ntptime/ntptime.c | 4 ++--
> > + 1 file changed, 2 insertions(+), 2 deletions(-)
> > +
> > +diff --git a/ntptime/ntptime.c b/ntptime/ntptime.c
> > +index ff861cb..5d58593 100644
> > +--- a/ntptime/ntptime.c
> > ++++ b/ntptime/ntptime.c
> > +@@ -305,7 +305,7 @@ main(
> > +             const char *ofmt2 = "  time %s, (.%0*d),\n";
> > +             const char *ofmt3 = "  maximum error %lu us, estimated
> error %lu us";
> > +             const char *ofmt4 = "  ntptime=%x.%x unixtime=%x.%0*d %s";
> > +-#if defined NTP_API && NTP_API > 3
> > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > +             const char *ofmt5 = ", TAI offset %ld\n";
> > + #else
> > +             const char *ofmt6 = "\n";
> > +@@ -315,7 +315,7 @@ main(
> > +             const char *jfmt2 =
> "\"time\":\"%s\",\"fractional-time\":\".%0*d\",";
> > +             const char *jfmt3 =
> "\"maximum-error\":%lu,\"estimated-error\":%lu,";
> > +             const char *jfmt4 =
> "\"raw-ntp-time\":\"%x.%x\",\"raw-unix-time\":\"%x.%0*d %s\",";
> > +-#if defined NTP_API && NTP_API > 3
> > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > +             const char *jfmt5 = "\"TAI-offset\":%d,";
> > + #else
> > +             const char *jfmt6 = "";
> > +--
> > +2.33.0
> > +
> > diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
> > new file mode 100644
> > index 0000000..9044aa4
> > --- /dev/null
> > +++ b/package/ntpsec/Config.in
> > @@ -0,0 +1,68 @@
> > +comment "ntpsec needs a toolchain w/ wchar, thread, dynamic library"
> > +     depends on BR2_STATIC_LIBS
> > +     depends on !BR2_USE_WCHAR
> > +     depends on !BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > +
> > +comment "ntpsec needs libbsd"
> > +     depends on !BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > +     depends on !BR2_STATIC_LIBS # libbsd
> > +
> > +comment "ntpsec needs python3"
> > +     depends on !BR2_PACKAGE_PYTHON3
> > +
> > +config BR2_PACKAGE_NTPSEC
> > +     bool "ntpsec"
> > +     depends on !BR2_STATIC_LIBS # libbsd
> > +     depends on BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > +     depends on BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > +     depends on BR2_PACKAGE_PYTHON3
> > +     select BR2_PACKAGE_LIBCAP
> > +     select BR2_PACKAGE_LIBBSD
> > +     select BR2_PACKAGE_PPS_TOOLS # refclock(pps)
> > +     help
> > +       NTPsec is a secure, hardened, and improved
> > +       implementation of Network Time Protocol derived
> > +       from NTP Classic, Dave Mills’s original.
> > +
> > +       Provides things like ntpd, ntpdate, ntpq, etc...
> > +
> > +       https://www.ntpsec.org/
> > +
> > +if BR2_PACKAGE_NTPSEC
> > +
> > +config BR2_PACKAGE_NTPSEC_CLASSIC_MODE
> > +     bool "ntpsec-classic"
> > +     help
> > +       Enable strict configuration and log-format compatibility
> > +       with NTP Classic.
> > +       This option is not recommended as it makes the module
> > +       less efficient.
> > +
> > +config BR2_PACKAGE_NTPSEC_NTS
> > +     bool "ntpsec-nts"
> > +     select BR2_PACKAGE_OPENSSL
> > +     help
> > +       Enable Network Time Security (NTS) support.
> > +
> > +comment "ntpsec-ntploggpsd needs gpsd"
> > +     depends on !BR2_PACKAGE_GPSD
> > +
> > +config BR2_PACKAGE_NTPSEC_LEAP_SMEAR
> > +     bool "ntpsec-leap-smear"
> > +     help
> > +       Activates leap second smearing,
> > +       https://docs.ntpsec.org/latest/leapsmear.html
> > +
> > +config BR2_PACKAGE_NTPSEC_LEAP_TESTING
> > +     bool "ntpsec-leap-testing"
> > +     help
> > +       Enables leap seconds on other than 1st day of month
> > +
> > +config BR2_PACKAGE_NTPSEC_EARLY_DROPROOT
> > +     bool "ntpsec-early-droproot"
> > +     help
> > +       Drops root privileges as early as possible.
> > +       This requires the refclock devices to be owned
> > +       by owner/group running 'ntpd'
> > +
> > +endif
> > diff --git a/package/ntpsec/S49ntp b/package/ntpsec/S49ntp
> > new file mode 100644
> > index 0000000..f3db514
> > --- /dev/null
> > +++ b/package/ntpsec/S49ntp
> > @@ -0,0 +1,58 @@
> > +#!/bin/sh
> > +#
> > +# Starts Network Time Protocol daemon
> > +#
> > +
> > +DAEMON="ntpd"
> > +PIDFILE="/var/run/$DAEMON.pid"
> > +
> > +NTPD_ARGS="-g -u ntp:ntp -s /var/run/ntp"
> > +
> > +# shellcheck source=/dev/null
> > +[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
> > +
> > +mkdir -p /var/run/ntp && chown ntp:ntp /var/run/ntp
> > +
> > +start() {
> > +     printf 'Starting %s: ' "$DAEMON"
> > +     # shellcheck disable=SC2086 # we need the word splitting
> > +     start-stop-daemon -S -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" \
> > +             -- $NTPD_ARGS -p "$PIDFILE"
> > +     status=$?
> > +     if [ "$status" -eq 0 ]; then
> > +             echo "OK"
> > +     else
> > +             echo "FAIL"
> > +     fi
> > +     return "$status"
> > +}
> > +
> > +stop() {
> > +     printf 'Stopping %s: ' "$DAEMON"
> > +     start-stop-daemon -K -q -p "$PIDFILE"
> > +     status=$?
> > +     if [ "$status" -eq 0 ]; then
> > +             rm -f "$PIDFILE"
> > +             echo "OK"
> > +     else
> > +             echo "FAIL"
> > +     fi
> > +     return "$status"
> > +}
> > +
> > +restart() {
> > +     stop
> > +     sleep 1
> > +     start
> > +}
> > +
> > +case "$1" in
> > +     start|stop|restart)
> > +             "$1";;
> > +     reload)
> > +             # Restart, since there is no true "reload" feature.
> > +             restart;;
> > +     *)
> > +             echo "Usage: $0 {start|stop|restart|reload}"
> > +             exit 1
> > +esac
> > diff --git a/package/ntpsec/ntpd.etc.conf b/package/ntpsec/ntpd.etc.conf
> > new file mode 100644
> > index 0000000..e0f45c1
> > --- /dev/null
> > +++ b/package/ntpsec/ntpd.etc.conf
> > @@ -0,0 +1,33 @@
> > +#
> > +# legacy NTP configuration
> > +#
> > +pool 0.pool.ntp.org iburst
> > +pool 1.pool.ntp.org iburst
> > +pool 2.pool.ntp.org iburst
> > +pool 3.pool.ntp.org iburst
> > +
> > +#
> > +# NTS configuration
> > +#
> > +# Notes:
> > +#  - uncomment the following lines to enable NTS support (but
> > +#    make sure the initial clock is up-to-date (otherwise the
> > +#    NTS certificate validation will fail with 'NTSc: certificate
> invalid:
> > +#    9=>certificate is not yet valid' as on boards without RTC support)
> > +#    and/or keep at least one line from the legacy NTP lines
> > +#  - enable BR2_PACKAGE_CA_CERTIFICATES to gain access to the
> certificate
> > +#    files
> > +#
> > +# server time.cloudflare.com nts  # Global, anycast
> > +# server nts.ntp.se:4443 nts      # Sweden
> > +# server ntpmon.dcs1.biz nts      # Singapore
> > +# server ntp1.glypnod.com nts     # San Francisco
> > +# server ntp2.glypnod.com nts     # London
> > +#
> > +# ca /usr/share/ca-certificates/mozilla
> > +
> > +# Allow only time queries, at a limited rate, sending KoD when in
> excess.
> > +# Allow all local queries (IPv4, IPv6)
> > +restrict default nomodify nopeer noquery limited kod
> > +restrict 127.0.0.1
> > +restrict [::1]
> > diff --git a/package/ntpsec/ntpd.service b/package/ntpsec/ntpd.service
> > new file mode 100644
> > index 0000000..b7db4a2
> > --- /dev/null
> > +++ b/package/ntpsec/ntpd.service
> > @@ -0,0 +1,15 @@
> > +[Unit]
> > +Description=Network Time Service
> > +After=network.target
> > +
> > +[Service]
> > +Type=forking
> > +PIDFile=/run/ntpd.pid
> > +# Turn off DNSSEC validation for hostname look-ups, since those need the
> > +# correct time to work, but we likely won't acquire that without NTP.
> Let's
> > +# break this chicken-and-egg cycle here.
> > +Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
> > +ExecStart=/usr/sbin/ntpd @NTPD_EXTRA_ARGS@ -g -p /run/ntpd.pid
>
> The @NTPD_EXTRA_ARGS@ handling needs the sed command instead of the
> simple install one (see package/ntp/ntp.mk)...
>
> > +
> > +[Install]
> > +WantedBy=multi-user.target
> > diff --git a/package/ntpsec/ntpsec.hash b/package/ntpsec/ntpsec.hash
> > new file mode 100644
> > index 0000000..49dc4e4
> > --- /dev/null
> > +++ b/package/ntpsec/ntpsec.hash
> > @@ -0,0 +1,4 @@
> > +# Locally calculated
> > +sha256
> 71c9f4bde6953bbc048bbaf278da81c451a56cc08d6772542b4ad37c67d72e89
> ntpsec-NTPsec_1_2_1.tar.bz2
> > +sha256
> b4db4de3317c3b0554ed91eb692968800bdfd6ad2c16ffbeee8ce4895ed91da4
> LICENSE.adoc
> > +sha256
> d3b21470adadd9abd9c6d675378f8c371ac5a4ea6dbec91859e02fadca3c0856
> docs/copyright.adoc
> > diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
> > new file mode 100644
> > index 0000000..55b4bb0
> > --- /dev/null
> > +++ b/package/ntpsec/ntpsec.mk
> > @@ -0,0 +1,85 @@
> >
> +################################################################################
> > +#
> > +# ntpsec
> > +#
> >
> +################################################################################
> > +
> > +NTPSEC_VERSION_MAJOR = 1
> > +NTPSEC_VERSION_MINOR = 2
> > +NTPSEC_VERSION_POINT = 1
> > +NTPSEC_VERSION =
> $(NTPSEC_VERSION_MAJOR)_$(NTPSEC_VERSION_MINOR)_$(NTPSEC_VERSION_POINT)
> > +NTPSEC_SOURCE = ntpsec-NTPsec_$(NTPSEC_VERSION).tar.bz2
> > +NTPSEC_SITE =
> https://gitlab.com/NTPsec/ntpsec/-/archive/NTPsec_$(NTPSEC_VERSION)
> > +NTPSEC_LICENSE = BSD-2-Clause NTP BSD-3-Clause MIT
> > +NTPSEC_LICENSE_FILES = LICENSE.adoc docs/copyright.adoc
> > +
> > +NTPSEC_CPE_ID_VENDOR = ntpsec
> > +NTPSEC_CPE_ID_VERSION = $(NTPSEC_VERSION_MAJOR).$(NTPSEC_VERSION_MINOR)
> > +NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
> > +
> > +NTPSEC_DEPENDENCIES = \
> > +     $(if $(BR2_PACKAGE_PYTHON),python,python3) \
> > +     libbsd \
> > +     pps-tools
> > +
> > +NTPSEC_PYVER = $(if
> $(BR2_PACKAGE_PYTHON),python$(PYTHON_VERSION_MAJOR),python$(PYTHON3_VERSION_MAJOR))
> > +
> > +NTPSEC_CONF_OPTS = \
> > +     CC=$(HOSTCC) \
> > +     PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/$(if
> $(BR2_PACKAGE_PYTHON),python,python3)-config" \
> > +     --cross-compiler="$(TARGET_CC)" \
> > +     --cross-cflags="$(TARGET_CFLAGS) -std=gnu99" \
> > +     --cross-ldflags="$(TARGET_LDFLAGS)" \
> > +     --notests \
> > +     --disable-mdns-registration \
> > +     --enable-pylib=ffi \
> > +     --nopyc \
> > +     --nopyo \
> > +     --nopycache \
> > +     --disable-doc \
> > +     --disable-manpage \
> > +     --refclock=all \
> > +     --libdir=/usr/lib/$(NTPSEC_PYVER)/site-packages/ntp
> > +
> > +ifeq ($(BR2_PACKAGE_NTPSEC_CLASSIC_MODE),y)
> > +NTPSEC_CONF_OPTS += --enable-classic-mode
> > +endif
> > +
> > +ifeq ($(BR2_PACKAGE_NTPSEC_NTS),y)
> > +NTPSEC_DEPENDENCIES += openssl
> > +else
> > +NTPSEC_CONF_OPTS += --disable-nts
> > +endif
> > +
> > +ifeq ($(BR2_PACKAGE_NTPSEC_EARLY_DROPROOT),y)
> > +NTPSEC_DEPENDENCIES += libcap
> > +NTPSEC_CONF_OPTS += --enable-early-droproot
> > +endif
> > +
> > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_SMEAR),y)
> > +NTPSEC_CONF_OPTS += --enable-leap-smear
> > +endif
> > +
> > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_TESTING),y)
> > +NTPSEC_CONF_OPTS += --enable-leap-testing
> > +endif
> > +
> > +define NTPSEC_INSTALL_NTPSEC_CONF
> > +     $(INSTALL) -m 644 package/ntpsec/ntpd.etc.conf
> $(TARGET_DIR)/etc/ntp.conf
> > +endef
> > +NTPSEC_POST_INSTALL_TARGET_HOOKS += NTPSEC_INSTALL_NTPSEC_CONF
> > +
> > +define NTPSEC_INSTALL_INIT_SYSV
> > +     $(INSTALL) -D -m 755 $(NTPSEC_PKGDIR)/S49ntp
> $(TARGET_DIR)/etc/init.d/S49ntp
> > +endef
> > +
> > +define NTPSEC_INSTALL_INIT_SYSTEMD
> > +     $(INSTALL) -D -m 644 $(NTPSEC_PKGDIR)/ntpd.service \
> > +             $(TARGET_DIR)/usr/lib/systemd/system/ntpd.service
> > +endef
> > +
> > +define NTPSEC_USERS
> > +     ntp -1 ntp -1 * - - - ntpd user
> > +endef
> > +
> > +$(eval $(waf-package))
>
> Will prepare an update of my original patch with the version update and
> some of
> your findings..., feel free to provide your improvements as add-on patches
> ;-)
>
> Regards,
> Peter
>
>
Peter Seiderer Dec. 15, 2021, 10:15 p.m. UTC | #3
Hello Guillaume,

On Wed, 15 Dec 2021 22:21:31 +0100, Guillaume Bres <guillaume.bressaix@gmail.com> wrote:

> Hello Peter,
> 
> > Will prepare an update of my original patch with the version update and  
> some of
> > your findings..., feel free to provide your improvements as add-on  
> patches ;-)
> sounds good, i'll wait for your v2 and will test it on my side
> 
> > Better done as an extra patch (easier to review)....  
> ok let's do that later
> 
> >  libbsd is required  
> >> Are you sure?
> >> With the original patch ntpsec builds fine without libbsd available...  
> it's listed in the dependencies for this pkg in debian.
> Ran a quick grep in their sources, it's clearly in their CI basic
> requirements too, but I cant figure where they actually use it. They
> clearly pass -lbsd to the linker though.


Checking for library bsd                 : not found
[...]
  LDFLAGS                       :  -Wl,-z,now -Wl,--strip-all -Wl,-z,relro 
  LINKFLAGS_NTPD                :  -pie 


With libbsd enabled I get the following failure:

--- building host --- 
Waf: Entering directory `.../build/ntpsec-1_2_1/build/host'
[1/2] Processing ntpd/ntp_parser.y
[2/2] Compiling build/host/ntpd/ntp_parser.tab.c
In file included from ../../include/ntp.h:15,
                 from .../build/ntpsec-1_2_1/ntpd/ntp_parser.y:16:
../../include/ntp_stdlib.h:20:10: fatal error: bsd/string.h: No such file or directory
   20 | #include <bsd/string.h>
      |          ^~~~~~~~~~~~~~
compilation terminated.


Can be avoided by the following patch:

diff --git a/package/libbsd/libbsd.mk b/package/libbsd/libbsd.mk
index 256a75f15e..454cee3f37 100644
--- a/package/libbsd/libbsd.mk
+++ b/package/libbsd/libbsd.mk
@@ -14,3 +14,4 @@ LIBBSD_CPE_ID_VENDOR = freedesktop
 LIBBSD_INSTALL_STAGING = YES
 
 $(eval $(autotools-package))
+$(eval $(host-autotools-package))
diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
index 7275533d26..41013d1e99 100644
--- a/package/ntpsec/Config.in
+++ b/package/ntpsec/Config.in
@@ -1,6 +1,7 @@
 config BR2_PACKAGE_NTPSEC
 	bool "ntpsec"
 	depends on BR2_PACKAGE_PYTHON3
+	select BR2_PACKAGE_LIBBSD
 	select BR2_PACKAGE_LIBCAP
 	select BR2_PACKAGE_OPENSSL
 	help
diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
index 739ef0eab4..63eaf35268 100644
--- a/package/ntpsec/ntpsec.mk
+++ b/package/ntpsec/ntpsec.mk
@@ -20,11 +20,12 @@ NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
 NTPSEC_DEPENDENCIES = \
 	host-pkgconf \
 	python3 \
+	host-libbsd libbsd \
 	libcap \
 	openssl
 
 NTPSEC_CONF_OPTS = \
-	CC="$(HOSTCC)" \
+	CC="$(HOSTCC) -I$(HOST_DIR)/include" \
 	PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/python3-config" \
 	--libdir=/usr/lib/python$(PYTHON3_VERSION_MAJOR)/site-packages/ntp \
 	--cross-compiler="$(TARGET_CC)" \

> 
> >Would prefer one option per refclock to reduce dependencies...  
> I tried to do so at first, but am failing at correctly concatenating the
> refclocks in a comma separated string.
> Expected format is "refclocks=gpsd,nmea,shm"
> Order does not matter. It is very important to only have valid refclocks in
> the submitted string otherwise configure fails. refclocks=",nmea,shm" and
> refclocks="shm," would fail.
> 
> >Would prefer one option per refclock to reduce dependencies...  
> Actually there are no dependencies related to refclocks, it's up to the
> user to provide a correct kernel config for specific hardware though. Only
> "gpsd" will have unmet requirements at the moment and would get dropped out
> by configure (smart detection). If you can provide a proper interface to
> concatenate the string, that would be useful (I'm not a good at shell
> scripting). If we do so, I would recommend we stick to the list of actively
> maintained refclocks (URL in my reply to v1)

Maybe take a look at package/mesa3d/mesa3d.mk and the dri-drivers handling:

	137         -Ddri-drivers=$(subst $(space),$(comma),$(MESA3D_DRI_DRIVERS-y))

Regards,
Peter

> 
> 
> Guillaume W. Bres
> Software engineer
> <guillaume.bressaix@gmail.com>
> 
> 
> Le mer. 15 déc. 2021 à 21:43, Peter Seiderer <ps.report@gmx.net> a écrit :
> 
> > Hello Guillaume,
> >
> > thanks of interest, testing and improvement of the ntpsec patch, some
> > comments below...
> >
> > On Sun, 12 Dec 2021 21:07:41 +0100, guillaume.bressaix@gmail.com wrote:
> >  
> > > From: Peter Seiderer <ps.report@gmx.net>
> > >
> > > - set 'CC=gcc' to avoid cross-compile failure (see [1]):
> > >
> > >   /bin/sh: line 1: .../build/ntpsec-1_2_0/build/host/ntpd/keyword-gen:  
> > cannot execute binary file: Exec format error  
> > >
> > >   Waf: Leaving directory `.../build/ntpsec-1_2_0/build/host'
> > >   Build failed  
> > >    -> task in 'ntp_keyword.h' failed with exit status 126 (run with -v  
> > to display more information)  
> > >
> > > - set '-std=gnu99"' to avoid compile failure with old compilers
> > >
> > > - explicit set PYTHON_CONFIG
> > >
> > > - add patch  
> > 001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch to  
> > >   fix ntptime jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
> > >
> > > - add SYSV init file (S49ntp)
> > >
> > > - add example ntpd.conf (with legacy option enabled and provide skeleton
> > >   for NTS configuration)
> > >
> > > - add config option for NTS support
> > >
> > > - depend on python3 (omit python2 to reduce test effort)
> > >
> > > - add ntp user/group and run ntpd as restricted user
> > >
> > > - add libcap dependency (compile time optional but needed for droproot
> > >   support)
> > >
> > > - submit latest ntpsec version 1.2.1  
> >
> > Interesting, not listed as release, but tagged and downloadable...
> >  
> > >
> > > - lib ntpc import in python is fixed by specifying the --libdir flag.  
> > >   -> removed the symlink trick  
> >
> > Fine..., will test it...
> >  
> > >
> > > - add --refclock=all flags to configure, see notes down below
> > >
> > > - add leap second management options & ntpviz
> > >
> > > - improved Config.in:
> > >   libbsd is required  
> >
> > Are you sure? With the original patch ntpsec builds fine without libbsd
> > available...
> >  
> > >   openssl is only needed when NTS encryption is enabled  
> >
> > A build without NTS and without openssl gives:
> >
> >         Checking for OpenSSL/libcrypto (via pkg-config)                 :
> > not found
> >         Checking for OpenSSL's crypto library                           :
> > not found
> >         The configuration failed
> >  
> > >   (depend on python3 only to simply things)
> > >   improved classic mode help description
> > >   improved early-drop-root feature description
> > >
> > > - early droproot should be an option: adapt libcap accordingly  
> >
> > This will break (the hard coded) '-u npt:npt' option from
> > package/ntpsec/S49ntp,
> > any reason to avoid the security feature?
> >  
> > >
> > > - corrected CC=gcc to CC=$(HOSTCC) in ntpsec.mk  
> >
> > Good point...
> >  
> > >
> > > - provide service script for systemd infra along sysv infra  
> >
> > Better done as an extra patch (easier to review)....
> >  
> > >
> > > - I don't think we need the patch if we restrict to !BR2_TOOLCHAIN_UCLIBC
> > >   IMO it's better to keep the patch and allow all toolchains.
> > >   I usually have glibc, but I just ran a sanity check on my zedboard  
> > with uclibc,  
> > >   it passed.  
> >
> > Not important for the commit log...
> >  
> > >
> > > - used on zynq_zed_defconfig and beaglebone_defconfig
> > >   daemon automatically started
> > >   ntpq works fine
> > >
> > > [1] https://gitlab.com/NTPsec/ntpsec/-/issues/694
> > >
> > > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > > Signed-off-by: Guillaume W. Bres <guillaume.bressaix@gmail.com>
> > >
> > > ---
> > > notes on refclocks: https://docs.ntpsec.org/latest/refclock.html
> > >   "For security reasons, we will no longer support any refclock
> > >   that requires a closed-source driver to run", see webpage.
> > >
> > >   --refclock=all is hardcoded at the moment
> > >
> > >   One must compile ntpsec with the 'refclock' option
> > >   if they want to drive or interact with hardware.
> > >
> > >   In any case, refclocks are not critical for both buildtime & runtime:
> > >
> > >      [+] ./configure is smart enough to disable a refclock
> > >      if requirements are not met. In the submitted context,
> > >      this happens for refclock=gpsd without BR2_PACKAGE_GPSD
> > >      selected by user
> > >
> > >      [+] some refclocks naturally require a specific hw support
> > >      with related kernel driver.
> > >      This is not buildtime critical because build does not care
> > >      about hw support.
> > >      This is not runtime critical either because any missing
> > >      hw support or unfeasible hardware access ends up as a logged
> > >      error message. It is up to the user to correct it in the
> > >      submitted context: example: 'nmea/gps' receivers without kernel  
> > support  
> > >      or hardware not plugged in.  
> >
> > Would prefer one option per refclock to reduce dependencies...
> >  
> > >
> > > ntpd / ntpsec should be mutualy exclusive if we harcode S49ntp as the  
> > service script  
> > >
> > > ---
> > >  DEVELOPERS                                         |  1 +
> > >  package/Config.in                                  |  1 +
> > >  ...-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch | 61 ++++++++++++++++
> > >  package/ntpsec/Config.in                           | 68  
> > +++++++++++++++++  
> > >  package/ntpsec/S49ntp                              | 58 +++++++++++++++
> > >  package/ntpsec/ntpd.etc.conf                       | 33 +++++++++
> > >  package/ntpsec/ntpd.service                        | 15 ++++
> > >  package/ntpsec/ntpsec.hash                         |  4 +
> > >  package/ntpsec/ntpsec.mk                           | 85  
> > ++++++++++++++++++++++  
> > >  9 files changed, 326 insertions(+)
> > >  create mode 100644  
> > package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch  
> > >  create mode 100644 package/ntpsec/Config.in
> > >  create mode 100644 package/ntpsec/S49ntp
> > >  create mode 100644 package/ntpsec/ntpd.etc.conf
> > >  create mode 100644 package/ntpsec/ntpd.service
> > >  create mode 100644 package/ntpsec/ntpsec.hash
> > >  create mode 100644 package/ntpsec/ntpsec.mk
> > >
> > > diff --git a/DEVELOPERS b/DEVELOPERS
> > > index 3023526..32b5e87 100644
> > > --- a/DEVELOPERS
> > > +++ b/DEVELOPERS
> > > @@ -2196,6 +2196,7 @@ F:      package/iwd/
> > >  F:   package/libevdev/
> > >  F:   package/libuev/
> > >  F:   package/log4cplus/
> > > +F:   package/ntpsec/
> > >  F:   package/postgresql/
> > >  F:   package/python-colorzero/
> > >  F:   package/python-flask-wtf/
> > > diff --git a/package/Config.in b/package/Config.in
> > > index 5720830..544a0fd 100644
> > > --- a/package/Config.in
> > > +++ b/package/Config.in
> > > @@ -2271,6 +2271,7 @@ endif
> > >       source "package/nmap/Config.in"
> > >       source "package/noip/Config.in"
> > >       source "package/ntp/Config.in"
> > > +     source "package/ntpsec/Config.in"
> > >       source "package/nuttcp/Config.in"
> > >       source "package/odhcp6c/Config.in"
> > >       source "package/odhcploc/Config.in"
> > > diff --git  
> > a/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> > b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch  
> > > new file mode 100644
> > > index 0000000..c2838fe
> > > --- /dev/null
> > > +++  
> > b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch  
> > > @@ -0,0 +1,61 @@
> > > +From 4015a1183d2f79dad6dd675ca5e0d329825f3fa3 Mon Sep 17 00:00:00 2001
> > > +From: Peter Seiderer <ps.report@gmx.net>
> > > +Date: Mon, 4 Oct 2021 22:25:58 +0200
> > > +Subject: [PATCH] ntptime: fix jfmt5/ofmt5 jfmt6/ofmt6 related compile  
> > failure  
> > > +MIME-Version: 1.0
> > > +Content-Type: text/plain; charset=UTF-8
> > > +Content-Transfer-Encoding: 8bit
> > > +
> > > +Use same define guard for definiton as for usage  
> > ('HAVE_STRUCT_NTPTIMEVAL_TAI'  
> > > +instead of 'NTP_API && NTP_API > 3').
> > > +
> > > +Fixes:
> > > +
> > > +  ../../ntptime/ntptime.c: In function ‘main’:
> > > +  ../../ntptime/ntptime.c:349:17: error: ‘jfmt5’ undeclared (first use  
> > in this function); did you mean ‘jfmt6’?  
> > > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > > +        |                 ^~~~~
> > > +        |                 jfmt6
> > > +  ../../ntptime/ntptime.c:349:17: note: each undeclared identifier is  
> > reported only once for each function it appears in  
> > > +  ../../ntptime/ntptime.c:349:25: error: ‘ofmt5’ undeclared (first use  
> > in this function); did you mean ‘ofmt6’?  
> > > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > > +        |                         ^~~~~
> > > +        |                         ofmt6
> > > +  ../../ntptime/ntptime.c:321:15: warning: unused variable ‘jfmt6’  
> > [-Wunused-variable]  
> > > +    321 |   const char *jfmt6 = "";
> > > +        |               ^~~~~
> > > +  ../../ntptime/ntptime.c:311:15: warning: unused variable ‘ofmt6’  
> > [-Wunused-variable]  
> > > +    311 |   const char *ofmt6 = "\n";
> > > +        |               ^~~~~
> > > +
> > > +[Upstream: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1245]
> > > +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > > +---
> > > + ntptime/ntptime.c | 4 ++--
> > > + 1 file changed, 2 insertions(+), 2 deletions(-)
> > > +
> > > +diff --git a/ntptime/ntptime.c b/ntptime/ntptime.c
> > > +index ff861cb..5d58593 100644
> > > +--- a/ntptime/ntptime.c
> > > ++++ b/ntptime/ntptime.c
> > > +@@ -305,7 +305,7 @@ main(
> > > +             const char *ofmt2 = "  time %s, (.%0*d),\n";
> > > +             const char *ofmt3 = "  maximum error %lu us, estimated  
> > error %lu us";  
> > > +             const char *ofmt4 = "  ntptime=%x.%x unixtime=%x.%0*d %s";
> > > +-#if defined NTP_API && NTP_API > 3
> > > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > > +             const char *ofmt5 = ", TAI offset %ld\n";
> > > + #else
> > > +             const char *ofmt6 = "\n";
> > > +@@ -315,7 +315,7 @@ main(
> > > +             const char *jfmt2 =  
> > "\"time\":\"%s\",\"fractional-time\":\".%0*d\",";  
> > > +             const char *jfmt3 =  
> > "\"maximum-error\":%lu,\"estimated-error\":%lu,";  
> > > +             const char *jfmt4 =  
> > "\"raw-ntp-time\":\"%x.%x\",\"raw-unix-time\":\"%x.%0*d %s\",";  
> > > +-#if defined NTP_API && NTP_API > 3
> > > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > > +             const char *jfmt5 = "\"TAI-offset\":%d,";
> > > + #else
> > > +             const char *jfmt6 = "";
> > > +--
> > > +2.33.0
> > > +
> > > diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
> > > new file mode 100644
> > > index 0000000..9044aa4
> > > --- /dev/null
> > > +++ b/package/ntpsec/Config.in
> > > @@ -0,0 +1,68 @@
> > > +comment "ntpsec needs a toolchain w/ wchar, thread, dynamic library"
> > > +     depends on BR2_STATIC_LIBS
> > > +     depends on !BR2_USE_WCHAR
> > > +     depends on !BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > > +
> > > +comment "ntpsec needs libbsd"
> > > +     depends on !BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > > +     depends on !BR2_STATIC_LIBS # libbsd
> > > +
> > > +comment "ntpsec needs python3"
> > > +     depends on !BR2_PACKAGE_PYTHON3
> > > +
> > > +config BR2_PACKAGE_NTPSEC
> > > +     bool "ntpsec"
> > > +     depends on !BR2_STATIC_LIBS # libbsd
> > > +     depends on BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > > +     depends on BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > > +     depends on BR2_PACKAGE_PYTHON3
> > > +     select BR2_PACKAGE_LIBCAP
> > > +     select BR2_PACKAGE_LIBBSD
> > > +     select BR2_PACKAGE_PPS_TOOLS # refclock(pps)
> > > +     help
> > > +       NTPsec is a secure, hardened, and improved
> > > +       implementation of Network Time Protocol derived
> > > +       from NTP Classic, Dave Mills’s original.
> > > +
> > > +       Provides things like ntpd, ntpdate, ntpq, etc...
> > > +
> > > +       https://www.ntpsec.org/
> > > +
> > > +if BR2_PACKAGE_NTPSEC
> > > +
> > > +config BR2_PACKAGE_NTPSEC_CLASSIC_MODE
> > > +     bool "ntpsec-classic"
> > > +     help
> > > +       Enable strict configuration and log-format compatibility
> > > +       with NTP Classic.
> > > +       This option is not recommended as it makes the module
> > > +       less efficient.
> > > +
> > > +config BR2_PACKAGE_NTPSEC_NTS
> > > +     bool "ntpsec-nts"
> > > +     select BR2_PACKAGE_OPENSSL
> > > +     help
> > > +       Enable Network Time Security (NTS) support.
> > > +
> > > +comment "ntpsec-ntploggpsd needs gpsd"
> > > +     depends on !BR2_PACKAGE_GPSD
> > > +
> > > +config BR2_PACKAGE_NTPSEC_LEAP_SMEAR
> > > +     bool "ntpsec-leap-smear"
> > > +     help
> > > +       Activates leap second smearing,
> > > +       https://docs.ntpsec.org/latest/leapsmear.html
> > > +
> > > +config BR2_PACKAGE_NTPSEC_LEAP_TESTING
> > > +     bool "ntpsec-leap-testing"
> > > +     help
> > > +       Enables leap seconds on other than 1st day of month
> > > +
> > > +config BR2_PACKAGE_NTPSEC_EARLY_DROPROOT
> > > +     bool "ntpsec-early-droproot"
> > > +     help
> > > +       Drops root privileges as early as possible.
> > > +       This requires the refclock devices to be owned
> > > +       by owner/group running 'ntpd'
> > > +
> > > +endif
> > > diff --git a/package/ntpsec/S49ntp b/package/ntpsec/S49ntp
> > > new file mode 100644
> > > index 0000000..f3db514
> > > --- /dev/null
> > > +++ b/package/ntpsec/S49ntp
> > > @@ -0,0 +1,58 @@
> > > +#!/bin/sh
> > > +#
> > > +# Starts Network Time Protocol daemon
> > > +#
> > > +
> > > +DAEMON="ntpd"
> > > +PIDFILE="/var/run/$DAEMON.pid"
> > > +
> > > +NTPD_ARGS="-g -u ntp:ntp -s /var/run/ntp"
> > > +
> > > +# shellcheck source=/dev/null
> > > +[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
> > > +
> > > +mkdir -p /var/run/ntp && chown ntp:ntp /var/run/ntp
> > > +
> > > +start() {
> > > +     printf 'Starting %s: ' "$DAEMON"
> > > +     # shellcheck disable=SC2086 # we need the word splitting
> > > +     start-stop-daemon -S -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" \
> > > +             -- $NTPD_ARGS -p "$PIDFILE"
> > > +     status=$?
> > > +     if [ "$status" -eq 0 ]; then
> > > +             echo "OK"
> > > +     else
> > > +             echo "FAIL"
> > > +     fi
> > > +     return "$status"
> > > +}
> > > +
> > > +stop() {
> > > +     printf 'Stopping %s: ' "$DAEMON"
> > > +     start-stop-daemon -K -q -p "$PIDFILE"
> > > +     status=$?
> > > +     if [ "$status" -eq 0 ]; then
> > > +             rm -f "$PIDFILE"
> > > +             echo "OK"
> > > +     else
> > > +             echo "FAIL"
> > > +     fi
> > > +     return "$status"
> > > +}
> > > +
> > > +restart() {
> > > +     stop
> > > +     sleep 1
> > > +     start
> > > +}
> > > +
> > > +case "$1" in
> > > +     start|stop|restart)
> > > +             "$1";;
> > > +     reload)
> > > +             # Restart, since there is no true "reload" feature.
> > > +             restart;;
> > > +     *)
> > > +             echo "Usage: $0 {start|stop|restart|reload}"
> > > +             exit 1
> > > +esac
> > > diff --git a/package/ntpsec/ntpd.etc.conf b/package/ntpsec/ntpd.etc.conf
> > > new file mode 100644
> > > index 0000000..e0f45c1
> > > --- /dev/null
> > > +++ b/package/ntpsec/ntpd.etc.conf
> > > @@ -0,0 +1,33 @@
> > > +#
> > > +# legacy NTP configuration
> > > +#
> > > +pool 0.pool.ntp.org iburst
> > > +pool 1.pool.ntp.org iburst
> > > +pool 2.pool.ntp.org iburst
> > > +pool 3.pool.ntp.org iburst
> > > +
> > > +#
> > > +# NTS configuration
> > > +#
> > > +# Notes:
> > > +#  - uncomment the following lines to enable NTS support (but
> > > +#    make sure the initial clock is up-to-date (otherwise the
> > > +#    NTS certificate validation will fail with 'NTSc: certificate  
> > invalid:  
> > > +#    9=>certificate is not yet valid' as on boards without RTC support)
> > > +#    and/or keep at least one line from the legacy NTP lines
> > > +#  - enable BR2_PACKAGE_CA_CERTIFICATES to gain access to the  
> > certificate  
> > > +#    files
> > > +#
> > > +# server time.cloudflare.com nts  # Global, anycast
> > > +# server nts.ntp.se:4443 nts      # Sweden
> > > +# server ntpmon.dcs1.biz nts      # Singapore
> > > +# server ntp1.glypnod.com nts     # San Francisco
> > > +# server ntp2.glypnod.com nts     # London
> > > +#
> > > +# ca /usr/share/ca-certificates/mozilla
> > > +
> > > +# Allow only time queries, at a limited rate, sending KoD when in  
> > excess.  
> > > +# Allow all local queries (IPv4, IPv6)
> > > +restrict default nomodify nopeer noquery limited kod
> > > +restrict 127.0.0.1
> > > +restrict [::1]
> > > diff --git a/package/ntpsec/ntpd.service b/package/ntpsec/ntpd.service
> > > new file mode 100644
> > > index 0000000..b7db4a2
> > > --- /dev/null
> > > +++ b/package/ntpsec/ntpd.service
> > > @@ -0,0 +1,15 @@
> > > +[Unit]
> > > +Description=Network Time Service
> > > +After=network.target
> > > +
> > > +[Service]
> > > +Type=forking
> > > +PIDFile=/run/ntpd.pid
> > > +# Turn off DNSSEC validation for hostname look-ups, since those need the
> > > +# correct time to work, but we likely won't acquire that without NTP.  
> > Let's  
> > > +# break this chicken-and-egg cycle here.
> > > +Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
> > > +ExecStart=/usr/sbin/ntpd @NTPD_EXTRA_ARGS@ -g -p /run/ntpd.pid  
> >
> > The @NTPD_EXTRA_ARGS@ handling needs the sed command instead of the
> > simple install one (see package/ntp/ntp.mk)...
> >  
> > > +
> > > +[Install]
> > > +WantedBy=multi-user.target
> > > diff --git a/package/ntpsec/ntpsec.hash b/package/ntpsec/ntpsec.hash
> > > new file mode 100644
> > > index 0000000..49dc4e4
> > > --- /dev/null
> > > +++ b/package/ntpsec/ntpsec.hash
> > > @@ -0,0 +1,4 @@
> > > +# Locally calculated
> > > +sha256  
> > 71c9f4bde6953bbc048bbaf278da81c451a56cc08d6772542b4ad37c67d72e89
> > ntpsec-NTPsec_1_2_1.tar.bz2  
> > > +sha256  
> > b4db4de3317c3b0554ed91eb692968800bdfd6ad2c16ffbeee8ce4895ed91da4
> > LICENSE.adoc  
> > > +sha256  
> > d3b21470adadd9abd9c6d675378f8c371ac5a4ea6dbec91859e02fadca3c0856
> > docs/copyright.adoc  
> > > diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
> > > new file mode 100644
> > > index 0000000..55b4bb0
> > > --- /dev/null
> > > +++ b/package/ntpsec/ntpsec.mk
> > > @@ -0,0 +1,85 @@
> > >  
> > +################################################################################  
> > > +#
> > > +# ntpsec
> > > +#
> > >  
> > +################################################################################  
> > > +
> > > +NTPSEC_VERSION_MAJOR = 1
> > > +NTPSEC_VERSION_MINOR = 2
> > > +NTPSEC_VERSION_POINT = 1
> > > +NTPSEC_VERSION =  
> > $(NTPSEC_VERSION_MAJOR)_$(NTPSEC_VERSION_MINOR)_$(NTPSEC_VERSION_POINT)  
> > > +NTPSEC_SOURCE = ntpsec-NTPsec_$(NTPSEC_VERSION).tar.bz2
> > > +NTPSEC_SITE =  
> > https://gitlab.com/NTPsec/ntpsec/-/archive/NTPsec_$(NTPSEC_VERSION)  
> > > +NTPSEC_LICENSE = BSD-2-Clause NTP BSD-3-Clause MIT
> > > +NTPSEC_LICENSE_FILES = LICENSE.adoc docs/copyright.adoc
> > > +
> > > +NTPSEC_CPE_ID_VENDOR = ntpsec
> > > +NTPSEC_CPE_ID_VERSION = $(NTPSEC_VERSION_MAJOR).$(NTPSEC_VERSION_MINOR)
> > > +NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
> > > +
> > > +NTPSEC_DEPENDENCIES = \
> > > +     $(if $(BR2_PACKAGE_PYTHON),python,python3) \
> > > +     libbsd \
> > > +     pps-tools
> > > +
> > > +NTPSEC_PYVER = $(if  
> > $(BR2_PACKAGE_PYTHON),python$(PYTHON_VERSION_MAJOR),python$(PYTHON3_VERSION_MAJOR))  
> > > +
> > > +NTPSEC_CONF_OPTS = \
> > > +     CC=$(HOSTCC) \
> > > +     PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/$(if  
> > $(BR2_PACKAGE_PYTHON),python,python3)-config" \  
> > > +     --cross-compiler="$(TARGET_CC)" \
> > > +     --cross-cflags="$(TARGET_CFLAGS) -std=gnu99" \
> > > +     --cross-ldflags="$(TARGET_LDFLAGS)" \
> > > +     --notests \
> > > +     --disable-mdns-registration \
> > > +     --enable-pylib=ffi \
> > > +     --nopyc \
> > > +     --nopyo \
> > > +     --nopycache \
> > > +     --disable-doc \
> > > +     --disable-manpage \
> > > +     --refclock=all \
> > > +     --libdir=/usr/lib/$(NTPSEC_PYVER)/site-packages/ntp
> > > +
> > > +ifeq ($(BR2_PACKAGE_NTPSEC_CLASSIC_MODE),y)
> > > +NTPSEC_CONF_OPTS += --enable-classic-mode
> > > +endif
> > > +
> > > +ifeq ($(BR2_PACKAGE_NTPSEC_NTS),y)
> > > +NTPSEC_DEPENDENCIES += openssl
> > > +else
> > > +NTPSEC_CONF_OPTS += --disable-nts
> > > +endif
> > > +
> > > +ifeq ($(BR2_PACKAGE_NTPSEC_EARLY_DROPROOT),y)
> > > +NTPSEC_DEPENDENCIES += libcap
> > > +NTPSEC_CONF_OPTS += --enable-early-droproot
> > > +endif
> > > +
> > > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_SMEAR),y)
> > > +NTPSEC_CONF_OPTS += --enable-leap-smear
> > > +endif
> > > +
> > > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_TESTING),y)
> > > +NTPSEC_CONF_OPTS += --enable-leap-testing
> > > +endif
> > > +
> > > +define NTPSEC_INSTALL_NTPSEC_CONF
> > > +     $(INSTALL) -m 644 package/ntpsec/ntpd.etc.conf  
> > $(TARGET_DIR)/etc/ntp.conf  
> > > +endef
> > > +NTPSEC_POST_INSTALL_TARGET_HOOKS += NTPSEC_INSTALL_NTPSEC_CONF
> > > +
> > > +define NTPSEC_INSTALL_INIT_SYSV
> > > +     $(INSTALL) -D -m 755 $(NTPSEC_PKGDIR)/S49ntp  
> > $(TARGET_DIR)/etc/init.d/S49ntp  
> > > +endef
> > > +
> > > +define NTPSEC_INSTALL_INIT_SYSTEMD
> > > +     $(INSTALL) -D -m 644 $(NTPSEC_PKGDIR)/ntpd.service \
> > > +             $(TARGET_DIR)/usr/lib/systemd/system/ntpd.service
> > > +endef
> > > +
> > > +define NTPSEC_USERS
> > > +     ntp -1 ntp -1 * - - - ntpd user
> > > +endef
> > > +
> > > +$(eval $(waf-package))  
> >
> > Will prepare an update of my original patch with the version update and
> > some of
> > your findings..., feel free to provide your improvements as add-on patches
> > ;-)
> >
> > Regards,
> > Peter
> >
> >
Guillaume Bres Dec. 17, 2021, 7:57 a.m. UTC | #4
Peter, all,

I'm currently testing (runtime) on your V2 and will get back soon to you.

>Maybe take a look at package/mesa3d/mesa3d.mk and the dri-drivers handling:
>-Ddri-drivers=$(subst $(space),$(comma),$(MESA3D_DRI_DRIVERS-y))
I will not increment the v2 with new features, let's have it merged and we
start from there

>With libbsd enabled I get the following failure:
I solved that issue with similar -I flags,
but did not realize libbsd was not available to staging.
What do you think is best then, should we enable libbsd and provide a mini
libbsd patch along our ntpsec patch?
If we all say so, then we will wait for your v3

Guillaume W. Bres
Software engineer
<guillaume.bressaix@gmail.com>


Le mer. 15 déc. 2021 à 23:15, Peter Seiderer <ps.report@gmx.net> a écrit :

> Hello Guillaume,
>
> On Wed, 15 Dec 2021 22:21:31 +0100, Guillaume Bres <
> guillaume.bressaix@gmail.com> wrote:
>
> > Hello Peter,
> >
> > > Will prepare an update of my original patch with the version update
> and
> > some of
> > > your findings..., feel free to provide your improvements as add-on
> > patches ;-)
> > sounds good, i'll wait for your v2 and will test it on my side
> >
> > > Better done as an extra patch (easier to review)....
> > ok let's do that later
> >
> > >  libbsd is required
> > >> Are you sure?
> > >> With the original patch ntpsec builds fine without libbsd
> available...
> > it's listed in the dependencies for this pkg in debian.
> > Ran a quick grep in their sources, it's clearly in their CI basic
> > requirements too, but I cant figure where they actually use it. They
> > clearly pass -lbsd to the linker though.
>
>
> Checking for library bsd                 : not found
> [...]
>   LDFLAGS                       :  -Wl,-z,now -Wl,--strip-all -Wl,-z,relro
>   LINKFLAGS_NTPD                :  -pie
>
>
> With libbsd enabled I get the following failure:
>
> --- building host ---
> Waf: Entering directory `.../build/ntpsec-1_2_1/build/host'
> [1/2] Processing ntpd/ntp_parser.y
> [2/2] Compiling build/host/ntpd/ntp_parser.tab.c
> In file included from ../../include/ntp.h:15,
>                  from .../build/ntpsec-1_2_1/ntpd/ntp_parser.y:16:
> ../../include/ntp_stdlib.h:20:10: fatal error: bsd/string.h: No such file
> or directory
>    20 | #include <bsd/string.h>
>       |          ^~~~~~~~~~~~~~
> compilation terminated.
>
>
> Can be avoided by the following patch:
>
> diff --git a/package/libbsd/libbsd.mk b/package/libbsd/libbsd.mk
> index 256a75f15e..454cee3f37 100644
> --- a/package/libbsd/libbsd.mk
> +++ b/package/libbsd/libbsd.mk
> @@ -14,3 +14,4 @@ LIBBSD_CPE_ID_VENDOR = freedesktop
>  LIBBSD_INSTALL_STAGING = YES
>
>  $(eval $(autotools-package))
> +$(eval $(host-autotools-package))
> diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
> index 7275533d26..41013d1e99 100644
> --- a/package/ntpsec/Config.in
> +++ b/package/ntpsec/Config.in
> @@ -1,6 +1,7 @@
>  config BR2_PACKAGE_NTPSEC
>         bool "ntpsec"
>         depends on BR2_PACKAGE_PYTHON3
> +       select BR2_PACKAGE_LIBBSD
>         select BR2_PACKAGE_LIBCAP
>         select BR2_PACKAGE_OPENSSL
>         help
> diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
> index 739ef0eab4..63eaf35268 100644
> --- a/package/ntpsec/ntpsec.mk
> +++ b/package/ntpsec/ntpsec.mk
> @@ -20,11 +20,12 @@ NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
>  NTPSEC_DEPENDENCIES = \
>         host-pkgconf \
>         python3 \
> +       host-libbsd libbsd \
>         libcap \
>         openssl
>
>  NTPSEC_CONF_OPTS = \
> -       CC="$(HOSTCC)" \
> +       CC="$(HOSTCC) -I$(HOST_DIR)/include" \
>         PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/python3-config" \
>         --libdir=/usr/lib/python$(PYTHON3_VERSION_MAJOR)/site-packages/ntp
> \
>         --cross-compiler="$(TARGET_CC)" \
>
> >
> > >Would prefer one option per refclock to reduce dependencies...
> > I tried to do so at first, but am failing at correctly concatenating the
> > refclocks in a comma separated string.
> > Expected format is "refclocks=gpsd,nmea,shm"
> > Order does not matter. It is very important to only have valid refclocks
> in
> > the submitted string otherwise configure fails. refclocks=",nmea,shm" and
> > refclocks="shm," would fail.
> >
> > >Would prefer one option per refclock to reduce dependencies...
> > Actually there are no dependencies related to refclocks, it's up to the
> > user to provide a correct kernel config for specific hardware though.
> Only
> > "gpsd" will have unmet requirements at the moment and would get dropped
> out
> > by configure (smart detection). If you can provide a proper interface to
> > concatenate the string, that would be useful (I'm not a good at shell
> > scripting). If we do so, I would recommend we stick to the list of
> actively
> > maintained refclocks (URL in my reply to v1)
>
> Maybe take a look at package/mesa3d/mesa3d.mk and the dri-drivers
> handling:
>
>         137         -Ddri-drivers=$(subst
> $(space),$(comma),$(MESA3D_DRI_DRIVERS-y))
>
> Regards,
> Peter
>
> >
> >
> > Guillaume W. Bres
> > Software engineer
> > <guillaume.bressaix@gmail.com>
> >
> >
> > Le mer. 15 déc. 2021 à 21:43, Peter Seiderer <ps.report@gmx.net> a
> écrit :
> >
> > > Hello Guillaume,
> > >
> > > thanks of interest, testing and improvement of the ntpsec patch, some
> > > comments below...
> > >
> > > On Sun, 12 Dec 2021 21:07:41 +0100, guillaume.bressaix@gmail.com
> wrote:
> > >
> > > > From: Peter Seiderer <ps.report@gmx.net>
> > > >
> > > > - set 'CC=gcc' to avoid cross-compile failure (see [1]):
> > > >
> > > >   /bin/sh: line 1:
> .../build/ntpsec-1_2_0/build/host/ntpd/keyword-gen:
> > > cannot execute binary file: Exec format error
> > > >
> > > >   Waf: Leaving directory `.../build/ntpsec-1_2_0/build/host'
> > > >   Build failed
> > > >    -> task in 'ntp_keyword.h' failed with exit status 126 (run with
> -v
> > > to display more information)
> > > >
> > > > - set '-std=gnu99"' to avoid compile failure with old compilers
> > > >
> > > > - explicit set PYTHON_CONFIG
> > > >
> > > > - add patch
> > > 001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch to
> > > >   fix ntptime jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
> > > >
> > > > - add SYSV init file (S49ntp)
> > > >
> > > > - add example ntpd.conf (with legacy option enabled and provide
> skeleton
> > > >   for NTS configuration)
> > > >
> > > > - add config option for NTS support
> > > >
> > > > - depend on python3 (omit python2 to reduce test effort)
> > > >
> > > > - add ntp user/group and run ntpd as restricted user
> > > >
> > > > - add libcap dependency (compile time optional but needed for
> droproot
> > > >   support)
> > > >
> > > > - submit latest ntpsec version 1.2.1
> > >
> > > Interesting, not listed as release, but tagged and downloadable...
> > >
> > > >
> > > > - lib ntpc import in python is fixed by specifying the --libdir
> flag.
> > > >   -> removed the symlink trick
> > >
> > > Fine..., will test it...
> > >
> > > >
> > > > - add --refclock=all flags to configure, see notes down below
> > > >
> > > > - add leap second management options & ntpviz
> > > >
> > > > - improved Config.in:
> > > >   libbsd is required
> > >
> > > Are you sure? With the original patch ntpsec builds fine without libbsd
> > > available...
> > >
> > > >   openssl is only needed when NTS encryption is enabled
> > >
> > > A build without NTS and without openssl gives:
> > >
> > >         Checking for OpenSSL/libcrypto (via pkg-config)
>  :
> > > not found
> > >         Checking for OpenSSL's crypto library
>  :
> > > not found
> > >         The configuration failed
> > >
> > > >   (depend on python3 only to simply things)
> > > >   improved classic mode help description
> > > >   improved early-drop-root feature description
> > > >
> > > > - early droproot should be an option: adapt libcap accordingly
> > >
> > > This will break (the hard coded) '-u npt:npt' option from
> > > package/ntpsec/S49ntp,
> > > any reason to avoid the security feature?
> > >
> > > >
> > > > - corrected CC=gcc to CC=$(HOSTCC) in ntpsec.mk
> > >
> > > Good point...
> > >
> > > >
> > > > - provide service script for systemd infra along sysv infra
> > >
> > > Better done as an extra patch (easier to review)....
> > >
> > > >
> > > > - I don't think we need the patch if we restrict to
> !BR2_TOOLCHAIN_UCLIBC
> > > >   IMO it's better to keep the patch and allow all toolchains.
> > > >   I usually have glibc, but I just ran a sanity check on my
> zedboard
> > > with uclibc,
> > > >   it passed.
> > >
> > > Not important for the commit log...
> > >
> > > >
> > > > - used on zynq_zed_defconfig and beaglebone_defconfig
> > > >   daemon automatically started
> > > >   ntpq works fine
> > > >
> > > > [1] https://gitlab.com/NTPsec/ntpsec/-/issues/694
> > > >
> > > > Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > > > Signed-off-by: Guillaume W. Bres <guillaume.bressaix@gmail.com>
> > > >
> > > > ---
> > > > notes on refclocks: https://docs.ntpsec.org/latest/refclock.html
> > > >   "For security reasons, we will no longer support any refclock
> > > >   that requires a closed-source driver to run", see webpage.
> > > >
> > > >   --refclock=all is hardcoded at the moment
> > > >
> > > >   One must compile ntpsec with the 'refclock' option
> > > >   if they want to drive or interact with hardware.
> > > >
> > > >   In any case, refclocks are not critical for both buildtime &
> runtime:
> > > >
> > > >      [+] ./configure is smart enough to disable a refclock
> > > >      if requirements are not met. In the submitted context,
> > > >      this happens for refclock=gpsd without BR2_PACKAGE_GPSD
> > > >      selected by user
> > > >
> > > >      [+] some refclocks naturally require a specific hw support
> > > >      with related kernel driver.
> > > >      This is not buildtime critical because build does not care
> > > >      about hw support.
> > > >      This is not runtime critical either because any missing
> > > >      hw support or unfeasible hardware access ends up as a logged
> > > >      error message. It is up to the user to correct it in the
> > > >      submitted context: example: 'nmea/gps' receivers without
> kernel
> > > support
> > > >      or hardware not plugged in.
> > >
> > > Would prefer one option per refclock to reduce dependencies...
> > >
> > > >
> > > > ntpd / ntpsec should be mutualy exclusive if we harcode S49ntp as
> the
> > > service script
> > > >
> > > > ---
> > > >  DEVELOPERS                                         |  1 +
> > > >  package/Config.in                                  |  1 +
> > > >  ...-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch | 61
> ++++++++++++++++
> > > >  package/ntpsec/Config.in                           | 68
> > > +++++++++++++++++
> > > >  package/ntpsec/S49ntp                              | 58
> +++++++++++++++
> > > >  package/ntpsec/ntpd.etc.conf                       | 33 +++++++++
> > > >  package/ntpsec/ntpd.service                        | 15 ++++
> > > >  package/ntpsec/ntpsec.hash                         |  4 +
> > > >  package/ntpsec/ntpsec.mk                           | 85
> > > ++++++++++++++++++++++
> > > >  9 files changed, 326 insertions(+)
> > > >  create mode 100644
> > >
> package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
>
> > > >  create mode 100644 package/ntpsec/Config.in
> > > >  create mode 100644 package/ntpsec/S49ntp
> > > >  create mode 100644 package/ntpsec/ntpd.etc.conf
> > > >  create mode 100644 package/ntpsec/ntpd.service
> > > >  create mode 100644 package/ntpsec/ntpsec.hash
> > > >  create mode 100644 package/ntpsec/ntpsec.mk
> > > >
> > > > diff --git a/DEVELOPERS b/DEVELOPERS
> > > > index 3023526..32b5e87 100644
> > > > --- a/DEVELOPERS
> > > > +++ b/DEVELOPERS
> > > > @@ -2196,6 +2196,7 @@ F:      package/iwd/
> > > >  F:   package/libevdev/
> > > >  F:   package/libuev/
> > > >  F:   package/log4cplus/
> > > > +F:   package/ntpsec/
> > > >  F:   package/postgresql/
> > > >  F:   package/python-colorzero/
> > > >  F:   package/python-flask-wtf/
> > > > diff --git a/package/Config.in b/package/Config.in
> > > > index 5720830..544a0fd 100644
> > > > --- a/package/Config.in
> > > > +++ b/package/Config.in
> > > > @@ -2271,6 +2271,7 @@ endif
> > > >       source "package/nmap/Config.in"
> > > >       source "package/noip/Config.in"
> > > >       source "package/ntp/Config.in"
> > > > +     source "package/ntpsec/Config.in"
> > > >       source "package/nuttcp/Config.in"
> > > >       source "package/odhcp6c/Config.in"
> > > >       source "package/odhcploc/Config.in"
> > > > diff --git
> > >
> a/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
> > >
> b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
>
> > > > new file mode 100644
> > > > index 0000000..c2838fe
> > > > --- /dev/null
> > > > +++
> > >
> b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
>
> > > > @@ -0,0 +1,61 @@
> > > > +From 4015a1183d2f79dad6dd675ca5e0d329825f3fa3 Mon Sep 17 00:00:00
> 2001
> > > > +From: Peter Seiderer <ps.report@gmx.net>
> > > > +Date: Mon, 4 Oct 2021 22:25:58 +0200
> > > > +Subject: [PATCH] ntptime: fix jfmt5/ofmt5 jfmt6/ofmt6 related
> compile
> > > failure
> > > > +MIME-Version: 1.0
> > > > +Content-Type: text/plain; charset=UTF-8
> > > > +Content-Transfer-Encoding: 8bit
> > > > +
> > > > +Use same define guard for definiton as for usage
> > > ('HAVE_STRUCT_NTPTIMEVAL_TAI'
> > > > +instead of 'NTP_API && NTP_API > 3').
> > > > +
> > > > +Fixes:
> > > > +
> > > > +  ../../ntptime/ntptime.c: In function ‘main’:
> > > > +  ../../ntptime/ntptime.c:349:17: error: ‘jfmt5’ undeclared (first
> use
> > > in this function); did you mean ‘jfmt6’?
> > > > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > > > +        |                 ^~~~~
> > > > +        |                 jfmt6
> > > > +  ../../ntptime/ntptime.c:349:17: note: each undeclared identifier
> is
> > > reported only once for each function it appears in
> > > > +  ../../ntptime/ntptime.c:349:25: error: ‘ofmt5’ undeclared (first
> use
> > > in this function); did you mean ‘ofmt6’?
> > > > +    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
> > > > +        |                         ^~~~~
> > > > +        |                         ofmt6
> > > > +  ../../ntptime/ntptime.c:321:15: warning: unused variable ‘jfmt6’
> > > [-Wunused-variable]
> > > > +    321 |   const char *jfmt6 = "";
> > > > +        |               ^~~~~
> > > > +  ../../ntptime/ntptime.c:311:15: warning: unused variable ‘ofmt6’
> > > [-Wunused-variable]
> > > > +    311 |   const char *ofmt6 = "\n";
> > > > +        |               ^~~~~
> > > > +
> > > > +[Upstream: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1245]
> > > > +Signed-off-by: Peter Seiderer <ps.report@gmx.net>
> > > > +---
> > > > + ntptime/ntptime.c | 4 ++--
> > > > + 1 file changed, 2 insertions(+), 2 deletions(-)
> > > > +
> > > > +diff --git a/ntptime/ntptime.c b/ntptime/ntptime.c
> > > > +index ff861cb..5d58593 100644
> > > > +--- a/ntptime/ntptime.c
> > > > ++++ b/ntptime/ntptime.c
> > > > +@@ -305,7 +305,7 @@ main(
> > > > +             const char *ofmt2 = "  time %s, (.%0*d),\n";
> > > > +             const char *ofmt3 = "  maximum error %lu us,
> estimated
> > > error %lu us";
> > > > +             const char *ofmt4 = "  ntptime=%x.%x unixtime=%x.%0*d
> %s";
> > > > +-#if defined NTP_API && NTP_API > 3
> > > > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > > > +             const char *ofmt5 = ", TAI offset %ld\n";
> > > > + #else
> > > > +             const char *ofmt6 = "\n";
> > > > +@@ -315,7 +315,7 @@ main(
> > > > +             const char *jfmt2 =
> > > "\"time\":\"%s\",\"fractional-time\":\".%0*d\",";
> > > > +             const char *jfmt3 =
> > > "\"maximum-error\":%lu,\"estimated-error\":%lu,";
> > > > +             const char *jfmt4 =
> > > "\"raw-ntp-time\":\"%x.%x\",\"raw-unix-time\":\"%x.%0*d %s\",";
> > > > +-#if defined NTP_API && NTP_API > 3
> > > > ++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
> > > > +             const char *jfmt5 = "\"TAI-offset\":%d,";
> > > > + #else
> > > > +             const char *jfmt6 = "";
> > > > +--
> > > > +2.33.0
> > > > +
> > > > diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
> > > > new file mode 100644
> > > > index 0000000..9044aa4
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/Config.in
> > > > @@ -0,0 +1,68 @@
> > > > +comment "ntpsec needs a toolchain w/ wchar, thread, dynamic library"
> > > > +     depends on BR2_STATIC_LIBS
> > > > +     depends on !BR2_USE_WCHAR
> > > > +     depends on !BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > > > +
> > > > +comment "ntpsec needs libbsd"
> > > > +     depends on !BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > > > +     depends on !BR2_STATIC_LIBS # libbsd
> > > > +
> > > > +comment "ntpsec needs python3"
> > > > +     depends on !BR2_PACKAGE_PYTHON3
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC
> > > > +     bool "ntpsec"
> > > > +     depends on !BR2_STATIC_LIBS # libbsd
> > > > +     depends on BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
> > > > +     depends on BR2_TOOLCHAIN_HAS_THREADS # libbsd
> > > > +     depends on BR2_PACKAGE_PYTHON3
> > > > +     select BR2_PACKAGE_LIBCAP
> > > > +     select BR2_PACKAGE_LIBBSD
> > > > +     select BR2_PACKAGE_PPS_TOOLS # refclock(pps)
> > > > +     help
> > > > +       NTPsec is a secure, hardened, and improved
> > > > +       implementation of Network Time Protocol derived
> > > > +       from NTP Classic, Dave Mills’s original.
> > > > +
> > > > +       Provides things like ntpd, ntpdate, ntpq, etc...
> > > > +
> > > > +       https://www.ntpsec.org/
> > > > +
> > > > +if BR2_PACKAGE_NTPSEC
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC_CLASSIC_MODE
> > > > +     bool "ntpsec-classic"
> > > > +     help
> > > > +       Enable strict configuration and log-format compatibility
> > > > +       with NTP Classic.
> > > > +       This option is not recommended as it makes the module
> > > > +       less efficient.
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC_NTS
> > > > +     bool "ntpsec-nts"
> > > > +     select BR2_PACKAGE_OPENSSL
> > > > +     help
> > > > +       Enable Network Time Security (NTS) support.
> > > > +
> > > > +comment "ntpsec-ntploggpsd needs gpsd"
> > > > +     depends on !BR2_PACKAGE_GPSD
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC_LEAP_SMEAR
> > > > +     bool "ntpsec-leap-smear"
> > > > +     help
> > > > +       Activates leap second smearing,
> > > > +       https://docs.ntpsec.org/latest/leapsmear.html
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC_LEAP_TESTING
> > > > +     bool "ntpsec-leap-testing"
> > > > +     help
> > > > +       Enables leap seconds on other than 1st day of month
> > > > +
> > > > +config BR2_PACKAGE_NTPSEC_EARLY_DROPROOT
> > > > +     bool "ntpsec-early-droproot"
> > > > +     help
> > > > +       Drops root privileges as early as possible.
> > > > +       This requires the refclock devices to be owned
> > > > +       by owner/group running 'ntpd'
> > > > +
> > > > +endif
> > > > diff --git a/package/ntpsec/S49ntp b/package/ntpsec/S49ntp
> > > > new file mode 100644
> > > > index 0000000..f3db514
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/S49ntp
> > > > @@ -0,0 +1,58 @@
> > > > +#!/bin/sh
> > > > +#
> > > > +# Starts Network Time Protocol daemon
> > > > +#
> > > > +
> > > > +DAEMON="ntpd"
> > > > +PIDFILE="/var/run/$DAEMON.pid"
> > > > +
> > > > +NTPD_ARGS="-g -u ntp:ntp -s /var/run/ntp"
> > > > +
> > > > +# shellcheck source=/dev/null
> > > > +[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
> > > > +
> > > > +mkdir -p /var/run/ntp && chown ntp:ntp /var/run/ntp
> > > > +
> > > > +start() {
> > > > +     printf 'Starting %s: ' "$DAEMON"
> > > > +     # shellcheck disable=SC2086 # we need the word splitting
> > > > +     start-stop-daemon -S -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" \
> > > > +             -- $NTPD_ARGS -p "$PIDFILE"
> > > > +     status=$?
> > > > +     if [ "$status" -eq 0 ]; then
> > > > +             echo "OK"
> > > > +     else
> > > > +             echo "FAIL"
> > > > +     fi
> > > > +     return "$status"
> > > > +}
> > > > +
> > > > +stop() {
> > > > +     printf 'Stopping %s: ' "$DAEMON"
> > > > +     start-stop-daemon -K -q -p "$PIDFILE"
> > > > +     status=$?
> > > > +     if [ "$status" -eq 0 ]; then
> > > > +             rm -f "$PIDFILE"
> > > > +             echo "OK"
> > > > +     else
> > > > +             echo "FAIL"
> > > > +     fi
> > > > +     return "$status"
> > > > +}
> > > > +
> > > > +restart() {
> > > > +     stop
> > > > +     sleep 1
> > > > +     start
> > > > +}
> > > > +
> > > > +case "$1" in
> > > > +     start|stop|restart)
> > > > +             "$1";;
> > > > +     reload)
> > > > +             # Restart, since there is no true "reload" feature.
> > > > +             restart;;
> > > > +     *)
> > > > +             echo "Usage: $0 {start|stop|restart|reload}"
> > > > +             exit 1
> > > > +esac
> > > > diff --git a/package/ntpsec/ntpd.etc.conf
> b/package/ntpsec/ntpd.etc.conf
> > > > new file mode 100644
> > > > index 0000000..e0f45c1
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/ntpd.etc.conf
> > > > @@ -0,0 +1,33 @@
> > > > +#
> > > > +# legacy NTP configuration
> > > > +#
> > > > +pool 0.pool.ntp.org iburst
> > > > +pool 1.pool.ntp.org iburst
> > > > +pool 2.pool.ntp.org iburst
> > > > +pool 3.pool.ntp.org iburst
> > > > +
> > > > +#
> > > > +# NTS configuration
> > > > +#
> > > > +# Notes:
> > > > +#  - uncomment the following lines to enable NTS support (but
> > > > +#    make sure the initial clock is up-to-date (otherwise the
> > > > +#    NTS certificate validation will fail with 'NTSc: certificate
> > > invalid:
> > > > +#    9=>certificate is not yet valid' as on boards without RTC
> support)
> > > > +#    and/or keep at least one line from the legacy NTP lines
> > > > +#  - enable BR2_PACKAGE_CA_CERTIFICATES to gain access to the
> > > certificate
> > > > +#    files
> > > > +#
> > > > +# server time.cloudflare.com nts  # Global, anycast
> > > > +# server nts.ntp.se:4443 nts      # Sweden
> > > > +# server ntpmon.dcs1.biz nts      # Singapore
> > > > +# server ntp1.glypnod.com nts     # San Francisco
> > > > +# server ntp2.glypnod.com nts     # London
> > > > +#
> > > > +# ca /usr/share/ca-certificates/mozilla
> > > > +
> > > > +# Allow only time queries, at a limited rate, sending KoD when in
> > > excess.
> > > > +# Allow all local queries (IPv4, IPv6)
> > > > +restrict default nomodify nopeer noquery limited kod
> > > > +restrict 127.0.0.1
> > > > +restrict [::1]
> > > > diff --git a/package/ntpsec/ntpd.service
> b/package/ntpsec/ntpd.service
> > > > new file mode 100644
> > > > index 0000000..b7db4a2
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/ntpd.service
> > > > @@ -0,0 +1,15 @@
> > > > +[Unit]
> > > > +Description=Network Time Service
> > > > +After=network.target
> > > > +
> > > > +[Service]
> > > > +Type=forking
> > > > +PIDFile=/run/ntpd.pid
> > > > +# Turn off DNSSEC validation for hostname look-ups, since those
> need the
> > > > +# correct time to work, but we likely won't acquire that without
> NTP.
> > > Let's
> > > > +# break this chicken-and-egg cycle here.
> > > > +Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
> > > > +ExecStart=/usr/sbin/ntpd @NTPD_EXTRA_ARGS@ -g -p /run/ntpd.pid
> > >
> > > The @NTPD_EXTRA_ARGS@ handling needs the sed command instead of the
> > > simple install one (see package/ntp/ntp.mk)...
> > >
> > > > +
> > > > +[Install]
> > > > +WantedBy=multi-user.target
> > > > diff --git a/package/ntpsec/ntpsec.hash b/package/ntpsec/ntpsec.hash
> > > > new file mode 100644
> > > > index 0000000..49dc4e4
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/ntpsec.hash
> > > > @@ -0,0 +1,4 @@
> > > > +# Locally calculated
> > > > +sha256
> > > 71c9f4bde6953bbc048bbaf278da81c451a56cc08d6772542b4ad37c67d72e89
> > > ntpsec-NTPsec_1_2_1.tar.bz2
> > > > +sha256
> > > b4db4de3317c3b0554ed91eb692968800bdfd6ad2c16ffbeee8ce4895ed91da4
> > > LICENSE.adoc
> > > > +sha256
> > > d3b21470adadd9abd9c6d675378f8c371ac5a4ea6dbec91859e02fadca3c0856
> > > docs/copyright.adoc
> > > > diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
> > > > new file mode 100644
> > > > index 0000000..55b4bb0
> > > > --- /dev/null
> > > > +++ b/package/ntpsec/ntpsec.mk
> > > > @@ -0,0 +1,85 @@
> > > >
> > >
> +################################################################################
>
> > > > +#
> > > > +# ntpsec
> > > > +#
> > > >
> > >
> +################################################################################
>
> > > > +
> > > > +NTPSEC_VERSION_MAJOR = 1
> > > > +NTPSEC_VERSION_MINOR = 2
> > > > +NTPSEC_VERSION_POINT = 1
> > > > +NTPSEC_VERSION =
> > >
> $(NTPSEC_VERSION_MAJOR)_$(NTPSEC_VERSION_MINOR)_$(NTPSEC_VERSION_POINT)
> > > > +NTPSEC_SOURCE = ntpsec-NTPsec_$(NTPSEC_VERSION).tar.bz2
> > > > +NTPSEC_SITE =
> > > https://gitlab.com/NTPsec/ntpsec/-/archive/NTPsec_$(NTPSEC_VERSION)
> > > > +NTPSEC_LICENSE = BSD-2-Clause NTP BSD-3-Clause MIT
> > > > +NTPSEC_LICENSE_FILES = LICENSE.adoc docs/copyright.adoc
> > > > +
> > > > +NTPSEC_CPE_ID_VENDOR = ntpsec
> > > > +NTPSEC_CPE_ID_VERSION =
> $(NTPSEC_VERSION_MAJOR).$(NTPSEC_VERSION_MINOR)
> > > > +NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
> > > > +
> > > > +NTPSEC_DEPENDENCIES = \
> > > > +     $(if $(BR2_PACKAGE_PYTHON),python,python3) \
> > > > +     libbsd \
> > > > +     pps-tools
> > > > +
> > > > +NTPSEC_PYVER = $(if
> > >
> $(BR2_PACKAGE_PYTHON),python$(PYTHON_VERSION_MAJOR),python$(PYTHON3_VERSION_MAJOR))
>
> > > > +
> > > > +NTPSEC_CONF_OPTS = \
> > > > +     CC=$(HOSTCC) \
> > > > +     PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/$(if
> > > $(BR2_PACKAGE_PYTHON),python,python3)-config" \
> > > > +     --cross-compiler="$(TARGET_CC)" \
> > > > +     --cross-cflags="$(TARGET_CFLAGS) -std=gnu99" \
> > > > +     --cross-ldflags="$(TARGET_LDFLAGS)" \
> > > > +     --notests \
> > > > +     --disable-mdns-registration \
> > > > +     --enable-pylib=ffi \
> > > > +     --nopyc \
> > > > +     --nopyo \
> > > > +     --nopycache \
> > > > +     --disable-doc \
> > > > +     --disable-manpage \
> > > > +     --refclock=all \
> > > > +     --libdir=/usr/lib/$(NTPSEC_PYVER)/site-packages/ntp
> > > > +
> > > > +ifeq ($(BR2_PACKAGE_NTPSEC_CLASSIC_MODE),y)
> > > > +NTPSEC_CONF_OPTS += --enable-classic-mode
> > > > +endif
> > > > +
> > > > +ifeq ($(BR2_PACKAGE_NTPSEC_NTS),y)
> > > > +NTPSEC_DEPENDENCIES += openssl
> > > > +else
> > > > +NTPSEC_CONF_OPTS += --disable-nts
> > > > +endif
> > > > +
> > > > +ifeq ($(BR2_PACKAGE_NTPSEC_EARLY_DROPROOT),y)
> > > > +NTPSEC_DEPENDENCIES += libcap
> > > > +NTPSEC_CONF_OPTS += --enable-early-droproot
> > > > +endif
> > > > +
> > > > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_SMEAR),y)
> > > > +NTPSEC_CONF_OPTS += --enable-leap-smear
> > > > +endif
> > > > +
> > > > +ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_TESTING),y)
> > > > +NTPSEC_CONF_OPTS += --enable-leap-testing
> > > > +endif
> > > > +
> > > > +define NTPSEC_INSTALL_NTPSEC_CONF
> > > > +     $(INSTALL) -m 644 package/ntpsec/ntpd.etc.conf
> > > $(TARGET_DIR)/etc/ntp.conf
> > > > +endef
> > > > +NTPSEC_POST_INSTALL_TARGET_HOOKS += NTPSEC_INSTALL_NTPSEC_CONF
> > > > +
> > > > +define NTPSEC_INSTALL_INIT_SYSV
> > > > +     $(INSTALL) -D -m 755 $(NTPSEC_PKGDIR)/S49ntp
> > > $(TARGET_DIR)/etc/init.d/S49ntp
> > > > +endef
> > > > +
> > > > +define NTPSEC_INSTALL_INIT_SYSTEMD
> > > > +     $(INSTALL) -D -m 644 $(NTPSEC_PKGDIR)/ntpd.service \
> > > > +             $(TARGET_DIR)/usr/lib/systemd/system/ntpd.service
> > > > +endef
> > > > +
> > > > +define NTPSEC_USERS
> > > > +     ntp -1 ntp -1 * - - - ntpd user
> > > > +endef
> > > > +
> > > > +$(eval $(waf-package))
> > >
> > > Will prepare an update of my original patch with the version update and
> > > some of
> > > your findings..., feel free to provide your improvements as add-on
> patches
> > > ;-)
> > >
> > > Regards,
> > > Peter
> > >
> > >
>
>
diff mbox series

Patch

diff --git a/DEVELOPERS b/DEVELOPERS
index 3023526..32b5e87 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2196,6 +2196,7 @@  F:	package/iwd/
 F:	package/libevdev/
 F:	package/libuev/
 F:	package/log4cplus/
+F:	package/ntpsec/
 F:	package/postgresql/
 F:	package/python-colorzero/
 F:	package/python-flask-wtf/
diff --git a/package/Config.in b/package/Config.in
index 5720830..544a0fd 100644
--- a/package/Config.in
+++ b/package/Config.in
@@ -2271,6 +2271,7 @@  endif
 	source "package/nmap/Config.in"
 	source "package/noip/Config.in"
 	source "package/ntp/Config.in"
+	source "package/ntpsec/Config.in"
 	source "package/nuttcp/Config.in"
 	source "package/odhcp6c/Config.in"
 	source "package/odhcploc/Config.in"
diff --git a/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
new file mode 100644
index 0000000..c2838fe
--- /dev/null
+++ b/package/ntpsec/0001-ntptime-fix-jfmt5-ofmt5-jfmt6-ofmt6-related-compile-.patch
@@ -0,0 +1,61 @@ 
+From 4015a1183d2f79dad6dd675ca5e0d329825f3fa3 Mon Sep 17 00:00:00 2001
+From: Peter Seiderer <ps.report@gmx.net>
+Date: Mon, 4 Oct 2021 22:25:58 +0200
+Subject: [PATCH] ntptime: fix jfmt5/ofmt5 jfmt6/ofmt6 related compile failure
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Use same define guard for definiton as for usage ('HAVE_STRUCT_NTPTIMEVAL_TAI'
+instead of 'NTP_API && NTP_API > 3').
+
+Fixes:
+
+  ../../ntptime/ntptime.c: In function ‘main’:
+  ../../ntptime/ntptime.c:349:17: error: ‘jfmt5’ undeclared (first use in this function); did you mean ‘jfmt6’?
+    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
+        |                 ^~~~~
+        |                 jfmt6
+  ../../ntptime/ntptime.c:349:17: note: each undeclared identifier is reported only once for each function it appears in
+  ../../ntptime/ntptime.c:349:25: error: ‘ofmt5’ undeclared (first use in this function); did you mean ‘ofmt6’?
+    349 |   printf(json ? jfmt5 : ofmt5, (long)ntv.tai);
+        |                         ^~~~~
+        |                         ofmt6
+  ../../ntptime/ntptime.c:321:15: warning: unused variable ‘jfmt6’ [-Wunused-variable]
+    321 |   const char *jfmt6 = "";
+        |               ^~~~~
+  ../../ntptime/ntptime.c:311:15: warning: unused variable ‘ofmt6’ [-Wunused-variable]
+    311 |   const char *ofmt6 = "\n";
+        |               ^~~~~
+
+[Upstream: https://gitlab.com/NTPsec/ntpsec/-/merge_requests/1245]
+Signed-off-by: Peter Seiderer <ps.report@gmx.net>
+---
+ ntptime/ntptime.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/ntptime/ntptime.c b/ntptime/ntptime.c
+index ff861cb..5d58593 100644
+--- a/ntptime/ntptime.c
++++ b/ntptime/ntptime.c
+@@ -305,7 +305,7 @@ main(
+ 		const char *ofmt2 = "  time %s, (.%0*d),\n";
+ 		const char *ofmt3 = "  maximum error %lu us, estimated error %lu us";
+ 		const char *ofmt4 = "  ntptime=%x.%x unixtime=%x.%0*d %s";
+-#if defined NTP_API && NTP_API > 3
++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
+ 		const char *ofmt5 = ", TAI offset %ld\n";
+ #else
+ 		const char *ofmt6 = "\n";
+@@ -315,7 +315,7 @@ main(
+ 		const char *jfmt2 = "\"time\":\"%s\",\"fractional-time\":\".%0*d\",";
+ 		const char *jfmt3 = "\"maximum-error\":%lu,\"estimated-error\":%lu,";
+ 		const char *jfmt4 = "\"raw-ntp-time\":\"%x.%x\",\"raw-unix-time\":\"%x.%0*d %s\",";
+-#if defined NTP_API && NTP_API > 3
++#if defined(HAVE_STRUCT_NTPTIMEVAL_TAI)
+ 		const char *jfmt5 = "\"TAI-offset\":%d,";
+ #else
+ 		const char *jfmt6 = "";
+-- 
+2.33.0
+
diff --git a/package/ntpsec/Config.in b/package/ntpsec/Config.in
new file mode 100644
index 0000000..9044aa4
--- /dev/null
+++ b/package/ntpsec/Config.in
@@ -0,0 +1,68 @@ 
+comment "ntpsec needs a toolchain w/ wchar, thread, dynamic library"
+	depends on BR2_STATIC_LIBS
+	depends on !BR2_USE_WCHAR
+	depends on !BR2_TOOLCHAIN_HAS_THREADS # libbsd
+
+comment "ntpsec needs libbsd"
+	depends on !BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
+	depends on !BR2_STATIC_LIBS # libbsd
+
+comment "ntpsec needs python3"
+	depends on !BR2_PACKAGE_PYTHON3
+
+config BR2_PACKAGE_NTPSEC
+	bool "ntpsec"
+	depends on !BR2_STATIC_LIBS # libbsd
+	depends on BR2_PACKAGE_LIBBSD_ARCH_SUPPORTS
+	depends on BR2_TOOLCHAIN_HAS_THREADS # libbsd
+	depends on BR2_PACKAGE_PYTHON3
+	select BR2_PACKAGE_LIBCAP
+	select BR2_PACKAGE_LIBBSD
+	select BR2_PACKAGE_PPS_TOOLS # refclock(pps)
+	help
+	  NTPsec is a secure, hardened, and improved
+	  implementation of Network Time Protocol derived
+	  from NTP Classic, Dave Mills’s original.
+
+	  Provides things like ntpd, ntpdate, ntpq, etc...
+
+	  https://www.ntpsec.org/
+
+if BR2_PACKAGE_NTPSEC
+
+config BR2_PACKAGE_NTPSEC_CLASSIC_MODE
+	bool "ntpsec-classic"
+	help
+	  Enable strict configuration and log-format compatibility
+	  with NTP Classic.
+	  This option is not recommended as it makes the module
+	  less efficient.
+
+config BR2_PACKAGE_NTPSEC_NTS
+	bool "ntpsec-nts"
+	select BR2_PACKAGE_OPENSSL
+	help
+	  Enable Network Time Security (NTS) support.
+
+comment "ntpsec-ntploggpsd needs gpsd"
+	depends on !BR2_PACKAGE_GPSD
+
+config BR2_PACKAGE_NTPSEC_LEAP_SMEAR
+	bool "ntpsec-leap-smear"
+	help
+	  Activates leap second smearing,
+	  https://docs.ntpsec.org/latest/leapsmear.html
+
+config BR2_PACKAGE_NTPSEC_LEAP_TESTING
+	bool "ntpsec-leap-testing"
+	help
+	  Enables leap seconds on other than 1st day of month
+
+config BR2_PACKAGE_NTPSEC_EARLY_DROPROOT
+	bool "ntpsec-early-droproot"
+	help
+	  Drops root privileges as early as possible.
+	  This requires the refclock devices to be owned
+	  by owner/group running 'ntpd'
+
+endif
diff --git a/package/ntpsec/S49ntp b/package/ntpsec/S49ntp
new file mode 100644
index 0000000..f3db514
--- /dev/null
+++ b/package/ntpsec/S49ntp
@@ -0,0 +1,58 @@ 
+#!/bin/sh
+#
+# Starts Network Time Protocol daemon
+#
+
+DAEMON="ntpd"
+PIDFILE="/var/run/$DAEMON.pid"
+
+NTPD_ARGS="-g -u ntp:ntp -s /var/run/ntp"
+
+# shellcheck source=/dev/null
+[ -r "/etc/default/$DAEMON" ] && . "/etc/default/$DAEMON"
+
+mkdir -p /var/run/ntp && chown ntp:ntp /var/run/ntp
+
+start() {
+	printf 'Starting %s: ' "$DAEMON"
+	# shellcheck disable=SC2086 # we need the word splitting
+	start-stop-daemon -S -q -p "$PIDFILE" -x "/usr/sbin/$DAEMON" \
+		-- $NTPD_ARGS -p "$PIDFILE"
+	status=$?
+	if [ "$status" -eq 0 ]; then
+		echo "OK"
+	else
+		echo "FAIL"
+	fi
+	return "$status"
+}
+
+stop() {
+	printf 'Stopping %s: ' "$DAEMON"
+	start-stop-daemon -K -q -p "$PIDFILE"
+	status=$?
+	if [ "$status" -eq 0 ]; then
+		rm -f "$PIDFILE"
+		echo "OK"
+	else
+		echo "FAIL"
+	fi
+	return "$status"
+}
+
+restart() {
+	stop
+	sleep 1
+	start
+}
+
+case "$1" in
+	start|stop|restart)
+		"$1";;
+	reload)
+		# Restart, since there is no true "reload" feature.
+		restart;;
+	*)
+		echo "Usage: $0 {start|stop|restart|reload}"
+		exit 1
+esac
diff --git a/package/ntpsec/ntpd.etc.conf b/package/ntpsec/ntpd.etc.conf
new file mode 100644
index 0000000..e0f45c1
--- /dev/null
+++ b/package/ntpsec/ntpd.etc.conf
@@ -0,0 +1,33 @@ 
+#
+# legacy NTP configuration
+#
+pool 0.pool.ntp.org iburst
+pool 1.pool.ntp.org iburst
+pool 2.pool.ntp.org iburst
+pool 3.pool.ntp.org iburst
+
+#
+# NTS configuration
+#
+# Notes:
+#  - uncomment the following lines to enable NTS support (but
+#    make sure the initial clock is up-to-date (otherwise the
+#    NTS certificate validation will fail with 'NTSc: certificate invalid:
+#    9=>certificate is not yet valid' as on boards without RTC support)
+#    and/or keep at least one line from the legacy NTP lines
+#  - enable BR2_PACKAGE_CA_CERTIFICATES to gain access to the certificate
+#    files
+#
+# server time.cloudflare.com nts  # Global, anycast
+# server nts.ntp.se:4443 nts      # Sweden
+# server ntpmon.dcs1.biz nts      # Singapore
+# server ntp1.glypnod.com nts     # San Francisco
+# server ntp2.glypnod.com nts     # London
+#
+# ca /usr/share/ca-certificates/mozilla
+
+# Allow only time queries, at a limited rate, sending KoD when in excess.
+# Allow all local queries (IPv4, IPv6)
+restrict default nomodify nopeer noquery limited kod
+restrict 127.0.0.1
+restrict [::1]
diff --git a/package/ntpsec/ntpd.service b/package/ntpsec/ntpd.service
new file mode 100644
index 0000000..b7db4a2
--- /dev/null
+++ b/package/ntpsec/ntpd.service
@@ -0,0 +1,15 @@ 
+[Unit]
+Description=Network Time Service
+After=network.target
+
+[Service]
+Type=forking
+PIDFile=/run/ntpd.pid
+# Turn off DNSSEC validation for hostname look-ups, since those need the
+# correct time to work, but we likely won't acquire that without NTP. Let's
+# break this chicken-and-egg cycle here.
+Environment=SYSTEMD_NSS_RESOLVE_VALIDATE=0
+ExecStart=/usr/sbin/ntpd @NTPD_EXTRA_ARGS@ -g -p /run/ntpd.pid
+
+[Install]
+WantedBy=multi-user.target
diff --git a/package/ntpsec/ntpsec.hash b/package/ntpsec/ntpsec.hash
new file mode 100644
index 0000000..49dc4e4
--- /dev/null
+++ b/package/ntpsec/ntpsec.hash
@@ -0,0 +1,4 @@ 
+# Locally calculated
+sha256  71c9f4bde6953bbc048bbaf278da81c451a56cc08d6772542b4ad37c67d72e89  ntpsec-NTPsec_1_2_1.tar.bz2
+sha256  b4db4de3317c3b0554ed91eb692968800bdfd6ad2c16ffbeee8ce4895ed91da4  LICENSE.adoc
+sha256  d3b21470adadd9abd9c6d675378f8c371ac5a4ea6dbec91859e02fadca3c0856  docs/copyright.adoc
diff --git a/package/ntpsec/ntpsec.mk b/package/ntpsec/ntpsec.mk
new file mode 100644
index 0000000..55b4bb0
--- /dev/null
+++ b/package/ntpsec/ntpsec.mk
@@ -0,0 +1,85 @@ 
+################################################################################
+#
+# ntpsec
+#
+################################################################################
+
+NTPSEC_VERSION_MAJOR = 1
+NTPSEC_VERSION_MINOR = 2
+NTPSEC_VERSION_POINT = 1
+NTPSEC_VERSION = $(NTPSEC_VERSION_MAJOR)_$(NTPSEC_VERSION_MINOR)_$(NTPSEC_VERSION_POINT)
+NTPSEC_SOURCE = ntpsec-NTPsec_$(NTPSEC_VERSION).tar.bz2
+NTPSEC_SITE = https://gitlab.com/NTPsec/ntpsec/-/archive/NTPsec_$(NTPSEC_VERSION)
+NTPSEC_LICENSE = BSD-2-Clause NTP BSD-3-Clause MIT
+NTPSEC_LICENSE_FILES = LICENSE.adoc docs/copyright.adoc
+
+NTPSEC_CPE_ID_VENDOR = ntpsec
+NTPSEC_CPE_ID_VERSION = $(NTPSEC_VERSION_MAJOR).$(NTPSEC_VERSION_MINOR)
+NTPSEC_CPE_ID_UPDATE = $(NTPSEC_VERSION_POINT)
+
+NTPSEC_DEPENDENCIES = \
+	$(if $(BR2_PACKAGE_PYTHON),python,python3) \
+	libbsd \
+	pps-tools
+
+NTPSEC_PYVER = $(if $(BR2_PACKAGE_PYTHON),python$(PYTHON_VERSION_MAJOR),python$(PYTHON3_VERSION_MAJOR))
+
+NTPSEC_CONF_OPTS = \
+	CC=$(HOSTCC) \
+	PYTHON_CONFIG="$(STAGING_DIR)/usr/bin/$(if $(BR2_PACKAGE_PYTHON),python,python3)-config" \
+	--cross-compiler="$(TARGET_CC)" \
+	--cross-cflags="$(TARGET_CFLAGS) -std=gnu99" \
+	--cross-ldflags="$(TARGET_LDFLAGS)" \
+	--notests \
+	--disable-mdns-registration \
+	--enable-pylib=ffi \
+	--nopyc \
+	--nopyo \
+	--nopycache \
+	--disable-doc \
+	--disable-manpage \
+	--refclock=all \
+	--libdir=/usr/lib/$(NTPSEC_PYVER)/site-packages/ntp
+
+ifeq ($(BR2_PACKAGE_NTPSEC_CLASSIC_MODE),y)
+NTPSEC_CONF_OPTS += --enable-classic-mode
+endif
+
+ifeq ($(BR2_PACKAGE_NTPSEC_NTS),y)
+NTPSEC_DEPENDENCIES += openssl
+else
+NTPSEC_CONF_OPTS += --disable-nts
+endif
+
+ifeq ($(BR2_PACKAGE_NTPSEC_EARLY_DROPROOT),y)
+NTPSEC_DEPENDENCIES += libcap
+NTPSEC_CONF_OPTS += --enable-early-droproot
+endif
+
+ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_SMEAR),y)
+NTPSEC_CONF_OPTS += --enable-leap-smear
+endif
+
+ifeq ($(BR2_PACKAGE_NTPSEC_LEAP_TESTING),y)
+NTPSEC_CONF_OPTS += --enable-leap-testing
+endif
+
+define NTPSEC_INSTALL_NTPSEC_CONF
+	$(INSTALL) -m 644 package/ntpsec/ntpd.etc.conf $(TARGET_DIR)/etc/ntp.conf
+endef
+NTPSEC_POST_INSTALL_TARGET_HOOKS += NTPSEC_INSTALL_NTPSEC_CONF
+
+define NTPSEC_INSTALL_INIT_SYSV
+	$(INSTALL) -D -m 755 $(NTPSEC_PKGDIR)/S49ntp $(TARGET_DIR)/etc/init.d/S49ntp
+endef
+
+define NTPSEC_INSTALL_INIT_SYSTEMD
+	$(INSTALL) -D -m 644 $(NTPSEC_PKGDIR)/ntpd.service \
+		$(TARGET_DIR)/usr/lib/systemd/system/ntpd.service
+endef
+
+define NTPSEC_USERS
+	ntp -1 ntp -1 * - - - ntpd user
+endef
+
+$(eval $(waf-package))