Files
wlan-lanforge-scripts/min_max_ave_station.pl
Ben Greear 72712ff548 Add scripts from the tools directory in the private Candela repo.
These scripts will now be publicly available in a git repo for
easier shared development and change tracking.
2017-10-06 13:41:50 -07:00

258 lines
8.5 KiB
Perl
Executable File

#!/usr/bin/perl -w
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
# This script looks for min-max-average bps for rx_rate in
# a station csv data file
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
package main;
$| = 1; # unbuffer output
use strict;
use warnings;
use diagnostics;
use Carp;
use Getopt::Long;
use POSIX qw(locale_h);
use locale;
use Number::Format qw(format_number);
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
our $TimeStamp = 0;
our $Name = 1;
our $Resource = 3;
our $Tx_Pkts = 4;
our $Tx_Packets = 4;
our $Rx_Pkts = 5;
our $Rx_Packets = 5;
our $Tx_Bytes = 6;
our $Rx_Bytes = 7;
our $Rx_Signal = 25;
our $Link_Speed = 26;
our $Rx_Link_Speed = 27;
our $filename;
our $start_time = 0;
our $finish_time = time() * 1000;
our $usage = "$0 [-f|--filename # name of staX csv file]
[-s|--start_time # timestamp milliseconds point to begin]
[-e|--finish_time # timestamp milliseconds point to finish]
Example:
$0 -f ./sta100_1.1.5_1429826436.csv # collect all entries
$0 -s 1429820000 -e 1429828000 -f ./sta100_1.1.5_1429826436.csv
We can use expanded unix datestamps as well:
$0 -s \`date -d \"2014/11/25 10:00:00\" \"+%s000\"\` \\
-e \`date -d \"2014/11/25 11:00:00\" \"+%s000\"\` \\
-f ./sta100_1.1.5_1429826436.csv
";
sub do_err_exit {
my $msg = shift;
print $msg."\n";
exit(1);
}
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
# takes a reference to a string
sub printRow {
my $rs_line = shift;
#print "LINE: $$rs_line\n";
my @hunks = split(',', $$rs_line);
my $msg =
"TimeStamp : $hunks[$::TimeStamp]
Name : $hunks[$::Name]
Resource : $hunks[$::Resource]
Tx_Pkts : $hunks[$::Tx_Pkts]
Rx_Pkts : $hunks[$::Rx_Pkts]
Tx_Bytes : $hunks[$::Tx_Bytes]
Rx_Bytes : $hunks[$::Rx_Bytes]
Rx_Signal : $hunks[$::Rx_Signal]
Link_Speed : $hunks[$::Link_Speed]
Rx_Link_Speed : $hunks[$::Rx_Link_Speed]\n\n";
print $msg;
}
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
# takes a reference to an array
sub printRowAt {
my $ra_rows = shift;
my $index = shift;
my $row = $ra_rows->[$index];
printRow( \$row );
}
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
# M A I N #
# ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- #
GetOptions (
'filename|f=s' => \$::filename,
'start_time|s=i' => \$::start_time,
'finish_time|e=i' => \$::finish_time
) || do_err_exit("$usage");
if ( ! defined $::filename || $::filename eq "" ) {
do_err_exit($::usage);
}
if ( ! -f $::filename ) {
do_err_exit("file not found");
}
open (my $input_fh, "<", $::filename) || do_err_exit($!);
my @lines = <$input_fh>;
close($input_fh);
#my $first_line = $lines[0];
#printRow( \$first_line );
#printRowAt( \@lines, 0 );
our $Orig = 0;
our $Min = 1;
our $Max = 2;
our $Tot = 3;
our $Total = 3;
our $Ave = 4;
our $Avg = 4;
our $Delta = 5;
our $Dt = 5;
my @begin_rx_bytes;
my @begin_rx_packets;
my @begin_rx_signal;
my $begin_time = 0;
my @cur_rx_bytes;
my @cur_rx_packets;
my @cur_rx_signal;
my @prev_rx_bytes;
my @prev_rx_packets;
my @prev_rx_signal;
# first entry
#my @hunks = split(',', $lines[ 1 ]);
my $counted = 0;
for( my $i = 2 ; $i < $#lines ; $i++ ) {
my @hunks = split(',', $lines[$i]);
#print "start time: $::start_time\nfinish time: $::finish_time\ntime stamp : $hunks[$::TimeStamp]\n";
next if ($hunks[ $::TimeStamp ] < $::start_time );
last if ($hunks[ $::TimeStamp ] > $::finish_time );
if ($counted == 0) {
$begin_time = $hunks[$::TimeStamp];
$begin_rx_bytes[ $::Orig ] = $hunks[$::Rx_Bytes];
$begin_rx_bytes[ $::Min ] = $hunks[$::Rx_Bytes];
$begin_rx_bytes[ $::Max ] = $hunks[$::Rx_Bytes];
$begin_rx_bytes[ $::Tot ] = $hunks[$::Rx_Bytes];
$begin_rx_bytes[ $::Ave ] = $hunks[$::Rx_Bytes];
$begin_rx_bytes[ $::Delta ] = 0;
$begin_rx_packets[ $::Orig ] = $hunks[$::Rx_Packets];
$begin_rx_packets[ $::Min ] = $hunks[$::Rx_Packets];
$begin_rx_packets[ $::Max ] = $hunks[$::Rx_Packets];
$begin_rx_packets[ $::Tot ] = $hunks[$::Rx_Packets];
$begin_rx_packets[$::Delta ] = 0;
$begin_rx_signal[ $::Orig ] = $hunks[$::Rx_Signal];
$begin_rx_signal[ $::Min ] = $hunks[$::Rx_Signal];
$begin_rx_signal[ $::Max ] = $hunks[$::Rx_Signal];
$begin_rx_signal[ $::Tot ] = $hunks[$::Rx_Signal];
$begin_rx_signal[$::Delta ] = 0;
@cur_rx_bytes = @begin_rx_bytes;
@cur_rx_packets = @begin_rx_packets;
@cur_rx_signal = @begin_rx_signal;
}
@prev_rx_bytes = @cur_rx_bytes;
@prev_rx_packets = @cur_rx_packets;
@prev_rx_signal = @cur_rx_signal;
#printRowAt( \@lines, $i );
$cur_rx_bytes[ $::Orig ] = $hunks[ $::Rx_Bytes ];
my $diff_rx = $hunks[ $::Rx_Bytes ] - $prev_rx_bytes[ $::Orig ];
$cur_rx_bytes[ $::Delta ] = $diff_rx;
if ($hunks[$::Rx_Bytes]==0) {
print "TimeStamp $hunks[$::TimeStamp] zero bytes\n";
$cur_rx_bytes[ $::Min ] = 0;
}
elsif (($diff_rx < $prev_rx_bytes[ $::Delta ]) && ($diff_rx < $prev_rx_bytes[ $::Min ])) {
if ($diff_rx == 0) {
print "TimeStamp $hunks[$::TimeStamp] zero bytes diff\n";
$cur_rx_bytes[ $::Min ] = $prev_rx_bytes[ $::Delta ];
} else {
$cur_rx_bytes[ $::Min ] = $diff_rx;
}
}
if (($diff_rx > $prev_rx_bytes[ $::Delta ]) && ($diff_rx > $prev_rx_bytes[ $::Max ])) {
$cur_rx_bytes[ $::Max ] = $diff_rx;
}
$cur_rx_bytes[ $::Tot ] = $hunks[ $::Rx_Bytes ] - $begin_rx_bytes[ $::Orig];
$cur_rx_packets[ $::Orig ] = $hunks[ $::Rx_Packets ];
$diff_rx = $hunks[ $::Rx_Packets ] - $prev_rx_packets[ $::Orig ];
$cur_rx_packets[ $::Delta ] = $diff_rx;
if ($hunks[$::Rx_Packets]==0) {
print "TimeStamp $hunks[$::TimeStamp] zero packets\n";
$cur_rx_packets[ $::Min ] = 0;
}
elsif (($diff_rx < $prev_rx_packets[ $::Delta ]) && ($diff_rx < $prev_rx_packets[ $::Min ])) {
if ($diff_rx == 0) {
print "TimeStamp $hunks[$::TimeStamp] zero packets diff\n";
$cur_rx_packets[ $::Min ] = $prev_rx_packets[ $::Delta ];
} else {
$cur_rx_packets[ $::Min ] = $diff_rx;
}
}
if (($diff_rx > $prev_rx_packets[ $::Delta ]) && ($diff_rx > $prev_rx_packets[ $::Max ])) {
$cur_rx_packets[ $::Max ] = $diff_rx;
}
$cur_rx_packets[ $::Tot ] = $hunks[ $::Rx_Packets ] - $begin_rx_packets[ $::Orig ];
$cur_rx_signal[ $::Orig ] = $hunks[ $::Rx_Signal ];
$cur_rx_signal[ $::Min ] = $hunks[ $::Rx_Signal ] if ( $hunks[ $::Rx_Signal ] < $prev_rx_signal[ $::Min ]);
$cur_rx_signal[ $::Max ] = $hunks[ $::Rx_Signal ] if ( $hunks[ $::Rx_Signal ] > $prev_rx_signal[ $::Max ]);
$cur_rx_signal[ $::Tot ] = $prev_rx_signal[ $::Tot ] + $hunks[ $::Rx_Signal ];
$counted++;
}
my $seconds = ($finish_time - $begin_time + 1000) / 1000;
if ($seconds <= 0 || $counted <= 0) {
do_err_exit("No records in range");
}
$cur_rx_bytes[ $Ave ] = $cur_rx_bytes[ $::Tot ] / $counted;
$cur_rx_packets[ $Ave ] = $cur_rx_packets[ $::Tot ] / $counted;
$cur_rx_signal[ $Ave ] = $cur_rx_signal[ $::Tot ] / $counted;
printf "Rx Bytes: Min_Bps: %15s Max_Bps: %15s Ave_Bps: %15s Total: %15s\n",
format_number($cur_rx_bytes[ $::Min ]),
format_number($cur_rx_bytes[ $::Max ]),
format_number($cur_rx_bytes[ $Ave ]),
format_number($cur_rx_bytes[ $::Tot ]);
printf "Rx bits/sec Min_bps: %15s Max_bps: %15s Ave_bps: %15s\n",
format_number($cur_rx_bytes[ $::Min ] * 8),
format_number($cur_rx_bytes[ $::Max ] * 8),
format_number($cur_rx_bytes[ $Ave ] * 8);
printf "Rx Packets: Min_Pps: %15s Max_Pps: %15s Ave_Pps: %15s Total: %15s\n",
format_number($cur_rx_packets[ $::Min ]),
format_number($cur_rx_packets[ $::Max ]),
format_number($cur_rx_packets[ $Ave ]),
format_number($cur_rx_packets[ $::Tot ]);
printf "Rx Signal: Min_dB: %15s Max_dB: %16s Ave_dB: %15s\n",
format_number($cur_rx_signal[ $::Min ]),
format_number($cur_rx_signal[ $::Max ]),
format_number($cur_rx_signal[ $Ave ]);
print format_number($counted)." samples in ".format_number($seconds)." seconds\n";
##
##
##