diff options
-rw-r--r-- | user/chrony/APKBUILD | 99 | ||||
-rw-r--r-- | user/chrony/chrony.conf | 10 | ||||
-rw-r--r-- | user/chrony/chrony.logrotate | 12 | ||||
-rw-r--r-- | user/chrony/chrony.pre-install | 6 | ||||
l--------- | user/chrony/chrony.pre-upgrade | 1 | ||||
-rw-r--r-- | user/chrony/chronyd.confd | 15 | ||||
-rw-r--r-- | user/chrony/chronyd.initd | 71 | ||||
-rw-r--r-- | user/chrony/fix-tests.patch | 12 | ||||
-rw-r--r-- | user/chrony/max_resolve_interval.patch | 13 | ||||
-rw-r--r-- | user/chrony/timepps.h | 216 |
10 files changed, 455 insertions, 0 deletions
diff --git a/user/chrony/APKBUILD b/user/chrony/APKBUILD new file mode 100644 index 000000000..494b70946 --- /dev/null +++ b/user/chrony/APKBUILD @@ -0,0 +1,99 @@ +# Contributor: Łukasz Jendrysik +# Contributor: Sören Tempel <soeren+alpine@soeren-tempel.net> +# Contributor: Natanael Copa <ncopa@alpinelinux.org> +# Maintainer: Dan Theisen <djt@hxx.in> +pkgname=chrony +pkgver=3.3 +pkgrel=0 +_ver=${pkgver/_/-} +pkgdesc="NTP client and server programs" +url="https://chrony.tuxfamily.org" +pkgusers="$pkgname" +pkggroups="$pkgname" +arch="all" +license="GPL-2.0-only" +install="$pkgname.pre-install $pkgname.pre-upgrade" +depends="" +makedepends="asciidoctor libcap-dev texinfo" +checkdepends="bash" +subpackages="$pkgname-doc $pkgname-openrc" +source="https://download.tuxfamily.org/$pkgname/$pkgname-$_ver.tar.gz + fix-tests.patch + max_resolve_interval.patch + chronyd.confd + chronyd.initd + chrony.logrotate + chrony.conf + timepps.h + " +builddir="$srcdir/$pkgname-$_ver" + +prepare() { + default_prepare + + # We copy timepps.h to the local build directory instead of + # creating a pps-tools-dev package for ppstime.h + # (See https://github.com/ago/pps-tools) + # + # Adelie TODO: This is originally an Alpine hack, however it looks like + # the pps-tools upstream is currently dead, we should determine if this + # is the right solution going forward. + mkdir -p pps-tools/sys + cp "$srcdir"/timepps.h pps-tools/sys/ +} + +build() { + cd "$builddir" + CPPFLAGS="$CPPFLAGS -I./pps-tools/" ./configure \ + --prefix=/usr \ + --infodir=/usr/share/info \ + --mandir=/usr/share/man \ + --sysconfdir=/etc/$pkgname \ + --disable-readline \ + --with-user=$pkgname \ + --with-sendmail=/usr/sbin/sendmail \ + --enable-ntp-signd + make all docs +} + +check() { + cd "$builddir" + make check +} + +package() { + cd "$builddir" + make DESTDIR="$pkgdir" install + + mkdir -p "$pkgdir"/etc/logrotate.d + install -Dm644 "$srcdir"/chrony.logrotate "$pkgdir"/etc/logrotate.d/chrony + + mkdir -p "$pkgdir"/usr/share/doc/chrony + install -m644 examples/*.example "$pkgdir"/usr/share/doc/chrony/ + install -Dm755 "$srcdir"/chronyd.initd "$pkgdir"/etc/init.d/chronyd + install -Dm644 "$srcdir"/chronyd.confd "$pkgdir"/etc/conf.d/chronyd + + mkdir -p "$pkgdir"/var/lib/chrony \ + "$pkgdir"/etc/chrony + + # allow chrony to write logs, and wheel users to read them + install -dm2750 -o $pkgusers -g wheel "$pkgdir"/var/log/chrony + + # chrony shouldn't be able to modify its own config + chown $pkgusers:$pkggroups "$pkgdir"/etc/chrony + install -m644 -o root -g root "$srcdir"/chrony.conf \ + "$pkgdir"/etc/chrony/chrony.conf + + # chrony.drift must be writable by chrony user + touch "$pkgdir"/var/lib/chrony/chrony.drift + chown -R $pkgusers:$pkggroups "$pkgdir"/var/lib/chrony +} + +sha512sums="36975d863599141e8e5b071d35cf67326b27f5b0da7ec942dbb4530377d10472b0729eea632e0702718b515cb2d5fd41a7eba158e6dade7f05adfb1bdffa5df0 chrony-3.3.tar.gz +067d47224a8c075ec8f63ffc58e65b030fdf228a72c4f03d50a2f2c17414da65bb5d27c7c2e4ba99e909f452041db83eaebe3c9e34c0c8fce18e05ebb489735e fix-tests.patch +b26581ed32680585edea5b8163a0062a87f648394c0f363c77a7d01a36608fcf4d005d9e6ab179ed2827b8a08f598f7bad4801bb5e135cad5107eb77fb19b247 max_resolve_interval.patch +1ebb72341b4421060a43d6db164d743de9144f1c23370e052f0db92a17e5e34f24ac98baddeb5dbfef27f67479142d448c4401d927394e55024760730a27e8de chronyd.confd +9a18c9744d7b78d9b9be3f0ae0b43cb988b294c342764802e0d5df835d450e748584c0b345f7161f14d84e15c8bbd491514ee9dc45e4a65f1276c52124d2e312 chronyd.initd +ab38f06bf45888846778ad935e24abb30d13b6805e9a750bc694ff953695fa8c5b33aac560f5f7f96dc46031c1a38660e5c418b6fce6fb34a87908a9a3c99357 chrony.logrotate +e2699b8b023e3a4e3d1304296c605842669b9daa275927d8c12caf30dd859c53ab3dab4efe96f2572d70044234a1f352ef917668507d0e72de9f5cdc8fb37d1a chrony.conf +eb11fc19243d1789016d88eb7645bfe67c46304547781489bf36eb1dd4c252d523681ff835a6488fa0ef62b6b9e2f781c672279f4439f5d5640a3f214a113048 timepps.h" diff --git a/user/chrony/chrony.conf b/user/chrony/chrony.conf new file mode 100644 index 000000000..e2d26cd62 --- /dev/null +++ b/user/chrony/chrony.conf @@ -0,0 +1,10 @@ +# default config +# TODO: update pools to adelie vendor zone when it is assigned +pool pool.ntp.org iburst +initstepslew 10 pool.ntp.org +driftfile /var/lib/chrony/chrony.drift +rtcsync + +# check /etc/conf.d/chrony if you want daemon logs to go to syslog +# this setting specifies where statistics go +logdir /var/log/chrony diff --git a/user/chrony/chrony.logrotate b/user/chrony/chrony.logrotate new file mode 100644 index 000000000..4461a3063 --- /dev/null +++ b/user/chrony/chrony.logrotate @@ -0,0 +1,12 @@ +/var/log/chrony/*.log { + missingok + sharedscripts + postrotate + PASSWORD=`awk '$1 ~ /^1$/ {print $2; exit}' /etc/chrony/chrony.keys` + cat << EOF | /usr/bin/chronyc | sed '/^200 OK$/d' + password $PASSWORD + cyclelogs +EOF + endscript +} + diff --git a/user/chrony/chrony.pre-install b/user/chrony/chrony.pre-install new file mode 100644 index 000000000..897fb74cc --- /dev/null +++ b/user/chrony/chrony.pre-install @@ -0,0 +1,6 @@ +#!/bin/sh + +addgroup -S chrony 2>/dev/null +adduser -S -D -h /var/log/chrony -s /sbin/nologin -G chrony -g chrony chrony 2>/dev/null + +exit 0 diff --git a/user/chrony/chrony.pre-upgrade b/user/chrony/chrony.pre-upgrade new file mode 120000 index 000000000..ff5c83698 --- /dev/null +++ b/user/chrony/chrony.pre-upgrade @@ -0,0 +1 @@ +chrony.pre-install
\ No newline at end of file diff --git a/user/chrony/chronyd.confd b/user/chrony/chronyd.confd new file mode 100644 index 000000000..18bc673cf --- /dev/null +++ b/user/chrony/chronyd.confd @@ -0,0 +1,15 @@ +# /etc/conf.d/chronyd + +CFGFILE="/etc/chrony/chrony.conf" + +# Configuration dependant options : +# -s - Set system time from RTC if rtcfile directive present +# -r - Reload sample histories if dumponexit directive present +# +# The combination of "-s -r" allows chronyd to perform long term averaging of +# the gain or loss rate across system reboots and shutdowns. +# +# -l <file> - specifies a file which should be used for logging instead +# of syslog or terminal + +ARGS="-l /var/log/chrony/daemon.log" diff --git a/user/chrony/chronyd.initd b/user/chrony/chronyd.initd new file mode 100644 index 000000000..771bb5b53 --- /dev/null +++ b/user/chrony/chronyd.initd @@ -0,0 +1,71 @@ +#!/sbin/openrc-run +# Copyright 1999-2007 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-misc/chrony/files/chronyd.rc,v 1.8 2007/03/22 14:32:09 tove Exp $ + +description="NTP daemon" + +depend() { + need net + after firewall + provide ntp-client ntp-server + use dns +} + +checkconfig() { + # Note that /etc/chrony/chrony.keys is *NOT* checked. This + # is because the user may have specified another key + # file, and we don't want to force the user to use that + # exact name for the key file. + if [ ! -f "${CFGFILE}" ] ; then + eerror "Please create ${CFGFILE} and the" + eerror "chrony key file (usually /etc/chrony/chrony.keys)" + eerror "by using the" + eerror "" + eerror " chrony.conf.example" + eerror " chrony.keys.example" + eerror "" + eerror "files (from the documentation directory)" + eerror "as templates." + return 1 + else + # Actually, I tried it, and chrony seems to ignore the pidfile + # option. I'm going to leave it here anyway, since you never + # know if it might be handy + PIDFILE=`awk '/^ *pidfile/{print $2}' "${CFGFILE}"` + fi + return 0 +} + +setxtrarg() { + if [ -c /dev/rtc ]; then + grep -q '^rtcfile' "${CFGFILE}" && ARGS="${ARGS} -s" + fi + grep -q '^dumponexit$' "${CFGFILE}" && ARGS="${ARGS} -r" + return 0 +} + +start() { + checkconfig || return $? + setxtrarg + + [ -n "${PIDFILE}" ] || PIDFILE=/var/run/chronyd.pid + + ebegin "Starting chronyd" + start-stop-daemon --start --quiet \ + --exec /usr/sbin/chronyd \ + --pidfile "${PIDFILE}" \ + -- -f "${CFGFILE}" ${ARGS} + eend $? "Failed to start chronyd" +} + +stop() { + checkconfig || return $? + + [ -n "${PIDFILE}" ] || PIDFILE=/var/run/chronyd.pid + + ebegin "Stopping chronyd" + start-stop-daemon --stop --quiet \ + --pidfile "${PIDFILE}" + eend $? "Failed to stop chronyd" +} diff --git a/user/chrony/fix-tests.patch b/user/chrony/fix-tests.patch new file mode 100644 index 000000000..6291fb046 --- /dev/null +++ b/user/chrony/fix-tests.patch @@ -0,0 +1,12 @@ +diff -upr chrony-3.2.orig/test/unit/test.c chrony-3.2/test/unit/test.c +--- chrony-3.2.orig/test/unit/test.c 2017-11-29 11:32:23.610059580 +0100 ++++ chrony-3.2/test/unit/test.c 2017-11-29 11:32:51.213742887 +0100 +@@ -23,6 +23,8 @@ + #include <logging.h> + #include <localp.h> + ++#include <sys/param.h> ++ + #include "test.h" + + void diff --git a/user/chrony/max_resolve_interval.patch b/user/chrony/max_resolve_interval.patch new file mode 100644 index 000000000..6343d9122 --- /dev/null +++ b/user/chrony/max_resolve_interval.patch @@ -0,0 +1,13 @@ +Try fix behaviour when network is not available at bootup + +--- ./ntp_sources.c.orig ++++ ./ntp_sources.c +@@ -87,7 +85,7 @@ + + #define RESOLVE_INTERVAL_UNIT 7 + #define MIN_RESOLVE_INTERVAL 2 +-#define MAX_RESOLVE_INTERVAL 9 ++#define MAX_RESOLVE_INTERVAL 6 + #define MIN_REPLACEMENT_INTERVAL 8 + + static struct UnresolvedSource *unresolved_sources = NULL; diff --git a/user/chrony/timepps.h b/user/chrony/timepps.h new file mode 100644 index 000000000..8c3bd835d --- /dev/null +++ b/user/chrony/timepps.h @@ -0,0 +1,216 @@ +/* + * timepps.h -- PPS API main header + * + * Copyright (C) 2005-2007 Rodolfo Giometti <giometti@linux.it> + * Copyright (C) 2009-2011 Alexander Gordeev <alex@gordick.net> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * Source: https://github.com/ago/pps-tools/ - Retreived Dec 2013 + */ + +#ifndef _SYS_TIMEPPS_H_ +#define _SYS_TIMEPPS_H_ + +#include <errno.h> +#include <sys/time.h> +#include <sys/ioctl.h> +#include <linux/types.h> +#include <linux/pps.h> + +#define LINUXPPS 1 /* signal we are using LinuxPPS */ + +/* + * New data structures + */ + +struct ntp_fp { + unsigned int integral; + unsigned int fractional; +}; + +union pps_timeu { + struct timespec tspec; + struct ntp_fp ntpfp; + unsigned long longpad[3]; +}; + +struct pps_info { + unsigned long assert_sequence; /* seq. num. of assert event */ + unsigned long clear_sequence; /* seq. num. of clear event */ + union pps_timeu assert_tu; /* time of assert event */ + union pps_timeu clear_tu; /* time of clear event */ + int current_mode; /* current mode bits */ +}; + +struct pps_params { + int api_version; /* API version # */ + int mode; /* mode bits */ + union pps_timeu assert_off_tu; /* offset compensation for assert */ + union pps_timeu clear_off_tu; /* offset compensation for clear */ +}; + +typedef int pps_handle_t; /* represents a PPS source */ +typedef unsigned long pps_seq_t; /* sequence number */ +typedef struct ntp_fp ntp_fp_t; /* NTP-compatible time stamp */ +typedef union pps_timeu pps_timeu_t; /* generic data type for time stamps */ +typedef struct pps_info pps_info_t; +typedef struct pps_params pps_params_t; + +#define assert_timestamp assert_tu.tspec +#define clear_timestamp clear_tu.tspec + +#define assert_timestamp_ntpfp assert_tu.ntpfp +#define clear_timestamp_ntpfp clear_tu.ntpfp + +#define assert_offset assert_off_tu.tspec +#define clear_offset clear_off_tu.tspec + +#define assert_offset_ntpfp assert_off_tu.ntpfp +#define clear_offset_ntpfp clear_off_tu.ntpfp + +/* + * The PPS API + */ + +static __inline int time_pps_create(int source, pps_handle_t *handle) +{ + int ret; + struct pps_kparams dummy; + + if (!handle) { + errno = EINVAL; + return -1; + } + + /* First we check if current device is a valid PPS one by + * doing a dummy PPS_GETPARAMS... + */ + ret = ioctl(source, PPS_GETPARAMS, &dummy); + if (ret) { + errno = EOPNOTSUPP; + return -1; + } + + /* ... then since in LinuxPPS there are no differences between a + * "PPS source" and a "PPS handle", we simply return the same value. + */ + *handle = source; + + return 0; +} + +static __inline int time_pps_destroy(pps_handle_t handle) +{ + return close(handle); +} + +static __inline int time_pps_getparams(pps_handle_t handle, + pps_params_t *ppsparams) +{ + int ret; + struct pps_kparams __ppsparams; + + ret = ioctl(handle, PPS_GETPARAMS, &__ppsparams); + + ppsparams->api_version = __ppsparams.api_version; + ppsparams->mode = __ppsparams.mode; + ppsparams->assert_off_tu.tspec.tv_sec = __ppsparams.assert_off_tu.sec; + ppsparams->assert_off_tu.tspec.tv_nsec = __ppsparams.assert_off_tu.nsec; + ppsparams->clear_off_tu.tspec.tv_sec = __ppsparams.clear_off_tu.sec; + ppsparams->clear_off_tu.tspec.tv_nsec = __ppsparams.clear_off_tu.nsec; + + return ret; +} + +static __inline int time_pps_setparams(pps_handle_t handle, + const pps_params_t *ppsparams) +{ + struct pps_kparams __ppsparams; + + __ppsparams.api_version = ppsparams->api_version; + __ppsparams.mode = ppsparams->mode; + __ppsparams.assert_off_tu.sec = ppsparams->assert_off_tu.tspec.tv_sec; + __ppsparams.assert_off_tu.nsec = ppsparams->assert_off_tu.tspec.tv_nsec; + __ppsparams.clear_off_tu.sec = ppsparams->clear_off_tu.tspec.tv_sec; + __ppsparams.clear_off_tu.nsec = ppsparams->clear_off_tu.tspec.tv_nsec; + + return ioctl(handle, PPS_SETPARAMS, &__ppsparams); +} + +/* Get capabilities for handle */ +static __inline int time_pps_getcap(pps_handle_t handle, int *mode) +{ + return ioctl(handle, PPS_GETCAP, mode); +} + +static __inline int time_pps_fetch(pps_handle_t handle, const int tsformat, + pps_info_t *ppsinfobuf, + const struct timespec *timeout) +{ + struct pps_fdata __fdata; + int ret; + + /* Sanity checks */ + if (tsformat != PPS_TSFMT_TSPEC) { + errno = EINVAL; + return -1; + } + + if (timeout) { + __fdata.timeout.sec = timeout->tv_sec; + __fdata.timeout.nsec = timeout->tv_nsec; + __fdata.timeout.flags = ~PPS_TIME_INVALID; + } else + __fdata.timeout.flags = PPS_TIME_INVALID; + + ret = ioctl(handle, PPS_FETCH, &__fdata); + + ppsinfobuf->assert_sequence = __fdata.info.assert_sequence; + ppsinfobuf->clear_sequence = __fdata.info.clear_sequence; + ppsinfobuf->assert_tu.tspec.tv_sec = __fdata.info.assert_tu.sec; + ppsinfobuf->assert_tu.tspec.tv_nsec = __fdata.info.assert_tu.nsec; + ppsinfobuf->clear_tu.tspec.tv_sec = __fdata.info.clear_tu.sec; + ppsinfobuf->clear_tu.tspec.tv_nsec = __fdata.info.clear_tu.nsec; + ppsinfobuf->current_mode = __fdata.info.current_mode; + + return ret; +} + +#ifdef PPS_KC_BIND + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + struct pps_bind_args __bind_args; + + __bind_args.tsformat = tsformat; + __bind_args.edge = edge; + __bind_args.consumer = kernel_consumer; + + return ioctl(handle, PPS_KC_BIND, &__bind_args); +} + +#else /* !PPS_KC_BIND */ + +static __inline int time_pps_kcbind(pps_handle_t handle, + const int kernel_consumer, + const int edge, const int tsformat) +{ + /* LinuxPPS doesn't implement kernel consumer feature */ + errno = EOPNOTSUPP; + return -1; +} + +#endif /* PPS_KC_BIND */ + +#endif /* _SYS_TIMEPPS_H_ */ |