128 lines
3.1 KiB
Perl
Executable File
128 lines
3.1 KiB
Perl
Executable File
#! /usr/bin/perl
|
|
|
|
package ntp_wait;
|
|
use 5.006_000;
|
|
use strict;
|
|
use warnings;
|
|
use lib "/usr/share/ntp/lib";
|
|
use NTP::Util qw(ntp_read_vars);
|
|
|
|
exit run(@ARGV) unless caller;
|
|
|
|
sub run {
|
|
my $opts;
|
|
if (!processOptions(\@_, $opts)) {
|
|
usage(1);
|
|
};
|
|
|
|
my $tries = $opts->{tries}; # How many tries before we give up? (10 min+)
|
|
my $sleep = $opts->{sleep}; # Seconds to sleep between tries (6s = 10/min)
|
|
my $verbose = $opts->{verbose}; # Be verbose?
|
|
|
|
# Autoflush stdout
|
|
$| = 1;
|
|
|
|
print "Waiting for ntpd to synchronize... " if $verbose;
|
|
|
|
for my $i (1 .. $tries) {
|
|
my $info = ntp_read_vars(0, []);
|
|
|
|
if (!defined $info) {
|
|
print "\bntpd is not running!\n" if $verbose;
|
|
return 1;
|
|
}
|
|
|
|
if (!exists $info->{status_line}{leap}) {
|
|
print "\bLeap status not available\n";
|
|
return 1;
|
|
}
|
|
|
|
my $leap = $info->{status_line}{leap};
|
|
my $sync = $info->{status_line}{sync};
|
|
|
|
if ($leap =~ /(sync|leap)_alarm/) {
|
|
print "\b".(substr "*+:.", $i % 4, 1) if $verbose;
|
|
sleep $sleep if $i < $tries;
|
|
next;
|
|
}
|
|
|
|
if ($leap =~ /leap_(none|((add|del)_sec))/) {
|
|
# We could check $sync here to make sure we like the source...
|
|
print "\bOK!\n" if $verbose;
|
|
return 0;
|
|
}
|
|
|
|
print "\bUnexpected 'leap' status <$leap>\n";
|
|
return 1;
|
|
}
|
|
|
|
print "\bNo!\nntpd did not synchronize.\n" if $verbose;
|
|
return 1;
|
|
}
|
|
|
|
# EDIT THIS FILE WITH CAUTION (ntp-wait-opts)
|
|
#
|
|
# It has been AutoGen-ed August 14, 2018 at 08:09:02 AM by AutoGen 5.18.5
|
|
# From the definitions ntp-wait-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 = {
|
|
'tries' => '100',
|
|
'sleep' => '6',
|
|
'verbose' => '',
|
|
'help' => '', 'more-help' => ''
|
|
};
|
|
my $argument = '';
|
|
my $ret = GetOptionsFromArray($args, $opts, (
|
|
'tries|n=i', 'sleep|s=i', 'verbose|v',
|
|
'help|?', 'more-help'));
|
|
|
|
$usage = <<'USAGE';
|
|
ntp-wait - Wait for ntpd to stabilize the system clock - Ver. 4.2.8p12
|
|
USAGE: ntp-wait [ -<flag> [<val>] | --<name>[{=| }<val>] ]...
|
|
|
|
-n, --tries=num Number of times to check ntpd
|
|
-s, --sleep=num How long to sleep between tries
|
|
-v, --verbose Be verbose
|
|
-?, --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 };
|
|
|
|
1;
|
|
__END__
|