]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - contrib/ntp/scripts/ntp-wait/ntp-wait.in
Fix multiple ntp vulnerabilities.
[FreeBSD/releng/10.2.git] / contrib / ntp / scripts / ntp-wait / ntp-wait.in
1 #! @PATH_PERL@
2
3 package ntp_wait;
4 use 5.006_000;
5 use strict;
6 use warnings;
7 use lib "@PERLLIBDIR@";
8 use NTP::Util qw(ntp_read_vars);
9
10 exit run(@ARGV) unless caller;
11
12 sub run {
13     my $opts;
14     if (!processOptions(\@_, $opts)) {
15         usage(1);
16     };
17
18     my $tries   = $opts->{tries};       # How many tries before we give up? (10 min+)
19     my $sleep   = $opts->{sleep};       # Seconds to sleep between tries (6s = 10/min)
20     my $verbose = $opts->{verbose};     # Be verbose?
21
22     # Autoflush stdout
23     $| = 1;
24
25     print "Waiting for ntpd to synchronize...  " if $verbose;
26
27     for my $i (1 .. $tries) {
28         my $info = ntp_read_vars(0, []);
29
30         if (!defined $info) {
31             print "\bntpd is not running!\n" if $verbose;
32             return 1;
33         }
34
35         if (!exists $info->{status_line}{leap}) {
36             print "\bLeap status not available\n";
37             return 1;
38         }
39
40         my $leap   = $info->{status_line}{leap};
41         my $sync   = $info->{status_line}{sync};
42
43         if ($leap =~ /(sync|leap)_alarm/) {
44             print "\b".(substr "*+:.", $i % 4, 1) if $verbose;
45             sleep $sleep if $i < $tries;
46             next;
47         }
48
49         if ($leap =~ /leap_(none|((add|del)_sec))/) {
50             # We could check $sync here to make sure we like the source...
51             print "\bOK!\n" if $verbose;
52             return 0;
53         }
54
55         print "\bUnexpected 'leap' status <$leap>\n";
56         return 1;
57     }
58
59     print "\bNo!\nntpd did not synchronize.\n" if $verbose;
60     return 1;
61 }
62
63 @ntp_wait_opts@
64
65 1;
66 __END__