ntptrace.in revision 1.1.1.1.16.2 1 1.1.1.1.16.2 msaitoh #! @PATH_PERL@ -w
2 1.1.1.1.16.2 msaitoh # John Hay -- John.Hay (at] icomtek.csir.co.za / jhay (at] FreeBSD.org
3 1.1.1.1.16.2 msaitoh
4 1.1.1.1.16.2 msaitoh package ntptrace;
5 1.1.1.1.16.2 msaitoh use 5.006_000;
6 1.1.1.1.16.2 msaitoh use strict;
7 1.1.1.1.16.2 msaitoh use lib "@PERLLIBDIR@";
8 1.1.1.1.16.2 msaitoh use NTP::Util qw(ntp_read_vars do_dns);
9 1.1.1.1.16.2 msaitoh
10 1.1.1.1.16.2 msaitoh exit run(@ARGV) unless caller;
11 1.1.1.1.16.2 msaitoh
12 1.1.1.1.16.2 msaitoh sub run {
13 1.1.1.1.16.2 msaitoh my $opts;
14 1.1.1.1.16.2 msaitoh if (!processOptions(\@_, $opts)) {
15 1.1.1.1.16.2 msaitoh usage(1);
16 1.1.1.1.16.2 msaitoh };
17 1.1.1.1.16.2 msaitoh
18 1.1.1.1.16.2 msaitoh my $dodns = $opts->{numeric} ? 0 : 1;
19 1.1.1.1.16.2 msaitoh my $max_hosts = $opts->{'max-hosts'};
20 1.1.1.1.16.2 msaitoh my $host = shift || $opts->{host};
21 1.1.1.1.16.2 msaitoh my $nb_host = 0;
22 1.1.1.1.16.2 msaitoh
23 1.1.1.1.16.2 msaitoh for (;;) {
24 1.1.1.1.16.2 msaitoh $nb_host++;
25 1.1.1.1.16.2 msaitoh
26 1.1.1.1.16.2 msaitoh my %info = get_info($host);
27 1.1.1.1.16.2 msaitoh last if not %info;
28 1.1.1.1.16.2 msaitoh
29 1.1.1.1.16.2 msaitoh my $dhost = $host;
30 1.1.1.1.16.2 msaitoh if ($dodns) {
31 1.1.1.1.16.2 msaitoh my $name = do_dns($host);
32 1.1.1.1.16.2 msaitoh $dhost = $name if defined $name;
33 1.1.1.1.16.2 msaitoh }
34 1.1.1.1.16.2 msaitoh
35 1.1.1.1.16.2 msaitoh printf "%s: stratum %d, offset %f, synch distance %f",
36 1.1.1.1.16.2 msaitoh $dhost, $info{stratum}, $info{offset}, $info{syncdistance};
37 1.1.1.1.16.2 msaitoh printf ", refid '%s'", $info{refid} if $info{stratum} == 1;
38 1.1.1.1.16.2 msaitoh print "\n";
39 1.1.1.1.16.2 msaitoh
40 1.1.1.1.16.2 msaitoh last if $info{stratum} == 0 || $info{stratum} == 1 ||
41 1.1.1.1.16.2 msaitoh $info{stratum} == 16;
42 1.1.1.1.16.2 msaitoh last if $info{refid} =~ /^127\.127\.\d{1,3}\.\d{1,3}$/;
43 1.1.1.1.16.2 msaitoh last if $nb_host == $max_hosts;
44 1.1.1.1.16.2 msaitoh
45 1.1.1.1.16.2 msaitoh my $next_host = get_next_host($info{peer}, $host);
46 1.1.1.1.16.2 msaitoh last if $next_host eq '';
47 1.1.1.1.16.2 msaitoh last if $next_host =~ /^127\.127\.\d{1,3}\.\d{1,3}$/;
48 1.1.1.1.16.2 msaitoh
49 1.1.1.1.16.2 msaitoh $host = $next_host;
50 1.1.1.1.16.2 msaitoh }
51 1.1.1.1.16.2 msaitoh return 0;
52 1.1.1.1.16.2 msaitoh }
53 1.1.1.1.16.2 msaitoh
54 1.1.1.1.16.2 msaitoh sub get_info {
55 1.1.1.1.16.2 msaitoh my ($host) = @_;
56 1.1.1.1.16.2 msaitoh my ($rootdelay, $rootdisp, $info) = (0, 0);
57 1.1.1.1.16.2 msaitoh
58 1.1.1.1.16.2 msaitoh $info = ntp_read_vars(0, [], $host);
59 1.1.1.1.16.2 msaitoh return if not defined $info;
60 1.1.1.1.16.2 msaitoh return if not exists $info->{stratum};
61 1.1.1.1.16.2 msaitoh
62 1.1.1.1.16.2 msaitoh $info->{offset} /= 1000;
63 1.1.1.1.16.2 msaitoh $info->{syncdistance} = ($info->{rootdisp} + ($info->{rootdelay} / 2)) / 1000;
64 1.1.1.1.16.2 msaitoh
65 1.1.1.1.16.2 msaitoh return %$info;
66 1.1.1.1.16.2 msaitoh }
67 1.1.1.1.16.2 msaitoh
68 1.1.1.1.16.2 msaitoh
69 1.1.1.1.16.2 msaitoh sub get_next_host {
70 1.1.1.1.16.2 msaitoh my ($peer, $host) = @_;
71 1.1.1.1.16.2 msaitoh
72 1.1.1.1.16.2 msaitoh my $info = ntp_read_vars($peer, [qw(srcadr)], $host);
73 1.1.1.1.16.2 msaitoh return if not defined $info;
74 1.1.1.1.16.2 msaitoh return $info->{srcadr};
75 1.1.1.1.16.2 msaitoh }
76 1.1.1.1.16.2 msaitoh
77 1.1.1.1.16.2 msaitoh @ntptrace_opts@
78 1.1.1.1.16.2 msaitoh
79 1.1.1.1.16.2 msaitoh 1;
80 1.1.1.1.16.2 msaitoh __END__
81