diff options
author | wollman <wollman@FreeBSD.org> | 1993-12-21 18:36:48 +0000 |
---|---|---|
committer | wollman <wollman@FreeBSD.org> | 1993-12-21 18:36:48 +0000 |
commit | 8e51e9f1429efc498f923bce8b25b20f47d7c075 (patch) | |
tree | 9db10264d45dc397a38276190303093a450d769e /usr.sbin/xntpd/scripts | |
download | FreeBSD-src-8e51e9f1429efc498f923bce8b25b20f47d7c075.zip FreeBSD-src-8e51e9f1429efc498f923bce8b25b20f47d7c075.tar.gz |
xntpd 3.3b from UDel
Diffstat (limited to 'usr.sbin/xntpd/scripts')
58 files changed, 8083 insertions, 0 deletions
diff --git a/usr.sbin/xntpd/scripts/Guess.sh b/usr.sbin/xntpd/scripts/Guess.sh new file mode 100755 index 0000000..97fd4c7 --- /dev/null +++ b/usr.sbin/xntpd/scripts/Guess.sh @@ -0,0 +1,116 @@ +#! /bin/sh + +if [ -f /bin/uname -o -f /usr/bin/uname ]; then + set `uname -a | tr '[A-Z]' '[a-z]'` +# set `cat test | tr '[A-Z]' '[a-z]'` + case "$1" in + convexos) case "$3" in + 10.*) guess="convexos10" ;; + esac + ;; + aix) case "$4" in + 3) case "$3" in + 1) guess="aix3.1" ;; + 2) guess="aix3.2" ;; + esac + ;; + esac + ;; + sinix-m) + guess=sinix-m + ;; + sunos) case "$3" in + 4.1*) guess="sunos4" ;; + 5.1) guess="sunos5.1" ;; + 5.*) guess="sunos5.2" ;; + esac + ;; + irix) case "$3" in + 4.*) guess="irix4" ;; + 5.*) guess="irix5" ;; + esac + ;; + "a/ux") case "$3" in + 2.*) guess="aux2" ;; + 3.*) guess="aux3" ;; + esac + ;; + ultrix) + guess="ultrix" + ;; + hp-ux) case "$3" in + *.10.*) guess="hpux10+" ;; + *) guess="hpux" ;; + esac + ;; + linux) guess="linux" ;; + + osf1) case "$5" in + alpha) guess="decosf1" ;; + esac + ;; + "bsd/386") + guess="bsdi" + ;; + "freebsd") + guess="freebsd" + ;; + "netbsd") + guess="netbsd" + ;; + # now the fun starts - there are vendors that + # do not really identify their OS un uname. + # Fine - now I look at our version and hope + # that nobody else had this marvellous idea. + # I am not willing to mention the vendor explicitly + *) # Great ! - We are dealing with an industry standard ! + if [ -f /unix ]; then + # + # looks like this thing has the license + # to call itself Unix + # + case "$3" in + 3.2.*) + case "$4" in + v*) + (i386) >/dev/null 2>&1 && guess=ptx;; + esac + esac + fi + ;; + esac +fi + +if [ "0$guess" != "0" ]; then + echo $guess + exit 0 +fi + +if [ -f /bin/machine ]; then + echo `/bin/machine` + exit 0 +fi + +if [ -f /usr/convex/vers ]; then + set `/usr/convex/vers /vmunix` + case "$2" in + 9.0) echo "convexos9" + exit 0 ;; + esac +fi + +if [ -d /usr/lib/NextStep ]; then + echo next + exit 0 +fi + +if [ -f /netbsd ]; then + echo netbsd + exit 0 +fi + +case "$guess" in + '') guess="none" +esac + +echo $guess diff --git a/usr.sbin/xntpd/scripts/README b/usr.sbin/xntpd/scripts/README new file mode 100644 index 0000000..79f1792 --- /dev/null +++ b/usr.sbin/xntpd/scripts/README @@ -0,0 +1,41 @@ +README file for directory ./scripts of the NTP Version 3 distribution + +This directory contains shell and perl script files for the configuration, +monitoring and support of NTP installations. See the README and RELNOTES +files in the parent directory for directions on how to use these files. + +Guess.sh script to figure out what machine and operating system + is running this thing. Prizes awarded for new machines + added to the list. + +autoconf awesome script swiped from Jeff Johnson (who may have + swiped it from GNU) which delves deep into the system + files to reveal dark secrets necessary to port NTP to + everything exceptt sewing machines. Unfinished work. + +makeconfig.sh shell script that calles Guess.sh and then figures out + what compiler is available, then builds the + configuration file in the base directory. Finally, it + launches the sed script Config.sed in the base directory + to make the makefiles used by most programs. + +mklinks script useful to create directories for multiple + architecture maintenance + +mkversion script useful to create new version numbers for all + sources + +monitoring directory containing perl scripts useful for monitoring + operations + +ntp-groper script useful for reaching out and rattling the cages of + NTP peers to see if animals are inside the bars + +ntp-restart script useful for killing and restarting the NTP daemon + +stats directory containing awk ans shell scripts useful for + maintaining statistics summaries of clockstats, loopstats + and peerstats files + +support directory containing shell and perl scripts useful for + configuration and monitoring of NTP subnets diff --git a/usr.sbin/xntpd/scripts/autoconf b/usr.sbin/xntpd/scripts/autoconf new file mode 100755 index 0000000..d1dc4c0 --- /dev/null +++ b/usr.sbin/xntpd/scripts/autoconf @@ -0,0 +1,885 @@ +#!/bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf. +# Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc. + +# 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, 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. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create] +# [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET] +# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and +# --with-PACKAGE unless this script has special code to handle it. + + +for arg +do + # Handle --exec-prefix with a space before the argument. + if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix= + # Handle --host with a space before the argument. + elif test x$next_host = xyes; then next_host= + # Handle --prefix with a space before the argument. + elif test x$next_prefix = xyes; then prefix=$arg; next_prefix= + # Handle --srcdir with a space before the argument. + elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir= + else + case $arg in + # For backward compatibility, also recognize exact --exec_prefix. + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*) + exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e) + next_exec_prefix=yes ;; + + -gas | --gas | --ga | --g) ;; + + -host=* | --host=* | --hos=* | --ho=* | --h=*) ;; + -host | --host | --hos | --ho | --h) + next_host=yes ;; + + -nfp | --nfp | --nf) ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no) + no_create=1 ;; + + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + next_prefix=yes ;; + + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*) + srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;; + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s) + next_srcdir=yes ;; + + -with-* | --with-*) + package=`echo $arg|sed 's/-*with-//'` + # Delete all the valid chars; see if any are left. + if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then + echo "configure: $package: invalid package name" >&2; exit 1 + fi + eval "with_`echo $package|sed s/-/_/g`=1" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb | --ver | --ve | --v) + verbose=yes ;; + + *) ;; + esac + fi +done + +trap 'rm -f conftest* core; exit 1' 1 3 15 + +# Needed for some versions of `tr' so that character classes in `[]' work. +if test "${LANG+set}" = "set" ; then + LANG=C +fi + +rm -f conftest* +compile='${CC-cc} $CFLAGS $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1' + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +unique_file=lib/msyslog.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + srcdirdefaulted=yes + # Try the directory containing this script, then `..'. + prog=$0 + confdir=`echo $prog|sed 's%/[^/][^/]*$%%'` + test "X$confdir" = "X$prog" && confdir=. + srcdir=$confdir + if test ! -r $srcdir/$unique_file; then + srcdir=.. + fi +fi +if test ! -r $srcdir/$unique_file; then + if test x$srcdirdefaulted = xyes; then + echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2 + else + echo "configure: Can not find sources in \`${srcdir}'." 1>&2 + fi + exit 1 +fi +# Preserve a srcdir of `.' to avoid automounter screwups with pwd. +# But we can't avoid them for `..', to make subdirectories work. +case $srcdir in + .|/*|~*) ;; + *) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute. +esac + + +useresolv="" + +echo CONFIGURE -- initializing DEFS +test -z "$DEFS" && DEFS="-DDEBUG -DREFCLOCK" +echo CONFIGURE -- initializing AUTHDEFS +test -z "$AUTHDEFS" && AUTHDEFS="-DDES -DMD5" +echo CONFIGURE -- initializing CLOCKDEFS +test -z "$CLOCKDEFS" && CLOCKDEFS="-DAS2201 -DCHU -DGOES -DLEITCH -DLOCAL_CLOCK -DOMEGA -DPST -DWWVB" +echo CONFIGURE -- initializing COPTS +test -z "$COPTS" && COPTS="-O" + +test -z "$INCLUDE" && INCLUDE="-I../include" +test -z "$LIB" && LIB="../lib/libntp.a" + +test "`uname`" = "SunOS" && { + DEFS="$DEFS -DXNTP_RETROFIT_STDLIB" +} +test "`uname`" = "ULTRIX" && { + DEFS="$DEFS -DXNTP_RETROFIT_STDLIB -DPLL -DREADKMEM" +} +test "`uname`" = "BSD/386" && { + DEFS="$DEFS -D__bsdi__" +} +test -d /usr/lib/NextStep && { + DEFS="$DEFS -DREADKMEM -DSYNCTODR_SUCKS" +} + +SOLARIS="" +test -d /kernel && test -d /opt && isSOLARIS="1" + +echo TODO -- checking for HPUX + +# We want these before the checks, so the checks can modify their values. +test -z "$CFLAGS" && CFLAGS=-g auto_cflags=1 +test -z "$LDFLAGS" && LDFLAGS=-g + +#========================================================================== +if test -z "$CC"; then + # Extract the first word of `gcc', so it can be a program name with args. + set dummy gcc; word=$2 + echo checking for $word + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/$word; then + CC="gcc" + break + fi + done + IFS="$saveifs" +fi +test -z "$CC" && CC="cc" +test -n "$CC" -a -n "$verbose" && echo " setting CC to $CC" + +# Find out if we are using GNU C, under whatever name. +cat > conftest.c <<EOF +#ifdef __GNUC__ + yes +#endif +EOF +${CC-cc} -E conftest.c > conftest.out 2>&1 +if egrep yes conftest.out >/dev/null 2>&1; then + GCC=1 # For later tests. +fi +rm -f conftest* + + +# If we're using gcc and the user hasn't specified CFLAGS, add -O to CFLAGS. +test -n "$GCC" && test -n "$auto_cflags" && CFLAGS="$CFLAGS -O" + + +echo checking how to run the C preprocessor +if test -z "$CPP"; then + CPP='${CC-cc} -E' + cat > conftest.c <<EOF +#include <stdio.h> +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + : +else + CPP=/lib/cpp +fi +rm -f conftest* +fi + +if test -n "$GCC"; then + echo checking whether -traditional is needed + pattern="Autoconf.*'x'" + prog='#include <sgtty.h> +Autoconf TIOCGETP' + cat > conftest.c <<EOF +$prog +EOF +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "$pattern" conftest.out >/dev/null 2>&1; then + need_trad=1 +fi +rm -f conftest* + + + if test -z "$need_trad"; then + prog='#include <termio.h> +Autoconf TCGETA' + cat > conftest.c <<EOF +$prog +EOF +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "$pattern" conftest.out >/dev/null 2>&1; then + need_trad=1 +fi +rm -f conftest* + + fi + test -n "$need_trad" && CC="$CC -traditional" +fi + +if test -z "$RANLIB"; then + # Extract the first word of `ranlib', so it can be a program name with args. + set dummy ranlib; word=$2 + echo checking for $word + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/$word; then + RANLIB="ranlib" + break + fi + done + IFS="$saveifs" +fi +test -z "$RANLIB" && RANLIB=":" +test -n "$RANLIB" -a -n "$verbose" && echo " setting RANLIB to $RANLIB" + + +# aC_MEMORY_H +echo checking for ANSI C header files +cat > conftest.c <<EOF +#include <stdlib.h> +#include <stdarg.h> +#include <string.h> +#include <float.h> +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +echo '#include <string.h>' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "memchr" conftest.out >/dev/null 2>&1; then + # SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +cat > conftest.c <<EOF +#include <ctype.h> +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e,f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + { +test -n "$verbose" && \ +echo ' defining' STDC_HEADERS +DEFS="$DEFS -DSTDC_HEADERS=1" +} + +fi +rm -f conftest* +fi +rm -f conftest* + +fi +rm -f conftest* + +for hdr in string.h memory.h +do +trhdr=HAVE_`echo $hdr | tr '[a-z]./' '[A-Z]__'` +echo checking for ${hdr} +cat > conftest.c <<EOF +#include <${hdr}> +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + { +test -n "$verbose" && \ +echo ' defining' ${trhdr} +DEFS="$DEFS -D${trhdr}=1" +} + +fi +rm -f conftest* +done + +echo checking for unistd.h +cat > conftest.c <<EOF +#include <unistd.h> +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + { +test -n "$verbose" && \ +echo ' defining' HAVE_UNISTD_H +DEFS="$DEFS -DHAVE_UNISTD_H=1" +} + +fi +rm -f conftest* + + +echo checking for mode_t in sys/types.h +echo '#include <sys/types.h>' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "mode_t" conftest.out >/dev/null 2>&1; then + : +else + { +test -n "$verbose" && \ +echo ' defining' mode_t to be 'int' +DEFS="$DEFS -Dmode_t=int" +} + +fi +rm -f conftest* + +echo checking for pid_t in sys/types.h +echo '#include <sys/types.h>' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "pid_t" conftest.out >/dev/null 2>&1; then + : +else + { +test -n "$verbose" && \ +echo ' defining' pid_t to be 'int' +DEFS="$DEFS -Dpid_t=int" +} + +fi +rm -f conftest* + +echo checking for return type of signal handlers +cat > conftest.c <<EOF +#include <sys/types.h> +#include <signal.h> +#ifdef signal +#undef signal +#endif +extern void (*signal ()) (); +int main() { exit(0); } +int t() { int i; } +EOF +if eval $compile; then + { +test -n "$verbose" && \ +echo ' defining' RETSIGTYPE to be 'void' +DEFS="$DEFS -DRETSIGTYPE=void" +} + +else + { +test -n "$verbose" && \ +echo ' defining' RETSIGTYPE to be 'int' +DEFS="$DEFS -DRETSIGTYPE=int" +} + +fi +rm -f conftest* + + +echo checking for size_t in sys/types.h +echo '#include <sys/types.h>' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "size_t" conftest.out >/dev/null 2>&1; then + : +else + { +test -n "$verbose" && \ +echo ' defining' size_t to be 'unsigned' +DEFS="$DEFS -Dsize_t=unsigned" +} + +fi +rm -f conftest* + + +# aC_VPRINTF + +# aC_TIME_WITH_SYS_TIME +# aC_STRUCT_TM + +# aC_CHAR_UNSIGNED +echo checking for signed char declaration +cat > conftest.c <<EOF +main() { signed char c; } +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + : +else + { +test -n "$verbose" && \ +echo ' defining' NO_SIGNED_CHAR_DECL +DEFS="$DEFS -DNO_SIGNED_CHAR_DECL=1" +} + +fi +rm -f conftest* +echo checking for s_char in sys/types.h +echo '#include <sys/types.h>' > conftest.c +eval "$CPP \$DEFS conftest.c > conftest.out 2>&1" +if egrep "s_char" conftest.out >/dev/null 2>&1; then + { +test -n "$verbose" && \ +echo ' defining' S_CHAR_DEFINED +DEFS="$DEFS -DS_CHAR_DEFINED=1" +} + +fi +rm -f conftest* + + +prog='/* Ultrix mips cc rejects this. */ +typedef int charset[2]; const charset x; +/* SunOS 4.1.1 cc rejects this. */ +char const *const *ccp; +char **p; +/* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in an arm + of an if-expression whose if-part is not a constant expression */ +const char *g = "string"; +p = &g + (g ? g-g : 0); +/* HPUX 7.0 cc rejects these. */ +++ccp; +p = (char**) ccp; +ccp = (char const *const *) p; +{ /* SCO 3.2v4 cc rejects this. */ + char *t; + char const *s = 0 ? (char *) 0 : (char const *) 0; + + *t++ = 0; +} +{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ + int x[] = {25,17}; + const int *foo = &x[0]; + ++foo; +} +{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ + typedef const int *iptr; + iptr p = 0; + ++p; +} +{ /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; +}' +echo checking for working const +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { $prog } +EOF +if eval $compile; then + : +else + { +test -n "$verbose" && \ +echo ' defining' const to be 'empty' +DEFS="$DEFS -Dconst=" +} + +fi +rm -f conftest* + +if test -n "$GCC"; then +echo checking for inline +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { } inline foo() { } +EOF +if eval $compile; then + : +else + { +test -n "$verbose" && \ +echo ' defining' inline to be '__inline' +DEFS="$DEFS -Dinline=__inline" +} + +fi +rm -f conftest* + +fi + + +# aC_INT_16_BITS +# DEC Alpha running OSF/1 +echo checking integer size +cat > conftest.c <<EOF +main() { exit(!(sizeof(long) > sizeof(int))); } +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + { +test -n "$verbose" && \ +echo ' defining' LONG to be 'int' +DEFS="$DEFS -DLONG=int" +} + { +test -n "$verbose" && \ +echo ' defining' U_LONG to be 'u_int' +DEFS="$DEFS -DU_LONG=u_int" +} + +fi +rm -f conftest* + +if test -n "$GCC"; then +{ +test -n "$verbose" && \ +echo ' defining' HAVE_LONG_DOUBLE +DEFS="$DEFS -DHAVE_LONG_DOUBLE=1" +} + +else +echo checking for long double +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { } long double foo() { } +EOF +if eval $compile; then + { +test -n "$verbose" && \ +echo ' defining' HAVE_LONG_DOUBLE +DEFS="$DEFS -DHAVE_LONG_DOUBLE=1" +} + +fi +rm -f conftest* + +fi + +echo checking byte ordering +cat > conftest.c <<EOF +main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +} +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + : +else + { +test -n "$verbose" && \ +echo ' defining' WORDS_BIGENDIAN +DEFS="$DEFS -DWORDS_BIGENDIAN=1" +} + +fi +rm -f conftest* + + +echo checking for restartable system calls +cat > conftest.c <<EOF +/* Exit 0 (true) if wait returns something other than -1, + i.e. the pid of the child, which means that wait was restarted + after getting the signal. */ +#include <sys/types.h> +#include <signal.h> +ucatch (isig) { } +main () { + int i = fork (), status; + if (i == 0) { sleep (3); kill (getppid (), SIGINT); sleep (3); exit (0); } + signal (SIGINT, ucatch); + status = wait(&i); + if (status == -1) wait(&i); + exit (status == -1); +} + +EOF +eval $compile +if test -s conftest && (./conftest; exit) 2>/dev/null; then + { +test -n "$verbose" && \ +echo ' defining' HAVE_RESTARTABLE_SYSCALLS +DEFS="$DEFS -DHAVE_RESTARTABLE_SYSCALLS=1" +} + +fi +rm -f conftest* + + +havestreams="" +echo checking for sys/stream.h +cat > conftest.c <<EOF +#include <sys/stream.h> +EOF +err=`eval "($CPP \$DEFS conftest.c >/dev/null) 2>&1"` +if test -z "$err"; then + { +test -n "$verbose" && \ +echo ' defining' STREAM +DEFS="$DEFS -DSTREAM=1" +} + havestreams="1" +fi +rm -f conftest* + +echo checking clock options + +if test -f /dev/pps ; then + echo found ppsclk + DEFS="$DEFS -DPPSCLK" +fi +if test -f /dev/tpro ; then + echo found tpro + CLOCKDEFS="$CLOCKDEFS -DTPRO" +fi +if test -f /dev/irig ; then + echo found irig + CLOCKDEFS="$CLOCKDEFS -DIRIG" +fi + +echo TODO -- checking for adjtime/libadjtimed.a + +test -n "$useresolv" && { + LIBS_save="${LIBS}" +LIBS="${LIBS} -lresolv" +have_lib="" +echo checking for -lresolv +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lresolv" +else + :; +fi + +} +test -n "$isSOLARIS" && { + { +test -n "$verbose" && \ +echo ' defining' SOLARIS +DEFS="$DEFS -DSOLARIS=1" +} + + { +test -n "$verbose" && \ +echo ' defining' SLEWALWAYS +DEFS="$DEFS -DSLEWALWAYS=1" +} + + { +test -n "$verbose" && \ +echo ' defining' STUPID_SIGNAL +DEFS="$DEFS -DSTUPID_SIGNAL=1" +} + + LIBS_save="${LIBS}" +LIBS="${LIBS} -lsocket" +have_lib="" +echo checking for -lsocket +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lsocket" +else + :; +fi + + LIBS_save="${LIBS}" +LIBS="${LIBS} -lnsl" +have_lib="" +echo checking for -lnsl +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lnsl" +else + :; +fi + + LIBS_save="${LIBS}" +LIBS="${LIBS} -lelf" +have_lib="" +echo checking for -lelf +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lelf" +else + :; +fi + +} + +LIBS_save="${LIBS}" +LIBS="${LIBS} -lBSD" +have_lib="" +echo checking for -lBSD +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; LIBS="$LIBS -lBSD" +else + :; +fi + +test -n "$have_lib" && { +test -n "$verbose" && \ +echo ' defining' COMPAT to be '"-lBSD"' +DEFS="$DEFS -DCOMPAT=\"-lBSD\"" +} + + +test -z "$isSOLARIS" && { + LIBS_save="${LIBS}" +LIBS="${LIBS} -lkvm" +have_lib="" +echo checking for -lkvm +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lkvm" +else + :; +fi + + test -n "$have_lib" && { +test -n "$verbose" && \ +echo ' defining' USELIBKVM +DEFS="$DEFS -DUSELIBKVM=1" +} + +} + +LIBS_save="${LIBS}" +LIBS="${LIBS} -lmld" +have_lib="" +echo checking for -lmld +cat > conftest.c <<EOF + +int main() { exit(0); } +int t() { main(); } +EOF +if eval $compile; then + have_lib="1" +fi +rm -f conftest* +LIBS="${LIBS_save}" +if test -n "${have_lib}"; then + :; RESLIB="$RESLIB -lmld" +else + :; +fi + + +prefix=/usr/local +bindir=/usr/local/bin + +if test -n "$prefix"; then + test -z "$exec_prefix" && exec_prefix='${prefix}' + prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%" +fi +if test -n "$exec_prefix"; then + prsub="$prsub +s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%\ +exec_prefix\\1=\\2$exec_prefix%" +fi +DEFS="`echo \"$DEFS\" | sed 's%[&\\\]%\\\&%g'`" + +trap 'rm -f config.status; exit 1' 1 3 15 +echo creating config.status +rm -f config.status +cat > config.status <<EOF +#!/bin/sh +# Generated automatically by autoconf. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# $0 $* +PROGS='$PROGS' +CC='$CC' +CFLAGS='$CFLAGS' +LDFLAGS='$LDFLAGS' +CPP='$CPP' +RANLIB='$RANLIB' +bindir='$bindir' +AUTHDEFS='$AUTHDEFS' +CLOCKDEFS='$CLOCKDEFS' +COPTS='$COPTS' +INCLUDE='$INCLUDE' +LIB='$LIB' +ADJLIB='$ADJLIB' +RESLIB='$RESLIB' +COMPAT='$COMPAT' +LIBS='$LIBS' +srcdir='$srcdir' +DEFS='$DEFS' +prefix='$prefix' +exec_prefix='$exec_prefix' +prsub='$prsub' +EOF + diff --git a/usr.sbin/xntpd/scripts/install.sh b/usr.sbin/xntpd/scripts/install.sh new file mode 100755 index 0000000..5dd9831 --- /dev/null +++ b/usr.sbin/xntpd/scripts/install.sh @@ -0,0 +1,100 @@ +#!/bin/sh +# +# Emulate the BSD install command with cpset for System V +# Tom Moore - NCR Corporation +# +PATH=/bin:/etc:/usr/bin:/usr/ucb +export PATH + +# Default values +mode=0755 +owner=bin +group=bin +strip=FALSE +remove=TRUE + +USAGE="install [-s] [-c] [-m mode] [-o owner] [-g group] source file|directory" +set -- `getopt scm:o:g: $*` || { + echo $USAGE >&2 + exit 2 +} +for option in $* +do + case $option in + -s) # Strip the installed file + strip=TRUE + shift + ;; + -c) # Copy the source file rather than move it + remove=FALSE + shift + ;; + -m) # File mode + mode=$2 + shift 2 + ;; + -o) # File owner + owner=$2 + shift 2 + ;; + -g) # File group + group=$2 + shift 2 + ;; + --) # End of options + shift + break + ;; + esac +done + +case $# in +0) echo "install: no file or destination specified" >&2 + exit 2 + ;; +1) echo "install: no destination specified" >&2 + exit 2 + ;; +2) source=$1 + destination=$2 + ;; +*) echo "install: too many files specified" >&2 + exit 2 + ;; +esac + +[ $source = $destination -o $destination = . ] && { + echo "install: can't move $source onto itself" >&2 + exit 1 +} + +[ -f $source ] || { + echo "install: can't open $source" >&2 + exit 1 +} + +if [ -d $destination ] +then + file=`basename $source` + OLDdestination=$destination/OLD$file + destination=$destination/$file +else + dir=`dirname $destination` + file=`basename $destination` + OLDdestination=$dir/OLD$file +fi + +(cp $source $destination && + chmod $mode $destination && + chown $owner $destination && + chgrp $group $destination) || exit 1 + +# /bin/rm -f $OLDdestination + +[ $strip = TRUE ] && + strip $destination + +[ $remove = TRUE ] && + rm -f $source + +exit 0 diff --git a/usr.sbin/xntpd/scripts/makeconfig.sh b/usr.sbin/xntpd/scripts/makeconfig.sh new file mode 100755 index 0000000..8842a86 --- /dev/null +++ b/usr.sbin/xntpd/scripts/makeconfig.sh @@ -0,0 +1,85 @@ +#!/bin/sh + +MACHINE=${1-${OS}} +COMPILER=${2-${CC}} + +# +# Figure out which compiler to use. Stolen from Jeff Johnson. +# +if [ "0$COMPILER" = "0" ]; then + COMPILER="cc" + set dummy gcc; word=$2 + IFS="${IFS= }"; saveifs="$IFS"; IFS="${IFS}:" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/$word; then + COMPILER="gcc" + break + fi + done + IFS="$saveifs" +fi + +# +# Figure out the byte order and word size. +# +if (cd util && rm -f longsize && $COMPILER -o longsize longsize.c ); then + if util/longsize >/dev/null 2>&1; then + LONG=`util/longsize` + else + echo "TROUBLE: executables built by your compiler don't work - bug your vendor" + exit 1 + fi +else + echo "TROUBLE: could not compile !" + echo "TROUBLE: either your compiler does not work / is not present" + echo "TROUBLE: or you have mangled the file tree" + exit 1 +fi +(cd util && rm -f byteorder && $COMPILER -o byteorder byteorder.c $LONG ) +BYTE=`util/byteorder ` +if [ "0$BYTE" = "0" ]; then + BYTE="XNTP_BIG_ENDIAN" +fi +(cd util && rm -f byteorder longsize) + +# +# Figure out which machine we have. +# +if [ "0$MACHINE" = "0" ]; then + GUESS=`scripts/Guess.sh` + if [ "0$GUESS" = "0none" ]; then + echo ' ' + echo "I don't know your system!" + echo "I do know about the following systems:" + (cd machines && ls -C *) + echo "Choose a system and type \"make OS=<system>\"" + exit 1 + else + if [ -f machines/$GUESS ]; then + MACHINE=$GUESS + else + if [ -f machines/$GUESS.posix ]; then + MACHINE="$GUESS.posix" + else + MACHINE="$GUESS.bsd" + fi + fi + fi +fi + +echo "Configuring machines/$MACHINE compilers/$MACHINE.$COMPILER" + +if [ -f machines/$MACHINE ]; then + cat machines/$MACHINE >Config ; + if [ -f compilers/$MACHINE.$COMPILER ]; then + cat compilers/$MACHINE.$COMPILER >>Config + else + echo "COMPILER= $COMPILER" >>Config + fi + echo "LIBDEFS= -D$BYTE" >>Config + cat Config.local >>Config +else + echo "Don't know how to build xntpd for machine $MACHINE " ; + exit 1 +fi diff --git a/usr.sbin/xntpd/scripts/mklinks b/usr.sbin/xntpd/scripts/mklinks new file mode 100755 index 0000000..8565d1c --- /dev/null +++ b/usr.sbin/xntpd/scripts/mklinks @@ -0,0 +1,9 @@ +#!/bin/sh +# call from the source root as 'mklinks ../sun4 ../src' +find . -type d -print | sort | sed "s-^\.-mkdir $1-" | sh +root=`echo $2 | sed "s-^\.\./--"` +find . ! -type d -a ! -name Config -print | sed "s-^\./--" | while read file + do + down=`echo $file | sed -e "s-[^/]*-..-g"` + ln -s $down/$root/$file $1/$file + done diff --git a/usr.sbin/xntpd/scripts/mkversion b/usr.sbin/xntpd/scripts/mkversion new file mode 100755 index 0000000..07dbb77 --- /dev/null +++ b/usr.sbin/xntpd/scripts/mkversion @@ -0,0 +1,33 @@ +#!/bin/sh - +PROG=${1-UNKNOWN} +if [ ! -f .version ]; then + echo 0 > .version +fi + +RUN="`cat .version`" +RUN="`expr $RUN + 1`" +echo $RUN > .version + +DATE="`date`" + +if [ -r VERSION ]; then + VERSION=VERSION +else + VERSION=../VERSION +fi + +if [ -f "$VERSION" ]; then + FLAGS="`egrep '^[0-9a-zA-Z_]+=' "$VERSION" | tr '\012' ';'` " +else + FLAGS="" +fi + +echo "Version $PROG ${FLAGS}${DATE} (${RUN})"; + +rm -f version.c +cat > version.c << -EoF- +/* + * version file for $PROG + */ +char * Version = "$PROG ${FLAGS}${DATE} (${RUN})"; +-EoF- diff --git a/usr.sbin/xntpd/scripts/monitoring/README b/usr.sbin/xntpd/scripts/monitoring/README new file mode 100644 index 0000000..fa8ad8b --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/README @@ -0,0 +1,154 @@ +This directory contains support for monitoring the local clock of xntp daemons. + +WARNING: The scripts and routines contained in this directory are bete realease! + Do not depend on their correct operation. They are, however, in regular + use at University of Erlangen-Nuernberg. No severe problems are known + for this code. + +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +PLEASE THINK TWICE BEFORE STARTING MONITORING REMOTE XNTP DEAMONS !!!! +MONITORING MAY INCREASE THE LOAD OF THE DEAMON MONITORED AND MAY +INCREASE THE NETWORK LOAD SIGNIFICANTLY +!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + +Files are: + +README: + This file + +ntptrap: + perl script to log ntp mode 6 trap messages. + + It sends a set_trap request to each server given and dumps the + trap messages received. It handles refresh of set_trap. + Currently it handles only NTP V2, however the NTP V3 servers + also accept v2 requests. It will not interpret v3 system and peer + stati correctly. + + usage: + ntptrap [-n] [-p <port>] [-l <debug-output>] servers... + + -n: do not send set_trap requests + + port: port to listen for responses + useful if you have a configured trap + + debug-output: file to write trace output to (for debugging) + + This script convinced me that ntp trap messages are only of + little use. + +ntploopstat: + perl script to gather loop info statistics from xntpd via mode 7 + LOOP_INFO requests. + + This script collects data to allow monitoring of remote xntp servers + where it is not possible to directly access the loopstats file + produced by xntpd itself. Of course, it can be used to sample + a local server if it is not configured to produce a loopstats file. + + Please note, this program poses a high load on the server as + a communication takes place every delay seconds ! USE WITH CARE ! + + usage: + ntploopstat [-d<delay>] [-t<timeout>] [-l <logfile>] [-v] [ntpserver] + + delay: number of seconds to wait between samples + default: 60 seconds + timeout: number of seconds to wait for reply + default 12 seconds + logfile: file to log samples to + default: loopstats:<ntpserver>: + (note the trailing colon) + This name actually is a prefix. + The file name is dynamically derived by appending + the name of the month the sample belongs to. + Thus all samples of a month end up in the same file. + + the format of the files generated is identical to the format used by + xntpd with the loopstats file: + MJD <seconds since midnight UTC> offset frequency compliance + + if a timeout occurs the next sample is tried after delay/2 seconds + + The script will terminate after MAX_FAIL (currently 60) consecutive errors. + Errors are counted for: + - error on send call + - error on select call + - error on recv call + - short packet received + - bad packet + - error on open for logfile + +ntploopwatch: + perl script to display loop filter statistics collected by ntploopstat + or dumped directly by xntpd. + + Gnuplot is used to produce a graphical representation of the sample + values, that have been preprocessed and analysed by this script. + + It can either be called to produce a printout of specific data set or + used to continously monitor the values. Monitoring is achieved by + periodically reprocessing the logfiles, which are updated regularly + either by a running ntploopstat process or by the running xntpd. + + usage: + to watch statistics permanently: + ntploopwatch [-v[<level>]] [-c <config-file>] [-d <working-dir>] + + to get a single print out specify also + -P<printer> [-s<samples>] + [-S <start-time>] [-E <end-time>] + [-O <MaxOffs>] [-o <MinOffs>] + + level: level of verbosity for debugging + config-file: file to read configurable settings from + On each iteration it is checked and reread + if it has been changed + default: loopwatch.config + working-dir: specify working directory for process, affects + interpretation of relative file names + + All other flags are only useful with printing plots, as otherwise + command line values would be replaced by settings from the config file. + + printer: specify printer to print plot + BSD print systems semantics apply; if printer is omitted + the name "ps" is used; plots are prepared using + PostScript, thus the printer should best accept + postscript input + + For the following see also the comments in loopwatch.config.SAMPLE + + samples: use last # samples from input data + start-time: ignore input samples before this date + end-time: ignore input samples after this date + if both start-time and end-time are specified + a given samples value is ignored + MaxOffs: + MinOffs: restrict value range + +loopwatch.config.SAMPLE: + sample config file for ntploopwatch + each configurable option is explained there + +lr.pl: + linear regression package used by ntploopwatch to compute + linear approximations for frequency and offset values + within display range + +timelocal.pl: + used during conversion of ISO_DATE_TIME values specified in loopwatch + config files to unix epoch values (seconds since 1970-01-01_00:00_00 UTC) + + A version of this file is distributed with perl-4.x, however, + it has a bug related to dates crossing 1970, causing endless loops.. + The version contained here has been fixed. + +ntp.pl: + perl support for ntp v2 mode 6 message handling + WARNING: This code is beta level - it triggers a memory leak; + as for now it is not quite clear, wether this is caused by a + bug in perl or by bad usage of perl within this script. + diff --git a/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE b/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE new file mode 100644 index 0000000..8cefea3 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/loopwatch.config.SAMPLE @@ -0,0 +1,89 @@ +# sample configuration and control file for ntploowatch +# +# delay: sampling interval in seconds +delay=60 +# samples: use only last # samples +samples=600 +# DO NOT USE srcprefix in shared config files +# srcprefix: name of file to read samples from +# current time suffix (month name) is appended +# defaults to "./var@$STATHOST/loopstats." +# The string "$STATHOST"is replaced by the name of the host +# being monitored +#srcprefix=./var@$STATHOST/loopstats. +# +# showoffs: yes/no control display of offset values +showoffs=yes +# +# showfreq: yes/no control display of frequency values +showfreq=yes +# +# showcmpl: yes/no control display of compliance values +showcmpl=no +# +# showoreg: yes/no control display of linear regression of offset values +showoreg=no +# +# showfreg: yes/no control display of linear regression of frequency values +showfreg=no +# +# timebase: dynamic/ISO_DATE_TIME point of zero for linear regression +# ISO_DATE_TIME: yyyy-mm-dd_hh:mm:ss.ms +# values are interpreted using local time zone +# parts omitted from front default to current date/time +# parts omitted from end default to lowest permitted values +# to get aa:bb being interpreted as minutes:seconds use aa:bb.0 +# for dynamic '00:00:00.0 of current day' is used +timebase=dynamic +# +# freqbase: dynamic/<baseval> +# if a number is given, subtract this from sampling values for display +# if dynamic is selected, freqbase is adjusted to fit into the range of +# offset values +freqbase=dynamic +# +# cmplscale: dynamic/<scaling> +# if a number is given, the sampling values are divided by this number +# if dynamic is selected, cmplscale is adjusted to fit into the range of +# offset values +cmplscale=dynamic +# +# DumbScale: 0/1 +# 0 enables dynamic adjust of value ranges for freqbase and cmplscale +# timescale is labeled with human readable times +# 1 only uses explicit scaling for numbers +# timescale is labeled with hours relative to timebase +DumbScale=0 +# +# StartTime: none/ISO_DATE_TIME +# ignore any samples before the specified date +StartTime=none +# +# EndTime: none/ISO_DATE_TIME +# ignore any samples after the specified date +# +# if both StartTime and EndTime are specified +# the value specified for samples is ignored +EndTime=none +# +# MaxOffs: none/<number> +# limit display (y-axis) to values not larger than <number> +MaxOffset=none +# +# MinOffs: none/<number> +# limit display (y-axis) to values not smaller than <number> +MinOffset=none + +# +# verbose: <number> +# specify level for debugging +# default is 0 for printing and 1 for monitoring +# level 1 will just print a timestamp for any display update +# (this is every delay seconds) +verbose=1 +# +# deltaT: <seconds> +# mark `holes' in the sample data grater than <seconds> +# by a break in the plot +# default: 512 seconds +deltaT=512 diff --git a/usr.sbin/xntpd/scripts/monitoring/lr.pl b/usr.sbin/xntpd/scripts/monitoring/lr.pl new file mode 100755 index 0000000..02c7550 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/lr.pl @@ -0,0 +1,145 @@ +;# +;# lr.pl,v 3.1 1993/07/06 01:09:08 jbj Exp +;# +;# +;# Linear Regression Package for perl +;# to be 'required' from perl +;# +;# Copyright (c) 1992 +;# Frank Kardel, Rainer Pruy +;# Friedrich-Alexander Universitaet Erlangen-Nuernberg +;# +;# +;############################################################# + +## +## y = A + Bx +## +## B = (n * Sum(xy) - Sum(x) * Sum(y)) / (n * Sum(x^2) - Sum(x)^2) +## +## A = (Sum(y) - B * Sum(x)) / n +## + +## +## interface +## +*lr_init = *lr'lr_init; #';# &lr_init(tag); initialize data set for tag +*lr_sample = *lr'lr_sample; #';# &lr_sample(x,y,tag); enter sample +*lr_Y = *lr'lr_Y; #';# &lr_Y(x,tag); compute y for given x +*lr_X = *lr'lr_X; #';# &lr_X(y,tag); compute x for given y +*lr_r = *lr'lr_r; #';# &lr_r(tag); regression coeffizient +*lr_cov = *lr'lr_cov; #';# &lr_cov(tag); covariance +*lr_A = *lr'lr_A; #';# &lr_A(tag); +*lr_B = *lr'lr_B; #';# &lr_B(tag); +*lr_sigma = *lr'lr_sigma; #';# &lr_sigma(tag); standard deviation +*lr_mean = *lr'lr_mean; #';# &lr_mean(tag); +######################### + +package lr; + +sub tagify +{ + local($tag) = @_; + if (defined($tag)) + { + *lr_n = eval "*${tag}_n"; + *lr_sx = eval "*${tag}_sx"; + *lr_sx2 = eval "*${tag}_sx2"; + *lr_sxy = eval "*${tag}_sxy"; + *lr_sy = eval "*${tag}_sy"; + *lr_sy2 = eval "*${tag}_sy2"; + } +} + +sub lr_init +{ + &tagify($_[$[]) if defined($_[$[]); + + $lr_n = 0; + $lr_sx = 0.0; + $lr_sx2 = 0.0; + $lr_sxy = 0.0; + $lr_sy = 0.0; + $lr_sy2 = 0.0; +} + +sub lr_sample +{ + local($_x, $_y) = @_; + + &tagify($_[$[+2]) if defined($_[$[+2]); + + $lr_n++; + $lr_sx += $_x; + $lr_sy += $_y; + $lr_sxy += $_x * $_y; + $lr_sx2 += $_x**2; + $lr_sy2 += $_y**2; +} + +sub lr_B +{ + &tagify($_[$[]) if defined($_[$[]); + + return 1 unless ($lr_n * $lr_sx2 - $lr_sx**2); + return ($lr_n * $lr_sxy - $lr_sx * $lr_sy) / ($lr_n * $lr_sx2 - $lr_sx**2); +} + +sub lr_A +{ + &tagify($_[$[]) if defined($_[$[]); + + return ($lr_sy - &lr_B * $lr_sx) / $lr_n; +} + +sub lr_Y +{ + &tagify($_[$[]) if defined($_[$[]); + + return &lr_A + &lr_B * $_[$[]; +} + +sub lr_X +{ + &tagify($_[$[]) if defined($_[$[]); + + return ($_[$[] - &lr_A) / &lr_B; +} + +sub lr_r +{ + &tagify($_[$[]) if defined($_[$[]); + + local($s) = ($lr_n * $lr_sx2 - $lr_sx**2) * ($lr_n * $lr_sy2 - $lr_sy**2); + + return 1 unless $s; + + return ($lr_n * $lr_sxy - $lr_sx * $lr_sy) / sqrt($s); +} + +sub lr_cov +{ + &tagify($_[$[]) if defined($_[$[]); + + return ($lr_sxy - $lr_sx * $lr_sy / $lr_n) / ($lr_n - 1); +} + +sub lr_sigma +{ + &tagify($_[$[]) if defined($_[$[]); + + return 0 if $lr_n <= 1; + return sqrt(($lr_sy2 - ($lr_sy * $lr_sy) / $lr_n) / ($lr_n)); +} + +sub lr_mean +{ + &tagify($_[$[]) if defined($_[$[]); + + return 0 if $lr_n <= 0; + return $lr_sy / $lr_n; +} + +&lr_init(); + +1; diff --git a/usr.sbin/xntpd/scripts/monitoring/ntp.pl b/usr.sbin/xntpd/scripts/monitoring/ntp.pl new file mode 100755 index 0000000..f3bfd2b --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/ntp.pl @@ -0,0 +1,477 @@ +#!/local/bin/perl +;# +;# ntp.pl,v 3.1 1993/07/06 01:09:09 jbj Exp +;# +;# process loop filter statistics file and either +;# - show statistics periodically using gnuplot +;# - or print a single plot +;# +;# Copyright (c) 1992 +;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg +;# +;# +;############################################################# + +package ntp; + +$NTP_version = 2; +$ctrl_mode=6; + +$byte1 = (($NTP_version & 0x7)<< 3) & 0x34 | ($ctrl_mode & 0x7); +$MAX_DATA = 468; + +$sequence = 0; # initial sequence number incred before used +$pad=4; +$do_auth=0; # no possibility today +$keyid=0; +;#list if known keys (passwords) +%KEYS = ( 0, "\200\200\200\200\200\200\200\200", + ); + +;#----------------------------------------------------------------------------- +;# access routines for ntp control packet + ;# NTP control message format + ;# C LI|VN|MODE LI 2bit=00 VN 3bit=2(3) MODE 3bit=6 : $byte1 + ;# C R|E|M|Op R response E error M more Op opcode + ;# n sequence + ;# n status + ;# n associd + ;# n offset + ;# n count + ;# a+ data (+ padding) + ;# optional authentication data + ;# N key + ;# N2 checksum + +;# first bye of packet +sub pkt_LI { return ($_[$[] >> 6) & 0x3; } +sub pkt_VN { return ($_[$[] >> 3) & 0x7; } +sub pkt_MODE { return ($_[$[] ) & 0x7; } + +;# second byte of packet +sub pkt_R { return ($_[$[] & 0x80) == 0x80; } +sub pkt_E { return ($_[$[] & 0x40) == 0x40; } +sub pkt_M { return ($_[$[] & 0x20) == 0x20; } +sub pkt_OP { return $_[$[] & 0x1f; } + +;#----------------------------------------------------------------------------- + +sub setkey +{ + local($id,$key) = @_; + + $KEYS{$id} = $key if (defined($key)); + if (! defined($KEYS{$id})) + { + warn "Key $id not yet specified - key not changed\n"; + return undef; + } + return ($keyid,$keyid = $id)[$[]; +} + +;#----------------------------------------------------------------------------- +sub numerical { $a <=> $b; } + +;#----------------------------------------------------------------------------- + +sub send #' +{ + local($fh,$opcode, $associd, $data,$address) = @_; + $fh = caller(0)."'$fh"; + + local($junksize,$junk,$packet,$offset,$ret); + $offset = 0; + + $sequence++; + while(1) + { + $junksize = length($data); + $junksize = $MAX_DATA if $junksize > $MAX_DATA; + + ($junk,$data) = $data =~ /^(.{$junksize})(.*)$/; + $packet + = pack("C2n5a".(($junk eq "") ? 0 : &pad($junksize+12,$pad)-12), + $byte1, + ($opcode & 0x1f) | ($data ? 0x20 : 0), + $sequence, + 0, $associd, + $offset, $junksize, $junk); + if ($do_auth) + { + ;# not yet + } + $offset += $junksize; + + if (defined($address)) + { + $ret = send($fh, $packet, 0, $address); + } + else + { + $ret = send($fh, $packet, 0); + } + + if (! defined($ret)) + { + warn "send failed: $!\n"; + return undef; + } + elsif ($ret != length($packet)) + { + warn "send failed: sent only $ret from ".length($packet). "bytes\n"; + return undef; + } + return $sequence unless $data; + } +} + +;#----------------------------------------------------------------------------- +;# status interpretation +;# +sub getval +{ + local($val,*list) = @_; + + return $list{$val} if defined($list{$val}); + return sprintf("%s#%d",$list{"-"},$val) if defined($list{"-"}); + return "unknown-$val"; +} + +;#--------------------------------- +;# system status +;# +;# format: |LI|CS|SECnt|SECode| LI=2bit CS=6bit SECnt=4bit SECode=4bit +sub ssw_LI { return ($_[$[] >> 14) & 0x3; } +sub ssw_CS { return ($_[$[] >> 8) & 0x3f; } +sub ssw_SECnt { return ($_[$[] >> 4) & 0xf; } +sub ssw_SECode { return $_[$[] & 0xf; } + +%LI = ( 0, "leap_none", 1, "leap_add_sec", 2, "leap_del_sec", 3, "sync_alarm", "-", "leap"); +%ClockSource = (0, "sync_unspec", + 1, "sync_lf_clock", + 2, "sync_uhf_clock", + 3, "sync_hf_clock", + 4, "sync_local_proto", + 5, "sync_ntp", + 6, "sync_udp/time", + 7, "sync_wristwatch", + "-", "ClockSource", + ); + +%SystemEvent = (0, "event_unspec", + 1, "event_restart", + 2, "event_fault", + 3, "event_sync_chg", + 4, "event_sync/strat_chg", + 5, "event_clock_reset", + 6, "event_bad_date", + 7, "event_clock_excptn", + "-", "event", + ); +sub LI +{ + &getval(&ssw_LI($_[$[]),*LI); +} +sub ClockSource +{ + &getval(&ssw_CS($_[$[]),*ClockSource); +} + +sub SystemEvent +{ + &getval(&ssw_SECode($_[$[]),*SystemEvent); +} + +sub system_status +{ + return sprintf("%s, %s, %d event%s, %s", &LI($_[$[]), &ClockSource($_[$[]), + &ssw_SECnt($_[$[]), ((&ssw_SECnt($_[$[])==1) ? "" : "s"), + &SystemEvent($_[$[])); +} +;#--------------------------------- +;# peer status +;# +;# format: |PStat|PSel|PCnt|PCode| Pstat=6bit PSel=2bit PCnt=4bit PCode=4bit +sub psw_PStat_config { return ($_[$[] & 0x8000) == 0x8000; } +sub psw_PStat_authenable { return ($_[$[] & 0x4000) == 0x4000; } +sub psw_PStat_authentic { return ($_[$[] & 0x2000) == 0x2000; } +sub psw_PStat_reach { return ($_[$[] & 0x1000) == 0x1000; } +sub psw_PStat_sane { return ($_[$[] & 0x0800) == 0x0800; } +sub psw_PStat_dispok { return ($_[$[] & 0x0400) == 0x0400; } +sub psw_PStat { return ($_[$[] >> 10) & 0x3f; } +sub psw_PSel { return ($_[$[] >> 8) & 0x3; } +sub psw_PCnt { return ($_[$[] >> 4) & 0xf; } +sub psw_PCode { return $_[$[] & 0xf; } + +%PeerSelection = (0, "sel_reject", + 1, "sel_candidate", + 2, "sel_selcand", + 3, "sel_sys.peer", + "-", "PeerSel", + ); +%PeerEvent = (0, "event_unspec", + 1, "event_ip_err", + 2, "event_authen", + 3, "event_unreach", + 4, "event_reach", + 5, "event_clock_excptn", + 6, "event_stratum_chg", + "-", "event", + ); + +sub PeerSelection +{ + &getval(&psw_PSel($_[$[]),*PeerSelection); +} +sub PeerEvent +{ + &getval(&psw_PCode($_[$[]),*PeerEvent); +} + +sub peer_status +{ + local($x) = (""); + $x .= "config," if &psw_PStat_config($_[$[]); + $x .= "authenable," if &psw_PStat_authenable($_[$[]); + $x .= "authentic," if &psw_PStat_authentic($_[$[]); + $x .= "reach," if &psw_PStat_reach($_[$[]); + $x .= &psw_PStat_sane($_[$[]) ? "sane," : "insane,"; + $x .= "hi_disp," unless &psw_PStat_dispok($_[$[]); + + $x .= sprintf(" %s, %d event%s, %s", &PeerSelection($_[$[]), + &psw_PCnt($_[$[]), ((&psw_PCnt($_[$[]) == 1) ? "" : "s"), + &PeerEvent($_[$[])); + return $x; +} + +;#--------------------------------- +;# clock status +;# +;# format: |CStat|CEvnt| CStat=8bit CEvnt=8bit +sub csw_CStat { return ($_[$[] >> 8) & 0xff; } +sub csw_CEvnt { return $_[$[] & 0xff; } + +%ClockStatus = (0, "clk_nominal", + 1, "clk_timeout", + 2, "clk_badreply", + 3, "clk_fault", + 4, "clk_prop", + 5, "clk_baddate", + 6, "clk_badtime", + "-", "clk", + ); + +sub clock_status +{ + return sprintf("%s, last %s", + &getval(&csw_CStat($_[$[]),*ClockStatus), + &getval(&csw_CEvnt($_[$[]),*ClockStatus)); +} + +;#--------------------------------- +;# error status +;# +;# format: |Err|reserved| Err=8bit +;# +sub esw_Err { return ($_[$[] >> 8) & 0xff; } + +%ErrorStatus = (0, "err_unspec", + 1, "err_auth_fail", + 2, "err_invalid_fmt", + 3, "err_invalid_opcode", + 4, "err_unknown_assoc", + 5, "err_unknown_var", + 6, "err_invalid_value", + 7, "err_adm_prohibit", + ); + +sub error_status +{ + return sprintf("%s", &getval(&esw_Err($_[$[]),*ErrorStatus)); +} + +;#----------------------------------------------------------------------------- +;# +;# cntrl op name translation + +%CntrlOpName = (1, "read_status", + 2, "read_variables", + 3, "write_variables", + 4, "read_clock_variables", + 5, "write_clock_variables", + 6, "set_trap", + 7, "trap_response", + 31, "unset_trap", # !!! unofficial !!! + "-", "cntrlop", + ); + +sub cntrlop_name +{ + return &getval($_[$[],*CntrlOpName); +} + +;#----------------------------------------------------------------------------- + +$STAT_short_pkt = 0; +$STAT_pkt = 0; + +;# process a NTP control message (response) packet +;# returns a list ($ret,$data,$status,$associd,$op,$seq,$auth_keyid) +;# $ret: undef --> not yet complete +;# "" --> complete packet received +;# "ERROR" --> error during receive, bad packet, ... +;# else --> error packet - list may contain useful info + + +sub handle_packet +{ + local($pkt,$from) = @_; # parameters + local($len_pkt) = (length($pkt)); +;# local(*FRAGS,*lastseen); + local($li_vn_mode,$r_e_m_op,$seq,$status,$associd,$offset,$count,$data); + local($autch_keyid,$auth_cksum); + + $STAT_pkt++; + if ($len_pkt < 12) + { + $STAT_short_pkt++; + return ("ERROR","short packet received"); + } + + ;# now break packet apart + ($li_vn_mode,$r_e_m_op,$seq,$status,$associd,$offset,$count,$data) = + unpack("C2n5a".($len_pkt-12),$pkt); + $data=substr($data,$[,$count); + if ((($len_pkt - 12) - &pad($count,4)) >= 12) + { + ;# looks like an authenticator + ($auth_keyid,$auth_cksum) = + unpack("Na8",substr($pkt,$len_pkt-12+$[,12)); + $STAT_auth++; + ;# no checking of auth_cksum (yet ?) + } + + if (&pkt_VN($li_vn_mode) != $NTP_version) + { + $STAT_bad_version++; + return ("ERROR","version ".&pkt_VN($li_vn_mode)."packet ignored"); + } + + if (&pkt_MODE($li_vn_mode) != $ctrl_mode) + { + $STAT_bad_mode++; + return ("ERROR", "mode ".&pkt_MODE($li_vn_mode)." packet ignored"); + } + + ;# handle single fragment fast + if ($offset == 0 && &pkt_M($r_e_m_op) == 0) + { + $STAT_single_frag++; + if (&pkt_E($r_e_m_op)) + { + $STAT_err_pkt++; + return (&error_status($status), + $data,$status,$associd,&pkt_OP($r_e_m_op),$seq, + $auth_keyid); + } + else + { + return ("", + $data,$status,$associd,&pkt_OP($r_e_m_op),$seq, + $auth_keyid); + } + } + else + { + ;# fragment - set up local name space + $id = "$from$seq".&pkt_OP($r_e_m_op); + $ID{$id} = 1; + *FRAGS = "$id FRAGS"; + *lastseen = "$id lastseen"; + + $STAT_frag++; + + $lastseen = 1 if !&pkt_M($r_e_m_op); + if (!defined(%FRAGS)) + { + (&pkt_M($r_e_m_op) ? " more" : "")."\n"; + $FRAGS{$offset} = $data; + ;# save other info + @FRAGS = ($status,$associd,&pkt_OP($r_e_m_op),$seq,$auth_keyid,$r_e_m_op); + } + else + { + (&pkt_M($r_e_m_op) ? " more" : "")."\n"; + ;# add frag to previous - combine on the fly + if (defined($FRAGS{$offset})) + { + $STAT_dup_frag++; + return ("ERROR","duplicate fragment at $offset seq=$seq"); + } + + $FRAGS{$offset} = $data; + + undef($loff); + foreach $off (sort numerical keys(%FRAGS)) + { + next unless defined($FRAGS{$off}); + if (defined($loff) && + ($loff + length($FRAGS{$loff})) == $off) + { + $FRAGS{$loff} .= $FRAGS{$off}; + delete $FRAGS{$off}; + last; + } + $loff = $off; + } + + ;# return packet if all frags arrived + ;# at most two frags with possible padding ??? + if ($lastseen && defined($FRAGS{0}) && + scalar(@x=sort numerical keys(%FRAGS)) <= 2 && + (length($FRAGS{0}) + 8) > $x[$[+1]) + { + @x=((&pkt_E($r_e_m_op) ? &error_status($status) : ""), + $FRAGS{0},@FRAGS); + &pkt_E($r_e_m_op) ? $STAT_err_frag++ : $STAT_frag_all++; + undef(%FRAGS); + undef(@FRAGS); + undef($lastseen); + delete $ID{$id}; + &main'clear_timeout($id); + return @x; + } + else + { + &main'set_timeout($id,time+$timeout,"&ntp'handle_packet_timeout(\"".unpack("H*",$id)."\");"); #'"; + } + } + return (undef); + } +} + +sub handle_packet_timeout +{ + local($id) = @_; + local($r_e_m_op,*FRAGS,*lastseen,@x) = (@FRAGS[$[+5]); + + *FRAGS = "$id FRAGS"; + *lastseen = "$id lastseen"; + + @x=((&pkt_E($r_e_m_op) ? &error_status($status) : "TIMEOUT"), + $FRAGS{0},@FRAGS[$[ .. $[+4]); + $STAT_frag_timeout++; + undef(%FRAGS); + undef(@FRAGS); + undef($lastseen); + delete $ID{$id}; + return @x; +} + + +sub pad +{ + return $_[$[+1] * int(($_[$[] + $_[$[+1] - 1) / $_[$[+1]); +} + +1; diff --git a/usr.sbin/xntpd/scripts/monitoring/ntploopstat b/usr.sbin/xntpd/scripts/monitoring/ntploopstat new file mode 100755 index 0000000..75cdff2 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/ntploopstat @@ -0,0 +1,457 @@ +#!/local/bin/perl -w--*-perl-*- +;# +;# ntploopstat,v 3.1 1993/07/06 01:09:11 jbj Exp +;# +;# Poll NTP server using NTP mode 7 loopinfo request. +;# Log info and timestamp to file for processing by ntploopwatch. +;# +;# +;# Copyright (c) 1992 +;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg +;# +;################################################################# +;# +;# The format written to the logfile is the same as used by xntpd +;# for the loopstats file. +;# This script however allows to gather loop filter statistics from +;# remote servers where you do not have access to the loopstats logfile. +;# +;# Please note: Communication delays affect the accuracy of the +;# timestamps recorded. Effects from these delays will probably +;# not show up, as timestamps are recorded to the second only. +;# (Should have implemented &gettimeofday()..) +;# + +$0 =~ s!^.*/([^/]+)$!\1!; # beautify script name + +$ntpserver = 'localhost'; # default host to poll +$delay = 60; # default sampling rate + ;# keep it shorter than minpoll (=64) + ;# to get all values + +require "ctime.pl"; +;# handle bug in early ctime distributions +$ENV{'TZ'} = 'MET' unless defined($ENV{'TZ'}) || $] > 4.010; + +if (defined(@ctime'MoY)) +{ + *MonthName = *ctime'MoY; +} +else +{ + @MonthName = ('Jan','Feb','Mar','Apr','May','Jun', + 'Jul','Aug','Sep','Oct','Nov','Dec'); +} + +;# this routine can be redefined to point to syslog if necessary +sub msg +{ + return unless $verbose; + + print STDERR "$0: "; + printf STDERR @_; +} + +;############################################################# +;# +;# process command line +$usage = <<"E-O-S"; + +usage: + $0 [-d<delay>] [-t<timeout>] [-l <logfile>] [-v] [ntpserver] +E-O-S + +while($_ = shift) +{ + /^-v(\d*)$/ && ($verbose=($1 eq '') ? 1 : $1,1) && next; + /^-d(\d*)$/ && + do { + ($1 ne '') && ($delay = $1,1) && next; + @ARGV || die("$0: delay value missing after -d\n$usage"); + $delay = shift; + ($delay >= 0) || die("$0: bad delay value \"$delay\"\n$usage"); + next; + }; + /^-l$/ && + do { + @ARGV || die("$0: logfile missing after -l\n$usage"); + $logfile = shift; + next; + }; + /^-t(\d*(\.\d*)?)$/ && + do { + ($1 ne '') && ($timeout = $1,1) && next; + @ARGV || die("$0: timeout value missing after -t\n$usage\n"); + $timeout = shift; + ($timeout > 0) || + die("$0: bad timeout value \"$timeout\"\n$usage"); + next; + }; + + /^-/ && die("$0: unknown option \"$_\"\n$usage"); + + ;# any other argument is server to poll + $ntpserver = $_; + last; +} + +if (@ARGV) +{ + warn("unexpected arguments: ".join(" ",@ARGV).".\n"); + die("$0: too many servers specified\n$usage"); +} + +;# logfile defaults to include server name +;# The name of the current month is appended and +;# the file is opened and closed for each sample. +;# +$logfile = "loopstats:$ntpserver." unless defined($logfile); +$timeout = 12.0 unless defined($timeout); # wait $timeout seconds for reply + +$MAX_FAIL = 60; # give up after $MAX_FAIL failed polls + + +$MJD_1970 = 40587; + +if (eval 'require "syscall.ph";') +{ + if (defined(&SYS_gettimeofday)) + { + ;# assume standard + ;# gettimeofday(struct timeval *tp,struct timezone *tzp) + ;# syntax for gettimeofday syscall + ;# tzp = NULL -> undef + ;# tp = (long,long) + eval 'sub time { local($tz) = pack("LL",0,0); + (&msg("gettimeofday failed: $!\n"), + return (time)) + unless syscall(&SYS_gettimeofday,$tz,undef) == 0; + local($s,$us) = unpack("LL",$tz); + return $s + $us/1000000; }'; + local($t1,$t2,$t3); + $t1 = time; + eval '$t2 = &time;'; + $t3 = time; + die("$0: gettimeofday failed: $@.\n") if defined($@) && $@; + die("$0: gettimeofday inconsistency time=$t1,gettimeofday=$t2,time=$t2\n") + if (int($t1) != int($t2) && int($t3) != int($t2)); + &msg("Using gettimeofday for timestamps\n"); + } + else + { + warn("No gettimeofday syscall found - using time builtin for timestamps\n"); + eval 'sub time { return time; }'; + } +} +else +{ + warn("No syscall.ph file found - using time builtin for timestamps\n"); + eval 'sub time { return time; }'; +} + + +;#------------------+ +;# from ntp_request.h +;#------------------+ + +;# NTP mode 7 packet format: +;# Byte 1: ResponseBit MoreBit Version(3bit) Mode(3bit)==7 +;# Byte 2: AuthBit Sequence # - 0 - 127 see MoreBit +;# Byte 3: Implementation # +;# Byte 4: Request Code +;# +;# Short 1: Err(3bit) NumItems(12bit) +;# Short 2: MBZ(3bit)=0 DataItemSize(12bit) +;# 0 - 500 byte Data +;# if AuthBit is set: +;# Long: KeyId +;# 2xLong: AuthCode + +;# +$IMPL_XNTPD = 2; +$REQ_LOOP_INFO = 8; + + +;# request packet for REQ_LOOP_INFO: +;# B1: RB=0 MB=0 V=2 M=7 +;# B2: S# = 0 +;# B3: I# = IMPL_XNTPD +;# B4: RC = REQ_LOOP_INFO +;# S1: E=0 NI=0 +;# S2: MBZ=0 DIS=0 +;# data: 32 byte 0 padding +;# 8byte timestamp if encryption, 0 padding otherwise +$loopinfo_reqpkt = + pack("CCCC nn x32 x8", 0x17, 0, $IMPL_XNTPD, $REQ_LOOP_INFO, 0, 0); + +;# ignore any auth data in packets +$loopinfo_response_size = + 1+1+1+1+2+2 # header size like request pkt + + 8 # l_fp last_offset + + 8 # l_fp drift_comp + + 4 # u_long compliance + + 4 # u_long watchdog_timer + ; +$loopinfo_response_fmt = "C4n2N2N2NN"; +$loopinfo_response_fmt_v2 = "C4n2N2N2N2N"; + +;# +;# prepare connection to server +;# + +;# workaround for broken socket.ph on dynix_ptx +eval 'sub INTEL {1;}' unless defined(&INTEL); +eval 'sub ATT {1;}' unless defined(&ATT); + +require "sys/socket.ph"; + +require 'netinet/in.ph'; + +;# if you do not have netinet/in.ph enable the following lines +;#eval 'sub INADDR_ANY { 0x00000000; }' unless defined(&INADDR_ANY); +;#eval 'sub IPPRORO_UDP { 17; }' unless defined(&IPPROTO_UDP); + +if ($ntpserver =~ /^((0x?)?\w+)\.((0x?)?\w+)\.((0x?)?\w+)\.((0x?)?\w+)$/) +{ + local($a,$b,$c,$d) = ($1,$3,$5,$7); + $a = oct($a) if defined($2); + $b = oct($b) if defined($4); + $c = oct($c) if defined($6); + $d = oct($d) if defined($8); + $server_addr = pack("C4", $a,$b,$c,$d); + + $server_mainname + = (gethostbyaddr($server_addr,&AF_INET))[$[] || $ntpserver; +} +else +{ + ($server_mainname,$server_addr) + = (gethostbyname($ntpserver))[$[,$[+4]; + + die("$0: host \"$ntpserver\" is unknown\n") + unless defined($server_addr); +} +&msg ("Address of server \"$ntpserver\" is \"%d.%d.%d.%d\"\n", + unpack("C4",$server_addr)); + +$proto_udp = (getprotobyname('udp'))[$[+2] || &IPPROTO_UDP; + +$ntp_port = + (getservbyname('ntp','udp'))[$[+2] || + (warn "Could not get port number for service \"ntp/udp\" using 123\n"), + ($ntp_port=123); + +;# +0 && &SOCK_DGRAM; # satisfy perl -w ... +socket(S, &AF_INET, &SOCK_DGRAM, $proto_udp) || + die("Cannot open socket: $!\n"); + +bind(S, pack("S n N x8", &AF_INET, 0, &INADDR_ANY)) || + die("Cannot bind: $!\n"); + +($my_port, $my_addr) = (unpack("S n a4 x8",getsockname(S)))[$[+1,$[+2]; + +&msg("Listening at address %d.%d.%d.%d port %d\n", + unpack("C4",$my_addr), $my_port); + +$server_inaddr = pack("Sna4x8", &AF_INET, $ntp_port, $server_addr); + +;############################################################ +;# +;# the main loop: +;# send request +;# get reply +;# wait til next sample time + +undef($lasttime); +$lostpacket = 0; + +while(1) +{ + $stime = &time; + + &msg("Sending request $stime...\n"); + + $ret = send(S,$loopinfo_reqpkt,0,$server_inaddr); + + if (! defined($ret) || $ret < length($loopinfo_reqpkt)) + { + warn("$0: send failed ret=($ret): $!\n"); + $fail++; + next; + } + + &msg("Waiting for reply...\n"); + + $mask = ""; vec($mask,fileno(S),1) = 1; + $ret = select($mask,undef,undef,$timeout); + + if (! defined($ret)) + { + warn("$0: select failed: $!\n"); + $fail++; + next; + } + elsif ($ret == 0) + { + warn("$0: request to $ntpserver timed out ($timeout seconds)\n"); + ;# do not count this event as failure + ;# it usually this happens due to dropped udp packets on noisy and + ;# havily loaded lines, so just try again; + $lostpacket = 1; + next; + } + + &msg("Receiving reply...\n"); + + $len = 520; # max size of a mode 7 packet + $reply = ""; # just make it defined for -w + $ret = recv(S,$reply,$len,0); + + if (!defined($ret)) + { + warn("$0: recv failed: $!\n"); + $fail++; + next; + } + + $etime = &time; + &msg("Received at\t$etime\n"); + + ;#$time = ($stime + $etime) / 2; # symmetric delay assumed + $time = $etime; # the above assumption breaks for X25 + ;# so taking etime makes timestamps be a + ;# little late, but keeps them increasing + ;# monotonously + + &msg(sprintf("Reply from %d.%d.%d.%d took %f seconds\n", + (unpack("SnC4",$ret))[$[+2 .. $[+5], ($etime - $stime))); + + if ($len < $loopinfo_response_size) + { + warn("$0: short packet ($len bytes) received ($loopinfo_response_size bytes expected\n"); + $fail++; + next; + } + + ($b1,$b2,$b3,$b4,$s1,$s2, + $offset_i,$offset_f,$drift_i,$drift_f,$compl,$watchdog) + = unpack($loopinfo_response_fmt,$reply); + + ;# check reply + if (($s1 >> 12) != 0) # error ! + { + die("$0: got error reply ".($s1>>12)."\n"); + } + if (($b1 != 0x97 && $b1 != 0x9f) || # Reply NotMore V=2 M=7 + ($b2 != 0 && $b2 != 0x80) || # S=0 Auth no/yes + $b3 != $IMPL_XNTPD || # ! IMPL_XNTPD + $b4 != $REQ_LOOP_INFO || # Ehh.. not loopinfo reply ? + $s1 != 1 || # ???? + ($s2 != 24 && $s2 != 28) # + ) + { + warn("$0: Bad/unexpected reply from server:\n"); + warn(" \"".unpack("H*",$reply)."\"\n"); + warn(" ".sprintf("b1=%x b2=%x b3=%x b4=%x s1=%d s2=%d\n", + $b1,$b2,$b3,$b4,$s1,$s2)); + $fail++; + next; + } + elsif ($s2 == 28) + { + ;# seems to be a version 2 xntpd + ($b1,$b2,$b3,$b4,$s1,$s2, + $offset_i,$offset_f,$drift_i,$drift_f,$compl_i,$compl_f,$watchdog) + = unpack($loopinfo_response_fmt_v2,$reply); + $compl = &lfptoa($compl_i, $compl_f); + } + + $time -= $watchdog; + + $offset = &lfptoa($offset_i, $offset_f); + $drift = &lfptoa($drift_i, $drift_f); + + &log($time,$offset,$drift,$compl) && ($fail = 0);; +} +continue +{ + die("$0: Too many failures - terminating\n") if $fail > $MAX_FAIL; + &msg("Sleeping " . ($lostpacket ? ($delay / 2) : $delay) . " seconds...\n"); + + sleep($lostpacket ? ($delay / 2) : $delay); + $lostpacket = 0; +} + +sub log +{ + local($time,$offs,$freq,$cmpl) = @_; + local($y,$m,$d); + local($fname,$suff) = ($logfile); + + + ;# silently drop sample if distance to last sample is too low + if (defined($lasttime) && ($lasttime + 2) >= $time) + { + &msg("Dropped packet - old sample\n"); + return 1; + } + + ;# $suff determines which samples end up in the same file + ;# could have used $year (;-) or WeekOfYear, DayOfYear,.... + ;# Change it to your suit... + + ($d,$m,$y) = (localtime($time))[$[+3 .. $[+5]; + $suff = sprintf("%04d%02d%02d",$y+1900,$m+1,$d); + $fname .= $suff; + if (!open(LOG,">>$fname")) + { + warn("$0: open($fname) failed: $!\n"); + $fail++; + return 0; + } + else + { + ;# file format + ;# MJD seconds offset drift compliance + printf LOG ("%d %.3lf %.8lf %.7lf %d\n", + int($time/86400)+$MJD_1970, + $time - int($time/86400) * 86400, + $offs,$freq,$cmpl); + close(LOG); + $lasttime = $time; + } + return 1; +} + +;# see ntp_fp.h to understand this +sub lfptoa +{ + local($i,$f) = @_; + local($sign) = 1; + + + if ($i & 0x80000000) + { + if ($f == 0) + { + $i = -$i; + } + else + { + $f = -$f; + $i = ~$i; + $i += 1; # 2s complement + } + $sign = -1; + ;#print "NEG: $i $f\n"; + } + else + { + ;#print "POS: $i $f\n"; + } + ;# unlike xntpd I have perl do the dirty work. + ;# Using floats here may affect precision, but + ;# currently these bits aren't significant anyway + return $sign * ($i + $f/2**32); +} diff --git a/usr.sbin/xntpd/scripts/monitoring/ntploopwatch b/usr.sbin/xntpd/scripts/monitoring/ntploopwatch new file mode 100755 index 0000000..655ed71 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/ntploopwatch @@ -0,0 +1,1631 @@ +#!/local/bin/perl -w--*-perl-*- +;# +;# ntploopwatch,v 3.1 1993/07/06 01:09:13 jbj Exp +;# +;# process loop filter statistics file and either +;# - show statistics periodically using gnuplot +;# - or print a single plot +;# +;# Copyright (c) 1992 +;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg +;# +;# +;############################################################# +$0 =~ s!^.*/([^/]+)$!\1!; +$F = ' ' x length($0); +$|=1; + +$ENV{'SHELL'} = '/bin/sh'; # use bourne shell + +undef($config); +undef($workdir); +undef($PrintIt); +undef($samples); +undef($StartTime); +undef($EndTime); +($a,$b) if 0; # keep -w happy +$usage = <<"E-O-P"; +usage: + to watch statistics permanently: + $0 [-v[<level>]] [-c <config-file>] [-d <working-dir>] + $F [-h <hostname>] + + to get a single print out specify also + $F -P[<printer>] [-s<samples>] + $F [-S <start-time>] [-E <end-time>] + $F [-Y <MaxOffs>] [-y <MinOffs>] + +If You like long option names, You can use: + -help + -c +config + -d +directory + -h +host + -v +verbose[=<level>] + -P +printer[=<printer>] + -s +samples[=<samples>] + -S +starttime + -E +endtime + -Y +maxy + -y +miny + +If <printer> contains a '/' (slash character) output is directed to +a file of this name instead of delivered to a printer. +E-O-P + +;# add directory to look for lr.pl and timelocal.pl (in front of current list) +unshift(@INC,"/src/NTP/v3/xntp/monitoring"); + +require "lr.pl"; # linear regresion routines + +$MJD_1970 = 40587; # from ntp.h (V3) +$RecordSize = 48; # usually a line fits into 42 bytes +$MinClip = 0.12; # clip Y scales with greater range than this + +;# largest extension of Y scale from mean value, factor for standart deviation +$FuzzLow = 2; # for side closer to zero +$FuzzBig = 1; # for side farther from zero + +require "ctime.pl"; +require "timelocal.pl"; +;# early distributions of ctime.pl had a bug +$ENV{'TZ'} = 'MET' unless defined $ENV{'TZ'} || $[ > 4.010; +if (defined(@ctime'MoY)) +{ + *Month=*ctime'MoY; + *Day=*ctime'DoW; +} +else +{ + @Month = ('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'); + @Day = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); +} +;# max number of days per month +@MaxNumDaysPerMonth = (31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); + +;# config settable parameters +$delay = 60; +$srcprefix = "./var\@\$STATHOST/loopstats."; +$showoffs = 1; +$showfreq = 1; +$showcmpl = 0; +$showoreg = 0; +$showfreg = 0; +undef($timebase); +undef($freqbase); +undef($cmplscale); +undef($MaxY); +undef($MinY); +$deltaT = 512; # indicate sample data gaps greater than $deltaT seconds +$verbose = 1; + +while($_ = shift(@ARGV)) +{ + (/^[+-]help$/) && die($usage); + + (/^-c$/ || /^\+config$/) && + (@ARGV || die($usage), $config = shift(@ARGV), next); + + (/^-d$/ || /^\+directory$/) && + (@ARGV || die($usage), $workdir = shift(@ARGV), next); + + (/^-h$/ || /^\+host$/) && + (@ARGV || die($usage), $STATHOST = shift, next); + + (/^-v(\d*)$/ || /^\+verbose=?(\d*)$/) && + ($verbose=($1 eq "") ? 1 : $1, next); + + (/^-P(\S*)$/ || /^\+[Pp]rinter=?(\S*)$/) && + ($PrintIt = $1, $verbose==1 && ($verbose = 0), next); + + (/^-s(\d*)$/ || /^\+samples=?(\d*)$/) && + (($samples = ($1 eq "") ? (shift || die($usage)): $1), next); + + (/^-S$/ || /^\+[Ss]tart[Tt]ime$/) && + (@ARGV || die($usage), $StartTime=&date_time_spec2seconds(shift),next); + + (/^-E$/ || /^\+[Ee]nd[Tt]ime$/) && + (@ARGV || die($usage), $EndTime = &date_time_spec2seconds(shift),next); + + (/^-Y$/ || /^\+[Mm]ax[Yy]$/) && + (@ARGV || die($usage), $MaxY = shift, next); + + (/^-y$/ || /^\+[Mm]in[Yy]$/) && + (@ARGV || die($usage), $MinY = shift, next); + + die("$0: unexpected argument \"$_\"\n$usage"); +} + +if (defined($workdir)) +{ + chdir($workdir) || + die("$0: failed to change working dir to \"$workdir\": $!\n"); +} + +$PrintIt = "ps" if defined($PrintIt) && $PrintIt eq ""; + +if (!defined($PrintIt)) +{ + defined($samples) && + print "WARNING: your samples value may be shadowed by config file settings\n"; + defined($StartTime) && + print "WARNING: your StartTime value may be shadowed by config file settings\n"; + defined($EndTime) && + print "WARNING: your EndTime value may be shadowed by config file settings\n"; + defined($MaxY) && + print "WARNING: your MaxY value may be shadowed by config file settings\n"; + defined($MinY) && + print "WARNING: your MinY value may be shadowed by config file settings\n"; + + ;# check operating environment + ;# + ;# gnuplot usually has X support + ;# I vaguely remember there was one with sunview support + ;# + ;# If Your plotcmd can display graphics using some other method + ;# (Tek window,..) fix the following test + ;# (or may be, just disable it) + ;# + !(defined($ENV{'DISPLAY'}) || defined($ENV{'WINDOW_PARENT'})) && + die("Need window system to monitor statistics\n"); +} + +;# configuration file +$config = "loopwatch.config" unless defined($config); +($STATHOST = $config) =~ s!.*loopwatch\.config.([^/\.]*)$!\1! + unless defined($STATHOST); +($STATTAG = $STATHOST) =~ s/^([^\.\*\s]+)\..*$/\1/; + +$srcprefix =~ s/\$STATHOST/$STATHOST/g; + +;# plot command +@plotcmd=("gnuplot", + '-title', "Ntp loop filter statistics $STATHOST", + '-name', "NtpLoopWatch_$STATTAG"); +$tmpfile = "/tmp/ntpstat.$$"; + +;# other variables +$doplot = ""; # assembled command for @plotcmd to display plot +undef($laststat); + +;# plot value ranges +undef($mintime); +undef($maxtime); +undef($minoffs); +undef($maxoffs); +undef($minfreq); +undef($maxfreq); +undef($mincmpl); +undef($maxcmpl); +undef($miny); +undef($maxy); + +;# stop operation if plot command dies +sub sigchld +{ + local($pid) = wait; + unlink($tmpfile); + warn(sprintf("%s: %s died: exit status: %d signal %d\n", + $0, + (defined($Plotpid) && $Plotpid == $pid) + ? "plotcmd" : "unknown child $pid", + $?>>8,$? & 0xff)) if $?; + exit(1) if $? && defined($Plotpid) && $pid == $Plotpid; +} +&sigchld if 0; +$SIG{'CHLD'} = "sigchld"; +$SIG{'CLD'} = "sigchld"; + +sub abort +{ + unlink($tmpfile); + defined($Plotpid) && kill('TERM',$Plotpid); + die("$0: received signal SIG$_[$[] - exiting\n"); +} +&abort if 0; # make -w happy - &abort IS used +$SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = $SIG{'PIPE'} = "abort"; + +;# +sub abs +{ + ($_[$[] < 0) ? -($_[$[]) : $_[$[]; +} + +;##################### +;# start of real work + +print "starting plot command (" . join(" ",@plotcmd) . ")\n" if $verbose > 1; + +$Plotpid = open(PLOT,"|-"); +select((select(PLOT),$|=1)[$[]); # make PLOT line bufferd + +defined($Plotpid) || + die("$0: failed to start plot command: $!\n"); + +unless ($Plotpid) +{ + ;# child == plot command + close(STDOUT); + open(STDOUT,">&STDERR") || + die("$0: failed to redirect STDOUT of plot command: $!\n"); + + print STDOUT "plot command running as $$\n"; + + exec @plotcmd; + die("$0: failed to exec (@plotcmd): $!\n"); + exit(1); # in case ... +} + +sub read_config +{ + local($at) = (stat($config))[$[+9]; + local($_,$c,$v); + + (undef($laststat),(print("stat $config failed: $!\n")),return) if ! defined($at); + return if (defined($laststat) && ($laststat == $at)); + $laststat = $at; + + print "reading configuration from \"$config\"\n" if $verbose; + + open(CF,"<$config") || + (warn("$0: failed to read \"$config\" - using old settings ($!)\n"), + return); + while(<CF>) + { + chop; + s/^([^\#]*[^\#\s]?)\s*\#.*$//; + next if /^\s*$/; + + s/^\s*([^=\s]*)\s*=\s*(.*\S)\s*$/\1=\2/; + + ($c,$v) = split(/=/,$_,2); + print "processing \"$c=$v\"\n" if $verbose > 3; + ($c eq "delay") && ($delay = $v,1) && next; + ($c eq 'samples') && (!defined($PrintIt) || !defined($samples)) && + ($samples = $v,1) && next; + ($c eq 'srcprefix') && (($srcprefix=$v)=~s/\$STATHOST/$STATHOST/g,1) + && next; + ($c eq 'showoffs') && + ($showoffs = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; + ($c eq 'showfreq') && + ($showfreq = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; + ($c eq 'showcmpl') && + ($showcmpl = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; + ($c eq 'showoreg') && + ($showoreg = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; + ($c eq 'showfreg') && + ($showfreg = ($v eq 'yes' || $v eq 'y' || $v != 0),1) && next; + + ($c eq 'exit') && (unlink($tmpfile),die("$0: exit by config request\n")); + + ($c eq 'freqbase' || + $c eq 'cmplscale') && + do { + if (! defined($v) || $v eq "" || $v eq 'dynamic') + { + eval "undef(\$$c);"; + } + else + { + eval "\$$c = \$v;"; + } + next; + }; + ($c eq 'timebase') && + do { + if (! defined($v) || $v eq "" || $v eq "dynamic") + { + undef($timebase); + } + else + { + $timebase=&date_time_spec2seconds($v); + } + }; + ($c eq 'EndTime') && + do { + next if defined($EndTime) && defined($PrintIt); + if (! defined($v) || $v eq "" || $v eq "none") + { + undef($EndTime); + } + else + { + $EndTime=&date_time_spec2seconds($v); + } + }; + ($c eq 'StartTime') && + do { + next if defined($StartTime) && defined($PrintIt); + if (! defined($v) || $v eq "" || $v eq "none") + { + undef($StartTime); + } + else + { + $StartTime=&date_time_spec2seconds($v); + } + }; + + ($c eq 'MaxY') && + do { + next if defined($MaxY) && defined($PrintIt); + if (! defined($v) || $v eq "" || $v eq "none") + { + undef($MaxY); + } + else + { + $MaxY=$v; + } + }; + + ($c eq 'MinY') && + do { + next if defined($MinY) && defined($PrintIt); + if (! defined($v) || $v eq "" || $v eq "none") + { + undef($MinY); + } + else + { + $MinY=$v; + } + }; + + ($c eq 'deltaT') && + do { + if (!defined($v) || $v eq "") + { + undef($deltaT); + } + else + { + $deltaT = $v; + } + next; + }; + ($c eq 'verbose') && ! defined($PrintIt) && + do { + if (!defined($v) || $v == 0) + { + $verbose = 0; + } + else + { + $verbose = $v; + } + next; + }; + ;# otherwise: silently ignore unrecognized config line + } + close(CF); + ;# set show defaults when nothing selected + $showoffs = $showfreq = $showcmpl = 1 + unless $showoffs || $showfreq || $showcmpl; + if ($verbose > 3) + { + print "new configuration:\n"; + print " delay\t= $delay\n"; + print " samples\t= $samples\n"; + print " srcprefix\t= $srcprefix\n"; + print " showoffs\t= $showoffs\n"; + print " showfreq\t= $showfreq\n"; + print " showcmpl\t= $showcmpl\n"; + print " showoreg\t= $showoreg\n"; + print " showfreg\t= $showfreg\n"; + printf " timebase\t= %s",defined($timebase)?&ctime($timebase):"dynamic\n"; + printf " freqbase\t= %s\n",defined($freqbase) ?"$freqbase":"dynamic"; + printf " cmplscale\t= %s\n",defined($cmplscale)?"$cmplscale":"dynamic"; + printf " StartTime\t= %s",defined($StartTime)?&ctime($StartTime):"none\n"; + printf " EndTime\t= %s", defined($EndTime) ? &ctime($EndTime):"none\n"; + printf " MaxY\t= %s",defined($MaxY)? $MaxY :"none\n"; + printf " MinY\t= %s",defined($MinY)? $MinY :"none\n"; + print " verbose\t= $verbose\n"; + } +print "configuration file read\n" if $verbose > 2; +} + +sub make_doplot +{ + local($c) = (""); + local($fmt) + = ("%s \"%s\" using 1:%d title '%s <%lf %lf> %6s' with lines"); + local($regfmt) + = ("%s ((%lf * x) + %lf) title 'lin. approx. %s (%f t[h]) %s %f <%f> %6s' with lines"); + + $doplot = " set title 'NTP loopfilter statistics for $STATHOST " . + "(last $LastCnt samples from $srcprefix*)'\n"; + + local($xts,$xte,$i,$t); + + local($s,$c) = (""); + + ;# number of integral seconds to get at least 12 tic marks on x axis + $t = int(($maxtime - $mintime) / 12 + 0.5); + $t = 1 unless $t; # prevent $t to be zero + foreach $i (30, + 60,5*60,15*60,30*60, + 60*60,2*60*60,6*60*60,12*60*60, + 24*60*60,48*60*60) + { + last if $t < $i; + $t = $t - ($t % $i); + } + print "time label resolution: $t seconds\n" if $verbose > 1; + + ;# make gnuplot use wall clock time labels instead of NTP seconds + for ($c="", $i = $mintime - ($mintime % $t); + $i <= $maxtime + $t; + $i += $t, $c=",") + { + $s .= $c; + ((int($i / $t) % 2) && + ($s .= sprintf("'' %lf",($i - $LastTimeBase)/3600))) || + (($t <= 60) && + ($s .= sprintf("'%d:%02d:%02d' %lf", + (localtime($i))[$[+2,$[+1,$[+0], + ($i - $LastTimeBase)/3600))) + || (($t <= 2*60*60) && + ($s .= sprintf("'%d:%02d' %lf", + (localtime($i))[$[+2,$[+1], + ($i - $LastTimeBase)/3600))) + || (($t <= 12*60*60) && + ($s .= sprintf("'%s %d:00' %lf", + $Day[(localtime($i))[$[+6]], + (localtime($i))[$[+2], + ($i - $LastTimeBase)/3600))) + || ($s .= sprintf("'%d.%d-%d:00' %lf", + (localtime($i))[$[+3,$[+4,$[+2], + ($i - $LastTimeBase)/3600)); + } + $doplot .= "set xtics ($s)\n"; + + chop($xts = &ctime($mintime)); + chop($xte = &ctime($maxtime)); + $doplot .= "set xlabel 'Start: $xts -- Time Scale -- End: $xte'\n"; + $doplot .= "set yrange [" ; + $doplot .= defined($MinY) ? sprintf("%lf", $MinY) : $miny; + $doplot .= ':'; + $doplot .= defined($MaxY) ? sprintf("%lf", $MaxY) : $maxy; + $doplot .= "]\n"; + + $doplot .= " plot"; + $c = ""; + $showoffs && + ($doplot .= sprintf($fmt,$c,$tmpfile,2, + "offset", + $minoffs,$maxoffs, + "[ms]"), + $c = ","); + $showcmpl && + ($doplot .= sprintf($fmt,$c,$tmpfile,4, + "compliance" . + (&abs($LastCmplScale) > 1 + ? " / $LastCmplScale" + : (&abs($LastCmplScale) == 1 ? "" : " * ".(1/$LastCmplScale))), + $mincmpl/$LastCmplScale,$maxcmpl/$LastCmplScale, + ""), + $c = ","); + $showfreq && + ($doplot .= sprintf($fmt,$c,$tmpfile,3, + "frequency" . + ($LastFreqBase > 0 + ? " - $LastFreqBaseString" + : ($LastFreqBase == 0 ? "" : " + $LastFreqBaseString")), + $minfreq * $FreqScale - $LastFreqBase, + $maxfreq * $FreqScale - $LastFreqBase, + "[${FreqScaleInv}ppm]"), + $c = ","); + $showoreg && $showoffs && + ($doplot .= sprintf($regfmt, $c, + &lr_B('offs'),&lr_A('offs'), + "offset ", + &lr_B('offs'), + ((&lr_A('offs')) < 0 ? '-' : '+'), + &abs(&lr_A('offs')), &lr_r('offs'), + "[ms]"), + $c = ","); + $showfreg && $showfreq && + ($doplot .= sprintf($regfmt, $c, + &lr_B('freq') * $FreqScale, + (&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase, + "frequency", + &lr_B('freq') * $FreqScale, + ((&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase) < 0 ? '-' : '+', + &abs((&lr_A('freq') + $minfreq) * $FreqScale - $LastFreqBase), + &lr_r('freq'), + "[${FreqScaleInv}ppm]"), + $c = ","); + $doplot .= "\n"; +} + +%F_key = (); +%F_name = (); +%F_size = (); +%F_mtime = (); +%F_first = (); +%F_last = (); + +sub genfile +{ + local($cnt,$in,$out,@fpos) = @_; + + local(@F,@t,$t,$lastT) = (); + local(@break,@time,@offs,@freq,@cmpl,@loffset,@filekey) = (); + local($lm,$l,@f); + + local($sdir,$sname); + + ;# allocate some storage for the tables + ;# otherwise realloc may get into troubles + if (defined($StartTime) && defined($EndTime)) + { + $l = ($EndTime-$StartTime) -$[+1 +1; # worst case: 1 sample per second + } + else + { + $l = $cnt + 10; + } + print "preextending arrays to $l entries\n" if $verbose > 2; + $#break = $l; for ($i=$[; $i<=$l;$i++) { $break[$i] = 0; } + $#time = $l; for ($i=$[; $i<=$l;$i++) { $time[$i] = 0; } + $#offs = $l; for ($i=$[; $i<=$l;$i++) { $offs[$i] = 0; } + $#freq = $l; for ($i=$[; $i<=$l;$i++) { $freq[$i] = 0; } + $#cmpl = $l; for ($i=$[; $i<=$l;$i++) { $cmpl[$i] = 0; } + $#loffset = $l; for ($i=$[; $i<=$l;$i++) { $loffset[$i] = 0; } + $#filekey = $l; for ($i=$[; $i<=$l;$i++) { $filekey[$i] = 0; } + ;# now reduce size again + $#break = $[ - 1; + $#time = $[ - 1; + $#offs = $[ - 1; + $#freq = $[ - 1; + $#cmpl = $[ - 1; + $#loffset = $[ - 1; + $#filekey = $[ - 1; + print "memory allocation ready\n" if $verbose > 2; + sleep(3) if $verbose > 1; + + if (index($in,"/") < $[) + { + $sdir = "."; + $sname = $in; + } + else + { + ($sdir,$sname) = ($in =~ m!^(.*)/([^/]*)!); + $sname = "" unless defined($sname); + } + + if (!defined($Lsdir) || $Lsdir ne $sdir || $Ltime != (stat($sdir))[$[+9] || + grep($F_mtime{$_} != (stat($F_name{$_}))[$[+9], @F_files)) + + { + print "rescanning directory \"$sdir\" for files \"$sname*\"\n" + if $verbose > 1; + + ;# rescan directory on changes + $Lsdir = $sdir; + $Ltime = (stat($sdir))[$[+9]; + </X{> if 0; # dummy line - calm down my formatter + local(@newfiles) = < ${in}*[0-9] >; + local($st_dev,$st_ino,$st_mtime,$st_size,$name,$key,$modified); + + foreach $name (@newfiles) + { + ($st_dev,$st_ino,$st_size,$st_mtime) = + (stat($name))[$[,$[+1,$[+7,$[+9]; + $modified = 0; + $key = sprintf("%lx|%lu", $st_dev, $st_ino); + + print "candidate file \"$name\"", + (defined($st_dev) ? "" : " failed: $!"),"\n" + if $verbose > 2; + + if (! defined($F_key{$name}) || $F_key{$name} ne $key) + { + $F_key{$name} = $key; + $modified++; + } + if (!defined($F_name{$key}) || $F_name{$key} != $name) + { + $F_name{$key} = $name; + $modified++; + } + if (!defined($F_size{$key}) || $F_size{$key} != $st_size) + { + $F_size{$key} = $st_size; + $modified++; + } + if (!defined($F_mtime{$key}) || $F_mtime{$key} != $st_mtime) + { + $F_mtime{$key} = $st_mtime; + $modified++; + } + if ($modified) + { + print "new data \"$name\" key: $key;\n" if $verbose > 1; + print " size: $st_size; mtime: $st_mtime;\n" + if $verbose > 1; + $F_last{$key} = $F_first{$key} = $st_mtime; + $F_first{$key}--; # prevent zero divide later on + ;# now compute derivated attributes + open(IN, "<$name") || + do { + warn "$0: failed to open \"$name\": $!"; + next; + }; + + while(<IN>) + { + @F = split; + next if @F < 5; + next if $F[$[] eq ""; + $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; + $t += $F[$[+1]; + $F_first{$key} = $t; + print "\tfound first entry: $t ",&ctime($t) + if $verbose > 4; + last; + } + seek(IN, + ($st_size > 4*$RecordSize) ? $st_size - 4*$RecordSize : 0, + 0); + while(<IN>) + { + @F = split; + next if @F < 5; + next if $F[$[] eq ""; + $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; + $t += $F[$[+1]; + $F_last{$key} = $t; + $_ = <IN>; + print "\tfound last entry: $t ", &ctime($t) + if $verbose > 4 && ! defined($_); + last unless defined($_); + redo; + ;# Ok, calm down... + ;# using $_ = <IN> in conjunction with redo + ;# is semantically equivalent to the while loop, but + ;# I needed a one line look ahead and this solution + ;# was what I thought of first + ;# and.. If you do not like it dont look + } + close(IN); + print(" first: ",$F_first{$key}, + " last: ",$F_last{$key},"\n") if $verbose > 1; + } + } + ;# now reclaim memory used for files no longer referenced ... + local(%Names); + grep($Names{$_} = 1,@newfiles); + foreach (keys %F_key) + { + next if defined($Names{$_}); + delete $F_key{$_}; + $verbose > 2 && print "no longer referenced: \"$_\"\n"; + } + %Names = (); + + grep($Names{$_} = 1,values(%F_key)); + foreach (keys %F_name) + { + next if defined($Names{$_}); + delete $F_name{$_}; + $verbose > 2 && print "unref name($_)= $F_name{$_}\n"; + } + foreach (keys %F_size) + { + next if defined($Names{$_}); + delete $F_size{$_}; + $verbose > 2 && print "unref size($_)\n"; + } + foreach (keys %F_mtime) + { + next if defined($Names{$_}); + delete $F_mtime{$_}; + $verbose > 2 && print "unref mtime($_)\n"; + } + foreach (keys %F_first) + { + next if defined($Names{$_}); + delete $F_first{$_}; + $verbose > 2 && print "unref first($_)\n"; + } + foreach (keys %F_last) + { + next if defined($Names{$_}); + delete $F_last{$_}; + $verbose > 2 && print "unref last($_)\n"; + } + ;# create list sorted by time + @F_files = sort {$F_first{$a} <=> $F_first{$b}; } keys(%F_name); + if ($verbose > 1) + { + print "Resulting file list:\n"; + foreach (@F_files) + { + print "\t$_\t$F_name{$_}\n"; + } + } + } + + printf("processing %s; output \"$out\" (%d input files)\n", + ((defined($StartTime) && defined($EndTime)) + ? "time range" + : (defined($StartTime) ? "$cnt samples from StartTime" : + (defined($EndTime) ? "$cnt samples to EndTime" : + "last $cnt samples"))), + scalar(@F_files)) + if $verbose > 1; + + ;# open output file - will be input for plotcmd + open(OUT,">$out") || + do { + warn("$0: cannot create \"$out\": $!\n"); + }; + + @f = @F_files; + if (defined($StartTime)) + { + while (@f && ($F_last{$f[$[]} < $StartTime)) + { + print("shifting ", $F_name{$f[$[]}, + " last: ", $F_last{$f[$[]}, + " < StartTime: $StartTime\n") + if $verbose > 3; + shift(@f); + } + + + } + if (defined($EndTime)) + { + while (@f && ($F_first{$f[$#f]} > $EndTime)) + { + print("popping ", $F_name{$f[$#f]}, + " first: ", $F_first{$f[$#f]}, + " > EndTime: $EndTime\n") + if $verbose > 3; + pop(@f); + } + } + + if (@f) + { + if (defined($StartTime)) + { + print "guess start according to StartTime ($StartTime)\n" + if $verbose > 3; + + if ($fpos[$[] eq 'start') + { + if (grep($_ eq $fpos[$[+1],@f)) + { + shift(@f) while @f && $f[$[] ne $fpos[$[+1]; + } + else + { + @fpos = ('start', $f[$[], undef); + } + } + else + { + @fpos = ('start' , $f[$[], undef); + } + + if (!defined($fpos[$[+2])) + { + if ($StartTime <= $F_first{$f[$[]}) + { + $fpos[$[+2] = 0; + } + else + { + $fpos[$[+2] = + int($F_size{$f[$[]} * + (($StartTime - $F_first{$f[$[]})/ + ($F_last{$f[$[]} - $F_first{$f[$[]}))); + $fpos[$[+2] = ($fpos[$[+2] <= 2 * $RecordSize) + ? 0 : $fpos[$[+2] - 2 * $RecordSize; + ;# anyway as the data may contain "time holes" + ;# our heuristics may baldly fail + ;# so just start at 0 + $fpos[$[+2] = 0; + } + } + } + elsif (defined($EndTime)) + { + print "guess starting point according to EndTime ($EndTime)\n" + if $verbose > 3; + + if ($fpos[$[] eq 'end') + { + if (grep($_ eq $fpos[$[+1],@f)) + { + shift(@f) while @f && $f[$[] ne $fpos[$[+1]; + } + else + { + @fpos = ('end', $f[$[], undef); + } + } + else + { + @fpos = ('end', $f[$[], undef); + } + + if (!defined($fpos[$[+2])) + { + local(@x) = reverse(@f); + local($s,$c) = (0,$cnt); + if ($EndTime < $F_last{$x[$[]}) + { + ;# last file will only be used partially + $s = int($F_size{$x[$[]} * + (($EndTime - $F_first{$x[$[]}) / + ($F_last{$x[$[]} - $F_first{$x[$[]}))); + $s = int($s/$RecordSize); + $c -= $s - 1; + if ($c <= 0) + { + ;# start is in the same file + $fpos[$[+1] = $x[$[]; + $fpos[$[+2] = ($c >=-2) ? 0 : (-$c - 2) * $RecordSize; + shift(@f) while @f && ($f[$[] ne $x[$[]); + } + else + { + shift(@x); + } + } + + if (!defined($fpos[$[+2])) + { + local($_); + while($_ = shift(@x)) + { + $s = int($F_size{$_}/$RecordSize); + $c -= $s - 1; + if ($c <= 0) + { + $fpos[$[+1] = $_; + $fpos[$[+2] = ($c>-2) ? 0 : (-$c - 2) * $RecordSize; + shift(@f) while @f && ($f[$[] ne $_); + last; + } + } + } + } + } + else + { + print "guessing starting point according to count ($cnt)\n" + if $verbose > 3; + ;# guess offset to get last available $cnt samples + if ($fpos[$[] eq 'cnt') + { + if (grep($_ eq $fpos[$[+1],@f)) + { + print "old positioning applies\n" if $verbose > 3; + shift(@f) while @f && $f[$[] ne $fpos[$[+1]; + } + else + { + @fpos = ('cnt', $f[$[], undef); + } + } + else + { + @fpos = ('cnt', $f[$[], undef); + } + + if (!defined($fpos[$[+2])) + { + local(@x) = reverse(@f); + local($s,$c) = (0,$cnt); + + local($_); + while($_ = shift(@x)) + { + print "examing \"$_\" $c samples still needed\n" + if $verbose > 4; + $s = int($F_size{$_}/$RecordSize); + $c -= $s - 1; + if ($c <= 0) + { + $fpos[$[+1] = $_; + $fpos[$[+2] = ($c>-2) ? 0 : (-$c - 2) * $RecordSize; + shift(@f) while @f && ($f[$[] ne $_); + last; + } + } + if (!defined($fpos[$[+2])) + { + print "no starting point yet - using start of data\n" + if $verbose > 2; + $fpos[$[+2] = 0; + } + } + } + } + print "Ooops, no suitable input file ??\n" + if $verbose > 1 && @f <= 0; + + printf("Starting at (%s) \"%s\" offset %ld using %d files\n", + $fpos[$[+1], + $F_name{$fpos[$[+1]}, + $fpos[$[+2], + scalar(@f)) + if $verbose > 2; + + $lm = 1; + $l = 0; + foreach $key (@f) + { + $file = $F_name{$key}; + print "processing file \"$file\"\n" if $verbose > 2; + + open(IN,"<$file") || + (warn("$0: cannot read \"$file\": $!\n"), next); + + ;# try to seek to a position nearer to the start of the interesting lines + ;# should always affect only first item in @f + ($key eq $fpos[$[+1]) && + (($verbose > 1) && + print("Seeking to offset $fpos[$[+2]\n"), + seek(IN,$fpos[$[+2],0) || + warn("$0: seek(\"$F_name{$key}\" failed: $|\n")); + + while(<IN>) + { + $l++; + ($verbose > 3) && + (($l % $lm) == 0 && print("\t$l lines read\n") && + (($l == 2) && ($lm = 10) || + ($l == 100) && ($lm = 100) || + ($l == 500) && ($lm = 500) || + ($l == 1000) && ($lm = 1000) || + ($l == 5000) && ($lm = 5000) || + ($l == 10000) && ($lm = 10000))); + + @F = split; + + next if @F < 5; # no valid input line is this short + next if $F[$[] eq ""; + ($F[$[] !~ /^\d+$/) && # A 'never should have happend' error + die("$0: unexpected input line: $_\n"); + + ;# modified Julian to UNIX epoch + $t = ($F[$[] - $MJD_1970) * 24 * 60 * 60; + $t += $F[$[+1]; # add seconds + fraction + + ;# multiply offset by 1000 to get ms - try to avoid float op + (($F[$[+2] =~ s/(\d*)\.(\d{3})(\d*)/\1\2.\3/) && + $F[$[+2] =~ s/0+([\d\.])/($1 eq '.') ? '0.' : $1/e) # strip leading zeros + || $F[$[+2] *= 1000; + + + ;# skip samples out of specified time range + next if (defined($StartTime) && $StartTime > $t); + next if (defined($EndTime) && $EndTime < $t); + + next if defined($lastT) && $t < $lastT; # backward in time ?? + + push(@offs,$F[$[+2]); + push(@freq,$F[$[+3] * (2**20/10**6)); + push(@cmpl,$F[$[+4]); + + push(@break, (defined($lastT) && ($t - $lastT > $deltaT))); + $lastT = $t; + push(@time,$t); + push(@loffset, tell(IN) - length($_)); + push(@filekey, $key); + + shift(@break),shift(@time),shift(@offs), + shift(@freq), shift(@cmpl),shift(@loffset), + shift(@filekey) + if @time > $cnt && + ! (defined($StartTime) && defined($EndTime)); + + last if @time >= $cnt && defined($StartTime) && !defined($EndTime); + } + close(IN); + last if @time >= $cnt && defined($StartTime) && !defined($EndTime); + } + print "input scanned ($l lines/",scalar(@time)," samples)\n" + if $verbose > 1; + + &lr_init('offs'); + &lr_init('freq'); + + if (@time) + { + local($_,@F); + + local($timebase) unless defined($timebase); + local($freqbase) unless defined($freqbase); + local($cmplscale) unless defined($cmplscale); + + undef($mintime,$maxtime,$minoffs,$maxoffs, + $minfreq,$maxfreq,$mincmpl,$maxcmpl, + $miny,$maxy); + + print "computing ranges\n" if $verbose > 2; + + $LastCnt = @time; + + ;# @time is in ascending order (;-) + $mintime = @time[$[]; + $maxtime = @time[$#time]; + unless (defined($timebase)) + { + local($time,@X) = (time); + @X = localtime($time); + + ;# compute today 00:00:00 + $timebase = $time - ((($X[$[+2]*60)+$X[$[+1])*60+$X[$[]); + + } + $LastTimeBase = $timebase; + + if ($showoffs) + { + local($i,$m,$f); + + $minoffs = &min(@offs); + $maxoffs = &max(@offs); + + ;# I know, it is not perl style using indices to access arrays, + ;# but I have to proccess two arrays in sync, non-destructively + ;# (otherwise a (shift(@a1),shift(a2)) would do), + ;# I dont like to make copies of these arrays as they may be huge + $i = $[; + &lr_sample(($time[$i]-$timebase)/3600,$offs[$i],'offs'),$i++ + while $i <= $#time; + + ($minoffs == $maxoffs) && ($minoffs -= 0.1,$maxoffs += 0.1); + + $i = &lr_sigma('offs'); + $m = &lr_mean('offs'); + + print "mean offset: $m sigma: $i\n" if $verbose > 2; + + if (($maxoffs - $minoffs) > $MinClip) + { + $f = (&abs($minoffs) < &abs($maxoffs)) ? $FuzzLow : $FuzzBig; + $miny = (($m - $minoffs) <= ($f * $i)) + ? $minoffs : ($m - $f * $i); + $f = ($f == $FuzzLow) ? $FuzzBig : $FuzzLow; + $maxy = (($maxoffs - $m) <= ($f * $i)) + ? $maxoffs : ($m + $f * $i); + } + else + { + $miny = $minoffs; + $maxy = $maxoffs; + } + ($maxy-$miny) == 0 && + (($maxy,$miny) + = (($maxoffs - $minoffs) > 0) + ? ($maxoffs,$minoffs) : ($MinClip,-$MinClip)); + + $maxy = $MaxY if defined($MaxY) && $MaxY < $maxy; + $miny = $MinY if defined($MinY) && $MinY > $miny; + + print "offset min clipped from $minoffs to $miny\n" + if $verbose > 2 && $minoffs != $miny; + print "offset max clipped from $maxoffs to $maxy\n" + if $verbose > 2 && $maxoffs != $maxy; + } + + if ($showfreq) + { + local($i,$m); + + $minfreq = &min(@freq); + $maxfreq = &max(@freq); + + $i = $[; + &lr_sample(($time[$i]-$timebase)/3600,$freq[$i]-$minfreq,'freq'), + $i++ + while $i <= $#time; + + $i = &lr_sigma('freq'); + $m = &lr_mean('freq') + $minfreq; + + print "mean frequency: $m sigma: $i\n" if $verbose > 2; + + if (defined($maxy)) + { + local($s) = + ($maxfreq - $minfreq) + ? ($maxy - $miny) / ($maxfreq - $minfreq) : 1; + + if (defined($freqbase)) + { + $FreqScale = 1; + $FreqScaleInv = ""; + } + else + { + $FreqScale = 1; + $FreqScale = 10 ** int(log($s)/log(10) - 0.8); + $FreqScaleInv = + ("$FreqScale" =~ /^10(0*)$/) ? "0.${1}1" : + ($FreqScale == 1 ? "" : (1/$FreqScale)); + + $freqbase = $m * $FreqScale; + $freqbase -= &lr_mean('offs'); + + ;# round resulting freqbase + ;# to precision of min max difference + $s = int(log(($maxfreq-$minfreq)*$FreqScale)/log(10))-1; + $s = 10 ** $s; + $freqbase = int($freqbase / $s) * $s; + } + } + else + { + $FreqScale = 1; + $FreqScaleInv = ""; + $freqbase = $m unless defined($freqbase); + if (($maxfreq - $minfreq) > $MinClip) + { + $f = (&abs($minfreq) < &abs($maxfreq)) + ? $FuzzLow : $FuzzBig; + $miny = (($freqbase - $minfreq) <= ($f * $i)) + ? ($minfreq-$freqbase) : (- $f * $i); + $f = ($f == $FuzzLow) ? $FuzzBig : $FuzzLow; + $maxy = (($maxfreq - $freqbase) <= ($f * $i)) + ? ($maxfreq-$freqbase) : ($f * $i); + } + else + { + $miny = $minfreq - $freqbase; + $maxy = $maxfreq - $freqbase; + } + ($maxy - $miny) == 0 && + (($maxy,$miny) = + (($maxfreq - $minfreq) > 0) + ? ($maxfreq-$freqbase,$minfreq-$freqbase) : (0.5,-0.5)); + + $maxy = $MaxY if defined($MaxY) && $MaxY < $maxy; + $miny = $MinY if defined($MinY) && $MinY > $miny; + + print("frequency min clipped from ",$minfreq-$freqbase, + " to $miny\n") + if $verbose > 2 && $miny != ($minfreq - $freqbase); + print("frequency max clipped from ",$maxfreq-$freqbase, + " to $maxy\n") + if $verbose > 2 && $maxy != ($maxfreq - $freqbase); + } + $LastFreqBaseString = + sprintf("%g",$freqbase >= 0 ? $freqbase : -$freqbase); + $LastFreqBase = $freqbase; + print "LastFreqBaseString now \"$LastFreqBaseString\"\n" + if $verbose > 5; + } + else + { + $FreqScale = 1; + $FreqScaleInv = ""; + $LastFreqBase = 0; + $LastFreqBaseString = ""; + } + + if ($showcmpl) + { + $mincmpl = &min(@cmpl); + $maxcmpl = &max(@cmpl); + + if (!defined($cmplscale)) + { + if (defined($maxy)) + { + local($cmp) + = (&abs($miny) > &abs($maxy)) ? &abs($miny) : $maxy; + $cmplscale = $cmp == $maxy ? 1 : -1; + + foreach (0.01, 0.02, 0.05, + 0.1, 0.2, 0.25, 0.4, 0.5, + 1, 2, 4, 5, + 10, 20, 25, 50, + 100, 200, 250, 500, 1000) + { + $cmplscale *= $_, last if $maxcmpl/$_ <= $cmp; + } + } + else + { + $cmplscale = 1; + $miny = $mincmpl ? 0 : -$MinClip; + $maxy = $maxcmpl+$MinClip; + } + } + $LastCmplScale = $cmplscale; + } + else + { + $LastCmplScale = 1; + } + + print "creating plot command input file\n" if $verbose > 2; + + + print OUT ("# preprocessed NTP statistics file for $STATHOST\n"); + print OUT ("# timebase is: ",&ctime($LastTimeBase)) + if defined($LastTimeBase); + print OUT ("# frequency is offset by ", + ($LastFreqBase >= 0 ? "+" : "-"), + "$LastFreqBaseString [${FreqScaleInv}ppm]\n"); + print OUT ("# compliance is scaled by $LastCmplScale\n"); + print OUT ("# time [h]\toffset [ms]\tfrequency [${FreqScaleInv}ppm]\tcompliance\n"); + + printf OUT ("%s%lf\t%lf\t%lf\t%lf\n", + (shift(@break) ? "\n" : ""), + (shift(@time) - $LastTimeBase)/3600, + shift(@offs), + shift(@freq) * $FreqScale - $LastFreqBase, + shift(@cmpl) / $LastCmplScale) + while(@time); + } + else + { + ;# prevent plotcmd from processing empty file + print "Creating plot command dummy...\n" if $verbose > 2; + print OUT "# dummy samples\n0 1 2 3\n1 1 2 3\n"; + &lr_sample(0,1,'offs'); + &lr_sample(1,1,'offs'); + &lr_sample(0,2,'freq'); + &lr_sample(1,2,'freq'); + @time = (0, 1); $maxtime = 1; $mintime = 0; + @offs = (1, 1); $maxoffs = 1; $minoffs = 1; + @freq = (2, 2); $maxfreq = 2; $minfreq = 2; + @cmpl = (3, 3); $maxcmpl = 3; $mincmpl = 3; + $LastCnt = 2; + $LastFreqBase = 0; + $LastCmplScale = 1; + $LastTimeBase = 0; + $miny = -$MinClip; + $maxy = 3 + $MinClip; + } + close(OUT); + + print "plot command input file created\n" + if $verbose > 2; + + if (($fpos[$[] eq 'cnt' && @loffset >= $cnt) || + ($fpos[$[] eq 'start' && $time[$[] <= $StartTime) || + ($fpos[$[] eq 'end')) + { + return ($fpos[$[],$filekey[$[],$loffset[$[]); + } + else # found to few lines - next time start search earlier in file + { + if ($fpos[$[] eq 'start') + { + ;# the timestamps we got for F_first and F_last guaranteed + ;# that no file is left out + ;# the only thing that could happen is: + ;# we guessed the starting point wrong + ;# compute a new guess from the first record found + ;# if this equals our last guess use data of first record + ;# otherwise try new guess + + if ($fpos[$[+1] eq $filekey[$[] && $loffset[$[] > $fpos[$[+2]) + { + local($noff); + $noff = $loffset[$[] - ($cnt - @loffset + 1) * $RecordSize; + $noff = 0 if $noff < 0; + + return (@fpos[$[,$[+1], ($noff == $fpos[$[+2]) ? $loffset[$[] : $noff); + } + return ($fpos[$[],$filekey[$[],$loffset[$[]); + } + elsif ($fpos[$[] eq 'end' || $fpos[$[] eq 'cnt') + { + ;# try to start earlier in file + ;# if we already started at the beginning + ;# try to use previous file + ;# this assumes distance to better starting point is at most one file + ;# the primary guess at top of genfile() should usually allow this + ;# assumption + ;# if the offset of the first sample used is within + ;# a different file than we guessed it must have occured later + ;# in the sequence of files + ;# this only can happen if our starting file did not contain + ;# a valid sample from the starting point we guessed + ;# however this does not invalidate our assumption, no check needed + local($noff,$key); + if ($fpos[$[+2] > 0) + { + $noff = $fpos[$[+2] - $RecordSize * ($cnt - @loffset + 1); + $noff = 0 if $noff < 0; + return (@fpos[$[,$[+1],$noff); + } + else + { + if ($fpos[$[+1] eq $F_files[$[]) + { + ;# first file - and not enough samples + ;# use data of first sample + return ($fpos[$[], $filekey[$[], $loffset[$[]); + } + else + { + ;# search key of previous file + $key = $F_files[$[]; + @F = reverse(@F_files); + while ($_ = shift(@F)) + { + if ($_ eq $fpos[$[+1]) + { + $key = shift(@F) if @F; + last; + } + } + $noff = int($F_size{$key} / $RecordSize); + $noff -= $cnt - @loffset; + $noff = 0 if $noff < 0; + $noff *= $RecordSize; + return ($fpos[$[], $key, $noff); + } + } + } + else + { + return (); + } + + return 0 if @loffset <= 1 || ($loffset[$#loffset] - $loffset[$[]) <= 1; + + ;# EOF - 1.1 * avg(line) * $cnt + local($val) = $loffset[$#loffset] + - $cnt * 11 * (($loffset[$#loffset] - $loffset[$[]) / @loffset) / 10; + return ($val < 0) ? 0 : $val; + } +} + +;# initial setup of plot +print "initialize plotting\n" if $verbose; +if (defined($PrintIt)) +{ + if ($PrintIt =~ m,/,) + { + print "Saving plot to file $PrintIt\n"; + print PLOT "set output '$PrintIt'\n"; + } + else + { + print "Printing plot on printer $PrintIt\n"; + print PLOT "set output '| lpr -P$PrintIt -h'\n"; + } + print PLOT "set terminal postscript landscape color solid 'Helvetica' 10\n"; +} +print PLOT "set grid\n"; +print PLOT "set tics out\n"; +print PLOT "set format y '%g '\n"; +printf PLOT "set time 47\n" unless defined($PrintIt); + +@filepos =(); +while(1) +{ + print &ctime(time) if $verbose; + + ;# update diplay characteristics + &read_config;# unless defined($PrintIt); + + unlink($tmpfile); + @filepos = &genfile($samples,$srcprefix,$tmpfile,@filepos); + + ;# make plotcmd display samples + &make_doplot; + print "Displaying plot...\n" if $verbose > 1; + print "command for plot sub process:\n$doplot----\n" if $verbose > 3; + print PLOT $doplot; +} +continue +{ + if (defined($PrintIt)) + { + delete $SIG{'CHLD'}; + print PLOT "quit\n"; + close(PLOT); + if ($PrintIt =~ m,/,) + { + print "Plot saved to file $PrintIt\n"; + } + else + { + print "Plot spooled to printer $PrintIt\n"; + } + unlink($tmpfile); + exit(0); + } + ;# wait $delay seconds + print "waiting $delay seconds ..." if $verbose > 2; + sleep($delay); + print " continuing\n" if $verbose > 2; + undef($LastFreqBaseString); +} + + +sub date_time_spec2seconds +{ + local($_) = @_; + ;# a date_time_spec consistes of: + ;# YYYY-MM-DD_HH:MM:SS.ms + ;# values can be omitted from the beginning and default than to + ;# values of current date + ;# values omitted from the end default to lowest possible values + + local($time) = time; + local($sec,$min,$hour,$mday,$mon,$year) + = localtime($time); + + local($last) = (); + + s/^\D*(.*\d)\D*/\1/; # strip off garbage + + PARSE: + { + if (s/^(\d{4})(-|$)//) + { + if ($1 < 1970) + { + warn("$0: can not handle years before 1970 - year $1 ignored\n"); + return undef; + } + elsif ( $1 >= 2070) + { + warn("$0: can not handle years past 2070 - year $1 ignored\n"); + return undef; + } + else + { + $year = $1 % 100; # 0<= $year < 100 + ;# - interpreted 70 .. 99,00 .. 69 + } + $last = $[ + 5; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec: \"$_\" found after YEAR\n"), + return(undef) + if $2 eq ''; + } + + if (s/^(\d{1,2})(-|$)//) + { + warn("$0: implausible month $1\n"),return(undef) + if $1 < 1 || $1 > 12; + $mon = $1 - 1; + $last = $[ + 4; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec: \"$_\" found after MONTH\n"), + return(undef) + if $2 eq ''; + } + else + { + warn("$0: bad date_time_spec \"$_\"\n"),return(undef) + if defined($last); + + } + + if (s/^(\d{1,2})([_ ]|$)//) + { + warn("$0: implausible month day $1 for month ".($mon+1)." (". + $MaxNumDaysPerMonth[$mon].")$mon\n"), + return(undef) + if $1 < 1 || $1 > $MaxNumDaysPerMonth[$mon]; + $mday = $1; + $last = $[ + 3; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec \"$_\" found after MDAY\n"), + return(undef) + if $2 eq ''; + } + else + { + warn("$0: bad date_time_spec \"$_\"\n"), return undef + if defined($last); + } + + ;# now we face a problem: + ;# if ! defined($last) a prefix of "07:" + ;# can be either 07:MM or 07:ss + ;# to get the second interpretation make the user add + ;# a msec fraction part and check for this special case + if (! defined($last) && s/^(\d{1,2}):(\d{1,2}\.\d+)//) + { + warn("$0: implausible minute $1\n"), return undef + if $1 < 0 || $1 >= 60; + warn("$0: implausible second $1\n"), return undef + if $2 < 0 || $2 >= 60; + $min = $1; + $sec = $2; + $last = $[ + 1; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec \"$_\" after SECONDS\n"); + return undef; + } + + if (s/^(\d{1,2})(:|$)//) + { + warn("$0: implausible hour $1\n"), return undef + if $1 < 0 || $1 > 24; + $hour = $1; + $last = $[ + 2; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec found \"$_\" after HOUR\n"), + return undef + if $2 eq ''; + } + else + { + warn("$0: bad date_time_spec \"$_\"\n"), return undef + if defined($last); + } + + if (s/^(\d{1,2})(:|$)//) + { + warn("$0: implausible minute $1\n"), return undef + if $1 < 0 || $1 >=60; + $min = $1; + $last = $[ + 1; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec found \"$_\" after MINUTE\n"), + return undef + if $2 eq ''; + } + else + { + warn("$0: bad date_time_spec \"$_\"\n"), return undef + if defined($last); + } + + if (s/^(\d{1,2}(\.\d+)?)//) + { + warn("$0: implausible second $1\n"), return undef + if $1 < 0 || $1 >=60; + $sec = $1; + $last = $[; + last PARSE if $_ eq ''; + warn("$0: bad date_time_spec found \"$_\" after SECOND\n"); + return undef; + } + } + + return $time unless defined($last); + + $sec = 0 if $last > $[; + $min = 0 if $last > $[ + 1; + $hour = 0 if $last > $[ + 2; + $mday = 1 if $last > $[ + 3; + $mon = 0 if $last > $[ + 4; + local($rtime) = &timelocal($sec,$min,$hour,$mday,$mon,$year, 0,0, 0); + + ;# $rtime may be off if daylight savings time is in effect at given date + return $rtime + ($sec - int($sec)) + if $hour == (localtime($rtime))[$[+2]; + return + &timelocal($sec,$min,$hour,$mday,$mon,$year, 0,0, 1) + + ($sec - int($sec)); +} + + +sub min +{ + local($m) = shift; + + grep((($m > $_) && ($m = $_),0),@_); + $m; +} + +sub max +{ + local($m) = shift; + + grep((($m < $_) && ($m = $_),0),@_); + $m; +} diff --git a/usr.sbin/xntpd/scripts/monitoring/ntptrap b/usr.sbin/xntpd/scripts/monitoring/ntptrap new file mode 100755 index 0000000..69c6660 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/ntptrap @@ -0,0 +1,453 @@ +#!/local/bin/perl --*-perl-*- +;# +;# ntptrap,v 3.1 1993/07/06 01:09:15 jbj Exp +;# +;# a client for the xntp mode 6 trap mechanism +;# +;# Copyright (c) 1992 +;# Rainer Pruy Friedrich-Alexander Universitaet Erlangen-Nuernberg +;# +;# +;############################################################# +$0 =~ s!^.*/([^/]+)$!\1!; # strip to filename +;# enforce STDOUT and STDERR to be line buffered +$| = 1; +select((select(STDERR),$|=1)[$[]); + +;####################################### +;# load utility routines and definitions +;# +require('ntp.pl'); # implementation of the NTP protocol +eval { require('sys/socket.ph'); require('netinet/in.ph') unless defined(&INADDR_ANY); } || +do { + die("$0: $@") unless $[ == index($@, "Can't locate "); + warn "$0: $@"; + warn "$0: supplying some default definitions\n"; + eval 'sub INADDR_ANY { 0; } sub AF_INET {2;} sub SOCK_DGRAM {2;} 1;' || die "$0: $@"; +}; +require('getopts.pl'); # option parsing +require('ctime.pl'); # date/time formatting + +;###################################### +;# define some global constants +;# +$BASE_TIMEOUT=10; +$FRAG_TIMEOUT=10; +$MAX_TRY = 5; +$REFRESH_TIME=60*15; # 15 minutes (server uses 1 hour) +$ntp'timeout = $FRAG_TIMEOUT; #'; + +;###################################### +;# now process options +;# +sub usage +{ + die("usage: $0 [-n] [-p <port>] [-l <logfile>] [host] ...\n"); +} + +$opt_l = "/dev/null"; # where to write debug messages to +$opt_p = 0; # port to use locally - (0 does mean: will be choosen by kernel) + +&usage unless &Getopts('l:p:'); +&Getopts if 0; # make -w happy + +@Hosts = ($#ARGV < $[) ? ("localhost") : @ARGV; + +;# setup for debug output +$DEBUGFILE=$opt_l; +$DEBUGFILE="&STDERR" if $DEBUGFILE eq '-'; + +open(DEBUG,">>$DEBUGFILE") || die("Cannot open \"$DEBUGFILE\": $!\n"); +select((select(DEBUG),$|=1)[$[]); + +;# &log prints a single trap record (adding a (local) time stamp) +sub log +{ + chop($date=&ctime(time)); + print "$date ",@_,"\n"; +} + +sub debug +{ + print DEBUG @_,"\n"; +} +;# +$proto_udp = (getprotobyname('udp'))[$[+2] || + (warn("$0: Could not get protocoll number for 'udp' using 17"), 17); + +$ntp_port = (getservbyname('ntp','udp'))[$[+2] || + (warn("$0: Could not get port number for service ntp/udp using 123"), 123); + +;# +socket(S, &AF_INET, &SOCK_DGRAM, $proto_udp) || die("Cannot open socket: $!\n"); + +;# +bind(S, pack("S n N x8", &AF_INET, $opt_p, &INADDR_ANY)) || + die("Cannot bind: $!\n"); + +($my_port, $my_addr) = (unpack("S n a4 x8",getsockname(S)))[$[+1,$[+2]; +&log(sprintf("Listening at address %d.%d.%d.%d port %d", + unpack("C4",$my_addr), $my_port)); + +;# disregister with all servers in case of termination +sub cleanup +{ + &log("Aborted by signal \"$_[$[]\"") if defined($_[$[]); + + foreach (@Hosts) + { + &ntp'send(S,31,0,"",pack("Sna4x8",&AF_INET,$ntp_port,$Hosts{$_})); #'; + } + close(S); + exit(2); +} + +$SIG{'HUP'} = 'cleanup'; +$SIG{'INT'} = 'cleanup'; +$SIG{'QUIT'} = 'cleanup'; +$SIG{'TERM'} = 'cleanup'; + +0 && $a && $b; +sub timeouts # sort timeout id array +{ + $TIMEOUTS{$a} <=> $TIMEOUTS{$b}; +} + +;# a Request element looks like: pack("a4SC",addr,associd,op) +@Requests= (); + +;# compute requests for set trap control msgs to each host given +{ + local($name,$addr); + + foreach (@Hosts) + { + if (/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/) + { + ($name,$addr) = + (gethostbyaddr(pack("C4",$1,$2,$3,$4),&AF_INET))[$[,$[+4]; + unless (defined($name)) + { + $name = sprintf("[[%d.%d.%d.%d]]",$1,$2,$3,$4); + $addr = pack("C4",$1,$2,$3,$4); + } + } + else + { + ($name,$addr) = (gethostbyname($_))[$[,$[+4]; + unless (defined($name)) + { + warn "$0: unknown host \"$_\" - ignored\n"; + next; + } + } + next if defined($Host{$name}); + $Host{$name} = $addr; + push(@Requests,pack("a4SC",$addr,0,6)); # schedule a set trap request for $name + } +} + +sub hostname +{ + local($addr) = @_; + return $HostName{$addr} if defined($HostName{$addr}); + local($name) = gethostbyaddr($addr,&AF_INET); + &debug(sprintf("hostname(%d.%d.%d.%d) = \"%s\"",unpack("C4",$addr),$name)) + if defined($name); + defined($name) && ($HostName{$addr} = $name) && (return $name); + &debug(sprintf("Failed to get name for %d.%d.%d.%d",unpack("C4",$addr))); + return sprintf("[%d.%d.%d.%d]",unpack("C4",$addr)); +} + +;# when no hosts were given on the commandline no requests have been scheduled +&usage unless (@Requests); + +&debug(sprintf("%d request(s) scheduled",scalar(@Requests))); +grep(&debug(" - ".$_),keys(%Host)); + +;# allocate variables; +$addr=""; +$assoc=0; +$op = 0; +$timeout = 0; +$ret=""; +%TIMEOUTS = (); +%TIMEOUT_PROCS = (); +@TIMEOUTS = (); + +$len = 512; +$buf = " " x $len; + +while (1) +{ + if (@Requests || @TIMEOUTS) # if there is some work pending + { + if (@Requests) + { + ($addr,$assoc,$op) = unpack("a4SC",($req = shift(@Requests))); + &debug(sprintf("Request: %s: %s(%d)",&hostname($addr), &ntp'cntrlop_name($op), $assoc)); #';)) + $ret = &ntp'send(S,$op,$assoc,"", #'( + pack("Sna4x8",&AF_INET,$ntp_port,$addr)); + &set_timeout("retry-".unpack("H*",$req),time+$BASE_TIMEOUT, + sprintf("&retry(\"%s\");",unpack("H*",$req))); + + last unless (defined($ret)); # warn called by ntp'send(); + + ;# if there are more requests just have a quick look for new messages + ;# otherwise grant server time for a response + $timeout = @Requests ? 0 : $BASE_TIMEOUT; + } + if ($timeout && @TIMEOUTS) + { + ;# ensure not to miss a timeout + if ($timeout + time > $TIMEOUTS{$TIMEOUTS[$[]}) + { + $timeout = $TIMEOUTS{$TIMEOUTS[$[]} - time; + $timeout = 0 if $timeout < 0; + } + } + } + else + { + ;# no work yet - wait for some messages dropping in + ;# usually this will not hapen as the refresh semantic will + ;# always have a pending timeout + undef($timeout); + } + + vec($mask="",fileno(S),1) = 1; + $ret = select($mask,undef,undef,$timeout); + + warn("$0: select: $!\n"),last if $ret < 0; # give up on error return from select + + if ($ret == 0) + { + ;# timeout + if (@TIMEOUTS && time > $TIMEOUTS{$TIMEOUTS[$[]}) + { + ;# handle timeout + $timeout_proc = + (delete $TIMEOUT_PROCS{$TIMEOUTS[$[]}, + delete $TIMEOUTS{shift(@TIMEOUTS)})[$[]; + eval $timeout_proc; + die "timeout eval (\"$timeout_proc\"): $@\n" if $@; + } + ;# else: there may be something to be sent + } + else + { + ;# data avail + $from = recv(S,$buf,$len,0); + ;# give up on error return from recv + warn("$0: recv: $!\n"), last unless (defined($from)); + + $from = (unpack("Sna4",$from))[$[+2]; # keep host addr only + ;# could check for ntp_port - but who cares + &debug("-Packet from ",&hostname($from)); + + ;# stuff packet into ntp mode 6 receive machinery + ($ret,$data,$status,$associd,$op,$seq,$auth_keyid) = + &ntp'handle_packet($buf,$from); # '; + &debug(sprintf("%s uses auth_keyid %d",&hostname($from),$auth_keyid)) if defined($auth_keyid); + next unless defined($ret); + + if ($ret eq "") + { + ;# handle packet + ;# simple trap response messages have neither timeout nor retries + &clear_timeout("retry-".unpack("H*",pack("a4SC",$from,$associd,$op))) unless $op == 7; + delete $RETRY{pack("a4SC",$from,$associd,$op)} unless $op == 7; + + &process_response($from,$ret,$data,$status,$associd,$op,$seq,$auth_keyid); + } + else + { + ;# some kind of error + &log(sprintf("%50s: %s: %s",(gethostbyaddr($from,&AF_INET))[$[],$ret,$data)); + if ($ret ne "TIMEOUT" && $ret ne "ERROR") + { + &clear_timeout("retry-".unpack("H*",pack("a4SC",$from,$associd,$op))); + } + } + } + +} + +warn("$0: terminating\n"); +&cleanup; +exit 0; + +;################################################## +;# timeout support +;# +sub set_timeout +{ + local($id,$time,$proc) = @_; + + $TIMEOUTS{$id} = $time; + $TIMEOUT_PROCS{$id} = $proc; + @TIMEOUTS = sort timeouts keys(%TIMEOUTS); + chop($date=&ctime($time)); + &debug(sprintf("Schedule timeout \"%s\" for %s", $id, $date)); +} + +sub clear_timeout +{ + local($id) = @_; + delete $TIMEOUTS{$id}; + delete $TIMEOUT_PROCS{$id}; + @TIMEOUTS = sort timeouts keys(%TIMEOUTS); + &debug("Clear timeout \"$id\""); +} + +0 && &refresh; +sub refresh +{ + local($addr) = @_; + $addr = pack("H*",$addr); + &debug(sprintf("Refreshing trap for %s", &hostname($addr))); + push(@Requests,pack("a4SC",$addr,0,6)); +} + +0 && &retry; +sub retry +{ + local($tag) = @_; + $tag = pack("H*",$tag); + $RETRY{$tag} = 0 if (!defined($RETRY{$tag})); + + if (++$RETRY{$tag} > $MAX_TRY) + { + &debug(sprintf("Retry failed: %s assoc %5d op %d", + &hostname(substr($tag,$[,4)), + unpack("x4SC",$tag))); + return; + } + &debug(sprintf("Retrying: %s assoc %5d op %d", + &hostname(substr($tag,$[,4)), + unpack("x4SC",$tag))); + push(@Requests,$tag); +} + +sub process_response +{ + local($from,$ret,$data,$status,$associd,$op,$seq,$auth_keyid) = @_; + + $msg=""; + if ($op == 7) # trap response + { + $msg .= sprintf("%40s trap#%-5d", + &hostname($from),$seq); + &debug (sprintf("\nTrap %d associd %d:\n%s\n===============\n",$seq,$associd,$data)); + if ($associd == 0) # system event + { + $msg .= " SYSTEM "; + $evnt = &ntp'SystemEvent($status); #'; + $msg .= "$evnt "; + ;# for special cases add additional info + ($stratum) = ($data =~ /stratum=(\d+)/); + ($refid) = ($data =~ /refid=([\w\.]+)/); + $msg .= "stratum=$stratum refid=$refid"; + if ($refid =~ /\[?(\d+)\.(\d+)\.(\d+)\.(\d+)/) + { + $msg .= " " . (gethostbyaddr(pack("C4",$1,$2,$3,$4),&AF_INET))[$[]; + } + if ($evnt eq "event_sync_chg") + { + $msg .= sprintf("%s %s ", + &ntp'LI($status), #', + &ntp'ClockSource($status) #' + ); + } + elsif ($evnt eq "event_sync/strat_chg") + { + ($peer) = ($data =~ /peer=([0-9]+)/); + $msg .= " peer=$peer"; + } + elsif ($evnt eq "event_clock_excptn") + { + if (($device) = ($data =~ /device=\"([^\"]+)\"/)) + { + ($cstatus) = ($data =~ /refclockstatus=0?x?([\da-fA-F]+)/); + $Cstatus = hex($cstatus); + $msg .= sprintf("- %-32s",&ntp'clock_status($Cstatus)); #'); + ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); + $msg .= " \"$device\" \"$timecode\""; + } + else + { + push(@Requests,pack("a4SC",$from, $associd, 4)); + } + } + } + else # peer event + { + $msg .= sprintf("peer %5d ",$associd); + ($srcadr) = ($data =~ /srcadr=\[?([\d\.]+)/); + $msg .= sprintf("%-18s %40s ", "[$srcadr]", + &hostname(pack("C4",split(/\./,$srcadr)))); + $evnt = &ntp'PeerEvent($status); #'; + $msg .= "$evnt "; + ;# for special cases include additional info + if ($evnt eq "event_clock_excptn") + { + if (($device) = ($data =~ /device=\"([^\"]+)\"/)) + { + ;#&debug("----\n$data\n====\n"); + ($cstatus) = ($data =~ /refclockstatus=0?x?([\da-fA-F]+)/); + $Cstatus = hex($cstatus); + $msg .= sprintf("- %-32s",&ntp'clock_status($Cstatus)); #'); + ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); + $msg .= " \"$device\" \"$timecode\""; + } + else + { + ;# no clockvars included - post a cv request + push(@Requests,pack("a4SC",$from, $associd, 4)); + } + } + elsif ($evnt eq "event_stratum_chg") + { + ($stratum) = ($data =~ /stratum=(\d+)/); + $msg .= "new stratum $stratum"; + } + } + } + elsif ($op == 6) # set trap resonse + { + &debug("Set trap ok from ",&hostname($from)); + &set_timeout("refresh-".unpack("H*",$from),time+$REFRESH_TIME, + sprintf("&refresh(\"%s\");",unpack("H*",$from))); + return; + } + elsif ($op == 4) # read clock variables response + { + ;# status of clock + $msg .= sprintf(" %40s ", &hostname($from)); + if ($associd == 0) + { + $msg .= "system clock status: "; + } + else + { + $msg .= sprintf("peer %5d clock",$associd); + } + $msg .= sprintf("%-32s",&ntp'clock_status($status)); #'); + ($device) = ($data =~ /device=\"([^\"]+)\"/); + ($timecode) = ($data =~ /timecode=\"([^\"]+)\"/); + $msg .= " \"$device\" \"$timecode\""; + } + elsif ($op == 31) # unset trap response (UNOFFICIAL op) + { + ;# clear timeout + &debug("Clear Trap ok from ",&hostname($from)); + &clear_timeout("refresh-".unpack("H*",$from)); + return; + } + else # unexpected response + { + $msg .= "unexpected response to op $op assoc=$associd"; + $msg .= sprintf(" status=%04x",$status); + } + &log($msg); +} diff --git a/usr.sbin/xntpd/scripts/monitoring/timelocal.pl b/usr.sbin/xntpd/scripts/monitoring/timelocal.pl new file mode 100755 index 0000000..d0f73a2 --- /dev/null +++ b/usr.sbin/xntpd/scripts/monitoring/timelocal.pl @@ -0,0 +1,77 @@ +;# timelocal.pl +;# +;# Usage: +;# $time = timelocal($sec,$min,$hours,$mday,$mon,$year,$junk,$junk,$isdst); +;# $time = timegm($sec,$min,$hours,$mday,$mon,$year); + +;# These routines are quite efficient and yet are always guaranteed to agree +;# with localtime() and gmtime(). We manage this by caching the start times +;# of any months we've seen before. If we know the start time of the month, +;# we can always calculate any time within the month. The start times +;# themselves are guessed by successive approximation starting at the +;# current time, since most dates seen in practice are close to the +;# current date. Unlike algorithms that do a binary search (calling gmtime +;# once for each bit of the time value, resulting in 32 calls), this algorithm +;# calls it at most 6 times, and usually only once or twice. If you hit +;# the month cache, of course, it doesn't call it at all. + +;# timelocal is implemented using the same cache. We just assume that we're +;# translating a GMT time, and then fudge it when we're done for the timezone +;# and daylight savings arguments. The timezone is determined by examining +;# the result of localtime(0) when the package is initialized. The daylight +;# savings offset is currently assumed to be one hour. + +CONFIG: { + package timelocal; + + @epoch = localtime(0); + $tzmin = $epoch[2] * 60 + $epoch[1]; # minutes east of GMT + if ($tzmin > 0) { + $tzmin = 24 * 60 - $tzmin; # minutes west of GMT + $tzmin -= 24 * 60 if $epoch[5] == 70; # account for the date line + } + + $SEC = 1; + $MIN = 60 * $SEC; + $HR = 60 * $MIN; + $DAYS = 24 * $HR; + $YearFix = ((gmtime(946684800))[5] == 100) ? 100 : 0; +} + +sub timegm { + package timelocal; + + $ym = pack(C2, @_[5,4]); + $cheat = $cheat{$ym} || &cheat; + $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAYS; +} + +sub timelocal { + package timelocal; + + $ym = pack(C2, @_[5,4]); + $cheat = $cheat{$ym} || &cheat; + $cheat + $_[0] * $SEC + $_[1] * $MIN + $_[2] * $HR + ($_[3]-1) * $DAYS + + $tzmin * $MIN - 60 * 60 * ($_[8] != 0); +} + +package timelocal; + +sub cheat { + $year = $_[5]; + $month = $_[4]; + $guess = $^T; + @g = gmtime($guess); + $year += $YearFix if $year < $epoch[5]; + while ($diff = $year - $g[5]) { + $guess += $diff * (364 * $DAYS); + @g = gmtime($guess); + } + while ($diff = $month - $g[4]) { + $guess += $diff * (28 * $DAYS); + @g = gmtime($guess); + } + $g[3]--; + $guess -= $g[0] * $SEC + $g[1] * $MIN + $g[2] * $HR + $g[3] * $DAYS; + $cheat{$ym} = $guess; +} diff --git a/usr.sbin/xntpd/scripts/ntp-groper b/usr.sbin/xntpd/scripts/ntp-groper new file mode 100755 index 0000000..1fd0cfe --- /dev/null +++ b/usr.sbin/xntpd/scripts/ntp-groper @@ -0,0 +1,95 @@ +#!/bin/sh +# +# ntpgroper host ... +# +# This script checks each hostname given as an argument to see if +# it is running NTP. It reports one of the following messages (assume +# the host is named "dumbo.hp.com": +# +# dumbo.hp.com not registered in DNS +# dumbo.hp.com not responding to ping +# dumbo.hp.com refused ntpq connection +# dumbo.hp.com not responding to NTP +# dumbo.hp.com answers NTP version 2, stratum: 3, ref: telford.nsa.hp.com +# dumbo.hp.com answers NTP version 3, stratum: 3, ref: telford.nsa.hp.com +# +# It ain't pretty, but it is kinda useful. +# +# Walter Underwood, 11 Feb 1993, wunder@hpl.hp.com +# +# converted to /bin/sh from /bin/ksh by scott@ee.udel.edu 24 Mar 1993 + +PATH="/usr/local/etc:$PATH" export PATH + +verbose=1 +logfile=/tmp/cntp-log$$ +ntpqlog=/tmp/cntp-ntpq$$ + +# I wrap the whole thing in parens so that it is possible to redirect +# all the output somewhere, if desired. +( +for host in $* +do + # echo "Trying $host." + + gethost $host > /dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "$host not registered in DNS" + continue + fi + + ping $host 64 1 > /dev/null 2>&1 + if [ $? -ne 0 ] + then + echo "$host not responding to ping" + continue + fi + + # Attempt to contact with version 3 ntp, then try version 2. + for version in 3 2 + do + + ntpq -c "ntpversion $version" -p $host > $ntpqlog 2>&1 + + if fgrep -s 'Connection refused' $ntpqlog + then + echo "$host refused ntpq connection" + break + fi + + responding=1 + fgrep -s 'timed out, nothing received' $ntpqlog > /dev/null && responding=0 + + if [ $responding -eq 1 ] + then + ntpq -c "ntpversion $version" -c rl $host > $ntpqlog + + # First we extract the reference ID (usually a host or a clock) + synchost=`fgrep "refid=" $ntpqlog` + #synchost=${synchost##*refid=} # strip off the beginning of the line + #synchost=${synchost%%,*} # strip off the end + synchost=`expr "$synchost" : '.*refid=\([^,]*\),.*'` + + # Next, we get the stratum + stratum=`fgrep "stratum=" $ntpqlog` + #stratum=${stratum##*stratum=} + #stratum=${stratum%%,*} + stratum=`expr "$stratum" : '.*stratum=\([^,]*\),.*'` + + echo "$host answers NTP version $version, stratum: $stratum, ref: $synchost" + break; + fi + + if [ $version -eq 2 -a $responding -eq 0 ] + then + echo "$host not responding to NTP" + fi + done +done +) +# ) >> $logfile + +if [ -f $ntpqlog ]; then + rm $ntpqlog +fi diff --git a/usr.sbin/xntpd/scripts/ntp-restart b/usr.sbin/xntpd/scripts/ntp-restart new file mode 100755 index 0000000..d2023f0 --- /dev/null +++ b/usr.sbin/xntpd/scripts/ntp-restart @@ -0,0 +1,9 @@ +#!/bin/sh +# +# This script can be used to kill and restart the NTP daemon. Edit the +# /usr/local/bin/xntpd line to fit. +# +kill -INT `ps -ax | egrep "xntpd" | egrep -v "egrep" | sed 's/^\([ 0-9]*\) .*/\1'/` +sleep 10 +/usr/local/bin/xntpd +exit 0 diff --git a/usr.sbin/xntpd/scripts/stats/README b/usr.sbin/xntpd/scripts/stats/README new file mode 100644 index 0000000..5aa64d4 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/README @@ -0,0 +1,32 @@ +Statistics processing scripts (README) + +This directory contains a number of scripts for use with the filegen +facility. Those files ending in .awk are for the Unix awk utility, while +those ending in .sh are for the csh utility. Normally, the summary.sh +script is called from a cron job once per day. This script calls the +peer.sh script to process the peerstats file and append the summary +statistics to the peer_summary file. Then, it callse the loop.sh script +to process the loopstats file and append the summary statistics to the +loop_summary file. Finally, it calls the clock.sh script to process the +clockstats file and append the summary statistics to the clock_summary +file. + +Each of the three shell scripts peer.sh, loop.sh and clock.sh invoke +one or more awk scripts to actually produce the data. This may result +in multiple scans of the same input file. The input file is deleted after +processing. In fact, the shell scripts will process all input files +found of the correct type in chronological order, deleting each one as +it is scanned, except the current day file. + +The psummary.awk script can be used to scan the peer_summary file and +construct an historical reprise of the daily summaries. + +The file formats are documented in the README.stats file and in the +scripts themselves. Further detail on the radio clock ASCII timecode +formats and related data are in the README.timecode file. + +David L. Mills +University of Delaware +mills@udel.edu +1 November 1993 + diff --git a/usr.sbin/xntpd/scripts/stats/README.stats b/usr.sbin/xntpd/scripts/stats/README.stats new file mode 100644 index 0000000..aa8e77f --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/README.stats @@ -0,0 +1,246 @@ +Statistics file formats (README.stats) + +The xntp3 daemon can produce a variety of statistics files which are +useful for maintenance, evaluation and retrospective calibration +purposes. See the xntpd.8 man page for instructions on how to configure +this feature. Since these files can become rather large and cumbersome, +they are ordinarily reduced to summary form by running the summary.sh +shell script once per day, week or month, as appropriate. There are +three file collections presently defined: peerstats, loopstats and +clockstats, each of which is described in this note. + +peerstats + +The following data are collected in the peerstats files. The files are +reduced to summary data using the peer.sh shell script. See the peer.awk +script for further information. A line in the file is produced upon +reception of each valid update from a configured peer. + + 49236 30.756 140.173.96.1 9474 0.000603 0.37532 + + 49236 modified Julian day number + 30.756 time of day (s) past midnight UTC + 140.173.96.1 peer identifier (IP address or receiver identifier) + 9474 peer status word (hex) (see NTP specification) + 0.000603 offset (s) + 0.08929 delay (s) + 0.37532 dispersion (s) + +loopstats + +The following data are collected in the loopstats files. The files are +reduced to summary data using the loop.sh shell script. See the loop.awk +script for further information. A line in the file is produced at each +valid update of the local clock. + + 49236 11.897 -0.000004 -35.9384 0 + + 49236 modified Julian day number + 11.897 time of day (s) past midnight UTC + -0.000004 time offset (s) + -35.9384 frequency offset (ppm) + 0 phase-lock loop time constant + +clockstats + +The following data are collected in the clockstats files. The files are +reduced to summary data using the clock.sh shell script, which also +updates the ensemble, etf, itf and tdata data files as well. See the +clock.awk, ensemble.awk, etf.awk, itf.awk and tdta.awk scripts for +further information. A line in the file is produced at each valid update +received from a configured radio clock. Data are at present recorded for +several radios. The first part of each data line is similar for all +radios, e.g.: + + 49234 60517.826 127.127.4.1 93 247 16:48:21.814 + + 49234 modified Julian day number + 60517.826 time of day (s) past midnight UTC + 127.127.4.1 receiver identifier (Spectracom 8170/Netclock-2) + 93 247 16:48:21.814 timecode (format varies) + +In the case of the Austron GPS receiver, a good deal of additional +information is extracted from the radio, as described below. The formats +shown consist of one line with all the fields shown in order. The +timecode formats specific to each radio follow. See the file +README.timecodes for detailed information on the timecode formats used +by these radios. + +Spectracom 8170/Netclock-2 WWVB receiver + + 49234 60517.826 127.127.4.1 ?A93 247 16:48:21.814 + + The '?' and 'A' characters are present only when the receiver is + unsynchronized; otherwise, they are replaced by space ' ' characters. + +IRIG audio decoder + + 49234 60517.826 127.127.6.0 247 16:48:21? + + The '?' character is present only when the receiver is unsynchronized. + +Austron 2200A/2201A GPS receiver + + 49234 60580.843 127.127.10.1 93:247:16:49:24.814? + + The '?' character is present only when the receiver is unsynchronized. + +Depending on the installed options, the Austron 2200A/2201A recognizes a +number of special commands that report various data items. See the +refclock_as2201.c source module for a list of the commands used. These +data are collected only if the following line is included in the +configuration file ntp.conf: + + fudge 127.127.10.1 flag4 1 # enable extended statistics collection + +The format of each data line returned is summarized in the following +list. + +External time/frequency data (requires input buffer option IN) + +These data determine the deviations of external time/frequency inputs +relative to receiver oscillator time. The following data are typical +using an external cesium oscillator PPS and 5-MHz outputs. + + 49234 60580.843 127.127.10.1 93:247:16:49:24.814 ETF + + -85.9 time interval (ns) + -89.0 average time interval (ns) + 4.0 time interval sigma (ns) + +1.510E-11 time interval rate + -4.500E-11 deltaf/f + +1.592E-11 average deltaf/f + 5.297E-13 sigma deltaf/f + 500 number of samples + +Model and option identifiers + +These data show the receiver model number and option configuration. + + 49234 60708.848 127.127.10.1 93:247:16:51:32.817 ID;OPT;VER + + GPS 2201A model ident (must be "GPS 2200A" or "GPS 2201A") + TTY1 rs232 option present (required) + TC1 IRIG option present (optional) + LORAN LORAN assist option present (optional) + IN input buffer option present (optional) + OUT1 output buffer option present (required) + B.00 data processor software version ("B.00" or later) + B.00 signal processor software version ("B.00" or later) + 28-Apr-93 software version date ("28-Apr-93" or later) + +Internal time/frequency data + +These data determine the deviations of the receiver oscillator with +respect to satellite time. + + 49234 60564.846 127.127.10.1 93:247:16:49:08.816 ITF + + COCO current mode (must be "COCO") + 0 code coast mode (must be zero) + +6.6152E-08 code sigma (s) + -3.5053E-08 code delta t (s) + -4.0361E-11 deltat/t + -6.4746E-11 oscillator ageing rate + 500.00 loop time constant + 4.984072 electrical tuning (V) + +GPS/LORAN ensemble data (requires LORAN assist option LORAN) + +These data determine the deviations and weights to calculate ensemble +time from GPS and LORAN data. + + 49234 60596.852 127.127.10.1 93:247:16:49:40.812 LORAN ENSEMBLE + + +9.06E-08 GPS t (s) + +3.53E-08 GPS sigma (s) + .532 GPS weight + +3.71E-08 LORAN t (s) + +3.76E-08 LORAN sigma (s) + .468 LORAN weight + +6.56E-08 ensemble t + +6.94E-08 ensemble sigma (s) + +LORAN stationkeeping data (requires LORAN assist option LORAN) + +These data determine which stations of the LORAN chain are being +tracked, together with individual signal/noise ratios, deviations and +weights. + + 49234 60532.850 127.127.10.1 93:247:16:48:36.820 LORAN TDATA + + M station identifier; data follows + OK status (must be "OK" for tracking) + 0 cw flag + 0 sw flag + 1162.17 time of arrival + -4.6 snr (-30.0 if not "OK" status) + 1.67E-07 2-sample phase-time deviation + .507 weight (included only if "OK" status) + W AQ 0 0 3387.80 -31.0 station identifier and data + X OK 0 0 1740.27 -11.2 2.20E-07 .294 station identifier and data + Y OK 0 0 2180.71 -4.6 2.68E-07 .198 station identifier and data + Z CV 0 0 3392.94 -30.0 station identifier and data + +Oscillator status and environment + +These data determine the receiver oscillator type, mode, status and +environment. Nominal operating conditions are shown below. + + 49234 60628.847 127.127.10.1 93:247:16:50:12.817 OSC;ET;TEMP + + 1121 Software Control oscillator model and mode (must be + "Software Control") + Locked status (must be "Locked") + 4.979905 electrical tuning (V) + 44.81 oscillator cavity temperature + +Receiver position, status and offsets + +These data determine the receiver position and elevation, together with +programmable delay corrections for the antenna cable and receiver. + + 49234 60788.847 127.127.10.1 93:247:16:52:52.817 POS;PPS;PPSOFF + + +39:40:48.425 receiver latitude (N) + -075:45:02.392 receiver longitude (E) + +74.09 receiver elevation (m) + Stored position status (must be "Stored") + UTC PPS/PPM alignment (must be "UTC") + 0 receiver delay (ns) (should be zero for calibrated + receiver) + 200 cable delay (ns) + 0 user time bias (ns) (must be zero) + +Satellite tracking status + +These data determine how many satellites are being tracked. At the +present state of constellation development, there should be at least +three visible satellites in view. Much of the time the maximum of +seven are being tracked; rarely this number drops to two. + + 49234 60612.850 127.127.10.1 93:247:16:49:56.820 TRSTAT + + 24 T satellite prn and status (T = track, A = acquire) + 16 A 13 T 20 T 18 T 07 T 12 T list continued + +UTC leap-second information + +These data determine when the next leap second is to occur. The exact +method to use is obscure. + + 49234 60548.847 127.127.10.1 93:247:16:48:52.818 UTC + + -1.2107E-08 A0 term (s) + -1.2790E-13 A1 term (s) + +9.0000E+00 current leap seconds (s) + +2.0480E+05 time for leap seconds (s) + +2.0100E+02 week number for delta leap (weeks) + +1.9100E+02 week number for future leap (weeks) + +4.0000E+00 day number for future leap (days) + +9.0000E+00 future leap seconds (s) + +David L. Mills +University of Delaware +mills@udel.edu +23 October 1993 diff --git a/usr.sbin/xntpd/scripts/stats/README.timecodes b/usr.sbin/xntpd/scripts/stats/README.timecodes new file mode 100644 index 0000000..00b5ba5 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/README.timecodes @@ -0,0 +1,149 @@ +Radio Timecode Formats (README.timecodes) + +Following are examples of the serial timecode formats used by various +timecode receivers as given in the instruction manuals. These examples +are intended only for illustration and not as the basis of system +design. The following symbols are used to identify the timecode +character that begins a subfield. The values given after this symbol +represent the character offset from the beginning of the timecode string +as edited to remove control characters. + +C on-time character (start bit) +Y year of century +T time of day +D day of year or month/day +A alarm indicator (format specific) +Q quality indicator (format specific) +<LF> ASCII line feed (hex 0a) +<CR> ASCII carriage return (hex 0d) +<SP> ASCII space (hex 20) + +In order to promote uniform behavior in the various implementations, it +is useful to have a common interpretation of alarm conditions and signal +quality. When the alarm indicator it on, the receiver is not operating +correctly or has never synchronized to the broadcast signal. When the +alarm indicator is off and the quality indicator is on, the receiver has +synchronized to the broadcast signal, then lost the signal and is +coasting on its internal oscillator. + +In the following uppercase letters, punctuation marks and spaces <SP> +stand for themselves; lowercase letters stand for fields as described. +Special characters other than <LF>, <CR> and <SP> are preceded by ^. + +Spectracom 8170 and Netclock/2 WWV Synchonized Clock (format 0) + +"<CR><LF>i ddd hh:mm:ss TZ=zz<CR><LF>" + C A D T + + poll: ?; offsets: Y = none, D = 3, T = 7, A = 0, Q = none + i = synchronization flag (<SP> = in synch, ? = out synch) + ddd = day of year + hh:mm:ss = hours, minutes, seconds + zz = timezone offset (hours from UTC) + + Note: alarm condition is indicated by other than <SP> at A, which + occurs during initial synchronization and when received signal has + been lost for about ten hours + + example: " 216 15:36:43 TZ=0" + A D T + +Netclock/2 WWV Synchonized Clock (format 2) + +"<CR><LF>iqyy ddd hh:mm:ss.fff ld" + C AQY D T + + poll: ?; offsets: Y = 2, D = 5, T = 9, A = 0, Q = 1 + i = synchronization flag (<SP> = in synch, ? = out synch) + q = quality indicator (<SP> < 1ms, A < 10 ms, B < 100 ms, C < 500 + ms, D > 500 ms) + yy = year (as broadcast) + ddd = day of year + hh:mm:ss.fff = hours, minutes, seconds, milliseconds of day + l = leap-second warning (L indicates leap at end of month) + d = standard/daylight time indicator (<SP> standard, D daylight) + + Note: alarm condition is indicated by other than <SP> at A, which + occurs during initial synchronization and when received signal has + been lost for about ten hours; unlock condition is indicated by + other than <SP> at Q, with time since last lock indicated by the + letter code A < 13 min, B < 1.5 hr, C < 7 hr, D > 7 hr. + + example: " 92 216 15:36:43.640 D" + AQ D T + +TrueTime 468-DC Satellite Synchronized Clock (and other TrueTime +receivers) + +"<CR><LF><^A>ddd:hh:mm:ssq<CR>" + D T QC + + poll: none; offsets: Y = none, D = 0, T = 4, A = 12, Q = 12 + hh:mm:ss = hours, minutes, seconds + q = quality/alarm indicator (<SP> = locked, ? = alarm) + + Note: alarm condition is indicated by ? at A, which occurs during + initial synchronization and when received signal is lost for an + extended period; unlock condition is indicated by other than <SP> + at Q + + example: "216:15:36:43 " + D T Q + +Heath GC-1000 Most Accurate Clock (WWV/H) + +"<CR>hh:mm:ss.f dd/mm/yy<CR>" + C T A D + + poll: none; offsets: Y = none, D = 15, T = 0, A = 9, Q = none + hh:mm:ss = hours, minutes, seconds + f = deciseconds (? when out of spec) + dd/mm = day, month + yy = year of century (from DIPswitches) + + Note: 0?:??:??.? is displayed before synch is first established and + hh:mm:ss.? once synch is established and then lost again for about + a day. + + example: "15:36:43.6 04/08/91" + T A D Y + +PST/Traconex 1020 Time Source (WWV/H) (firmware revision V4.01) + +"frdzycchhSSFTttttuuxx<CR>" "ahh:mm:ss.fffs<CR>" "yy/dd/mm/ddd<CR>" + A Q T Y D + + poll: "QMQDQT"; offsets: Y = 0, D = 3 T = 1,, A = 11, Q = 13 + f = frequency enable (O = all frequencies enabled) + r = baud rate (3 = 1200, 6 = 9600) + d = features indicator (@ = month/day display enabled) + z = time zone (0 = UTC) + y = year (5 = 1991) + cc = WWV propagation delay (52 = 22 ms) + hh = WWVH propagation delay (81 = 33 ms) + SS = status (80 or 82 = operating correctly) + F = current receive frequency (1-5 = 2.5, 5, 10, 15, 20 MHz) + T = transmitter (C = WWV, H = WWVH) + tttt = time since last update (minutes) + uu = flush character (03 = ^C) + xx = 94 (unknown) (firmware revision X4.01.999 only) + + a = AM/PM indicator (A = AM, P = PM, <SP> - 24-hour format) + hh:mm:ss.fff = hours, minutes, seconds, milliseconds of day + s = daylight-saving indicator (<SP> standard, D daylight) + + yy = year of century (from DIPswitches) + dd/mm/ddd = day of month, month of year, day of year + + Note: The alarm condition is indicated by other than ? at A, which + occurs during initial synchronization and when received signal is + lost for an extended period. A receiver unlock condition is + indicated by other than "0000" in the tttt subfield at Q. + + example: "O3@055281824C00000394 91/08/04/216 15:36:43.640" + T Y D T + +David L. Mills +University of Delaware +mills@udel.edu +23 October 1993 diff --git a/usr.sbin/xntpd/scripts/stats/clock.awk b/usr.sbin/xntpd/scripts/stats/clock.awk new file mode 100644 index 0000000..f6afc99 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/clock.awk @@ -0,0 +1,341 @@ +# awk program to scan clockstat files and report errors/statistics +# +# usage: awk -f check.awk clockstats +# +# This program works for Spectracom 8170/Netclock-2 receiver, Austron +# 2200A/2201A receiver and IRIG audio decoder. It is easily adapted to +# other receivers as required. See README.austron file for additional +# information on Austron receiver. +# +BEGIN { + etf_min = osc_vmin = osc_tmin = 1e9 + etf_max = osc_vmax = osc_tmax = -1e9 +} +# +# scan all records in file +# +{ + # + # select WWVB records + # see summary for decode + # + if (NF >= 4 && $3 == "127.127.4.1") { + if ($4 == "SIGNAL" || NF > 7) + printf "%s\n", $0 + else { + wwvb_count++ + if ($4 ~ /\?/) + wwvb_x++ + else if ($4 ~ /A/) + wwvb_a++ + else if ($4 ~ /B/) + wwvb_b++ + else if ($4 ~ /C/) + wwvb_c++ + else if ($4 ~ /D/) + wwvb_d++ + } + continue + } + # + # select IRIG records + # see summary for decode + # + if (NF >= 4 && $3 == "127.127.6.0") { + irig_count++ + if ($5 ~ /\?/) + irig_error++ + continue + } + # + # select LORAN ENSEMBLE records + # see summary for decode + # + else if (NF >= 13 && $6 == "ENSEMBLE") { + ensemble_count++ + if ($9 <= 0) + ensemble_badgps++ + else if ($12 <= 0) + ensemble_badloran++ + else { + if ($13 > 200e-9 || $13 < -200e-9) + ensemble_200++ + else if ($13 > 100e-9 || $13 < -100e-9) + ensemble_100++ + ensemble_mean += $13 + ensemble_rms += $13 * $13 + } + continue + } + # + # select LORAN TDATA records + # see summary for decode; note that signal quality log is simply + # copied to output + # + else if (NF >= 7 && $6 == "TDATA") { + tdata_count++ + for (i = 7; i < NF; i++) { + if ($i == "M" && $(i+1) == "OK") { + i += 5 + m += $i + tdata_m++ + } + else if ($i == "W" && $(i+1) == "OK") { + i += 5 + w += $i + tdata_w++ + } + else if ($i == "X" && $(i+1) == "OK") { + i += 5 + x += $i + tdata_x++ + } + else if ($i == "Y" && $(i+1) == "OK") { + i += 5 + y += $i + tdata_y++ + } + else if ($i == "Z" && $(i+1) == "OK") { + i += 5 + z += $i + tdata_z++ + } + } + continue + } + # + # select ITF records + # see summary for decode + # + else if (NF >= 13 && $5 == "ITF" && $12 >= 500) { + itf_count++ + if ($9 > 200e-9 || $9 < -200e-9) + itf_200++ + else if ($9 > 100e-9 || $9 < -100e-9) + itf_100++ + itf_mean += $9 + itf_rms += $9 * $9 + itf_var += $10 * $10 + continue + } + # + # select ETF records + # see summary for decode + # + else if (NF >= 13 && $5 == "ETF" && $13 >= 500) { + etf_count++ + if ($6 > etf_max) + etf_max = $6 + else if ($6 < etf_min) + etf_min = $6 + etf_mean += $6 + etf_rms += $6 * $6 + etf_var += $9 * $9 + continue + } + # + # select TRSTAT records + # see summary for decode + # + else if (NF >= 5 && $5 == "TRSTAT") { + trstat_count++ + j = 0 + for (i = 6; i <= NF; i++) + if ($i == "T") + j++ + trstat_sat[j]++ + continue + } + # + # select ID;OPT;VER records + # + # config GPS 2201A TTY1 TC1 LORAN IN OUT1 B.00 B.00 28-Apr-93 + # + # GPS 2201A receiver model + # TTY1 rs232 moduel + # TC1 IRIG module + # LORAN LORAN assist module + # IN input module + # OUT1 output module + # B.00 B.00 firmware revision + # 28-Apr-9 firmware date3 + # + else if (NF >= 5 && $5 == "ID;OPT;VER") { + id_count++ + id_temp = "" + for (i = 6; i <= NF; i++) + id_temp = id_temp " " $i + if (id_string != id_temp) + printf "config%s\n", id_temp + id_string = id_temp + continue + } + # + # select POS;PPS;PPSOFF records + # + # position +39:40:48.425 -075:45:02.392 +74.09 Stored UTC 0 200 0 + # + # +39:40:48.425 position north latitude + # -075:45:02.392 position east longitude + # +74.09 elevation (meters) + # Stored position is stored + # UTC time is relative to UTC + # 0 200 0 PPS offsets + # + else if (NF >= 5 && $5 == "POS;PPS;PPSOFF") { + pos_count++ + pos_temp = "" + for (i = 6; i <= NF; i++) + pos_temp = pos_temp " " $i + if (pos_string != pos_temp) + printf "position%s\n", pos_temp + pos_string = pos_temp + continue + } + # + # select OSC;ET;TEMP records + # + # loop 1121 Software Control Locked + # + # 1121 oscillator type + # Software Control loop is under software control + # Locked loop is locked + # + else if (NF >= 5 && $5 == "OSC;ET;TEMP") { + osc_count++ + osc_temp = $6 " " $7 " " $8 " " $9 + if (osc_status != osc_temp) + printf "loop %s\n", osc_temp + osc_status = osc_temp + if ($10 > osc_vmax) + osc_vmax = $10 + if ($10 < osc_vmin) + osc_vmin = $10 + if ($11 > osc_tmax) + osc_tmax = $11 + if ($11 < osc_tmin) + osc_tmin = $11 + continue + } + # + # select UTC records + # these ain't ready yet + # + else if (NF >= 5 && $5 == "UTC") { + utc_count++ + utc_temp = "" + for (i = 6; i <= NF; i++) + utc_temp = utc_temp " " $i + if (utc_string != utc_temp) +# printf "utc%s\n", utc_temp + utc_string = utc_temp + continue + } +} END { +# +# ensemble summary data +# +# ensemble record count +# badgps gps data unavailable +# badloran loran data unavailable +# rms ensemble rms error (ns) +# >200 ensemble error >200 ns +# >100 100 ns < ensemble error < 200 ns +# + if (ensemble_count > 0) { + ensemble_mean /= ensemble_count + ensemble_rms = sqrt(ensemble_rms / ensemble_count - ensemble_mean * ensemble_mean) * 1e9 + printf "ensemble %d, badgps %d, badloran %d, rms %.1f, >200 %d, >100 %d\n", ensemble_count, ensemble_badgps, ensemble_badloran, ensemble_rms, ensemble_200, ensemble_100 + } +# +# wwvb summary data +# +# wwvb record count +# ? unsynchronized +# >1 error > 1 ms +# >10 error > 10 ms +# >100 error > 100 ms +# >500 error > 500 ms +# + if (wwvb_count > 0) + printf "wwvb %d, ? %d, >1 %d, >10 %d, >100 %d, >500 %d\n", wwvb_count, wwvb_x, wwvb_a, wwvb_b, wwvb_c, wwvb_d +# +# irig summary data +# +# irig record count +# err error count +# + if (irig_count > 0) + printf "irig %d, err %d\n", irig_count, irig_error +# +# tdata summary data +# +# tdata record count +# m M master OK-count, mean level (dB) +# w W slave OK-count, mean level (dB) +# x X slave OK-count, mean level (dB) +# y Y slave OK-count, mean level (dB) +# z Z slave OK-count, mean level (dB) +# + if (tdata_count > 0 ) { + if (tdata_m > 0) + m /= tdata_count + if (tdata_x > 0) + w /= tdata_count + if (tdata_x > 0) + x /= tdata_count + if (tdata_y > 0) + y /= tdata_count + if (tdata_z > 0) + z /= tdata_count + printf "tdata %d, m %d %.1f, w %d %.1f, x %d %.1f, y %d %.1f, z %d %.1f\n", tdata_count, tdata_m, m, tdata_w, w, tdata_x, x, tdata_y, y, tdata_z, z + } +# +# itf summary data +# +# itf record count +# rms itf rms error (ns) +# >200 itf error > 200 ns +# >100 itf error > 100 ns +# var Allan variance +# + if (itf_count > 1) { + itf_mean /= itf_count + itf_rms = sqrt(itf_rms / itf_count - itf_mean * itf_mean) * 1e9 + itf_var = sqrt(itf_var / (2 * (itf_count - 1))) + printf "itf %d, rms %.1f, >200 %d, >100 %d, var %.2e\n", itf_count, itf_rms, itf_200, itf_100, itf_var + } +# +# etf summary data +# +# etf record count +# mean etf mean (ns) +# rms etf rms error (ns) +# max etf maximum (ns) +# min etf minimum (ns) +# var Allan variance +# + if (etf_count > 0) { + etf_mean /= etf_count + etf_rms = sqrt(etf_rms / etf_count - etf_mean * etf_mean) + etf_var = sqrt(etf_var / (2 * (etf_count - 1))) + printf "etf %d, mean %.1f, rms %.1f, max %d, min %d, var %.2e\n", etf_count, etf_mean, etf_rms, etf_max, etf_min, etf_var + } +# +# trstat summary data +# +# trstat record count +# sat histogram of tracked satellites (0 - 7) +# + if (trstat_count > 0) + printf "trstat %d, sat %d %d %d %d %d %d %d %d\n", trstat_count, trstat_sat[0], trstat_sat[1], trstat_sat[2], trstat_sat[2], trstat_sat[3], trstat_sat[4], trstat_sat[5], trstat_sat[6], trstat_sat[7] +# +# osc summary data +# +# osc record count +# control control midrange (V) +/- deviation (mV) +# temp oven temperature midrange +/- deviation (deg C) +# + if (osc_count > 0) + printf "osc %d, control %.3f+/-%.3f, temp %.1f+/-%.2f\n", osc_count, (osc_vmax + osc_vmin) / 2, (osc_vmax - osc_vmin) / 2 * 1e3, (osc_tmax + osc_tmin) / 2, (osc_tmax - osc_tmin) / 2 +} diff --git a/usr.sbin/xntpd/scripts/stats/clock.sh b/usr.sbin/xntpd/scripts/stats/clock.sh new file mode 100755 index 0000000..1866d55 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/clock.sh @@ -0,0 +1,17 @@ +#!/bin/csh +# +# Script to summarize clockstats files +# +set x = `ls clockstats.*` +foreach dayfile ( $x ) + if ($dayfile == $x[$#x]) continue + echo " " + echo $dayfile + awk -f clock.awk $dayfile + awk -f itf.awk $dayfile >>itf + awk -f etf.awk $dayfile >>etf + awk -f ensemble.awk $dayfile >>ensemble + awk -f tdata.awk $dayfile >>tdata + rm -f $dayfile +end + diff --git a/usr.sbin/xntpd/scripts/stats/dupe.awk b/usr.sbin/xntpd/scripts/stats/dupe.awk new file mode 100644 index 0000000..3ddc1b6 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/dupe.awk @@ -0,0 +1,7 @@ +# program to delete duplicate lines in a file +# +{ + if (old != $0) + printf "%s\n", $0 + old = $0 +} diff --git a/usr.sbin/xntpd/scripts/stats/ensemble.awk b/usr.sbin/xntpd/scripts/stats/ensemble.awk new file mode 100644 index 0000000..136b33d --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/ensemble.awk @@ -0,0 +1,17 @@ +# program to produce loran ensemble statistics from clockstats files +# +# usage: awk -f ensemble.awk clockstats +# +# format of input record (time values in seconds) +# 49165 8.628 127.127.10.1 93:178:00:00:07.241 LORAN ENSEMBLE +# -6.43E-08 +5.02E-08 .091 +5.98E-08 +1.59E-08 .909 +4.85E-08 +3.52E-08 +# +# format of output record (time values in nanoseconds) +# MJD sec GPS wgt LORAN wgt avg sigma +# 49165 8.628 -64.3 0.091 59.8 0.909 48.5 35.2 +# +# select LORAN ENSEMBLE records with valid format and weights +{ + if (NF >= 14 && $6 == "ENSEMBLE" && $9 > 0 && $12 > 0) + printf "%5s %9.3f %7.1f %6.3f %7.1f %6.3f %7.1f %7.1f\n", $1, $2, $7*1e9, $9, $10*1e9, $12, $13*1e9, $14*1e9 +} diff --git a/usr.sbin/xntpd/scripts/stats/etf.awk b/usr.sbin/xntpd/scripts/stats/etf.awk new file mode 100644 index 0000000..8e6e334 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/etf.awk @@ -0,0 +1,19 @@ +# program to produce external time/frequence statistics from clockstats files +# +# usage: awk -f etf.awk clockstats +# +# format of input record +# 49165 40.473 127.127.10.1 93:178:00:00:39.238 ETF +# +175.0 +176.8 2.0 +3.729E-11 +1.000E-10 +3.511E-11 4.005E-13 500 +# +# format of output record (time values in nanoseconds) +# MJD sec time freq +# 49165 40.473 175.0 3.729e-11 +# +# select ETF records with valid format +{ + if (NF >= 9 && $5 == "ETF") { + printf "%5s %9.3f %7.1f %10.3e\n", $1, $2, $6, $9 + } +} + diff --git a/usr.sbin/xntpd/scripts/stats/itf.awk b/usr.sbin/xntpd/scripts/stats/itf.awk new file mode 100644 index 0000000..2b21c5b --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/itf.awk @@ -0,0 +1,19 @@ +# program to produce intewrnal time/frequence statistics from clockstats files +# +# usage: awk -f itf.awk clockstats +# +# format of input record +# 49227 67.846 127.127.10.1 93:240:00:00:51.816 ITF +# COCO 0 +2.0579E-07 -3.1037E-08 -7.7723E-11 +6.5455E-10 500.00 4.962819 +# +# format of output record (time values in nanoseconds) +# MJD sec time freq +# 49227 67.846 +2.0579E-07 -7.7723E-11 +# +# select ITF records with valid format +{ + if (NF >= 10 && $5 == "ITF") { + printf "%5s %9.3f %7.1f %10.3e\n", $1, $2, $8 * 1e9, $10 + } +} + diff --git a/usr.sbin/xntpd/scripts/stats/loop.awk b/usr.sbin/xntpd/scripts/stats/loop.awk new file mode 100644 index 0000000..25d0bdb --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/loop.awk @@ -0,0 +1,49 @@ +# awk program to scan loopstats files and report errors/statistics +# +# usage: awk -f loop.awk loopstats +# +# format of loopstats record +# MJD sec time (s) freq (ppm) tc +# 49235 3.943 0.000016 22.4716 0 +# +BEGIN { + loop_tmax = loop_fmax = -1e9 + loop_tmin = loop_fmin = 1e9 +} +# +# scan all records in file +# +{ + if (NF >= 5) { + loop_count++ + if ($3 > loop_tmax) + loop_tmax = $3 + if ($3 < loop_tmin) + loop_tmin = $3 + if ($4 > loop_fmax) + loop_fmax = $4 + if ($4 < loop_fmin) + loop_fmin = $4 + loop_time += $3 + loop_time_rms += $3 * $3 + loop_freq += $4 + loop_freq_rms += $4 * $4 + } +} END { + if (loop_count > 0) { + loop_time /= loop_count + loop_time_rms = sqrt(loop_time_rms / loop_count - loop_time * loop_time) + loop_freq /= loop_count + loop_freq_rms = sqrt(loop_freq_rms / loop_count - loop_freq * loop_freq) + loop_tmax = loop_tmax - loop_time + loop_tmin = loop_time - loop_tmin + if (loop_tmin > loop_tmax) + loop_tmax = loop_tmin + loop_fmax = loop_fmax - loop_freq + loop_fmin = loop_time - loop_fmin + if (loop_fmin > loop_fmax) + loop_fmax = loop_fmin + printf "loop %d, %.0f+/-%.1f, rms %.1f, freq %.2f+/-%0.3f, rms %.3f\n", loop_count, loop_time * 1e6, loop_tmax * 1e6, loop_time_rms * 1e6, loop_freq, loop_fmax, loop_freq_rms + } +} + diff --git a/usr.sbin/xntpd/scripts/stats/loop.sh b/usr.sbin/xntpd/scripts/stats/loop.sh new file mode 100755 index 0000000..619eeb8 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/loop.sh @@ -0,0 +1,13 @@ +#!/bin/csh +# +# Script to summarize loopstats files +# +set x = `ls loopstats.*` +foreach dayfile ( $x ) + if ($dayfile == $x[$#x]) continue + echo " " + echo $dayfile + awk -f loop.awk $dayfile + rm -f $dayfile +end + diff --git a/usr.sbin/xntpd/scripts/stats/peer.awk b/usr.sbin/xntpd/scripts/stats/peer.awk new file mode 100644 index 0000000..4cb48cd --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/peer.awk @@ -0,0 +1,57 @@ +# awk program to scan peerstats files and report errors/statistics +# +# usage: awk -f peer.awk peerstats +# +# format of peerstats record +# MJD sec ident stat offset (s) delay (s) disp (s) +# 49235 11.632 128.4.2.7 f414 -0.000041 0.21910 0.00084 +# +BEGIN { + n = 0 + MAXDISTANCE = 1.0 +} +# +# scan all records in file +# +{ + if (NF >= 7 && ($7 + $6 / 2) < MAXDISTANCE) { + i = n + for (j = 0; j < n; j++) { + if ($3 == peer_ident[j]) + i = j + } + if (i == n) { + peer_ident[i] = $3 + peer_tmax[i] = peer_dist[i] = -1e9 + peer_tmin[i] = 1e9 + n++ + } + peer_count[i]++ + if ($5 > peer_tmax[i]) + peer_tmax[i] = $5 + if ($5 < peer_tmin[i]) + peer_tmin[i] = $5 + dist = $7 + $6 / 2 + if (dist > peer_dist[i]) + peer_dist[i] = dist + peer_time[i] += $5 + peer_time_rms[i] += $5 * $5 + peer_delay[i] += $6 + peer_disp[i] += $7 + } +} END { + printf " ident cnt mean rms max delay dist disp\n" + printf "==========================================================================\n" + for (i = 0; i < n; i++) { + peer_time[i] /= peer_count[i] + peer_time_rms[i] = sqrt(peer_time_rms[i] / peer_count[i] - peer_time[i] * peer_time[i]) + peer_delay[i] /= peer_count[i] + peer_disp[i] /= peer_count[i] + peer_tmax[i] = peer_tmax[i] - peer_time[i] + peer_tmin[i] = peer_time[i] - peer_tmin[i] + if (peer_tmin[i] > peer_tmax[i]) + peer_tmax[i] = peer_tmin[i] + printf "%15s%5d%9.3f%9.3f%9.3f%9.3f%9.3f%9.3f\n", peer_ident[i], peer_count[i], peer_time[i] * 1e3, peer_time_rms[i] * 1e3, peer_tmax[i] * 1e3, peer_delay[i] * 1e3, peer_dist[i] * 1e3, peer_disp[i] * 1e3 + } +} + diff --git a/usr.sbin/xntpd/scripts/stats/peer.sh b/usr.sbin/xntpd/scripts/stats/peer.sh new file mode 100755 index 0000000..b5d8d29 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/peer.sh @@ -0,0 +1,13 @@ +#!/bin/csh +# +# Script to summarize peerstats files +# +set x = `ls peerstats.*` +foreach dayfile ( $x ) + if ($dayfile == $x[$#x]) continue + echo " " + echo $dayfile + awk -f peer.awk $dayfile + rm -f $dayfile +end + diff --git a/usr.sbin/xntpd/scripts/stats/psummary.awk b/usr.sbin/xntpd/scripts/stats/psummary.awk new file mode 100644 index 0000000..b7f0e92 --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/psummary.awk @@ -0,0 +1,41 @@ +# program to scan peer_summary file and produce summary of daily summaries +# +{ + if (NF < 8 || $1 == "ident") + continue + i = n + for (j = 0; j < n; j++) { + if ($1 == peer_ident[j]) + i = j + } + if (i == n) { + peer_ident[i] = $1 + n++ + } + peer_count[i]++ + if (($7 - $6 / 2) < 400) { + peer_count[i]++ + peer_mean[i] += $3 + peer_var[i] += $4 * $4 + if ($5 > peer_max[i]) + peer_max[i] = $5 + if ($5 > 1) + peer_1[i]++ + if ($5 > 5) + peer_2[i]++ + if ($5 > 10) + peer_3[i]++ + if ($5 > 50) + peer_4[i]++ + } +} END { + printf " host cnt mean rms max >1 >5 >10 >50\n" + printf "=================================================================\n" + for (i = 0; i < n; i++) { + if (peer_count[i] <= 0) + continue + peer_mean[i] /= peer_count[i] + peer_var[i] = sqrt(peer_var[i] / peer_count[i]) + printf "%15s%4d%10.3f%10.3f%10.3f%4d%4d%4d%4d\n", peer_ident[i], peer_count[i], peer_mean[i], peer_var[i], peer_max[i], peer_1[i], peer_2[i], peer_3[i], peer_4[i] + } +} diff --git a/usr.sbin/xntpd/scripts/stats/summary.sh b/usr.sbin/xntpd/scripts/stats/summary.sh new file mode 100755 index 0000000..e27ecfa --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/summary.sh @@ -0,0 +1,12 @@ +#!/bin/csh +# +# Script to summarize ipeerstats, loopstats and clockstats files +# +# This script can be run from a cron job once per day, week or month. It +# runs the file-specific summary script and appends the summary data to +# designated files. +# +peer.sh >>peer_summary +loop.sh >>loop_summary +clock.sh >>clock_summary + diff --git a/usr.sbin/xntpd/scripts/stats/tdata.awk b/usr.sbin/xntpd/scripts/stats/tdata.awk new file mode 100644 index 0000000..04d7e6a --- /dev/null +++ b/usr.sbin/xntpd/scripts/stats/tdata.awk @@ -0,0 +1,45 @@ +# program to produce loran tdata statistics from clockstats files +# +# usage: awk -f tdata.awk clockstats +# +# format of input record (missing replaced by -40.0) +# 49228 36.852 127.127.10.1 93:241:00:00:20.812 LORAN TDATA +# M OK 0 0 1169.14 -7.4 3.16E-07 .424 +# W CV 0 0 3329.30 -16.4 1.81E-06 +# X OK 0 0 1737.19 -10.5 3.44E-07 .358 +# Y OK 0 0 2182.07 -9.0 4.41E-07 .218 +# +# format of output record (signal values are in dB) +# MJD sec time M W X Y Z +# 49228 36.852 175.0 -7.4 -16.4 -10.5 -9.0 +# +# select LORAN TDATA records with valid format +{ + if (NF >= 7 && $6 == "TDATA") { + m = w = x = y = z = -40.0 + for (i = 7; i < NF - 5; i++) { + if ($i == "M" && $(i+1) == "OK") { + i += 5 + m = $i + } + else if ($i == "W" && $(i+1) == "OK") { + i += 5 + w = $i + } + else if ($i == "X" && $(i+1) == "OK") { + i += 5 + x = $i + } + else if ($i == "Y" && $(i+1) == "OK") { + i += 5 + y = $i + } + else if ($i == "Z" && $(i+1) == "OK") { + i += 5 + z = $i + } + } + printf "%5s %9.3f %6.1f %6.1f %6.1f %6.1f %6.1f\n", $1, $2, m, w, x, y, z + } +} + diff --git a/usr.sbin/xntpd/scripts/support/README b/usr.sbin/xntpd/scripts/support/README new file mode 100644 index 0000000..812965b --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/README @@ -0,0 +1,73 @@ +The bin and etc directories contain several scripts (sh and perl) that +should ease startup and configuration of NTP sites. + + bin/monl is a monitoring script that prints out new, current and + old customers of an NTP timeserver when monitoring is + in effect. + monl has following options: + -i <regexp> (regular expression matchin IP addres to be ignored + -d <directory> where the current state is kept (default /tmp) + -v debug output + -n do not translate IP addresses into hostnames + <host> host to be analyzed + + monl uses xntpdc for information gathering and is thus + limited to the NTP version xntpdc is compiled for. + + bin/mvstats moves compresses and removes statistics files (useful mainly + for reference servers + + etc/install creates the locally needed directories for NTP (if not residung in /etc) + + etc/rc starts up daemon with configuration file and key file + etc/cron cron called monitor statistic (uses bin/monl) + etc/crontab crontab prototype for reference time servers + etc/setup sh script sourced by the other scripts for variable setup + +YOU MUST EDIT THESE FILES TO REFLECT YOUR LOCAL SETUP ! + +READ THIS BEFORE USING THE STARTUP SCRIPTS + +The startupscript etc/rc has been written for Suns and HPs. They are not +guaranteed to work elsewhere. Following assumptions have been made: + + All NTP related files reside in ONE directory having following structure: + + bin/* - all executables (daemon, control, date, scripts) + etc/* - startup scripts and cron scripts + conf/* - NTP configuration files + +The variable NTPROOT (etc/rc, etc/install) must be edited to reflect +the NTP directory (e.g. /usr/local/NTP) + +NTP config files are located via Suns arch command and have the name +conf/`arch`.`arch -k`. +These are the default configurations (usually clients). If a file with the name +conf/`arch`.`arch -k`.`hostname` is present this file will be preferred (Reference host, +gateway). If the arch command is not available no-arch is used. The arch command +is usually a shell script which echoes a string unique the the current machine +architecture. + +The tickadj command has its own conf/tickconf file which is used to set host +specific tickadj values. The line with DEFAULT specifies the default tickadj +parameters, all other lines consists of <hostname> <hostid> +<tickadj parameters>. These lines need only be entered if the specified host +needs parameters different from the default parameters. + +Reference clock support is provided for DCF77. If you need to initialize +certain things for reference clock support (e.g. loading STREAMS modules), +you need to edit etc/rc. + +The current config files of Erlangen are included in the conf directory. +They are just for reference, but might help you a bit in setting up a +synchronisation network. + +The advantage of keeping all config files centralized is the easier +administration. + +We replicate the NTP directory via NFS and rdist. + +When you have set up the local config files (YOUR OWN!) you can call +<NTPROOT>/etc/rc for daemon startup. + +For more information: time@informatik.uni-erlangen.de diff --git a/usr.sbin/xntpd/scripts/support/bin/monl b/usr.sbin/xntpd/scripts/support/bin/monl new file mode 100755 index 0000000..44201d0 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/bin/monl @@ -0,0 +1,212 @@ +#!/local/bin/perl + +%service = ( 0, "unspec", + 1, "Active", + 2, "Passive", + 3, "Client", + 4, "Server", + 5, "Broadcast", + 6, "Control", + 7, "Private" ); +%nc = (); +@ignpat = (); +$noname = 0; +$verbose = 0; +$retries = 5; +$lastkey = 0; + +sub timedelta { + local($tm, $days, $h, $m, $s); + + $tm = @_[$[]; + $days = 0; + $days = sprintf("%dd+", $days) if $days = int($tm / (60*60*24)); + $days = "" unless $days; + $tm = $tm % (60*60*24); + $h = int($tm / (60*60)); + $tm = $tm % (60*60); + $m = int($tm / 60); + $s = $tm % 60; + + return sprintf("%s%02d:%02d:%02d", $days, $h, $m, $s); +} + +sub listentry { + local($host, $mode) = split("$;" , @_[$[]); + local($count, $version, $firsttime) = split("$;" , $_[$[+1]); + local($name); + + if (grep($host =~ m/$_/, @ignpat)) + { + print "ignored $host ...\n" if $verbose; + return; + } + + return if ! $count; + + if (defined($nc{$host})) + { + $name = $nc{$host}; + } + else + { + if ($noname) + { + $nc{$host} = $name = $host; + } + else + { + $name = (gethostbyaddr(pack("C4", split(/\./, $host)), 2))[$[]; + $nc{$host} = $name = $host if ! defined($name); + } + } + + printf ($fmt, ($lastkey eq $host) ? "" : $name, $service{$mode}, $count, $version, &timedelta($firsttime), $firsttime / $count); + + if (@_[$[+2]) + { + $hostcnt++ if $lastkey ne $host; + $packcnt += $count; + $maxtime = $firsttime if $firsttime > $maxtime; + } + + $lastkey = $host; +} + +while ($ARGV[$[] =~ /^-[nvid]$/) + { + if ($ARGV[$[] eq "-i") + { + shift; + push(@ignpat, shift) unless ! defined($ARGV[$[]); + } + elsif ($ARGV[$[] eq "-d") + { + shift; + $dir = shift unless ! defined($ARGV[$[]); + } + elsif ($ARGV[$[] eq "-n") + { + shift; + $noname = 1; + } + elsif ($ARGV[$[] eq "-v") + { + shift; + $verbose = 1; + } + } + +$dir = "/tmp" unless defined($dir); +$gone = 60*60*48; +$fmt = "%48s %10s %7d %7d %13s %14.3f\n"; +$sfmt = "%48s %10s %7s %7s %13s %14s\n"; +@lbl = ("Host", "Mode", "Count", "Version", "Time active", "Packetinterval"); + +if (!defined($ARGV[$[])) + { + $hostname = `hostname`; + chop($hostname); + unshift(@ARGV, $hostname); + } + +foreach $hostname (@ARGV) + { + $dbmfile = $dir . "/monlstats-" . $hostname; + $monl = "xntpdc -c 'hostnames no' -c monl $hostname | tail +3 |"; + $hostcnt = 0; + $packcnt = 0; + $maxtime = 0; + %Seen = (); + %New = (); + %Old = (); + + print "Monitor Status of $hostname\n\n"; + + $cnt = $retries; + do + { + open(MONL, $monl) || die("$monl failed $!"); + @monlout = <MONL>; + close(MONL); + } while (! @monlout && $cnt--); + + if (! @monlout) + { + print "not available.\n"; + next; + } + + dbmopen(Clients, $dbmfile, 0644) || die("dbmopen(.., $dbmfile, ...): $!"); + + foreach (@monlout) + { + chop; + split; + ($host, $count, $mode, $version, $lasttime, $firsttime) = (@_[$[, $[+2 .. $[+6]); + + $Seen{$host, $mode} = 1; + + if (!defined($Clients{$host, $mode})) + { + if ($lasttime <= $gone) + { + ## got a new one + $Clients{$host, $mode} = $New{$host, $mode} = join("$;", $count, $version, $firsttime, $lasttime); + } + } + else + { + ## throw out the old ones + if ($lasttime > $gone) + { + $Old{$host, $mode} = $Clients{$host, $mode}; + delete $Clients{$host, $mode}; + } + else + { + $Clients{$host, $mode} = join("$;", $count, $version, $firsttime, $lasttime); + } + } + } + + grep(($Seen{$_} || ($Old{$_} = delete $Clients{$_})), keys(%Clients)); + + if (grep(($tmp = $_ , !grep($tmp =~ m/$_/, @ignpat)), keys(%New))) + { + print "New customers\n"; + print "-------------\n"; + printf $sfmt, @lbl; + grep( &listentry($_, $New{$_}, 1), sort(keys(%New)) ); + print "\n"; + } + + + if (grep((!defined($New{$_}) && ($tmp = $_, !grep($tmp =~ m/$_/, @ignpat))), keys(%Clients))) + { + print "Current customers\n"; + print "-----------------\n"; + printf $sfmt, @lbl; + grep( defined($New{$_}) || &listentry($_, $Clients{$_}, 1) , sort(keys(%Clients)) ); + print "\n"; + } + + if (grep(($tmp = $_, !grep($tmp =~ m/$_/, @ignpat)), keys(%Old))) + { + print "Discarded customers\n"; + print "-------------------\n"; + printf $sfmt, @lbl; + grep( &listentry($_, $Old{$_}, 0) , sort(keys(%Old)) ); + print "\n"; + } + + dbmclose(Clients); + + print "\nSummary:\n"; + print "--------\n"; + printf("Elapsed time: %13s\n", &timedelta($maxtime)); + printf(" Hosts: %13d\n", $hostcnt); + printf(" Packets: %13d\n", $packcnt); + printf(" Rate: %13.2f\n", $packcnt / $maxtime) if $maxtime; + print "\n"; + } diff --git a/usr.sbin/xntpd/scripts/support/bin/mvstats b/usr.sbin/xntpd/scripts/support/bin/mvstats new file mode 100755 index 0000000..e33dc792 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/bin/mvstats @@ -0,0 +1,23 @@ +#!/bin/sh +# +# mvstats,v 3.1 1993/07/06 01:10:24 jbj Exp +# +# mvstats is called by cron for keeping the log files together +# usually only used on reference hosts +# +# Files reside in /var/NTP +# Files older than 2 days will be compressed, +# Files older than 64 days will be removed. +# +# mvstats,v +# Revision 3.1 1993/07/06 01:10:24 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:24 kardel +# Prerelease NTP V3 / DCF +# +# +cd /var/NTP +find . ! -name '*.Z' -mtime +2 -exec compress -f {} \; +find . -mtime +64 -exec rm -f {} \; diff --git a/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 b/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 new file mode 100644 index 0000000..7b18758 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/hp300.hp300 @@ -0,0 +1,70 @@ +# +# FAU NTP client configuration file +# +# hp300.hp300,v 3.1 1993/07/06 01:10:27 jbj Exp +# +# hp300.hp300,v +# Revision 3.1 1993/07/06 01:10:27 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:29 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.2 1992/09/24 06:10:46 kardel +# authdelay adjust +# +# Revision 1.1 1992/09/24 06:09:23 kardel +# Initial revision +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +# +# authentication stuff +# +authdelay 0.000436 # hp300 +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 new file mode 100644 index 0000000..911ff10 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700 @@ -0,0 +1,67 @@ +# +# FAU NTP client configuration file +# +# hp700.hp700,v 3.1 1993/07/06 01:10:29 jbj Exp +# +# hp700.hp700,v +# Revision 3.1 1993/07/06 01:10:29 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:31 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.1 1992/09/24 06:09:02 kardel +# Initial revision +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +# +# authentication stuff +# +authdelay 0.000016 # hp700 +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 new file mode 100644 index 0000000..80c72a6 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/hp700.hp700.faui47 @@ -0,0 +1,71 @@ +# +# FAU NTP client configuration file +# +# hp700.hp700.faui47,v 3.1 1993/07/06 01:10:30 jbj Exp +# +# hp700.hp700.faui47,v +# Revision 3.1 1993/07/06 01:10:30 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:33 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.1 1992/09/24 14:53:10 kirschni +# Initial revision +# +# Revision 1.1 1992/09/24 06:09:02 kardel +# Initial revision +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out +broadcast 131.188.54.255 + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +# +# authentication stuff +# +authdelay 0.000016 # hp700 +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 b/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 new file mode 100644 index 0000000..58f4706 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/hp800.hp800 @@ -0,0 +1,70 @@ +# +# FAU NTP client configuration file +# +# hp800.hp800,v 3.1 1993/07/06 01:10:31 jbj Exp +# +# hp800.hp800,v +# Revision 3.1 1993/07/06 01:10:31 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:35 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.2 1992/09/24 06:10:46 kardel +# authdelay adjust +# +# Revision 1.1 1992/09/24 06:09:23 kardel +# Initial revision +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +# +# authentication stuff +# +authdelay 0.000088 # hp800 +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.60.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.54.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.conf b/usr.sbin/xntpd/scripts/support/conf/ntp.conf new file mode 100644 index 0000000..06f5482 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/ntp.conf @@ -0,0 +1,36 @@ +# +# peers - local synch setup +# +#server ntps1-0 key 0 version 2 +#server ntps1-1 key 0 version 2 +#server ntps2-0 key 0 version 2 +#server ntps2-1 key 0 version 2 +broadcastclient yes +#broadcastdelay # use default, until we measure something +# +# files +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres +# +# authentication stuff +# +authdelay 0.000629 +requestkey 65634 +controlkey 65635 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nopeer nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # allow refclocks +restrict 127.0.0.1 mask 255.255.255.255 # allow local config +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify# allow local hosts diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.keys b/usr.sbin/xntpd/scripts/support/conf/ntp.keys new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/ntp.keys diff --git a/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb b/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/ntp.keys.dumb diff --git a/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 b/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 new file mode 100644 index 0000000..06f5482 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun3.sun3 @@ -0,0 +1,36 @@ +# +# peers - local synch setup +# +#server ntps1-0 key 0 version 2 +#server ntps1-1 key 0 version 2 +#server ntps2-0 key 0 version 2 +#server ntps2-1 key 0 version 2 +broadcastclient yes +#broadcastdelay # use default, until we measure something +# +# files +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres +# +# authentication stuff +# +authdelay 0.000629 +requestkey 65634 +controlkey 65635 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nopeer nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # allow refclocks +restrict 127.0.0.1 mask 255.255.255.255 # allow local config +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify# allow local hosts diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 new file mode 100644 index 0000000..8927535 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui01 @@ -0,0 +1,83 @@ +# +# NTP v3 configuration file for faui01 +# +# sun4.sun4.faui01,v 3.1 1993/07/06 01:10:37 jbj Exp +# +# sun4.sun4.faui01,v +# Revision 3.1 1993/07/06 01:10:37 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:44 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.3 1992/10/15 10:56:01 kardel +# -60 has 0 broadcasts now +# +# Revision 1.2 1992/09/17 12:46:53 kardel +# CIP network broadcasts +# +# Revision 1.1 1992/06/09 13:40:44 kardel +# Initial revision +# +# + +# +# Local clock definitions +# +precision -14 # kernel fix - HIREZ timer + +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# get time from local network - hope this is reasonably stable +# +broadcastclient yes + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift + +# +# authentication stuff +# +authdelay 0.000076 +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.54.255 key 0 version 3 +broadcast 131.188.60.0 key 0 version 3 +broadcast 131.188.61.0 version 3 # inf1-net.revue (still on 2) +broadcast 131.188.62.0 version 3 # inf4-net1.revue (still on 2) + +# +# Statistics +# +monitor yes +#statfile /var/NTP/statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 notrust # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +restrict 131.188.1.45 mask 255.255.255.255 # ntps1-0 +restrict 131.188.34.45 mask 255.255.255.255 # ntps1-0 +restrict 131.188.44.45 mask 255.255.255.255 # ntps1-0 diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 new file mode 100644 index 0000000..3be93a9 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui10 @@ -0,0 +1,176 @@ +# +# NTP v3 configuration file for faui45 +# +# sun4.sun4.faui10,v 3.1 1993/07/06 01:10:38 jbj Exp +# +# sun4.sun4.faui10,v +# Revision 3.1 1993/07/06 01:10:38 jbj +# XNTP release 3.1 +# +# +# Revision 1.2 1993/01/19 09:32:31 kardel +# Release 1993/01/19 DCF77/PPS +# +# Revision 1.1 1992/12/10 12:58:46 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.11 1992/10/28 07:38:09 kardel +# bear.zoo.bt.co.uk now also peer +# +# Revision 1.10 1992/09/17 12:56:22 kardel +# 61 and 62 have ZEROBROADCASTS +# +# Revision 1.9 1992/09/17 12:46:53 kardel +# CIP network broadcasts +# +# Revision 1.8 1992/08/14 21:51:04 kardel +# local clock is now preferred peer +# +# Revision 1.7 1992/07/19 14:19:26 kardel +# fixed broadcasts +# +# Revision 1.6 1992/07/17 17:12:43 kardel +# new statistics support +# +# Revision 1.5 1992/07/10 07:46:03 kardel +# added loopstats statistic file +# +# Revision 1.4 1992/06/26 07:30:32 kardel +# update for reference clock support +# +# Revision 1.3 1992/05/18 13:51:04 kardel +# precision fix +# +# Revision 1.2 1992/03/30 11:16:07 kardel +# ntps1-1 version 3 +# +# Revision 1.1 1992/01/14 12:30:21 kardel +# Initial revision +# +# + +# +# Local clock definitions +# +precision -18 # us resolution + +# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO +# +# Supported clock types Base +# Meinberg DCF PZF535 TCXO 0 +# Meinberg DCF PZF535 OCXO 16 +# Meinberg DCF U/A 31 32 +# +# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) +# PPS 128 +# +# The device to be used is added to the base (16 devices possible +# /dev/dcf77-0 - /dev/dcf77-15) +# +# If PPS support is to be used 128 has to be added to the base +# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) +# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) +# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) +# +peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support +# +# We want to provide timed service too, thus (startup script magic) +# TIMED + +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# peers - local synch setup +# +peer ntps1-0 key 0 version 3 +peer ntps2-0 key 0 version 3 + +# +# European servers +# +peer sunmanager.lrz-muenchen.de key 0 version 2 +peer rustime01.rus.uni-stuttgart.de version 2 +peer mailszrz.zrz.tu-berlin.de version 2 + +# +# UK servers +# +peer bear.zoo.bt.co.uk version 3 + +# US Servers +# +server truechimer.cso.uiuc.edu version 2 + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres + +# +# authentication stuff +# +authdelay 0.000076 +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.31.0 version 3 # inf1-net.revue +broadcast 131.188.34.0 version 3 # inf4-net1.revue +broadcast 131.188.44.0 version 3 # inf4-net2.revue +broadcast 131.188.1.255 version 3 # revue.revue +broadcast 131.188.54.255 key 0 version 3 +broadcast 131.188.60.255 key 0 version 3 +broadcast 131.188.61.0 key 0 version 3 +broadcast 131.188.62.0 key 0 version 3 + +# +# Statistics +# +monitor yes + +# +# file name prefix +# +statsdir /var/NTP/ +# +# <stat type> file <file name> type <modifier> enable|disable|link|nolink +filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) +filegen loopstats file loopstats type day link +statistics peerstats loopstats # enable statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 notrust # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +restrict 131.188.1.45 mask 255.255.255.255 # ntps1-0 +restrict 131.188.34.45 mask 255.255.255.255 # ntps1-0 +restrict 131.188.44.45 mask 255.255.255.255 # ntps1-0 +restrict 131.188.30.1 mask 255.255.255.255 # ntps1-1 +# +# external trust +# +restrict 130.126.174.40 mask 255.255.255.255 nomodify # truechimer.cso.uiuc.edu +restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de +restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de +restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de +restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 new file mode 100644 index 0000000..57e77f2 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4.faui45 @@ -0,0 +1,228 @@ +# +# NTP v3 configuration file for faui45 +# +# sun4.sun4.faui45,v 3.1 1993/07/06 01:10:39 jbj Exp +# +# sun4.sun4.faui45,v +# Revision 3.1 1993/07/06 01:10:39 jbj +# XNTP release 3.1 +# +# +# Revision 1.2 1993/01/19 09:32:33 kardel +# Release 1993/01/19 DCF77/PPS +# +# Revision 1.1 1992/12/10 12:58:48 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.28 1992/10/28 07:38:09 kardel +# bear.zoo.bt.co.uk now also peer +# +# Revision 1.27 1992/09/17 12:56:22 kardel +# 61 and 62 have ZEROBROADCASTS +# +# Revision 1.26 1992/09/17 12:46:53 kardel +# CIP network broadcasts +# +# Revision 1.25 1992/09/04 12:48:44 kardel +# dcn1 -> churchy +# +# Revision 1.24 1992/08/14 21:42:20 kardel +# local clock is now preferred peer +# +# Revision 1.23 1992/07/17 17:11:51 kardel +# new statistics support +# +# Revision 1.22 1992/07/05 22:41:18 root +# using default module settings now +# +# Revision 1.21 1992/07/02 11:47:26 root +# loop statistics added +# +# Revision 1.20 1992/06/26 07:30:51 kardel +# corrected examples +# +# Revision 1.19 1992/06/18 16:56:05 kardel +# running timed too (startup script magic) +# +# Revision 1.18 1992/06/18 13:58:45 kardel +# precision adjusted (us resolution) +# clock definition explanation +# +# Revision 1.17 1992/06/13 12:49:35 root +# allowed ntps1-1 +# +# Revision 1.16 1992/06/07 11:44:41 kardel +# switch to PPS support for dcf77-0 +# +# Revision 1.15 1992/06/03 14:02:58 kardel +# new version (fausup notrust) +# +# Revision 1.14 1992/05/18 13:49:45 kardel +# first precision update due to kernel patch +# +# Revision 1.13 1992/05/18 13:48:36 kardel +# more updates +# +# Revision 1.12 1992/03/24 08:43:49 kardel +# now trusting netserv.rz.uni-karlsruhe.de +# +# Revision 1.11 1992/03/23 15:03:43 kardel +# sunmanager.lrz-muenchen.de is a peer +# +# Revision 1.10 1992/03/12 22:49:53 kardel +# well, got to switch fudge too +# +# Revision 1.9 1992/03/12 22:47:07 kardel +# adjust for next xntpv3 alpha release +# +# Revision 1.8 1992/02/07 11:07:35 kardel +# switched to Meinberg PZF 535/OCXO +# +# Revision 1.7 1992/01/21 15:11:38 kardel +# netserv & sunmanager must be configured server (botch on other side) +# +# Revision 1.6 1992/01/17 17:54:34 kardel +# added ntps2-0, ntps2-1 to unrestricted list +# +# Revision 1.5 1992/01/10 10:49:03 kardel +# Authentication correction +# +# Revision 1.4 1992/01/10 08:08:06 kardel +# peer apple.com added +# ntps1-1 added to restrictionlist +# +# Revision 1.3 1991/12/19 10:23:56 kardel +# peers on STRATUM 1 +# add mailszrz +# +# Revision 1.2 1991/12/19 09:57:29 kardel +# upgrade NTP V3 +# +# + +# +# Local clock definitions +# +precision -18 # us resolution + +# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO +# +# Supported clock types Base +# Meinberg DCF PZF535 TCXO 0 +# Meinberg DCF PZF535 OCXO 16 +# Meinberg DCF U/A 31 32 +# +# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) +# PPS 128 +# +# The device to be used is added to the base (16 devices possible +# /dev/dcf77-0 - /dev/dcf77-15) +# +# If PPS support is to be used 128 has to be added to the base +# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) +# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) +# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) +# +peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support +# +# We want to provide timed service too, thus (startup script magic) +# TIMED + +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# peers - local synch setup +# +peer ntps1-1 key 0 version 2 # to be upgrade to version 3 +peer ntps2-0 key 0 version 2 # to be upgrade to version 3 + +# +# European servers +# +peer sunmanager.lrz-muenchen.de key 0 version 2 +peer iis.ethz.ch version 3 +server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side +peer rustime01.rus.uni-stuttgart.de version 2 +peer mailszrz.zrz.tu-berlin.de version 2 + +# +# UK servers +# +peer bear.zoo.bt.co.uk version 3 + +# +# US Servers +# +peer apple.com version 2 +server churchy.udel.edu key 0 version 3 + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres + +# +# authentication stuff +# +authdelay 0.000076 +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.1.255 key 0 version 2 # revue.revue (still on 2) +broadcast 131.188.34.0 key 0 version 2 # inf4-net1.revue (still on 2) +broadcast 131.188.44.0 key 0 version 2 # inf4-net2.revue (still on 2) +broadcast 131.188.54.255 key 0 version 3 +broadcast 131.188.60.255 key 0 version 3 +broadcast 131.188.61.0 key 0 version 3 +broadcast 131.188.62.0 key 0 version 3 + +# +# Statistics +# +monitor yes +# +# file name prefix +# +statsdir /var/NTP/ +# +# <stat type> file <file name> type <modifier> enable|disable|link|nolink +filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) +filegen loopstats file loopstats type day link +statistics peerstats loopstats # enable statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +restrict 131.188.1.41 mask 255.255.255.255 # ntps1-1 +restrict 131.188.31.1 mask 255.255.255.255 # ntps2-0, ntps2-1 +# +# external trust +# +restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com +restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch +restrict 128.4.1.5 mask 255.255.255.255 nomodify # churchy.udel.edu +restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de +restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de +restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de +restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk +restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c new file mode 100644 index 0000000..e1ff902 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c @@ -0,0 +1,63 @@ +# +# FAU NTP client configuration file +# +# sun4.sun4c,v 3.1 1993/07/06 01:10:41 jbj Exp +# +# sun4.sun4c,v +# Revision 3.1 1993/07/06 01:10:41 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:50 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres +# +# authentication stuff +# +authdelay 0.000144 # sun4c +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer new file mode 100644 index 0000000..78d3ea8 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4c.Lucifer @@ -0,0 +1,174 @@ +# +# NTP v3 configuration file for Lucifer +# +# sun4.sun4c.Lucifer,v 3.1 1993/07/06 01:10:42 jbj Exp +# +# sun4.sun4c.Lucifer,v +# Revision 3.1 1993/07/06 01:10:42 jbj +# XNTP release 3.1 +# +# +# Revision 1.2 1993/01/19 09:32:35 kardel +# Release 1993/01/19 DCF77/PPS +# +# Revision 1.1 1992/12/10 12:58:52 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.8 1992/10/28 07:38:09 kardel +# bear.zoo.bt.co.uk now also peer +# +# Revision 1.7 1992/09/17 12:56:22 kardel +# 61 and 62 have ZEROBROADCASTS +# +# Revision 1.6 1992/09/17 12:46:53 kardel +# CIP network broadcasts +# +# Revision 1.5 1992/08/14 21:52:02 kardel +# local clock is now preferred peer +# +# Revision 1.4 1992/07/17 17:15:06 kardel +# adedd new statistics support +# +# Revision 1.3 1992/07/12 16:50:16 kardel +# new peers, restrictions, statistics, no timed +# +# Revision 1.2 1992/07/10 07:01:44 kardel +# authdelay fixed +# +# Revision 1.1 1992/07/10 07:00:30 kardel +# Initial revision +# +# +# +# Local clock definitions +# +precision -18 # us resolution + +# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO +# +# Supported clock types Base +# Meinberg DCF PZF535 TCXO 0 +# Meinberg DCF PZF535 OCXO 16 +# Meinberg DCF U/A 31 32 +# ELV DCF7000 48 + +# +# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) +# PPS 128 +# +# The device to be used is added to the base (16 devices possible +# /dev/dcf77-0 - /dev/dcf77-15) +# +# If PPS support is to be used 128 has to be added to the base +# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) +# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) +# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) +# +peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support +# + +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# peers - local synch setup +# +peer ntps1-1 key 0 version 3 +peer ntps1-2 key 0 version 3 +peer ntps2-0 key 0 version 3 + +# +# UK servers +# +peer bear.zoo.bt.co.uk version 3 + +# +# European servers +# +peer sunmanager.lrz-muenchen.de key 0 version 2 +peer iis.ethz.ch version 3 +server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side +peer rustime01.rus.uni-stuttgart.de version 2 +peer mailszrz.zrz.tu-berlin.de version 2 + +# +# US Servers +# +peer apple.com version 2 +server dcn1.udel.edu key 0 version 3 + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres + +# +# authentication stuff +# +authdelay 0.000144 # sun4c +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) +broadcast 131.188.34.0 key 0 version 3 # inf4-net1.revue (still on 2) +broadcast 131.188.44.0 key 0 version 3 # inf4-net2.revue (still on 2) +broadcast 131.188.54.255 key 0 version 3 +broadcast 131.188.60.255 key 0 version 3 +broadcast 131.188.61.0 key 0 version 3 +broadcast 131.188.62.0 key 0 version 3 + +# +# Statistics +# +monitor yes + +# +# file name prefix +# +statsdir /var/NTP/ +# +# <stat type> file <file name> type <modifier> enable|disable|link|nolink +filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) +filegen loopstats file loopstats type day link +statistics peerstats loopstats # enable statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +restrict 131.188.1.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.34.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.44.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.1.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.34.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.44.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.31.1 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +# +# external trust +# +restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com +restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch +restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu +restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de +restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de +restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de +restrict 132.146.40.28 mask 255.255.255.255 nomodify # bear.zoo.bt.co.uk +restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m new file mode 100644 index 0000000..cf1e283 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m @@ -0,0 +1,69 @@ +# +# FAU NTP client configuration file +# +# sun4.sun4m,v 3.1 1993/07/06 01:10:43 jbj Exp +# +# sun4.sun4m,v +# Revision 3.1 1993/07/06 01:10:43 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:58:55 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.2 1992/10/05 12:48:44 kardel +# sun4m authdelay +# +# Revision 1.1 1992/10/05 12:48:07 kardel +# Initial revision +# +# Revision 1.2 1992/01/14 14:01:35 kardel +# update for joined INF4/INF1 nets +# +# +# Local fall back clock +# +precision -7 +# +# Local clock +# +peer 127.127.1.13 +# +broadcastclient yes +# broadcastdelay must be figured out + +# +# peers - local synch setup +# +#server ntps1-0 version 3 +#server ntps1-1 version 2 +#server ntps2-0 version 3 +# +# files +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres +# +# authentication stuff +# +authdelay 0.000033 # sun4c +controlkey 1006 +requestkey 1007 +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +# +restrict default notrust lowpriotrap nomodify +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 # allow local hosts +# +restrict 127.0.0.1 mask 255.255.255.255 # local config +restrict 127.127.0.0 mask 255.255.0.0 # local clocks diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 new file mode 100644 index 0000000..acc919c --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui42 @@ -0,0 +1,152 @@ +# +# NTP v3 configuration file for faui42 +# +# sun4.sun4m.faui42,v 3.1 1993/07/06 01:10:44 jbj Exp +# +# sun4.sun4m.faui42,v +# Revision 3.1 1993/07/06 01:10:44 jbj +# XNTP release 3.1 +# +# +# Revision 1.2 1993/01/19 09:32:36 kardel +# Release 1993/01/19 DCF77/PPS +# +# Revision 1.1 1992/12/10 12:58:57 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.6 1992/09/15 16:19:10 kardel +# preferrred peer +# +# Revision 1.5 1992/09/15 15:57:36 kardel +# Stratum 1 again (may the Patches be with us...) +# +# Revision 1.4 1992/06/30 08:52:38 kardel +# sun4m machine don't have a clock (SunOS4.1.2) +# soory - just Stratum 2 +# +# Revision 1.3 1992/06/18 13:58:45 kardel +# precision adjusted (us resolution) +# clock definition explanation +# +# Revision 1.2 1992/06/13 11:42:49 kardel +# restrictions changed +# +# Revision 1.1 1992/06/13 11:27:11 kardel +# Initial revision +# +# + +# +# Local clock definitions +# +precision -18 # us resolution + +# +# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO +# +# Supported clock types Base +# Meinberg DCF PZF535 TCXO 0 +# Meinberg DCF PZF535 OCXO 16 +# Meinberg DCF U/A 31 32 +# +# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) +# PPS 128 +# +# The device to be used is added to the base (16 devices possible +# /dev/dcf77-0 - /dev/dcf77-15) +# +# If PPS support is to be used 128 has to be added to the base +# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) +# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) +# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) +# +peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# peers - local synch setup +# +peer ntps1-0 key 0 version 2 # to be upgrade to version 3 +peer ntps2-0 key 0 version 2 # to be upgrade to version 3 + +# +# European servers +# +peer sunmanager.lrz-muenchen.de key 0 version 2 +peer iis.ethz.ch version 3 +#server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side +peer rustime01.rus.uni-stuttgart.de version 2 +#peer mailszrz.zrz.tu-berlin.de version 2 + +# +# US Servers +# +#peer apple.com version 2 +#server dcn1.udel.edu key 0 version 3 + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres + +# +# authentication stuff +# +authdelay 0.000047 +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) +broadcast 131.188.40.0 key 0 version 3 # inf4-net2.revue (still on 2) + +# +# Statistics +# +monitor yes + +# +# file name prefix +# +statsdir /var/NTP/ +# +# <stat type> file <file name> type <modifier> enable|disable|link|nolink +filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) +filegen loopstats file loopstats type day link +statistics peerstats loopstats # enable statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.40.0 mask 255.255.255.0 nomodify # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 nomodify # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 nomodify # allow local hosts +restrict 131.188.31.0 mask 255.255.255.0 nomodify # allow local hosts +restrict 131.188.1.0 mask 255.255.255.0 nomodify # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +# +# external trust +# +restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com +restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch +restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu +restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de +restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de +restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de +restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m new file mode 100644 index 0000000..2c75f67 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/sun4.sun4m.faui45m @@ -0,0 +1,165 @@ +# +# NTP v3 configuration file for Lucifer +# +# sun4.sun4m.faui45m,v 3.1 1993/07/06 01:10:45 jbj Exp +# +# sun4.sun4m.faui45m,v +# Revision 3.1 1993/07/06 01:10:45 jbj +# XNTP release 3.1 +# +# +# Revision 1.2 1993/01/19 09:32:38 kardel +# Release 1993/01/19 DCF77/PPS +# +# Revision 1.1 1992/12/10 12:58:59 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.7 1992/09/17 12:56:22 kardel +# 61 and 62 have ZEROBROADCASTS +# +# Revision 1.6 1992/09/17 12:46:53 kardel +# CIP network broadcasts +# +# Revision 1.5 1992/08/14 21:52:02 kardel +# local clock is now preferred peer +# +# Revision 1.4 1992/07/17 17:15:06 kardel +# adedd new statistics support +# +# Revision 1.3 1992/07/12 16:50:16 kardel +# new peers, restrictions, statistics, no timed +# +# Revision 1.2 1992/07/10 07:01:44 kardel +# authdelay fixed +# +# Revision 1.1 1992/07/10 07:00:30 kardel +# Initial revision +# +# +# +# Local clock definitions +# +precision -18 # us resolution + +# DCF77 - 0 - REFERENCE CLOCK / Meinberg PZF 535/OCXO +# +# Supported clock types Base +# Meinberg DCF PZF535 TCXO 0 +# Meinberg DCF PZF535 OCXO 16 +# Meinberg DCF U/A 31 32 +# ELV DCF7000 48 + +# +# Option PPS support (CLOCKDEFS=-DDCF -DDCFPPS) +# PPS 128 +# +# The device to be used is added to the base (16 devices possible +# /dev/dcf77-0 - /dev/dcf77-15) +# +# If PPS support is to be used 128 has to be added to the base +# thus a DCF77 U/A 31 without PPS would be 127.127.8.32 (device 0 - /dev/dcf77-0) +# a DCF77 PZF535/TCXO with PPS would be 127.127.8.129 (device 1 - /dev/dcf77-1) +# a DCF77 PZF535/OCXO with PPS would be 127.127.8.146 (device 2 - /dev/dcf77-2) +# +peer 127.127.8.144 prefer # PZF 535/OCXO / PPS support +# + +# +# Local clock +# +peer 127.127.1.6 # Fall back stratum 6 + +# +# peers - local synch setup +# +peer ntps1-1 key 0 version 3 +peer ntps1-2 key 0 version 3 +peer ntps2-0 key 0 version 3 + +# +# European servers +# +peer sunmanager.lrz-muenchen.de key 0 version 2 +peer iis.ethz.ch version 3 +server netserv.rz.uni-karlsruhe.de version 2 # sorry configuration error on other side +peer rustime01.rus.uni-stuttgart.de version 2 +peer mailszrz.zrz.tu-berlin.de version 2 + +# +# US Servers +# +peer apple.com version 2 +server dcn1.udel.edu key 0 version 3 + +# +# files / programs +# +driftfile /+private/local/NTP/xntp.drift +resolver /local/NTP/bin/xntpres + +# +# authentication stuff +# +authdelay 0.000033 # sun4m +requestkey 1007 +controlkey 1006 + +# +# service +# +broadcast 131.188.1.255 key 0 version 3 # revue.revue (still on 2) +broadcast 131.188.34.0 key 0 version 3 # inf4-net1.revue (still on 2) +broadcast 131.188.44.0 key 0 version 3 # inf4-net2.revue (still on 2) +broadcast 131.188.54.255 key 0 version 3 +broadcast 131.188.60.255 key 0 version 3 +broadcast 131.188.61.0 key 0 version 3 +broadcast 131.188.62.0 key 0 version 3 + +# +# Statistics +# +monitor yes + +# +# file name prefix +# +statsdir /var/NTP/ +# +# <stat type> file <file name> type <modifier> enable|disable|link|nolink +filegen peerstats file peerstats type day link # generate <statsdir><file>.<YYYYMMDD> and link generic file name (without extension) +filegen loopstats file loopstats type day link +statistics peerstats loopstats # enable statistics + +# +# restrictions +# +# provide cheap services to the world/ prevent modifications from there +restrict default notrust lowpriotrap nomodify + +# +# hosts on the local networks are allowed unrestricted access +# +restrict 131.188.0.0 mask 255.255.0.0 nomodify notrust # allow local hosts +restrict 131.188.34.0 mask 255.255.255.0 notrust # allow local hosts +restrict 131.188.44.0 mask 255.255.255.0 notrust # allow local hosts +# +restrict 127.127.0.0 mask 255.255.0.0 # local clocks +restrict 127.0.0.1 # localhost does it too +# +restrict 131.188.1.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.34.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.44.45 mask 255.255.255.255 # ntps1-1 +restrict 131.188.1.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.34.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.44.31 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +restrict 131.188.31.1 mask 255.255.255.255 # ntps1-2, ntps2-0, ntps2-1 +# +# external trust +# +restrict 130.43.2.2 mask 255.255.255.255 nomodify # apple.com +restrict 129.132.2.60 mask 255.255.255.255 nomodify # iis.ethz.ch +restrict 128.4.0.1 mask 255.255.255.255 nomodify # dcn1.umd.edu +restrict 129.13.64.5 mask 255.255.255.255 nomodify # netserv.rz.uni-karlsruhe.de +restrict 129.69.1.153 mask 255.255.255.255 nomodify # rustime01.rus.uni-stuttgart.de +restrict 129.187.10.32 mask 255.255.255.255 nomodify # sunmanager.lrz-muenchen.de +restrict 130.149.4.11 mask 255.255.255.255 nomodify # mailszrz.zrz.tu-berlin.de diff --git a/usr.sbin/xntpd/scripts/support/conf/tickconf b/usr.sbin/xntpd/scripts/support/conf/tickconf new file mode 100644 index 0000000..b17dbe8 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/conf/tickconf @@ -0,0 +1,19 @@ +DEFAULT -A -p -s -q +Lucifer 55406cfa -a 1 -p -s -q -t 10001 +faui45 24000f9b -a 1 -p -s -q +faui10 2440213c -a 1 -p -s -q +faui1b 54001418 -A -p -s -q -t 10001 +faui4p 5100344d -A -p -s -q -t 9999 +faui02g 1200be20 -A -p -s -q -t 9999 +faui02e 1200bbab -A -p -s -q -t 9999 +faui02f 1200bedb -A -p -s -q -t 9999 +faui03b 1200b92b -A -p -s -q -t 9999 +faui45m 726001ac -A -p -s -q -t 10001 +faui45o 72600272 -A -p -s -q -t 10001 +faui45p 7260028f -A -p -s -q -t 10001 +faui45r 72400cc7 -A -p -s -q -t 10001 +faui45s 726045be -A -p -s -q -t 10001 +faui45v 72604487 -A -p -s -q -t 10001 +faui45x 726044eb -A -p -s -q -t 10001 +faui45y 7260476d -A -p -s -q -t 10001 +faui45z 726045a1 -A -p -s -q -t 10001 diff --git a/usr.sbin/xntpd/scripts/support/etc/cron b/usr.sbin/xntpd/scripts/support/etc/cron new file mode 100755 index 0000000..07ed189 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/etc/cron @@ -0,0 +1,18 @@ +#!/bin/sh +# +# cron,v 3.1 1993/07/06 01:10:50 jbj Exp +# +# called by cron for statistics gathering +# +# cron,v +# Revision 3.1 1993/07/06 01:10:50 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:59:18 kardel +# Prerelease NTP V3 / DCF +# +# +PATH="${PATH}:/local/NTP/bin" +export PATH +monl -d /local/NTP/monitor -i '127\.0\.0\.1' faui10 faui45 lucifer rackety.udel.edu diff --git a/usr.sbin/xntpd/scripts/support/etc/crontab b/usr.sbin/xntpd/scripts/support/etc/crontab new file mode 100644 index 0000000..2b2d19c --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/etc/crontab @@ -0,0 +1,8 @@ +# +# NTP statistics periodic cleanup - REFERENCE SERVER ONLY +# +#55 23 * * * sh /local/NTP/etc/mvstats +# +# gather NTP client statistics - REFERENCE SERVER ONLY +# +0 8,18 * * * /local/NTP/etc/cron 2>/dev/null | /usr/ucb/mail -s "NTP statistics" time@informatik.uni-erlangen.de diff --git a/usr.sbin/xntpd/scripts/support/etc/install b/usr.sbin/xntpd/scripts/support/etc/install new file mode 100755 index 0000000..169a7e5 --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/etc/install @@ -0,0 +1,67 @@ +#!/bin/sh +# +# install,v 3.1 1993/07/06 01:10:53 jbj Exp +# +# install,v +# Revision 3.1 1993/07/06 01:10:53 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:59:21 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.1 1992/06/18 14:50:08 kardel +# Initial revision +# +# +NTPROOT=/local/NTP # SITE SPECIFIC: where NTP resides +# +# where the local NTP state files reside (xntp.drift) ussualle /etc +# this directory must not be shared as machine dependent data ist stored there +# +NTPDIR="/+private/local/NTP" +# +# get the initial setup +# +if [ ! -r $NTPROOT/etc/setup ]; then + echo "ERROR: $NTPROOT/etc/setup missing - incorrect installation." + exit 1 +else + . $NTPROOT/etc/setup +fi + +umask 022 # SITE SPECIFIC: local policy - watch out for NFS and "root" rights + +Mkdir() { + p="" + IFS="/" + set -- $@ + IFS=' +' + for pnc do + if [ ! -d "$p/$pnc" ]; then + ECHO -n "creating directory $p/$pnc" + if mkdir "$p/$pnc"; then + ECHO "" + else + ECHO " - FAILED" + break; + fi + fi + p="$p/$pnc" + done +} + +if [ ! -d "$NTPDIR" ]; then + ECHO "installing NTP private data area ($NTPDIR)" + if Mkdir "$NTPDIR"; then + chmod 755 "$NTPDIR" + ECHO "$NTPDIR created." + fi +else + ECHO "NTP already installed." + if [ -f "$NTPDIR/xntp.drift" ]; then + ECHO "currently saved drift value:" `cat "$NTPDIR/xntp.drift"` + fi +fi + diff --git a/usr.sbin/xntpd/scripts/support/etc/rc b/usr.sbin/xntpd/scripts/support/etc/rc new file mode 100755 index 0000000..ef8834a --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/etc/rc @@ -0,0 +1,198 @@ +#!/bin/sh +# NTP time synchronisation +# +# /src/NTP/REPOSITORY/v3/supportscripts/etc/rc,v 1.11 1993/07/09 13:17:00 kardel Exp +# +# rc,v +# Revision 1.11 1993/07/09 13:17:00 kardel +# local NTPROOT +# +# Revision 1.10 1993/07/09 11:37:29 kardel +# Initial restructured version + GPS support +# +# Revision 1.9 1993/06/23 14:10:36 kardel +# June 21st reconcilation +# +# Revision 1.7 1993/06/02 12:04:43 kardel +# May 28th reconcilation & clenaup +# +# +# non reference clock hosts will try to do an ntpdate on NTPSERVERS +# +NTPSERVERS="ntps1-0 ntps1-1 ntps2-0 ntps2-1" +NTPROOT=/local/NTP + +# +# get the initial setup +# +if [ ! -r $NTPROOT/etc/setup ]; then + echo "ERROR: $NTPROOT/etc/setup missing - incorrect installation." + exit 1 +else + . $NTPROOT/etc/setup +fi + +umask 022 # SITE SPECIFIC: local policy - watch out for NFS and "root" rights + +msg="" +# +# default configuration files are named $NTPROOT/conf/<ARCH>.<KARCH> +# +CF=$NTPROOT/conf/$ARCH.$KARCH # default configuration file +# +# Host specific config file (reference clocks) have the hostname tagged on +# +CFH="$CF"."$HOSTNAME" # specific configuration file +# +# where to find the tickadj command +# +KFIX=$NTPROOT/bin/tickadj # kernel variable fix +# +# where to find special tickadj parameters +# +TC=$NTPROOT/conf/tickconf # special tickadj parameters +# +# where to find the keys file (if not found $KEY.dumb will be used) +# +KEY=$NTPROOT/conf/ntp.keys # private key file +# +# the daemon +# +XD=$NTPROOT/bin/xntpd # NTP daemon +# +# HP adjtimed +# +ADJTIMED=$NTPROOT/bin/adjtimed # HP special (adjtime() emulation) +# +# ntpdate command +# +NTPDATE=$NTPROOT/bin/ntpdate + +# +# secondary timed support +# The word "TIMED" must be in the config file for timed to start +# Note that this times is a special version which does not ever set or +# adjust the time. Ask time@informatik.uni-erlangen.de for patches +# +TIMED=$NTPROOT/bin/timed # timed (Berkeley) secondary time service + # here used in a *HARMLESS* version + # to provide time to "inferior" systems +# +# ISREFHOST is a command that returns exit status 0 for a reference host +# Site specific: sample for dcf77 is given +# +ISREFHOST="[ -f $NTPROOT/.karch.$KARCH/sys/OBJ/parsestreams.o -a -f /dev/refclock-0 ]" +# +# SETUP_REFCLOCK +# +# what to do in order to set up a local reference clock +# usually this will load a STREAMS module or initialize other things +# needed +# +SETUP_REFCLOCK() { + if modstat | grep -s 'PARSE'; then + ECHO "loadable PARSER STREAMS module already loaded." + else + ECHO "attempting to load PARSER STREAMS module..." + MDLFILE="/tmp/mdl.$$" + if modload $NTPROOT/.karch.$KARCH/sys/OBJ/parsestreams.o -o $MDLFILE 2>&1; then + modstat + else + echo WARNING: load FAILED + fi | LOG + rm -f $MDLFILE + unset MDLFILE + fi +} + +kargs() { + MATCH=NO + HOSTID="`(hostid) 2>/dev/null || echo 000000`" + if [ -r "$TC" ]; then + exec 0< "$TC" + while [ "$MATCH" != "YES" ] && read HOST ID PARAM; do + if [ "$HOST" = "DEFAULT" ]; then + DEFAULT="$ID $PARAM" + else + if [ "$ID" = "$HOSTID" -o "$HOST" = "$HOSTNAME" ]; then + echo "$PARAM" + MATCH=YES + fi + fi + done + if [ "$MATCH" != "YES" ]; then + if [ -z "$DEFAULT" ]; then + echo "-A -p -s -q"; + else + echo "$DEFAULT"; + fi + fi + else + echo "-A -p -s -q"; + fi +} + +if [ -x $XD ]; then + if [ -x "$ADJTIMED" ]; then + $ADJTIMED && ECHO "adjusttimesupport: adjtimed." + fi + # + # WARNING: check ps command first, or you might kill things you don't want to + # + PID="`(ps -efa 2>/dev/null || ps auxww 2>/dev/null || echo "") | grep xntp | grep -v grep | awk '{ print $2 }'`" + + if [ ! -z "$PID" ]; then + ECHO "killing old NTP daemon (PID=$PID)" + # + # enable this after checking for correctness + # kill $PID + ECHO "should do a kill $PID, if this is the right PID - check rc script" + fi + # + # try an ntpdate when timeservers are configured + # + if [ ! -z "$NTPSERVERS" -a -x $NTPDATE ]; then + ECHO "NTP initial time setting" + $NTPDATE -v $NTPSERVERS | LOG + fi + # + # look for reference clock equipment + # + if $ISREFHOST; then + ECHO "REFERENCE CLOCK SUPPORT (initializing...)" + SETUP_REFCLOCK + fi + + if [ -r "$CFH" ]; then + CF="$CFH" + else + if [ ! -r "$KEY" ]; then + KEY="$KEY.dumb" + fi + fi + + ECHO "NTP configuration file: $CF" + ECHO -n "time daemon startup:" + + if [ -r "$CF" ]; then + if [ -x "$KFIX" ]; then + KARGS="`kargs`" + if [ ! -z "$KARGS" ]; then + $KFIX $KARGS && ECHO -n "tickadj $KARGS" + fi + fi + $XD -c "$CF" -k "$KEY" && ECHO -n ' xntpd' + if [ -x "$TIMED" ] && grep -s TIMED "$CF"; then + $TIMED -M -N && ECHO -n ' timed' + fi + else + msg="configuration file ($CF) not present." + fi +else + msg="daemon binary ($XD) not present." +fi +ECHO "." + +if [ "$msg" ]; then + NLECHO "WARNING: NO NTP time sychronisation: $msg" +fi diff --git a/usr.sbin/xntpd/scripts/support/etc/setup b/usr.sbin/xntpd/scripts/support/etc/setup new file mode 100755 index 0000000..d4ea75e --- /dev/null +++ b/usr.sbin/xntpd/scripts/support/etc/setup @@ -0,0 +1,72 @@ +# +# setup,v 3.1 1993/07/06 01:10:55 jbj Exp +# +# /bin/sh sourced file for environment setup +# expects NTPROOT variable initialized +# +# if not set it will be initialized to /usr/local/NTP +# +# setup,v +# Revision 3.1 1993/07/06 01:10:55 jbj +# XNTP release 3.1 +# +# +# Revision 1.1 1992/12/10 12:59:25 kardel +# Prerelease NTP V3 / DCF +# +# Revision 1.1 1992/12/10 10:14:46 kardel +# Initial revision +# +# +NTPROOT=${NTPROOT-/usr/local/NTP} + +# +# we so use our own echos, as we somes want to substitute them with a +# file logging version durin the /etc/rc.local phase +# +set `type ECHO` + +PATH="${PATH}:$NTPROOT/bin" +export PATH + +if [ "$2" = "is" ]; then + : +else + # + # find out the way echos work (Rest of rc thinks BSD echo) + # + ECHOREP="`echo -n x`" + if [ "$ECHOREP" = "-n x" ]; then + ECHO () { + if [ "$1" = "-n" ]; then + shift + echo "$@\c" + else + echo "$@" + fi + } + #ECHO "System V style echo" + else + ECHO () { + echo "$@" + } + #ECHO "BSD style echo" + fi + + NLECHO () { + echo "$@" + } + + LOG () { + while read _line; do + ECHO "$_line" + done + } + # + # carefully find out some configuration Variables + # + ARCH="`(arch) 2>/dev/null || ((uname) > /dev/null && uname -a | awk '{ print $6; }') 2>/dev/null || echo 'no-arch'`" + KARCH="`(arch -k) 2>/dev/null || ((uname) > /dev/null && uname -a | awk '{ print $5 }') || echo 'no-arch'`" + HOSTNAME="`(hostname) 2>/dev/null || uname -n`" +fi + |