xref: /freebsd/contrib/ntp/scripts/summary.in (revision f5f40dd63bc7acbb5312b26ac1ea1103c12352a6)
1224ba2bdSOllivier Robert#! @PATH_PERL@ -w
2*f5f40dd6SCy Schubert# @configure_input@
3ce265a54SOllivier Robert# $Id$
4224ba2bdSOllivier Robert# Perl version of (summary.sh, loop.awk, peer.awk):
5224ba2bdSOllivier Robert# Create summaries from xntpd's loop and peer statistics.
6224ba2bdSOllivier Robert#
7224ba2bdSOllivier Robert# Copyright (c) 1997, 1999 by Ulrich Windl <Ulrich.Windl@rz.uni-regensburg.de>
8224ba2bdSOllivier Robert#
9224ba2bdSOllivier Robert# This program is free software; you can redistribute it and/or modify
10224ba2bdSOllivier Robert# it under the terms of the GNU General Public License as published by
11224ba2bdSOllivier Robert# the Free Software Foundation; either version 2 of the License, or
12224ba2bdSOllivier Robert# (at your option) any later version.
13224ba2bdSOllivier Robert#
14224ba2bdSOllivier Robert# This program is distributed in the hope that it will be useful, but
15224ba2bdSOllivier Robert# WITHOUT ANY WARRANTY; without even the implied warranty of
16224ba2bdSOllivier Robert# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17224ba2bdSOllivier Robert# General Public License for more details.
18224ba2bdSOllivier Robert#
19224ba2bdSOllivier Robert# You should have received a copy of the GNU General Public License
20224ba2bdSOllivier Robert# along with this program; if not, write to the Free Software
21224ba2bdSOllivier Robert# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
222b15cb3dSCy Schubertpackage summary;
232b15cb3dSCy Schubertuse 5.006_000;
24224ba2bdSOllivier Robertuse strict;
25224ba2bdSOllivier Robert
262b15cb3dSCy Schubertmy ($log_date_pattern, $statsdir, $outputdir, $skip_time_steps, $startdate,
272b15cb3dSCy Schubert    $enddate, $peer_dist_limit);
28224ba2bdSOllivier Robert
292b15cb3dSCy Schubertexit run(@ARGV) unless caller;
30224ba2bdSOllivier Robert
312b15cb3dSCy Schubertsub run {
322b15cb3dSCy Schubert    my $opts;
332b15cb3dSCy Schubert    if (!processOptions(\@ARGV, $opts)) {
342b15cb3dSCy Schubert        usage(1);
352b15cb3dSCy Schubert    };
36224ba2bdSOllivier Robert
372b15cb3dSCy Schubert    $log_date_pattern = '[12]\d{3}[01]\d[0-3]\d';
382b15cb3dSCy Schubert    $statsdir         = $opts->{directory};
392b15cb3dSCy Schubert    $outputdir        = $opts->{'output-directory'};
402b15cb3dSCy Schubert    $skip_time_steps  = $opts->{'skip-time-steps'};
412b15cb3dSCy Schubert    $startdate        = $opts->{'start-date'};
422b15cb3dSCy Schubert    $enddate          = $opts->{'end-date'};
432b15cb3dSCy Schubert    if (!$enddate){
442b15cb3dSCy Schubert        $enddate = `date -u +%Y%m%d`;
452b15cb3dSCy Schubert        chomp $enddate;
462b15cb3dSCy Schubert        --$enddate;
47224ba2bdSOllivier Robert    }
482b15cb3dSCy Schubert    $peer_dist_limit = $opts->{'peer-dist-limit'};
49224ba2bdSOllivier Robert
50224ba2bdSOllivier Robert    # check possibly current values of options
51224ba2bdSOllivier Robert    die "$statsdir: no such directory" unless (-d $statsdir);
52224ba2bdSOllivier Robert    die "$outputdir: no such directory" unless (-d $outputdir);
53224ba2bdSOllivier Robert    die "$skip_time_steps: skip-time-steps must be positive"
54224ba2bdSOllivier Robert        unless ($skip_time_steps >= 0.0);
55224ba2bdSOllivier Robert    die "$startdate: invalid start date|$`|$&|$'"
56224ba2bdSOllivier Robert        unless ($startdate =~ m/.*$log_date_pattern$/);
57224ba2bdSOllivier Robert    die "$enddate: invalid end date"
58224ba2bdSOllivier Robert        unless ($enddate =~ m/.*$log_date_pattern$/);
59224ba2bdSOllivier Robert
60224ba2bdSOllivier Robert    $skip_time_steps = 0.128 if ($skip_time_steps == 0);
61224ba2bdSOllivier Robert
622b15cb3dSCy Schubert    my $loop_summary="$outputdir/loop_summary";
632b15cb3dSCy Schubert    my $peer_summary="$outputdir/peer_summary";
642b15cb3dSCy Schubert    my $clock_summary="$outputdir/clock_summary";
652b15cb3dSCy Schubert    my (@loopfiles, @peerfiles, @clockfiles);
662b15cb3dSCy Schubert
672b15cb3dSCy Schubert    print STDERR "Creating summaries from $statsdir ($startdate to $enddate)\n";
682b15cb3dSCy Schubert
692b15cb3dSCy Schubert    opendir SDIR, $statsdir or die "directory ${statsdir}: $!";
702b15cb3dSCy Schubert    rewinddir SDIR;
712b15cb3dSCy Schubert    @loopfiles=sort grep /loop.*$log_date_pattern/, readdir SDIR;
722b15cb3dSCy Schubert    rewinddir SDIR;
732b15cb3dSCy Schubert    @peerfiles=sort grep /peer.*$log_date_pattern/, readdir SDIR;
742b15cb3dSCy Schubert    rewinddir SDIR;
752b15cb3dSCy Schubert    @clockfiles=sort grep /clock.*$log_date_pattern/, readdir SDIR;
762b15cb3dSCy Schubert    closedir SDIR;
772b15cb3dSCy Schubert
782b15cb3dSCy Schubert    # remove old summary files
792b15cb3dSCy Schubert    for ($loop_summary, $peer_summary, $clock_summary) { unlink $_ if -f $_ };
802b15cb3dSCy Schubert
812b15cb3dSCy Schubert    my $date;
822b15cb3dSCy Schubert    for (@loopfiles) {
832b15cb3dSCy Schubert        $date = $_; $date =~ s/.*($log_date_pattern)$/$1/;
842b15cb3dSCy Schubert        if ($date ge $startdate && $date le $enddate) {
852b15cb3dSCy Schubert            do_loop($statsdir, $_, $loop_summary);
862b15cb3dSCy Schubert        }
872b15cb3dSCy Schubert    }
882b15cb3dSCy Schubert
892b15cb3dSCy Schubert    for (@peerfiles) {
902b15cb3dSCy Schubert        $date = $_; $date =~ s/.*($log_date_pattern)$/$1/;
912b15cb3dSCy Schubert        if ($date ge $startdate && $date le $enddate) {
922b15cb3dSCy Schubert            do_peer($statsdir, $_, $peer_summary);
932b15cb3dSCy Schubert        }
942b15cb3dSCy Schubert    }
952b15cb3dSCy Schubert
962b15cb3dSCy Schubert    for (@clockfiles) {
972b15cb3dSCy Schubert        $date = $_; $date =~ s/.*($log_date_pattern)$/$1/;
982b15cb3dSCy Schubert        if ($date ge $startdate && $date le $enddate) {
992b15cb3dSCy Schubert            do_clock($statsdir, $_, $clock_summary);
1002b15cb3dSCy Schubert        }
1012b15cb3dSCy Schubert    }
1022b15cb3dSCy Schubert
1032b15cb3dSCy Schubert    print STDERR "Creating peer summary with limit $peer_dist_limit\n";
1042b15cb3dSCy Schubert    peer_summary($peer_summary) if (-f $peer_summary);
1052b15cb3dSCy Schubert}
1062b15cb3dSCy Schubert
107224ba2bdSOllivier Robertsub min
108224ba2bdSOllivier Robert{
109224ba2bdSOllivier Robert    my ($result, @rest) = @_;
110224ba2bdSOllivier Robert    map { $result = $_ if ($_ < $result) } @rest;
111224ba2bdSOllivier Robert    return($result);
112224ba2bdSOllivier Robert}
113224ba2bdSOllivier Robert
114224ba2bdSOllivier Robertsub max
115224ba2bdSOllivier Robert{
116224ba2bdSOllivier Robert    my ($result, @rest) = @_;
117224ba2bdSOllivier Robert    map { $result = $_ if ($_ > $result) } @rest;
118224ba2bdSOllivier Robert    return($result);
119224ba2bdSOllivier Robert}
120224ba2bdSOllivier Robert
121224ba2bdSOllivier Robert# calculate mean, range, and standard deviation for offset and frequency
122224ba2bdSOllivier Robertsub do_loop
123224ba2bdSOllivier Robert{
124224ba2bdSOllivier Robert    my ($directory, $fname, $out_file) = @_;
125224ba2bdSOllivier Robert    print "$directory/$fname\n";
126224ba2bdSOllivier Robert    open INPUT, "$directory/$fname" or warn "can't open $directory/$fname: $!";
127224ba2bdSOllivier Robert    open OUTPUT, ">>$out_file" or die "can't open $out_file: $!";
128224ba2bdSOllivier Robert    print OUTPUT "$fname\n";
129224ba2bdSOllivier Robert    my ($loop_tmax, $loop_fmax) = (-1e9, -1e9);
130224ba2bdSOllivier Robert    my ($loop_tmin, $loop_fmin) = (1e9, 1e9);
131224ba2bdSOllivier Robert    my ($loop_time_rms, $loop_freq_rms) = (0, 0);
132224ba2bdSOllivier Robert    my $loop_count = 0;
133224ba2bdSOllivier Robert    my $loop_time = 0;
134224ba2bdSOllivier Robert    my $loop_freq = 0;
135224ba2bdSOllivier Robert    my ($freq, $offs);
136224ba2bdSOllivier Robert    my @Fld;
137224ba2bdSOllivier Robert    while (<INPUT>) {
138224ba2bdSOllivier Robert	chop;	# strip record separator
139224ba2bdSOllivier Robert	@Fld = split;
140224ba2bdSOllivier Robert	next if ($#Fld < 4);
141224ba2bdSOllivier Robert#NTPv3: 50529 74356.259 -0.000112 16.1230 8
142224ba2bdSOllivier Robert#NTPv3: day, sec.msec, offset, drift_comp, sys_poll
143224ba2bdSOllivier Robert#NTPv4: 51333 54734.582 0.000001648 16.981964 0.000001094 0.020938 6
144224ba2bdSOllivier Robert#NTPv4: day, sec.msec, offset, drift_comp, sys_error, clock_stabil, sys_poll
145224ba2bdSOllivier Robert	if ($Fld[2] > $skip_time_steps || $Fld[2] < -$skip_time_steps) {
146224ba2bdSOllivier Robert	    warn "ignoring loop offset $Fld[2] (file $fname, line $.)\n";
147224ba2bdSOllivier Robert	    next
148224ba2bdSOllivier Robert	}
149224ba2bdSOllivier Robert	$loop_count++;
150224ba2bdSOllivier Robert	($offs, $freq) = ($Fld[2], $Fld[3]);
151224ba2bdSOllivier Robert	$loop_tmax = max($loop_tmax, $offs);
152224ba2bdSOllivier Robert	$loop_tmin = min($loop_tmin, $offs);
153224ba2bdSOllivier Robert	$loop_fmax = max($loop_fmax, $freq);
154224ba2bdSOllivier Robert	$loop_fmin = min($loop_fmin, $freq);
155224ba2bdSOllivier Robert	$loop_time += $offs;
156224ba2bdSOllivier Robert	$loop_time_rms += $offs * $offs;
157224ba2bdSOllivier Robert	$loop_freq += $freq;
158224ba2bdSOllivier Robert	$loop_freq_rms += $freq * $freq;
159224ba2bdSOllivier Robert    }
160224ba2bdSOllivier Robert    close INPUT;
161224ba2bdSOllivier Robert    if ($loop_count > 1) {
162224ba2bdSOllivier Robert	$loop_time /= $loop_count;
163224ba2bdSOllivier Robert	$loop_time_rms = $loop_time_rms / $loop_count - $loop_time * $loop_time;
164224ba2bdSOllivier Robert	if ($loop_time_rms < 0) {
165224ba2bdSOllivier Robert	    warn "loop_time_rms: $loop_time_rms < 0";
166224ba2bdSOllivier Robert	    $loop_time_rms = 0;
167224ba2bdSOllivier Robert	}
168224ba2bdSOllivier Robert	$loop_time_rms = sqrt($loop_time_rms);
169224ba2bdSOllivier Robert	$loop_freq /= $loop_count;
170224ba2bdSOllivier Robert	$loop_freq_rms = $loop_freq_rms / $loop_count - $loop_freq * $loop_freq;
171224ba2bdSOllivier Robert	if ($loop_freq_rms < 0) {
172224ba2bdSOllivier Robert	    warn "loop_freq_rms: $loop_freq_rms < 0";
173224ba2bdSOllivier Robert	    $loop_freq_rms = 0;
174224ba2bdSOllivier Robert	}
175224ba2bdSOllivier Robert	$loop_freq_rms = sqrt($loop_freq_rms);
176224ba2bdSOllivier Robert	printf OUTPUT
177224ba2bdSOllivier Robert	    ("loop %d, %.0f+/-%.1f, rms %.1f, freq %.2f+/-%0.3f, var %.3f\n",
178224ba2bdSOllivier Robert	     $loop_count, ($loop_tmax + $loop_tmin) / 2 * 1e6,
179224ba2bdSOllivier Robert	     ($loop_tmax - $loop_tmin) / 2 * 1e6, $loop_time_rms * 1e6,
180224ba2bdSOllivier Robert	     ($loop_fmax + $loop_fmin) / 2, ($loop_fmax - $loop_fmin) / 2,
181224ba2bdSOllivier Robert	     $loop_freq_rms);
182224ba2bdSOllivier Robert    }
183224ba2bdSOllivier Robert    else {
184224ba2bdSOllivier Robert	warn "no valid lines in $directory/$fname";
185224ba2bdSOllivier Robert    }
186224ba2bdSOllivier Robert    close OUTPUT
187224ba2bdSOllivier Robert}
188224ba2bdSOllivier Robert
189224ba2bdSOllivier Robert# calculate mean, standard deviation, maximum offset, mean dispersion,
190224ba2bdSOllivier Robert# and maximum distance for each peer
191224ba2bdSOllivier Robertsub do_peer
192224ba2bdSOllivier Robert{
193224ba2bdSOllivier Robert    my ($directory, $fname, $out_file) = @_;
194224ba2bdSOllivier Robert    print "$directory/$fname\n";
195224ba2bdSOllivier Robert    open INPUT, "$directory/$fname" or warn "can't open $directory/$fname: $!";
196224ba2bdSOllivier Robert    open OUTPUT, ">>$out_file" or die "can't open $out_file: $!";
197224ba2bdSOllivier Robert    print OUTPUT "$fname\n";
198224ba2bdSOllivier Robert# we toss out all distances greater than one second on the assumption the
199224ba2bdSOllivier Robert# peer is in initial acquisition
200224ba2bdSOllivier Robert    my ($n, $MAXDISTANCE) = (0, 1.0);
201224ba2bdSOllivier Robert    my %peer_time;
202224ba2bdSOllivier Robert    my %peer_time_rms;
203224ba2bdSOllivier Robert    my %peer_count;
204224ba2bdSOllivier Robert    my %peer_delay;
205224ba2bdSOllivier Robert    my %peer_disp;
206224ba2bdSOllivier Robert    my %peer_dist;
207224ba2bdSOllivier Robert    my %peer_ident;
208224ba2bdSOllivier Robert    my %peer_tmin;
209224ba2bdSOllivier Robert    my %peer_tmax;
210224ba2bdSOllivier Robert    my @Fld;
211224ba2bdSOllivier Robert    my ($i, $j);
212224ba2bdSOllivier Robert    my ($dist, $offs);
213224ba2bdSOllivier Robert    while (<INPUT>) {
214224ba2bdSOllivier Robert	chop;	# strip record separator
215224ba2bdSOllivier Robert	@Fld = split;
216224ba2bdSOllivier Robert	next if ($#Fld < 6);
217224ba2bdSOllivier Robert#NTPv3: 50529 83316.249 127.127.8.1 9674 0.008628 0.00000 0.00700
218224ba2bdSOllivier Robert#NTPv3: day, sec.msec, addr, status, offset, delay, dispersion
219224ba2bdSOllivier Robert#NTPv4: 51333 56042.037 127.127.8.1 94f5 -0.000014657 0.000000000 0.000000000 0.000013214
220224ba2bdSOllivier Robert#NTPv4: day, sec.msec, addr, status, offset, delay, dispersion, skew
221224ba2bdSOllivier Robert
222224ba2bdSOllivier Robert	$dist = $Fld[6] + $Fld[5] / 2;
223224ba2bdSOllivier Robert	next if ($dist > $MAXDISTANCE);
224224ba2bdSOllivier Robert	$offs = $Fld[4];
225224ba2bdSOllivier Robert	if ($offs > $skip_time_steps || $offs < -$skip_time_steps) {
226224ba2bdSOllivier Robert	    warn "ignoring peer offset $offs (file $fname, line $.)\n";
227224ba2bdSOllivier Robert	    next
228224ba2bdSOllivier Robert	}
229224ba2bdSOllivier Robert	$i = $n;
230224ba2bdSOllivier Robert	for ($j = 0; $j < $n; $j++) {
231224ba2bdSOllivier Robert	    if ($Fld[2] eq $peer_ident{$j}) {
232224ba2bdSOllivier Robert		$i = $j;		# peer found
233224ba2bdSOllivier Robert		last;
234224ba2bdSOllivier Robert	    }
235224ba2bdSOllivier Robert	}
236224ba2bdSOllivier Robert	if ($i == $n) {		# add new peer
237224ba2bdSOllivier Robert	    $peer_ident{$i} = $Fld[2];
238224ba2bdSOllivier Robert	    $peer_tmax{$i} = $peer_dist{$i} = -1e9;
239224ba2bdSOllivier Robert	    $peer_tmin{$i} = 1e9;
240224ba2bdSOllivier Robert	    $peer_time{$i} = $peer_time_rms{$i} = 0;
241224ba2bdSOllivier Robert	    $peer_delay{$i} = $peer_disp{$i} = 0;
242224ba2bdSOllivier Robert	    $peer_count{$i} = 0;
243224ba2bdSOllivier Robert	    $n++;
244224ba2bdSOllivier Robert	}
245224ba2bdSOllivier Robert	$peer_count{$i}++;
246224ba2bdSOllivier Robert	$peer_tmax{$i} = max($peer_tmax{$i}, $offs);
247224ba2bdSOllivier Robert	$peer_tmin{$i} = min($peer_tmin{$i}, $offs);
248224ba2bdSOllivier Robert	$peer_dist{$i} = max($peer_dist{$i}, $dist);
249224ba2bdSOllivier Robert	$peer_time{$i} += $offs;
250224ba2bdSOllivier Robert	$peer_time_rms{$i} += $offs * $offs;
251224ba2bdSOllivier Robert	$peer_delay{$i} += $Fld[5];
252224ba2bdSOllivier Robert	$peer_disp{$i} += $Fld[6];
253224ba2bdSOllivier Robert    }
254224ba2bdSOllivier Robert    close INPUT;
255224ba2bdSOllivier Robert    print OUTPUT
256224ba2bdSOllivier Robert"       ident     cnt     mean     rms      max     delay     dist     disp\n";
257224ba2bdSOllivier Robert    print OUTPUT
258224ba2bdSOllivier Robert"==========================================================================\n";
259224ba2bdSOllivier Robert    my @lines = ();
260224ba2bdSOllivier Robert    for ($i = 0; $i < $n; $i++) {
261224ba2bdSOllivier Robert	next if $peer_count{$i} < 2;
262224ba2bdSOllivier Robert	$peer_time{$i} /= $peer_count{$i};
263224ba2bdSOllivier Robert	eval { $peer_time_rms{$i} = sqrt($peer_time_rms{$i} / $peer_count{$i} -
264224ba2bdSOllivier Robert					 $peer_time{$i} * $peer_time{$i}); };
265224ba2bdSOllivier Robert	$peer_time_rms{$i} = 0, warn $@ if $@;
266224ba2bdSOllivier Robert	$peer_delay{$i} /= $peer_count{$i};
267224ba2bdSOllivier Robert	$peer_disp{$i} /= $peer_count{$i};
268224ba2bdSOllivier Robert	$peer_tmax{$i} = $peer_tmax{$i} - $peer_time{$i};
269224ba2bdSOllivier Robert	$peer_tmin{$i} = $peer_time{$i} - $peer_tmin{$i};
270224ba2bdSOllivier Robert	if ($peer_tmin{$i} > $peer_tmax{$i}) {	# can this happen at all?
271224ba2bdSOllivier Robert	    $peer_tmax{$i} = $peer_tmin{$i};
272224ba2bdSOllivier Robert	}
273224ba2bdSOllivier Robert	push @lines, sprintf
274224ba2bdSOllivier Robert	    "%-15s %4d %8.3f %8.3f %8.3f %8.3f %8.3f %8.3f\n",
275224ba2bdSOllivier Robert	    $peer_ident{$i}, $peer_count{$i}, $peer_time{$i} * 1e3,
276224ba2bdSOllivier Robert	    $peer_time_rms{$i} * 1e3, $peer_tmax{$i} * 1e3,
277224ba2bdSOllivier Robert	    $peer_delay{$i} * 1e3, $peer_dist{$i} * 1e3, $peer_disp{$i} * 1e3;
278224ba2bdSOllivier Robert    }
279224ba2bdSOllivier Robert    print OUTPUT sort @lines;
280224ba2bdSOllivier Robert    close OUTPUT;
281224ba2bdSOllivier Robert}
282224ba2bdSOllivier Robert
283224ba2bdSOllivier Robertsub do_clock
284224ba2bdSOllivier Robert{
285224ba2bdSOllivier Robert    my ($directory, $fname, $out_file) = @_;
286224ba2bdSOllivier Robert    print "$directory/$fname\n";
287224ba2bdSOllivier Robert    open INPUT, "$directory/$fname";
288224ba2bdSOllivier Robert    open OUTPUT, ">>$out_file" or die "can't open $out_file: $!";
289224ba2bdSOllivier Robert    print OUTPUT "$fname\n";
290224ba2bdSOllivier Robert    close INPUT;
291224ba2bdSOllivier Robert    close OUTPUT;
292224ba2bdSOllivier Robert}
293224ba2bdSOllivier Robert
294224ba2bdSOllivier Robertsub peer_summary
295224ba2bdSOllivier Robert{
296224ba2bdSOllivier Robert    my $in_file = shift;
297224ba2bdSOllivier Robert    my ($i, $j, $n);
298224ba2bdSOllivier Robert    my (%peer_ident, %peer_count, %peer_mean, %peer_var, %peer_max);
299224ba2bdSOllivier Robert    my (%peer_1, %peer_2, %peer_3, %peer_4);
300224ba2bdSOllivier Robert    my $dist;
301224ba2bdSOllivier Robert    my $max;
302224ba2bdSOllivier Robert    open INPUT, "<$in_file" or die "can't open $in_file: $!";
303224ba2bdSOllivier Robert    my @Fld;
304224ba2bdSOllivier Robert    $n = 0;
305224ba2bdSOllivier Robert    while (<INPUT>) {
306224ba2bdSOllivier Robert	chop;	# strip record separator
307224ba2bdSOllivier Robert	@Fld = split;
308224ba2bdSOllivier Robert	next if ($#Fld < 7 || $Fld[0] eq 'ident');
309224ba2bdSOllivier Robert	$i = $n;
310224ba2bdSOllivier Robert	for ($j = 0; $j < $n; $j++) {
311224ba2bdSOllivier Robert	    if ($Fld[0] eq $peer_ident{$j}) {
312224ba2bdSOllivier Robert		$i = $j;
313224ba2bdSOllivier Robert		last;			# peer found
314224ba2bdSOllivier Robert	    }
315224ba2bdSOllivier Robert	}
316224ba2bdSOllivier Robert	if ($i == $n) {			# add new peer
317224ba2bdSOllivier Robert	    $peer_count{$i} = $peer_mean{$i} = $peer_var{$i} = 0;
318224ba2bdSOllivier Robert	    $peer_max{$i} = 0;
319224ba2bdSOllivier Robert 	    $peer_1{$i} = $peer_2{$i} = $peer_3{$i} = $peer_4{$i} = 0;
320224ba2bdSOllivier Robert	    $peer_ident{$i} = $Fld[0];
321224ba2bdSOllivier Robert	    ++$n;
322224ba2bdSOllivier Robert	}
323224ba2bdSOllivier Robert	$dist = $Fld[6] - $Fld[5] / 2;
324224ba2bdSOllivier Robert	if ($dist < $peer_dist_limit) {
325224ba2bdSOllivier Robert	    $peer_count{$i}++;
326224ba2bdSOllivier Robert	    $peer_mean{$i} += $Fld[2];
327224ba2bdSOllivier Robert	    $peer_var{$i} += $Fld[3] * $Fld[3];
328224ba2bdSOllivier Robert	    $max = $Fld[4];
329224ba2bdSOllivier Robert	    $peer_max{$i} = max($peer_max{$i}, $max);
330224ba2bdSOllivier Robert	    if ($max > 1) {
331224ba2bdSOllivier Robert		$peer_1{$i}++;
332224ba2bdSOllivier Robert		if ($max > 5) {
333224ba2bdSOllivier Robert		    $peer_2{$i}++;
334224ba2bdSOllivier Robert		    if ($max > 10) {
335224ba2bdSOllivier Robert			$peer_3{$i}++;
336224ba2bdSOllivier Robert			if ($max > 50) {
337224ba2bdSOllivier Robert			    $peer_4{$i}++;
338224ba2bdSOllivier Robert			}
339224ba2bdSOllivier Robert		    }
340224ba2bdSOllivier Robert		}
341224ba2bdSOllivier Robert	    }
342224ba2bdSOllivier Robert	}
343224ba2bdSOllivier Robert	else {
344224ba2bdSOllivier Robert	    warn "dist exceeds limit: $dist (file $in_file, line $.)\n";
345224ba2bdSOllivier Robert	}
346224ba2bdSOllivier Robert    }
347224ba2bdSOllivier Robert    close INPUT;
348224ba2bdSOllivier Robert    my @lines = ();
349224ba2bdSOllivier Robert    print
350224ba2bdSOllivier Robert	"       host     days    mean       rms       max   >1  >5 >10 >50\n";
351224ba2bdSOllivier Robert    print
352224ba2bdSOllivier Robert	"==================================================================\n";
353224ba2bdSOllivier Robert    for ($i = 0; $i < $n; $i++) {
354224ba2bdSOllivier Robert	next if ($peer_count{$i} < 2);
355224ba2bdSOllivier Robert	$peer_mean{$i} /= $peer_count{$i};
356224ba2bdSOllivier Robert	eval { $peer_var{$i} = sqrt($peer_var{$i} / $peer_count{$i} -
357224ba2bdSOllivier Robert				    $peer_mean{$i} * $peer_mean{$i}); };
358224ba2bdSOllivier Robert	$peer_var{$i} = 0, warn $@ if $@;
359224ba2bdSOllivier Robert	push @lines, sprintf
360224ba2bdSOllivier Robert	    "%-15s %3d %9.3f% 9.3f %9.3f %3d %3d %3d %3d\n",
361224ba2bdSOllivier Robert	    $peer_ident{$i}, $peer_count{$i}, $peer_mean{$i}, $peer_var{$i},
362224ba2bdSOllivier Robert	    $peer_max{$i}, $peer_1{$i}, $peer_2{$i}, $peer_3{$i}, $peer_4{$i};
363224ba2bdSOllivier Robert    }
364224ba2bdSOllivier Robert    print sort @lines;
365224ba2bdSOllivier Robert}
366224ba2bdSOllivier Robert
3672b15cb3dSCy Schubert@summary_opts@
368224ba2bdSOllivier Robert
3692b15cb3dSCy Schubert1;
3702b15cb3dSCy Schubert__END__
371