#!/usr/bin/perl # # h-tick log analyzer # by Dmitry Pankov (2:5022/81) # # Based on # hptlogstat.pl by Yuriy Daybov (2:5029/42) # dmstat.pl by Eugene Barbashin (2:5030/920) # # Usage: # Set $logname to point to your H-Tick logfile. Then call the script: # st_htick.pl [days] # # Examples: # "st_htick.pl 7" - create 7-day statistics for all the areas # "st_htick.pl 1" - statistics for last day use Time::Local; my %areaq; my %areas; my %linkq; my %links; my $cur_size; my $totals = 0; my $totalq = 0; #$logname = "c:\\fido\\logs\\htick.log"; $logname = "/fido/log/htick.log"; # this hash is used, when converting verbose months to numeral (Jan = 0) @months{qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)} = (0..11); # working with command line arguments if ($#ARGV > 1) { print("Wrong command line arguments number\n"); exit; } foreach (@ARGV) { if(/^\d{1,4}$/ && !$period) { $period = $_ } } $date = time() - (24 * 60 * 60 * ($period - 1)) if $period; open(LOG, "<$logname") || die "can't open $logname: $!"; while () { if (/-{10}\s+\w+\s(.*),/) { $last = $1; if (!$from) { $found = date_to_period($1); $date ||= $found; $from = $1 if ($found >= $date); } next; } if ($from) { if (/Size: (\d+)/) { $totals += $1; $totalq++; $cur_size = $1; }; if (/Area: (\S+)/) { $areaq{"\U$1"}++; $areas{"\U$1"} += $cur_size; }; if (/From: (\S+)/) { $linkq{$1}++; $links{$1} += $cur_size; } } } close LOG || die "Can't close $logname: $!";; # error checking unless(%areas) { print "No files in areas or wrong period of days!\n"; exit; } $period ||= int ((date_to_period($last) - $date) /24 /60 /60 + 1); # results print "\n\n> Fileecho traffic from $from to $last\n\n"; #print "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÑ". # "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"; #printf "\nº%16c%-29s ³ %8s ³ %12s º\n", 32, "Fileecho area", "Files", "Bytes"; #print "ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅ". # "ÄÄÄÄÄÄÄÄÄÄÄÄÄĶ\n"; print "+==============================================+==========+", "==============+"; printf "\n|%16c%-29s | %8s | %12s |\n", 32, "Fileecho area", "Files", "Bytes"; print "+==============================================+==========+", "==============+"; foreach (sort (keys %areaq)) { # printf "º %-44s ³ %8s ³ %12s º\n", $_, $areaq{$_}, $areas{$_}; printf "| %-44s | %8s | %12s |\n", $_, $areaq{$_}, $areas{$_}; } #print "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÏ". # "ÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n"; #print "ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÑÍÍÍÍÍÍÍÍÍÍÑ". # "ÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»"; #printf "\nº%14c%-31s ³ %8s ³ %12s º\n", 32, # "Fileecho uplinks", "Files", "Bytes"; #print "ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÅÄÄÄÄÄÄÄÄÄÄÅ". # "ÄÄÄÄÄÄÄÄÄÄÄÄÄĶ\n"; print "+==============================================+==========+", "==============+"; printf "\n|%14c%-31s | %8s | %12s |\n", 32, "Fileecho area", "Files", "Bytes"; print "+==============================================+==========+", "==============+"; foreach (sort (keys %linkq)) { # printf "º %-44s ³ %8s ³ %12s º\n", $_, $linkq{$_}, $links{$_}; printf "| %-44s | %8s | %12s |\n", $_, $linkq{$_}, $links{$_}; } #print "ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÏÍÍÍÍÍÍÍÍÍÍÏ". #"ÍÍÍÍÍÍÍÍÍÍÍÍÍͼ\n"; print "+==============================================+==========+", "==============+"; { my $totala = keys(%areaq); my $totall = keys(%linkq); print "\n Total $totals byte(s) in $totalq file(s)"; print " from $totala fileecho(s) from $totall link(s)\n"; } # converting verbose date to epoch seconds sub date_to_period { $_[0] =~ /(\d\d)\s(\w\w\w)\s(\d\d)/i; ($day, $month, $year) = ($1, $2, $3); timelocal("59", "59", "23", $day, $months{$month}, $year); }