summarise.pl
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:3k
源码类别:

SNMP编程

开发平台:

C/C++

  1. # summarise.pl
  2. #
  3. # Summarise some whodo log/csv files into a single file. The old files
  4. # are then deleted.
  5. #
  6. # Args are:
  7. # i path of input log/CSV files. If no arg is given, this defaults to
  8. # yesterday's files.
  9. # o path of output CSV file. If no arg is given, this defaults to
  10. # YYYYMMDD.csv where the date is the latest date in the input data.
  11. #
  12. # v1.0 11/11/98 Tony Farr
  13. #
  14. use Getopt::Std;
  15. use File::Basename;
  16. use strict;
  17. use vars qw/ $opt_i $opt_o /;
  18. # Directory for output logs/csv files.
  19. my $LOGPATH= "D:\logs\whodo\";
  20. my $progname = basename($0);
  21. my $usage= "Usage: $progname -i input_path -o output_filen";
  22. getopts('i:o:') || die $usage;
  23. my @flist= get_input_files($opt_i);
  24. if ( scalar(@flist) < 1 ) {
  25. die "$progname: No files to process!";
  26. }
  27. my ($trafficref, $endtime, $duration)= get_traffic(@flist);
  28. if (! $opt_o) {
  29. ($_)= split(/ /, $endtime);
  30. my ($d,$m,$y) = split///;
  31. $opt_o= dirname($flist[0]) . "\" . sprintf "%d%02d%02d.csv",$y,$m,$d;
  32. }
  33. print_stats($trafficref, $endtime, $duration, $opt_o);
  34. unlink @flist;
  35. exit 0;
  36. sub get_input_files {
  37. # Returns a list of input files to be processed
  38. my($path)= @_;
  39. if (! $path) {
  40. my $t = time() - 24*60*60;
  41. my ($mday,$mon,$year) = ( localtime($t) )[3..5];
  42. $path= $LOGPATH . sprintf("%d%02d%02d-*.csv",$year+1900,$mon+1,$mday);
  43. }
  44. glob($path);
  45. }
  46. sub get_traffic {
  47. # Read the log files (specified in @_) & summarise into a hash
  48. my($fname, $lastf, $lasttime, $hr, $min, $sec, $duration, $src, $dst, $bytes, %traffic);
  49. foreach $fname (@_) {
  50. open(CSV, "< $fname") || warn "$progname: unable to open $fname; $!";
  51. # First line is a header giving end time
  52. $_= <CSV> || warn "$progname: $fname is emptyn";
  53. chomp;
  54. $_= (split/,/)[1];
  55. if ($fname gt $lastf) {
  56. $lastf= $fname;
  57. $lasttime= $_;
  58. }
  59. # Second line is a header giving period covered by this log
  60. $_= <CSV> || die "$progname: $fname lacks second header linen";
  61. chomp;
  62. $_= (split/,/)[1];
  63. ($hr, $min, $sec)= split/:/;
  64. $duration += $sec + 60 * ($min + 60*$hr);
  65. # The rest of the file has traffic for particular sources & destinations
  66. while (<CSV>) {
  67. ($src, $dst, $bytes)= split/,/;
  68. $traffic{$src}{$dst} += $bytes;
  69. }
  70. close(CSV);
  71. }
  72. return(%traffic, $lasttime, $duration);
  73. }
  74. sub print_stats {
  75. # Print out the traffictab in csv format
  76. use integer;
  77. my ($trafficref, $endtime, $duration, $fname)= @_;
  78. open (CSVFILE,">$fname") || die "$progname: Could not open file $fname; $!n";
  79. print CSVFILE "End Time:,$endtimen";
  80. my $sec= $duration % 60;
  81. $_= ($duration - $sec) / 60;
  82. my $min= $_ % 60;
  83. my $hr= ($_ - $min) / 60;
  84. print CSVFILE "Duration:,$hr:$min:$secn";
  85. foreach my $s (sort keys %$trafficref) {
  86. foreach my $d (sort keys %{$$trafficref{$s}}) {
  87. print CSVFILE "$s,$d,$$trafficref{$s}{$d}n";
  88. }
  89. }
  90. close(CSVFILE);
  91. }