Mon Mar 25 15:40:35 2019 UTC ()
ntpsec: import ntpsec-1.1.3

A secure, hardened, and improved implementation of Network Time Protocol
derived from NTP Classic, Dave Mills's original.


(tnn)
diff -r0 -r1.1 pkgsrc/time/ntpsec/DESCR
diff -r0 -r1.1 pkgsrc/time/ntpsec/Makefile
diff -r0 -r1.1 pkgsrc/time/ntpsec/PLIST
diff -r0 -r1.1 pkgsrc/time/ntpsec/distinfo
diff -r0 -r1.1 pkgsrc/time/ntpsec/files/ntpd.sh
diff -r0 -r1.1 pkgsrc/time/ntpsec/patches/patch-pylib_poly.py
diff -r0 -r1.1 pkgsrc/time/ntpsec/patches/patch-wafhelpers_waf.py
diff -r0 -r1.1 pkgsrc/time/ntpsec/patches/patch-wscript

File Added: pkgsrc/time/ntpsec/DESCR
A secure, hardened, and improved implementation of Network Time Protocol
derived from NTP Classic, Dave Mills's original.

File Added: pkgsrc/time/ntpsec/Makefile
# $NetBSD: Makefile,v 1.1 2019/03/25 15:40:35 tnn Exp $

DISTNAME=	ntpsec-1.1.3
CATEGORIES=	time
MASTER_SITES=	http://ftp.ntpsec.org/pub/releases/

MAINTAINER=	pkgsrc-users@NetBSD.org
HOMEPAGE=	ftp://ftp.ntpsec.org/pub/releases/
COMMENT=	Hardened & improved NTP implementation derived from NTP Classic
LICENSE=	cc-by-v4.0 AND 2-clause-bsd AND modified-bsd AND mit

DEPENDS+=	${PYPKGPREFIX}-curses-[0-9]*:../../devel/py-curses

BUILD_DEPENDS+=	asciidoc-[0-9]*:../../textproc/asciidoc
BUILD_DEPENDS+=	waf-[0-9]*:../../devel/waf

USE_TOOLS+=		bison m4 pkg-config
WAF_CONFIGURE_ARGS+=	--python=${PYTHONBIN}
# pkgsrc python PLIST logic expects all python-3.x extensions to use -O1,
# but I can't figure out how to pass it through waf, so disable precompiled
# python files for now ...
WAF_CONFIGURE_ARGS+=	--nopyc --nopyo
WAF_CONFIGURE_ARGS+=	--refclock=all
WAF_ENV+=		PYTHON_CONFIG=${PYTHONCONFIG}
WAF_ENV+=		BIN_A2X=${PREFIX}/bin/a2x
WAF_ENV+=		BIN_XSLTPROC=${PREFIX}/bin/xsltproc

RCD_SCRIPTS=		ntpd
REPLACE_PYTHON+=	ntpclients/*.py
PY_PATCHPLIST=		yes

# kludge for waf-2.x; fixed upstream already. see patch-wafhelpers_waf.py.
CFLAGS+=	-I../../build -I../../include

.include "../../devel/waf/waf.mk"
# ntploggps(1) needs py-gps. But gpsd package in pkgsrc is too old.
#.include "../../geography/gpsd/buildlink3.mk"
.include "../../lang/python/application.mk"
.include "../../lang/python/extension.mk"
.include "../../security/openssl/buildlink3.mk"
BUILDLINK_DEPMETHOD.libxslt?=	build
.include "../../textproc/libxslt/buildlink3.mk"
.include "../../mk/bsd.pkg.mk"

File Added: pkgsrc/time/ntpsec/PLIST
@comment $NetBSD: PLIST,v 1.1 2019/03/25 15:40:35 tnn Exp $
bin/ntpdig
bin/ntpfrob
bin/ntpkeygen
bin/ntpleapfetch
bin/ntplogtemp
bin/ntpmon
bin/ntpq
bin/ntpsnmpd
bin/ntpsweep
bin/ntptime
bin/ntptrace
bin/ntpviz
bin/ntpwait
${PYSITELIB}/ntp/__init__.py
${PYSITELIB}/ntp/agentx.py
${PYSITELIB}/ntp/agentx_packet.py
${PYSITELIB}/ntp/control.py
${PYSITELIB}/ntp/magic.py
${PYSITELIB}/ntp/ntpc.so
${PYSITELIB}/ntp/packet.py
${PYSITELIB}/ntp/poly.py
${PYSITELIB}/ntp/statfiles.py
${PYSITELIB}/ntp/util.py
man/man1/ntpdig.1
man/man1/ntplogtemp.1
man/man1/ntpmon.1
man/man1/ntpq.1
man/man1/ntpsweep.1
man/man1/ntptrace.1
man/man1/ntpviz.1
man/man5/ntp.conf.5
man/man5/ntp.keys.5
man/man8/ntpd.8
man/man8/ntpfrob.8
man/man8/ntpkeygen.8
man/man8/ntpleapfetch.8
man/man8/ntpsnmpd.8
man/man8/ntptime.8
man/man8/ntpwait.8
sbin/ntpd

File Added: pkgsrc/time/ntpsec/distinfo
$NetBSD: distinfo,v 1.1 2019/03/25 15:40:35 tnn Exp $

SHA1 (ntpsec-1.1.3.tar.gz) = 221300deec696ad63c1540fec49b72046b2654f0
RMD160 (ntpsec-1.1.3.tar.gz) = cdaae8f682cd4cc97a37d86aca1d3196cfea0437
SHA512 (ntpsec-1.1.3.tar.gz) = df60c5fa63d4c94529ba1e8b21c7d6b5d0c9fb810ed7546a621b072725a6ff03edbd2dcbc3baf19ac3b3a9b82d7aff3ddee4ab8c93559b7065ed06a211b538c4
Size (ntpsec-1.1.3.tar.gz) = 2462330 bytes
SHA1 (patch-pylib_poly.py) = 90694c1ef806e87e74628c820659ffad26580b26
SHA1 (patch-wafhelpers_waf.py) = 9c87a5ebac7b94f5d956abf92ceb52ffa49626c8
SHA1 (patch-wscript) = 8ddb7b542f6ad805f49a94f5ceb7c80117529609

File Added: pkgsrc/time/ntpsec/files/ntpd.sh
#!@RCD_SCRIPTS_SHELL@
#
# $NetBSD: ntpd.sh,v 1.1 2019/03/25 15:40:35 tnn Exp $
#

# PROVIDE: ntpd
# REQUIRE: DAEMON
# BEFORE:  LOGIN
# KEYWORD: chrootdir

. /etc/rc.subr

name="ntpd"
rcvar=$name
command="@PREFIX@/sbin/${name}"
pidfile="/var/run/${name}.pid"
start_precmd="ntpd_precmd"
required_files="@PKG_SYSCONFDIR@/ntp.conf"

ntpd_precmd()
{
	if [ -z "$ntpd_chrootdir" ]; then
		return 0;
	fi

	# If running in a chroot cage, ensure that the appropriate files
	# exist inside the cage, as well as helper symlinks into the cage 
	# from outside.
	#
	# As this is called after the is_running and required_dir checks
	# are made in run_rc_command(), we can safely assume ${ntpd_chrootdir}
	# exists and ntpd isn't running at this point (unless forcestart
	# is used).
	#
	# Before enabling ntpd_chrootdir, ensure that:
	#	- The kernel has "pseudo-device clockctl" compiled in
	#	- /dev/clockctl is present
	#	- This is only for NetBSD at this time.
	#
	if [ ! -c "${ntpd_chrootdir}/dev/clockctl" ]; then
		rm -f "${ntpd_chrootdir}/dev/clockctl"
		( cd /dev ; /bin/pax -rw -pe clockctl "${ntpd_chrootdir}/dev" )
	fi
	ln -fs "${ntpd_chrootdir}/var/db/ntp.drift" /var/db/ntp.drift

	if [ ! -d "${ntpd_chrootdir}/etc" ]; then
		mkdir "${ntpd_chrootdir}/etc"
	fi
	if [ ! -f "${ntpd_chrootdir}/etc/services" ]; then
		(echo "ntp		123/udp"
		 echo "ntp		123/tcp") \
			> "${ntpd_chrootdir}/etc/services"
	fi
	if [ ! -d "${ntpd_chrootdir}/var/db" ]; then
		mkdir -p "${ntpd_chrootdir}/var/db"
	fi
	if [ ! -f "${ntpd_chrootdir}/var/db/services.cdb" ]; then
		services_mkdb -o "${ntpd_chrootdir}/var/db/services.cdb" \
			"${ntpd_chrootdir}/etc/services"
	fi

	#	Change run_rc_commands()'s internal copy of $ntpd_flags
	#
	rc_flags="-u ntpd:ntpd -i ${ntpd_chrootdir} $rc_flags"
}

load_rc_config $name
run_rc_command "$1"

File Added: pkgsrc/time/ntpsec/patches/Attic/patch-pylib_poly.py
$NetBSD: patch-pylib_poly.py,v 1.1 2019/03/25 15:40:35 tnn Exp $

- NetBSD fix from upstream:
  https://gitlab.com/NTPsec/ntpsec/commit/a4453ee5a4edf87cf081fe69f5c214a8b2a82b58

--- pylib/poly.py.orig	2019-01-14 05:40:59.000000000 +0000
+++ pylib/poly.py
@@ -103,9 +103,9 @@ else:  # Python 3
                                 newline="\n", line_buffering=True)
 
     # This is the one situation where we *can* force unicode.
-    if "UTF-8" != sys.stdout.encoding:
+    if "utf-8" != sys.stdout.encoding.lower():
         forced_utf8 = True
         sys.stdout = make_std_wrapper(sys.stdout)
-    if "UTF-8" != sys.stderr.encoding:
+    if "utf-8" != sys.stderr.encoding.lower():
         forced_utf8 = True
         sys.stderr = make_std_wrapper(sys.stderr)

File Added: pkgsrc/time/ntpsec/patches/Attic/patch-wafhelpers_waf.py
$NetBSD: patch-wafhelpers_waf.py,v 1.1 2019/03/25 15:40:35 tnn Exp $

Kludge for waf 2.0. Added include paths in CFLAGS in pkgsrc Makefile instead.

--- wafhelpers/waf.py.orig	2019-01-14 05:40:59.000000000 +0000
+++ wafhelpers/waf.py
@@ -6,14 +6,14 @@ from waflib.TaskGen import before_method
 @feature('bld_include')
 def insert_blddir(self):
     bldnode = self.bld.bldnode.parent.abspath()
-    self.includes += [bldnode]
+#    self.includes += [bldnode]
 
 
 @before_method('apply_incpaths')
 @feature('src_include')
 def insert_srcdir(self):
     srcnode = self.bld.srcnode.abspath()
-    self.includes += ["%s/include" % srcnode]
+#    self.includes += ["%s/include" % srcnode]
 
 
 def manpage_subst_fun(self, code):

File Added: pkgsrc/time/ntpsec/patches/patch-wscript
$NetBSD: patch-wscript,v 1.1 2019/03/25 15:40:35 tnn Exp $

- don't hardcode PREFIX
- waf-2.x support from upstream:
  https://gitlab.com/NTPsec/ntpsec/commit/ff6f50b1ce7d7c2a552b27c6e8fb19639a7bf82a

--- wscript.orig	2019-01-14 05:40:59.000000000 +0000
+++ wscript
@@ -536,20 +536,12 @@ int main(int argc, char **argv) {
 
     # XXX: hack
     if ctx.env.DEST_OS in ["freebsd", "openbsd"]:
-        ctx.env.PLATFORM_INCLUDES = ["/usr/local/include"]
-        ctx.env.PLATFORM_LIBPATH = ["/usr/local/lib"]
+        pass
     elif ctx.env.DEST_OS == "netbsd":
-        ctx.env.PLATFORM_INCLUDES = ["/usr/pkg/include"]
-        ctx.env.PLATFORM_LIBPATH = ["/usr/lib", "/usr/pkg/lib"]
+        pass
     elif ctx.env.DEST_OS == "win32":
         ctx.load("msvc")
     elif ctx.env.DEST_OS == "darwin":
-        # macports location
-        if os.path.isdir("/opt/local/include"):
-            ctx.env.PLATFORM_INCLUDES = ["/opt/local/include"]
-        if os.path.isdir("/opt/local/lib"):
-            ctx.env.PLATFORM_LIBPATH = ["/opt/local/lib"]
-        # OS X needs this for IPv6
         ctx.define("__APPLE_USE_RFC_3542", 1,
                    comment="Needed for IPv6 support")
     elif ctx.env.DEST_OS == "sunos":
@@ -558,6 +550,29 @@ int main(int argc, char **argv) {
         ctx.define("_POSIX_C_SOURCE", "200112L", quote=False)
         ctx.define("__EXTENSIONS__", "1", quote=False)
 
+    # Borrowed from waf-1.9, when type_name and field_name were valid keywords
+    SNIP_TYPE = '''
+    int main(int argc, char **argv) {
+        (void)argc; (void)argv;
+        if ((%(type_name)s *) 0) return 0;
+        if (sizeof (%(type_name)s)) return 0;
+        return 1;
+    }
+    '''
+
+    SNIP_FIELD = '''
+    #include <stddef.h>
+    int main(int argc, char **argv) {
+        char *off;
+        (void)argc; (void)argv;
+        off = (char*) &((%(type_name)s*)0)->%(field_name)s;
+        return (size_t) off < sizeof(%(type_name)s);
+    }
+    '''
+
+    def to_header(header_name):
+        return ''.join(['#include <%s>\n' % x for x in Utils.to_list(header_name)])
+
     structures = (
         ("struct if_laddrconf", ["sys/types.h", "net/if6.h"], False),
         ("struct if_laddrreq", ["sys/types.h", "net/if6.h"], False),
@@ -565,14 +580,12 @@ int main(int argc, char **argv) {
         ("struct ntptimeval", ["sys/time.h", "sys/timex.h"], False),
     )
     for (s, h, r) in structures:
-        ctx.check_cc(type_name=s, header_name=h, mandatory=r)
-
-    # waf's SNIP_FIELD should likely include this header itself
-    # This is needed on some systems to get size_t for following checks
-    ctx.check_cc(auto_add_header_name=True,
-                 header_name="stddef.h",
-                 define_name="",           # omit from config.h
-                 mandatory=False)
+        ctx.check_cc(
+            fragment=to_header(h) + SNIP_TYPE % {'type_name': s},
+            msg='Checking for type %s' % s,
+            define_name=ctx.have_define(s.upper()),
+            mandatory=r,
+        )
 
     structure_fields = (
         ("struct timex", "time_tick", ["sys/time.h", "sys/timex.h"]),
@@ -582,7 +595,12 @@ int main(int argc, char **argv) {
         # first in glibc 2.12
     )
     for (s, f, h) in structure_fields:
-        ctx.check_cc(type_name=s, field_name=f, header_name=h, mandatory=False)
+        ctx.check_cc(
+            fragment=to_header(h) + SNIP_FIELD % {'type_name': s, 'field_name': f},
+            msg='Checking for field %s in %s' % (f, s),
+            define_name=ctx.have_define((s + '_' + f).upper()),
+            mandatory=False,
+        )
 
     # mostly used by timetoa.h and timespecops.h
     sizeofs = [