diff options
Diffstat (limited to 'main/chrony')
-rw-r--r-- | main/chrony/APKBUILD | 60 | ||||
-rw-r--r-- | main/chrony/chrony-1.20-chrony.conf.example-gentoo.diff | 46 | ||||
-rw-r--r-- | main/chrony/chrony-1.20-conf.c-gentoo.diff | 11 | ||||
-rw-r--r-- | main/chrony/chrony-1.21-makefile.diff | 15 | ||||
-rw-r--r-- | main/chrony/chrony-1.23-reply-ip.diff | 242 | ||||
-rw-r--r-- | main/chrony/chrony-1.23-sources.diff | 56 | ||||
-rw-r--r-- | main/chrony/chrony.conf | 7 | ||||
-rw-r--r-- | main/chrony/chronyd.confd | 18 | ||||
-rw-r--r-- | main/chrony/chronyd.initd | 58 |
9 files changed, 513 insertions, 0 deletions
diff --git a/main/chrony/APKBUILD b/main/chrony/APKBUILD new file mode 100644 index 000000000..21f8924a6 --- /dev/null +++ b/main/chrony/APKBUILD @@ -0,0 +1,60 @@ +# Maintainer: Natanael Copa <ncopa@alpinelinux.org> +pkgname=chrony +pkgver=1.23 +pkgrel=2 +pkgdesc="NTP client and server programs" +url="http://chrony.sunsite.dk/" +license="GPL-2" +depends= +makedepends="texinfo" +subpackages="$pkgname-doc" +source="http://chrony.sunsite.dk/download/$pkgname-$pkgver.tar.gz + $pkgname-1.20-conf.c-gentoo.diff + $pkgname-1.20-chrony.conf.example-gentoo.diff + $pkgname-1.21-makefile.diff + $pkgname-1.23-sources.diff + $pkgname-1.23-reply-ip.diff + chronyd.confd + chronyd.initd + chrony.conf + " + +build() { + local i + cd "$srcdir/$pkgname-$pkgver" + + for i in ../*.diff; do + msg "Applying $i" + patch -p1 < $i || return 1 + done + sed -i "s:/etc/chrony:/etc/chrony/chrony:g" \ + chrony*.[158] faq.txt chrony.texi || die "sed failed" + + ./configure --prefix=/usr \ + --infodir=/usr/share/info \ + --mandir=/usr/share/man \ + --disable-readline + + make all docs || return 1 + make DESTDIR="$pkgdir" install + + mv "$pkgdir"/usr/doc "$pkgdir"/usr/share/ + install -D -m644 examples/*.example "$pkgdir"/usr/share/doc/chrony/ + + install -m755 -D "$srcdir"/chronyd.initd "$pkgdir"/etc/init.d/chronyd + install -m644 -D "$srcdir"/chronyd.confd "$pkgdir"/etc/conf.d/chronyd + mkdir -p "$pkgdir"/var/lib/chrony \ + "$pkgdir"/var/log/chrony \ + "$pkgdir"/etc/chrony + touch "$pkgdir"/etc/chrony/chrony.drift + install -m644 "$srcdir"/chrony.conf "$pkgdir"/etc/chrony/chrony.conf +} +md5sums="ffce77695e55d8efda19ab0b78309c23 chrony-1.23.tar.gz +bd6bd57363865d3ed0c3187d0c9f7151 chrony-1.20-conf.c-gentoo.diff +b2a23e02f7af50bebdd5d18bccdedbf0 chrony-1.20-chrony.conf.example-gentoo.diff +d47015a34b6b2f9eebca77ef939cec72 chrony-1.21-makefile.diff +39cbce9f66638b67623e1ee6bb0f943f chrony-1.23-sources.diff +caa6589a1a1cd56f64957e312d1ef84c chrony-1.23-reply-ip.diff +d5c09be46226774d22c08c5a4c28093a chronyd.confd +dac8aa4913d7c323abfa1719ddd7e5e4 chronyd.initd +46f42c52953d398ca44d6baa449618d7 chrony.conf" diff --git a/main/chrony/chrony-1.20-chrony.conf.example-gentoo.diff b/main/chrony/chrony-1.20-chrony.conf.example-gentoo.diff new file mode 100644 index 000000000..498b24175 --- /dev/null +++ b/main/chrony/chrony-1.20-chrony.conf.example-gentoo.diff @@ -0,0 +1,46 @@ +--- a/examples/chrony.conf.example.orig 2003-06-16 11:59:01.000000000 -0400 ++++ b/examples/chrony.conf.example 2003-06-16 12:00:13.000000000 -0400 +@@ -3,5 +3,5 @@ + # + # This is an example chrony configuration file. You should copy it to +-# /etc/chrony.conf after uncommenting and editing the options that you ++# /etc/chrony/chrony.conf after uncommenting and editing the options that you + # want to enable. I have not included the more obscure options. Refer + # to the documentation for these. +@@ -91,5 +91,5 @@ + # generally want this, so it is uncommented. + +-driftfile /etc/chrony.drift ++driftfile /etc/chrony/chrony.drift + + # If you want to use the program called chronyc to configure aspects of +@@ -100,5 +100,5 @@ + # assumed by default. + +-keyfile /etc/chrony.keys ++keyfile /etc/chrony/chrony.keys + + # Tell chronyd which numbered key in the file is used as the password +@@ -158,6 +158,6 @@ + ! log measurements statistics tracking + +-If you have real time clock support enabled (see below), you might want +-this line instead: ++# If you have real time clock support enabled (see below), you might want ++# this line instead: + + ! log measurements statistics tracking rtc +@@ -269,5 +269,5 @@ + # kernel. (Note, these options apply only to Linux.) + +-! rtcfile /etc/chrony.rtc ++! rtcfile /etc/chrony/chrony.rtc + + # Your RTC can be set to keep Universal Coordinated Time (UTC) or local +@@ -285,5 +285,5 @@ + # using devfs), uncomment and edit the following line. + +-! rtcdevice /dev/misc/rtc ++rtcdevice /dev/misc/rtc + + ####################################################################### diff --git a/main/chrony/chrony-1.20-conf.c-gentoo.diff b/main/chrony/chrony-1.20-conf.c-gentoo.diff new file mode 100644 index 000000000..4917d445b --- /dev/null +++ b/main/chrony/chrony-1.20-conf.c-gentoo.diff @@ -0,0 +1,11 @@ +--- a/conf.c.orig Sun May 12 14:07:31 2002 ++++ b/conf.c Sun May 12 14:07:52 2002 +@@ -45,7 +45,7 @@ + + /* ================================================== */ + +-#define DEFAULT_CONF_FILE "/etc/chrony.conf" ++#define DEFAULT_CONF_FILE "/etc/chrony/chrony.conf" + + /* ================================================== */ + /* Forward prototypes */ diff --git a/main/chrony/chrony-1.21-makefile.diff b/main/chrony/chrony-1.21-makefile.diff new file mode 100644 index 000000000..2eec4e842 --- /dev/null +++ b/main/chrony/chrony-1.21-makefile.diff @@ -0,0 +1,15 @@ +--- a/Makefile.in_old 2006-08-12 17:42:57.000000000 +0200 ++++ b/Makefile.in 2006-08-12 17:44:35.000000000 +0200 +@@ -68,10 +68,10 @@ + all : chronyd chronyc + + chronyd : $(OBJS) $(EXTRA_OBJS) +- $(CC) $(OPTFLAGS) -o chronyd $(OBJS) $(EXTRA_OBJS) $(LIBS) $(EXTRA_LIBS) ++ $(CC) $(OPTFLAGS) $(LDFLAGS) -o chronyd $(OBJS) $(EXTRA_OBJS) $(LIBS) $(EXTRA_LIBS) + + chronyc : $(CLI_OBJS) +- $(CC) $(OPTFLAGS) -o chronyc $(CLI_OBJS) @READLINE_LINK@ $(LIBS) $(EXTRA_CLI_LIBS) ++ $(CC) $(OPTFLAGS) $(LDFLAGS) -o chronyc $(CLI_OBJS) @READLINE_LINK@ $(LIBS) $(EXTRA_CLI_LIBS) + + client.o : client.c + $(CC) $(CFLAGS) $(DEFS) @READLINE_COMPILE@ -c $< diff --git a/main/chrony/chrony-1.23-reply-ip.diff b/main/chrony/chrony-1.23-reply-ip.diff new file mode 100644 index 000000000..f4e5d8eff --- /dev/null +++ b/main/chrony/chrony-1.23-reply-ip.diff @@ -0,0 +1,242 @@ + +Currently, on multihomed host, when chrony is not bound to a specific +IP address, a query is sent to an interface and the default source IP +hint for the back route differs, the reply will have a source IP +different than where the query was destinied to. This will cause +problems because connection tracking firewalls will drop the replies +and most likely the client program will get confused too. + +This patch uses the IP_PKTINFO mechanism to get the IP address where +received packets where targetted to and use that IP address as source +hint when sending a reply. +--- + addressing.h | 1 + + broadcast.c | 1 + + cmdmon.c | 3 ++ + conf.c | 1 + + ntp_io.c | 92 +++++++++++++++++++++++++++++++++++++++++---------------- + 5 files changed, 72 insertions(+), 26 deletions(-) + +diff --git a/addressing.h b/addressing.h +index aa20ed9..05152f4 100644 +--- a/addressing.h ++++ b/addressing.h +@@ -36,6 +36,7 @@ + typedef struct { + unsigned long ip_addr; + unsigned short port; ++ unsigned long local_ip_addr; + } NTP_Remote_Address; + + #if 0 +diff --git a/broadcast.c b/broadcast.c +index be217e7..c979741 100644 +--- a/broadcast.c ++++ b/broadcast.c +@@ -146,6 +146,7 @@ BRD_AddDestination(unsigned long addr, unsigned short port, int interval) + + destinations[n_destinations].addr.ip_addr = addr; + destinations[n_destinations].addr.port = port; ++ destinations[n_destinations].addr.local_ip_addr = 0; + destinations[n_destinations].interval = interval; + + SCH_AddTimeoutInClass((double) interval, 1.0, +diff --git a/cmdmon.c b/cmdmon.c +index 819977c..8affb0b 100644 +--- a/cmdmon.c ++++ b/cmdmon.c +@@ -1097,6 +1097,7 @@ handle_add_server(CMD_Request *rx_message, CMD_Reply *tx_message) + + rem_addr.ip_addr = ntohl(rx_message->data.ntp_source.ip_addr); + rem_addr.port = (unsigned short)(ntohl(rx_message->data.ntp_source.port)); ++ rem_addr.local_ip_addr = 0; + params.minpoll = ntohl(rx_message->data.ntp_source.minpoll); + params.maxpoll = ntohl(rx_message->data.ntp_source.maxpoll); + params.presend_minpoll = ntohl(rx_message->data.ntp_source.presend_minpoll); +@@ -1133,6 +1134,7 @@ handle_add_peer(CMD_Request *rx_message, CMD_Reply *tx_message) + + rem_addr.ip_addr = ntohl(rx_message->data.ntp_source.ip_addr); + rem_addr.port = (unsigned short)(ntohl(rx_message->data.ntp_source.port)); ++ rem_addr.local_ip_addr = 0; + params.minpoll = ntohl(rx_message->data.ntp_source.minpoll); + params.maxpoll = ntohl(rx_message->data.ntp_source.maxpoll); + params.presend_minpoll = ntohl(rx_message->data.ntp_source.presend_minpoll); +@@ -1167,6 +1169,7 @@ handle_del_source(CMD_Request *rx_message, CMD_Reply *tx_message) + + rem_addr.ip_addr = ntohl(rx_message->data.del_source.ip_addr); + rem_addr.port = 0; ++ rem_addr.local_ip_addr = 0; + + status = NSR_RemoveSource(&rem_addr); + switch (status) { +diff --git a/conf.c b/conf.c +index e34927e..ddd13f1 100644 +--- a/conf.c ++++ b/conf.c +@@ -949,6 +949,7 @@ CNF_AddSources(void) { + for (i=0; i<n_ntp_sources; i++) { + server.ip_addr = ntp_sources[i].ip_addr; + server.port = ntp_sources[i].port; ++ server.local_ip_addr = 0; + + switch (ntp_sources[i].type) { + case SERVER: +diff --git a/ntp_io.c b/ntp_io.c +index afb6ad1..db89758 100644 +--- a/ntp_io.c ++++ b/ntp_io.c +@@ -118,6 +118,12 @@ NIO_Initialise(void) + LOG(LOGS_ERR, LOGF_NtpIO, "Could not set broadcast socket options"); + /* Don't quit - we might survive anyway */ + } ++ /* We want the local IP info too */ ++ if (setsockopt(sock_fd, IPPROTO_IP, IP_PKTINFO, (char *)&on_off, sizeof(on_off)) < 0) { ++ LOG(LOGS_ERR, LOGF_NtpIO, "Could not request packet info using socket option"); ++ /* Don't quit - we might survive anyway */ ++ } ++ + + /* Bind the port */ + my_addr.sin_family = AF_INET; +@@ -182,22 +188,30 @@ read_from_socket(void *anything) + + int status; + ReceiveBuffer message; +- int message_length; + struct sockaddr_in where_from; +- socklen_t from_length; + unsigned int flags = 0; + struct timeval now; + NTP_Remote_Address remote_addr; + double local_clock_err; ++ char cmsgbuf[256]; ++ struct cmsghdr *cmsg; ++ struct msghdr msg; ++ struct iovec iov; + + assert(initialised); + +- from_length = sizeof(where_from); +- message_length = sizeof(message); ++ iov.iov_base = message.arbitrary; ++ iov.iov_len = sizeof(message); ++ msg.msg_name = &where_from; ++ msg.msg_namelen = sizeof(where_from); ++ msg.msg_iov = &iov; ++ msg.msg_iovlen = 1; ++ msg.msg_control = (void *) cmsgbuf; ++ msg.msg_controllen = sizeof(cmsgbuf); ++ msg.msg_flags = 0; + + LCL_ReadCookedTime(&now, &local_clock_err); +- status = recvfrom(sock_fd, (char *)&message, message_length, flags, +- (struct sockaddr *)&where_from, &from_length); ++ status = recvmsg(sock_fd, &msg, flags); + + /* Don't bother checking if read failed or why if it did. More + likely than not, it will be connection refused, resulting from a +@@ -209,6 +223,13 @@ read_from_socket(void *anything) + if (status > 0) { + remote_addr.ip_addr = ntohl(where_from.sin_addr.s_addr); + remote_addr.port = ntohs(where_from.sin_port); ++ remote_addr.local_ip_addr = 0; ++ ++ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) { ++ if (cmsg->cmsg_level == IPPROTO_IP && cmsg->cmsg_type == IP_PKTINFO) ++ remote_addr.local_ip_addr = ++ ntohl(((struct in_pktinfo *) CMSG_DATA(cmsg))->ipi_spec_dst.s_addr); ++ } + + if (status == NTP_NORMAL_PACKET_SIZE) { + +@@ -229,21 +250,45 @@ read_from_socket(void *anything) + } + + /* ================================================== */ +-/* Send an unauthenticated packet to a given address */ ++/* Send a packet to given address */ + +-void +-NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr) ++static void ++NIO_SendPacket(NTP_Packet *packet, int packetlen, NTP_Remote_Address *remote_addr) + { + struct sockaddr_in remote; ++ struct msghdr msg; ++ struct iovec iov; ++ struct { ++ struct cmsghdr cm; ++ struct in_pktinfo ipi; ++ } cmsg; + + assert(initialised); + + remote.sin_family = AF_INET; + remote.sin_port = htons(remote_addr->port); + remote.sin_addr.s_addr = htonl(remote_addr->ip_addr); ++ iov.iov_base = (void *) packet; ++ iov.iov_len = packetlen; ++ msg.msg_name = &remote; ++ msg.msg_namelen = sizeof(remote); ++ msg.msg_iov = &iov; ++ msg.msg_iovlen = 1; ++ if (remote_addr->local_ip_addr) { ++ cmsg.cm.cmsg_len = sizeof(cmsg); ++ cmsg.cm.cmsg_level = IPPROTO_IP; ++ cmsg.cm.cmsg_type = IP_PKTINFO; ++ memset(&cmsg.ipi, 0, sizeof(cmsg.ipi)); ++ cmsg.ipi.ipi_spec_dst.s_addr = htonl(remote_addr->local_ip_addr); ++ msg.msg_control = (void *) &cmsg; ++ msg.msg_controllen = sizeof(cmsg); ++ } else { ++ msg.msg_control = NULL; ++ msg.msg_controllen = 0; ++ } ++ msg.msg_flags = 0; + +- if (sendto(sock_fd, (void *) packet, NTP_NORMAL_PACKET_SIZE, 0, +- (struct sockaddr *) &remote, sizeof(remote)) < 0) { ++ if (sendmsg(sock_fd, &msg, 0) < 0) { + LOG(LOGS_WARN, LOGF_NtpIO, "Could not send to %s:%d : %s", + UTI_IPToDottedQuad(remote_addr->ip_addr), remote_addr->port, strerror(errno)); + } +@@ -252,26 +297,21 @@ NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr) + } + + /* ================================================== */ +-/* Send an authenticated packet to a given address */ ++/* Send an unauthenticated packet to a given address */ + + void +-NIO_SendAuthenticatedPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr) ++NIO_SendNormalPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr) + { +- struct sockaddr_in remote; +- +- assert(initialised); +- +- remote.sin_family = AF_INET; +- remote.sin_port = htons(remote_addr->port); +- remote.sin_addr.s_addr = htonl(remote_addr->ip_addr); ++ NIO_SendPacket(packet, NTP_NORMAL_PACKET_SIZE, remote_addr); ++} + +- if (sendto(sock_fd, (void *) packet, sizeof(NTP_Packet), 0, +- (struct sockaddr *) &remote, sizeof(remote)) < 0) { +- LOG(LOGS_WARN, LOGF_NtpIO, "Could not send to %s:%d : %s", +- UTI_IPToDottedQuad(remote_addr->ip_addr), remote_addr->port, strerror(errno)); +- } ++/* ================================================== */ ++/* Send an authenticated packet to a given address */ + +- return; ++void ++NIO_SendAuthenticatedPacket(NTP_Packet *packet, NTP_Remote_Address *remote_addr) ++{ ++ NIO_SendPacket(packet, sizeof(NTP_Packet), remote_addr); + } + + /* ================================================== */ +-- +1.5.6.3 + diff --git a/main/chrony/chrony-1.23-sources.diff b/main/chrony/chrony-1.23-sources.diff new file mode 100644 index 000000000..5f39ca332 --- /dev/null +++ b/main/chrony/chrony-1.23-sources.diff @@ -0,0 +1,56 @@ +commit 2f2446c7dc074b2d1728a5e3f7a600c10cea2425 +Author: Goswin Brederlow <brederlo@informatik.uni-tuebingen.de> +Date: Sat Mar 29 20:49:59 2008 +0000 + + Fix for chronyc "sources" command on 64 bit machines + + (Taken from + http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=348412 + ) + + Attached is a patchlet to make the "sources" command of chrony output properly + signed numbers. The chronyd code (see e.g. ntp.h) properly uses int32_t and + friends to get the right number of bits per datatype while client.c just uses + short, int, long. But long will be 64 bit or 32 bit depending on the cpu. + +diff --git a/client.c b/client.c +index b7e5bcb..85d6e84 100644 +--- a/client.c ++++ b/client.c +@@ -45,6 +45,12 @@ + #include <readline/history.h> + #endif + ++#ifdef HAS_STDINT_H ++#include <stdint.h> ++#elif defined(HAS_INTTYPES_H) ++#include <inttypes.h> ++#endif ++ + /* ================================================== */ + + static int sock_fd; +@@ -1383,16 +1389,16 @@ process_cmd_sources(char *line) + int n_sources, i; + int verbose = 0; + +- long orig_latest_meas, latest_meas, est_offset; +- unsigned long ip_addr; +- unsigned long latest_meas_err, est_offset_err; +- unsigned long latest_meas_ago; +- unsigned short poll, stratum; +- unsigned short state, mode; ++ int32_t orig_latest_meas, latest_meas, est_offset; ++ uint32_t ip_addr; ++ uint32_t latest_meas_err, est_offset_err; ++ uint32_t latest_meas_ago; ++ uint16_t poll, stratum; ++ uint16_t state, mode; + double resid_freq, resid_skew; + const char *dns_lookup; + char hostname_buf[32]; +- unsigned short status; ++ uint16_t status; + + /* Check whether to output verbose headers */ + verbose = check_for_verbose_flag(line); diff --git a/main/chrony/chrony.conf b/main/chrony/chrony.conf new file mode 100644 index 000000000..d99b1e01d --- /dev/null +++ b/main/chrony/chrony.conf @@ -0,0 +1,7 @@ +# default config + +server pool.ntp.org +initstepslew 10 pool.ntp.org +commandkey 10 +keyfile /etc/chrony/chrony.keys +driftfile /etc/chrony/chrony.drift diff --git a/main/chrony/chronyd.confd b/main/chrony/chronyd.confd new file mode 100644 index 000000000..560825c2c --- /dev/null +++ b/main/chrony/chronyd.confd @@ -0,0 +1,18 @@ +# /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. + +ARGS="" + +# devfs creates the device for RTC if it's compiled into kernel +test -c /dev/rtc && { + grep -q '^rtcfile' "${CFGFILE}" && ARGS="${ARGS} -s" +} +grep -q '^dumponexit$' "${CFGFILE}" && ARGS="${ARGS} -r" diff --git a/main/chrony/chronyd.initd b/main/chrony/chronyd.initd new file mode 100644 index 000000000..49d7526bb --- /dev/null +++ b/main/chrony/chronyd.initd @@ -0,0 +1,58 @@ +#!/sbin/runscript +# 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 $ + +depend() { + need net + 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 +} + +start() { + checkconfig || return $? + + [ -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" +} |