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