[ntpsec commit] Discard the incomplete Perl implementation of ntpleapfetch...
Eric S. Raymond
esr at ntpsec.org
Sun Oct 18 23:46:12 UTC 2015
Module: ntpsec
Branch: master
Commit: f5cb790c665df8b24e0af010b0ef0e18a45425b1
Changeset: http://git.ntpsec.org/ntpsec/commit/?id=f5cb790c665df8b24e0af010b0ef0e18a45425b1
Author: Eric S. Raymond <esr at thyrsus.com>
Date: Sun Oct 18 19:44:35 2015 -0400
Discard the incomplete Perl implementation of ntpleapfetch...
...the shell version works and if we want this in another language
we;ll translate to Python.
---
ntpleapfetch/{ntpleapfetch.sh => ntpleapfetch} | 0
ntpleapfetch/ntpleapfetch-opts | 72 -----
ntpleapfetch/ntpleapfetch.in | 424 -------------------------
wscript | 1 -
4 files changed, 497 deletions(-)
diff --git a/ntpleapfetch/ntpleapfetch.sh b/ntpleapfetch/ntpleapfetch
old mode 100644
new mode 100755
similarity index 100%
rename from ntpleapfetch/ntpleapfetch.sh
rename to ntpleapfetch/ntpleapfetch
diff --git a/ntpleapfetch/ntpleapfetch-opts b/ntpleapfetch/ntpleapfetch-opts
deleted file mode 100644
index 2bfe98e..0000000
--- a/ntpleapfetch/ntpleapfetch-opts
+++ /dev/null
@@ -1,72 +0,0 @@
-# EDIT THIS FILE WITH CAUTION (ntpleapfetch-opts)
-#
-# It has been AutoGen-ed June 3, 2015 at 11:53:37 AM by AutoGen 5.18.5
-# From the definitions ntpleapfetch-opts.def
-# and the template file perlopt
-
-use Getopt::Long qw(GetOptionsFromArray);
-Getopt::Long::Configure(qw(no_auto_abbrev no_ignore_case_always));
-
-my $usage;
-
-sub usage {
- my ($ret) = @_;
- print STDERR $usage;
- exit $ret;
-}
-
-sub paged_usage {
- my ($ret) = @_;
- my $pager = $ENV{PAGER} || '(less || more)';
-
- open STDOUT, "| $pager" or die "Can't fork a pager: $!";
- print $usage;
-
- exit $ret;
-}
-
-sub processOptions {
- my $args = shift;
-
- my $opts = {
- 'source-url' => '',
- 'ipv4' => '',
- 'destination' => '',
- 'expiration' => '',
- 'ntp-conf-file' => '',
- 'force-update' => '',
- 'dont-wait' => '',
- 'help' => '', 'more-help' => ''
- };
- my $argument = '';
- my $ret = GetOptionsFromArray($args, $opts, (
- 'source-url|s=s', 'ipv4|4', 'destination|d=f',
- 'expiration|e=s', 'ntp-conf-file|f=s', 'force-update|F',
- 'dont-wait',
- 'help|?', 'more-help'));
-
- $usage = <<'USAGE';
-ntpleapfetch - leap-seconds file manager/updater.
-USAGE: ntpleapfetch [ -<flag> [<val>] | --<name>[{=| }<val>] ]...
-
- -s, --source-url=str The URL of the master copy of the leapseconds file
- -4, --ipv4 Use only IPv4 addresses for DNS name resolution
- -d, --destination=float Filename on the local system
- -e, --expiration=str Refresh the leapfile this long before it expires
- -f, --ntp-conf-file=str Location of the ntp.conf file
- -F, --force-update Force update of the leapfile
- --dont-wait Don't wait for keystroke between plots
- -?, --help Display usage information and exit
- --more-help Pass the extended usage text through a pager
-
-Options are specified by doubled hyphens and their name or by a single
-hyphen and the flag character.
-USAGE
-
- usage(0) if $opts->{'help'};
- paged_usage(0) if $opts->{'more-help'};
- $_[0] = $opts;
- return $ret;
-}
-
-END { close STDOUT };
diff --git a/ntpleapfetch/ntpleapfetch.in b/ntpleapfetch/ntpleapfetch.in
deleted file mode 100644
index 8a04dcf..0000000
--- a/ntpleapfetch/ntpleapfetch.in
+++ /dev/null
@@ -1,424 +0,0 @@
-#! @BIN_PERL@ -w
-
-# Copyright (C) 2015 Network Time Foundation
-# Author: Harlan Stenn
-
-# Original shell version:
-# Copyright (C) 2014 Timothe Litt litt at acm dot org
-
-# This script may be freely copied, used and modified providing that
-# this notice and the copyright statement are included in all copies
-# and derivative works. No warranty is offered, and use is entirely at
-# your own risk. Bugfixes and improvements would be appreciated by the
-# author.
-
-use strict;
-
-use Digest::SHA qw(sha1_hex);
-use File::Copy qw(move);
-use File::Fetch;
-use Getopt::Long qw(:config auto_help no_ignore_case bundling);
-use Sys::Syslog;
-
-my $VERSION="1.003";
-
-# leap-seconds file manager/updater
-
-# ########## Default configuration ##########
-#
-
-my $CRONJOB = $ENV{'CRONJOB'};
-$CRONJOB = "" unless defined($CRONJOB);
-my $LOGGER;
-my $QUIET = "";
-my $VERBOSE = "";
-
-# Where to get the file
-my $LEAPSRC="ftp://time.nist.gov/pub/leap-seconds.list";
-my $LEAPFILE;
-
-# How many times to try to download new file
-my $MAXTRIES=6;
-my $INTERVAL=10;
-
-# Where to find ntp config file
-my $NTPCONF="/etc/ntp.conf";
-
-# How long (in days) before expiration to get updated file
-my $PREFETCH="60";
-
-# How to restart NTP - older NTP: service ntpd? try-restart | condrestart
-# Recent NTP checks for new file daily, so there's nothing to do
-my $RESTART="";
-
-my $EXPIRES;
-my $FORCE = "";
-
-# Where to put temporary copy before it's validated
-my $TMPFILE="/tmp/leap-seconds.$$.tmp";
-
-# Syslog facility
-my $LOGFAC="daemon";
-
-# ###########################################
-
-=item ntpleapfetch
-
-Usage: $0 [options] [leapfile]
-
-Verifies and if necessary, updates leap-second definition file
-
-All arguments are optional: Default (or current value) shown:
- -s Specify the URL of the master copy to download
- $LEAPSRC
- -d Specify the filename on the local system
- $LEAPFILE
- -e Specify how long (in days) before expiration the file is to be
- refreshed. Note that larger values imply more frequent refreshes.
- "$PREFETCH"
- -f Specify location of ntp.conf (used to make sure leapfile directive is
- present and to default leapfile)
- $NTPCONF
- -F Force update even if current file is OK and not close to expiring.
- -r Specify number of times to retry on get failure
- $MAXTRIES
- -i Specify number of minutes between retries
- $INTERVAL
- -l Use syslog for output (Implied if CRONJOB is set)
- -L Don't use syslog for output
- -P Specify the syslog facility for logging
- $LOGFAC
- -t Name of temporary file used in validation
- $TMPFILE
- -q Only report errors to stdout
- -v Verbose output
-
-The following options are not (yet) implemented in the perl version:
- -4 Use only IPv4
- -6 Use only IPv6
- -c Command to restart NTP after installing a new file
- <none> - ntpd checks file daily
- -p 4|6
- Prefer IPv4 or IPv6 (as specified) addresses, but use either
- -z Specify path for utilities
- $PATHLIST
- -Z Only use system path
-
-$0 will validate the file currently on the local system
-
-Ordinarily, the file is found using the "leapfile" directive in $NTPCONF.
-However, an alternate location can be specified on the command line.
-
-If the file does not exist, is not valid, has expired, or is expiring soon,
-a new copy will be downloaded. If the new copy validates, it is installed and
-NTP is (optionally) restarted.
-
-If the current file is acceptable, no download or restart occurs.
-
--c can also be used to invoke another script to perform administrative
-functions, e.g. to copy the file to other local systems.
-
-This can be run as a cron job. As the file is rarely updated, and leap
-seconds are announced at least one month in advance (usually longer), it
-need not be run more frequently than about once every three weeks.
-
-For cron-friendly behavior, define CRONJOB=1 in the crontab.
-
-Version $VERSION
-=cut
-
-# Default: Use syslog for logging if running under cron
-
-my $SYSLOG = $CRONJOB;
-
-# Parse options
-
-our(%opt);
-
-GetOptions(\%opt,
- 'c=s',
- 'e:60',
- 'F',
- 'f=s',
- 'i:10',
- 'L',
- 'l',
- 'P=s',
- 'q',
- 'r:6',
- 's=s',
- 't=s',
- 'v'
- );
-
-$LOGFAC=$opt{P} if (defined($opt{P}));
-$LEAPSRC=$opt{s} if (defined($opt{s}));
-$PREFETCH=$opt{e} if (defined($opt{e}));
-$NTPCONF=$opt{f} if (defined($opt{f}));
-$FORCE="Y" if (defined($opt{F}));
-$RESTART=$opt{c} if (defined($opt{c}));
-$MAXTRIES=$opt{r} if (defined($opt{r}));
-$INTERVAL=$opt{i} if (defined($opt{i}));
-$TMPFILE=$opt{t} if (defined($opt{t}));
-$SYSLOG="Y" if (defined($opt{l}));
-$SYSLOG="" if (defined($opt{L}));
-$QUIET="Y" if (defined($opt{q}));
-$VERBOSE="Y" if (defined($opt{v}));
-
-# export PATH="$PATHLIST$PATH"
-
-# Handle logging
-
-openlog($0, 'pid', $LOGFAC);
-
-sub logger {
- my ($priority, $message) = @_;
-
- # "priority" "message"
- #
- # Stdout unless syslog specified or logger isn't available
- #
- if ($SYSLOG eq "" or $LOGGER eq "") {
- if ($QUIET ne "" and ( $priority eq "info" or $priority eq "notice" or $priority eq "debug" ) ) {
- return 0
- }
- printf "%s: $message\n", uc $priority;
- return 0;
- }
-
- # Also log to stdout if cron job && notice or higher
- if (($CRONJOB ne "" and ($priority ne "info" ) and ($priority ne "debug" )) || ($VERBOSE ne "")) {
- # Log to stderr as well
- print STDERR "$0: $priority: $message\n";
- }
- syslog($priority, $message);
-}
-
-# Verify interval
-# INTERVAL=$(( $INTERVAL *1 ))
-
-# Validate a leap-seconds file checksum
-#
-# File format: (full description in files)
-# # marks comments, except:
-# #$ number : the NTP date of the last update
-# #@ number : the NTP date that the file expires
-# Date (seconds since 1900) leaps : leaps is the # of seconds to add for times >= Date
-# Date lines have comments.
-# #h hex hex hex hex hex is the SHA-1 checksum of the data & dates, excluding whitespace w/o leading zeroes
-#
-# Returns:
-# 0 File is valid
-# 1 Invalid Checksum
-# 2 Expired
-
-sub verifySHA {
- my ($file, $verbose) = @_;
-
- my $raw = "";
- my $data = "";
- my $FSHA;
-
- # Remove comments, except those that are markers for last update,
- # expires and hash
-
- unless (open(LF, $file)) {
- warn "Can't open <$file>: $!\n";
- print "Will try and create that file.\n";
- return 1;
- };
- while (<LF>) {
- if (/^#\$/) {
- $raw .= $_;
- s/^..//;
- $data .= $_;
- }
- elsif (/^#\@/) {
- $raw .= $_;
- s/^..//;
- $data .= $_;
- s/\s+//g;
- $EXPIRES = $_ - 2208988800;
- }
- elsif (/^#h\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)\s+([[:xdigit:]]+)/) {
- chomp;
- $raw .= $_;
- $FSHA = sprintf("%08s%08s%08s%08s%08s", $1, $2, $3, $4, $5);
- }
- elsif (/^#/) {
- # ignore it
- }
- elsif (/^\d/) {
- s/#.*$//;
- $raw .= $_;
- $data .= $_;
- } else {
- chomp;
- print "Unexpected line: <$_>\n";
- }
- }
- close LF;
-
- # Remove all white space
- $data =~ s/\s//g;
-
- # Compute the SHA hash of the data, removing the marker and filename
- # Computed in binary mode, which shouldn't matter since whitespace has been removed
-
- my $DSHA = sha1_hex($data);
-
- # Extract the file's hash. Restore any leading zeroes in hash segments.
-
- if ( ( "$FSHA" ne "" ) && ( $FSHA eq $DSHA ) ) {
- if ( $verbose ne "" ) {
- logger("info", "Checksum of $file validated");
- }
- } else {
- logger("error", "Checksum of $file is invalid:");
- $FSHA="(no checksum record found in file)"
- if ( $FSHA eq "");
- logger("error", "EXPECTED: $FSHA");
- logger("error", "COMPUTED: $DSHA");
- return 1;
- }
-
- # Check the expiration date, converting NTP epoch to Unix epoch used by date
-
- if ( $EXPIRES < time() ) {
- logger("notice", "File expired on " . gmtime($EXPIRES));
- return 2;
- }
- return 0;
-}
-
-# Verify ntp.conf
-
--r $NTPCONF || die "Missing ntp configuration: $NTPCONF\n";
-
-# Parse ntp.conf for leapfile directive
-
-open(LF, $NTPCONF) || die "Can't open <$NTPCONF>: $!\n";
-while (<LF>) {
- chomp;
- if (/^ *leapfile\s+(\S+)/) {
- $LEAPFILE = $1;
- }
-}
-close LF;
-
--s $LEAPFILE || warn "$NTPCONF specifies $LEAPFILE as a leapfile, which is empty.\n";
-
-# Allow placing the file someplace else - testing
-
-if ( defined $ARGV[0] ) {
- if ( $ARGV[0] ne $LEAPFILE ) {
- logger("notice", "Requested install to $ARGV[0], but $NTPCONF specifies $LEAPFILE");
- }
- $LEAPFILE = $ARGV[0];
-}
-
-# Verify the current file
-# If it is missing, doesn't validate or expired
-# Or is expiring soon
-# Download a new one
-
-if ( $FORCE ne "" || verifySHA($LEAPFILE, $VERBOSE) || ( $EXPIRES lt ( $PREFETCH * 86400 + time() ) )) {
- my $TRY = 0;
- my $ff = File::Fetch->new(uri => $LEAPSRC) || die "Fetch failed.\n";
- while (1) {
- ++$TRY;
- logger("info", "Attempting download from $LEAPSRC, try $TRY..")
- if ($VERBOSE ne "");
- my $where = $ff->fetch( to => '/tmp' );
-
- if ($where) {
- logger("info", "Download of $LEAPSRC succeeded");
-
- if ( verifySHA($where, $VERBOSE )) {
- # There is no point in retrying, as the file on the
- # server is almost certainly corrupt.
-
- logger("warning", "Downloaded file $where rejected -- saved for diagnosis");
- exit 1;
- }
-
- # While the shell script version will set correct permissions
- # on temporary file, for the perl version that's harder, so
- # for now at least one should run this script as the
- # appropriate user.
-
- # REFFILE="$LEAPFILE"
- # if [ ! -f $LEAPFILE ]; then
- # logger "notice" "$LEAPFILE was missing, creating new copy - check permissions"
- # touch $LEAPFILE
- # # Can't copy permissions from old file, copy from NTPCONF instead
- # REFFILE="$NTPCONF"
- # fi
- # chmod --reference $REFFILE $TMPFILE
- # chown --reference $REFFILE $TMPFILE
- # ( which selinuxenabled && selinuxenabled && which chcon ) >/dev/null 2>&1
- # if [ $? == 0 ] ; then
- # chcon --reference $REFFILE $TMPFILE
- # fi
-
- # Replace current file with validated new one
-
- if ( move $where, $LEAPFILE ) {
- logger("notice", "Installed new $LEAPFILE from $LEAPSRC");
- } else {
- logger("error", "Install $where => $LEAPFILE failed -- saved for diagnosis: $!");
- exit 1;
- }
-
- # Restart NTP (or whatever else is specified)
-
- if ( $RESTART ne "" ) {
- if ( $VERBOSE ne "" ) {
- logger("info", "Attempting restart action: $RESTART");
- }
-
-# XXX
- #R="$( 2>&1 $RESTART )"
- #if [ $? -eq 0 ]; then
- # logger "notice" "Restart action succeeded"
- # if [ -n "$VERBOSE" -a -n "$R" ]; then
- # logger "info" "$R"
- # fi
- #else
- # logger "error" "Restart action failed"
- # if [ -n "$R" ]; then
- # logger "error" "$R"
- # fi
- # exit 2
- #fi
- }
- exit 0;
- }
-
- # Failed to download. See about trying again
-
- # rm -f $TMPFILE
- if ( $TRY ge $MAXTRIES ) {
- last;
- }
- if ( $VERBOSE ne "" ) {
- logger("info", "Waiting $INTERVAL minutes before retrying...");
- }
- sleep $INTERVAL * 60 ;
- }
-
- # Failed and out of retries
-
- logger("warning", "Download from $LEAPSRC failed after $TRY attempts");
- exit 1;
-}
-
-print "FORCE is <$FORCE>\n";
-print "verifySHA is " . verifySHA($LEAPFILE, "") . "\n";
-print "EXPIRES <$EXPIRES> vs ". ( $PREFETCH * 86400 + time() ) . "\n";
-
-logger("info", "Not time to replace $LEAPFILE");
-
-exit 0;
-
-# EOF
diff --git a/wscript b/wscript
index 0e03943..385a566 100644
--- a/wscript
+++ b/wscript
@@ -111,7 +111,6 @@ def build(ctx):
"scripts/ntpwait/ntpwait.in",
"scripts/ntpsweep/ntpsweep.in",
"scripts/ntptrace/ntptrace.in",
- "ntpleapfetch/ntpleapfetch.in"
]
ctx(
More information about the vc
mailing list