# summarise.pl
#
# Summarise some whodo log/csv files into a single file. The old files
# are then deleted.
#
# Args are:
# i path of input log/CSV files. If no arg is given, this defaults to
# yesterday's files.
# o path of output CSV file. If no arg is given, this defaults to
# YYYYMMDD.csv where the date is the latest date in the input data.
#
# v1.0 11/11/98 Tony Farr
#
use Getopt::Std;
use File::Basename;
use strict;
use vars qw/ $opt_i $opt_o /;
# Directory for output logs/csv files.
my $LOGPATH= "D:\\logs\\whodo\\";
my $progname = basename($0);
my $usage= "Usage: $progname -i input_path -o output_file\n";
getopts('i:o:') || die $usage;
my @flist= get_input_files($opt_i);
if ( scalar(@flist) < 1 ) {
die "$progname: No files to process!";
}
my ($trafficref, $endtime, $duration)= get_traffic(@flist);
if (! $opt_o) {
($_)= split(/ /, $endtime);
my ($d,$m,$y) = split/\//;
$opt_o= dirname($flist[0]) . "\\" . sprintf "%d%02d%02d.csv",$y,$m,$d;
}
print_stats($trafficref, $endtime, $duration, $opt_o);
unlink @flist;
exit 0;
sub get_input_files {
# Returns a list of input files to be processed
my($path)= @_;
if (! $path) {
my $t = time() - 24*60*60;
my ($mday,$mon,$year) = ( localtime($t) )[3..5];
$path= $LOGPATH . sprintf("%d%02d%02d-*.csv",$year+1900,$mon+1,$mday);
}
glob($path);
}
sub get_traffic {
# Read the log files (specified in @_) & summarise into a hash
my($fname, $lastf, $lasttime, $hr, $min, $sec, $duration, $src, $dst, $bytes, %traffic);
foreach $fname (@_) {
open(CSV, "< $fname") || warn "$progname: unable to open $fname; $!";
# First line is a header giving end time
$_= <CSV> || warn "$progname: $fname is empty\n";
chomp;
$_= (split/,/)[1];
if ($fname gt $lastf) {
$lastf= $fname;
$lasttime= $_;
}
# Second line is a header giving period covered by this log
$_= <CSV> || die "$progname: $fname lacks second header line\n";
chomp;
$_= (split/,/)[1];
($hr, $min, $sec)= split/:/;
$duration += $sec + 60 * ($min + 60*$hr);
# The rest of the file has traffic for particular sources & destinations
while (<CSV>) {
($src, $dst, $bytes)= split/,/;
$traffic{$src}{$dst} += $bytes;
}
close(CSV);
}
return(\%traffic, $lasttime, $duration);
}
sub print_stats {
# Print out the traffictab in csv format
use integer;
my ($trafficref, $endtime, $duration, $fname)= @_;
open (CSVFILE,">$fname") || die "$progname: Could not open file $fname; $!\n";
print CSVFILE "End Time:,$endtime\n";
my $sec= $duration % 60;
$_= ($duration - $sec) / 60;
my $min= $_ % 60;
my $hr= ($_ - $min) / 60;
print CSVFILE "Duration:,$hr:$min:$sec\n";
foreach my $s (sort keys %$trafficref) {
foreach my $d (sort keys %{$$trafficref{$s}}) {
print CSVFILE "$s,$d,$$trafficref{$s}{$d}\n";
}
}
close(CSVFILE);
}