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

SNMP编程

开发平台:

C/C++

  1. # xlsummary.pl
  2. #
  3. # Extract summary figures from the MRTG log files. In particular it summarises
  4. # all sites (i.e. as many as will fit on a page) into a single Excel chart.
  5. #
  6. # Args are:
  7. # h help
  8. # d,w,m do stats for last day, week or month
  9. # f directory containing mrtg log files
  10. #
  11. # v1.1 17/2/99 Tony Farr
  12. #
  13. use Getopt::Std;
  14. use File::Basename;
  15. use strict;
  16. my $progname = basename($0);
  17. my $usage = "Usage: $progname [-h] [-dwm] [-f path_of_logs]n";
  18. use vars qw/$opt_h $opt_d $opt_w $opt_m $opt_f/;
  19. getopts('hdwmf:') || die $usage;
  20. if ( defined($opt_h) ) {
  21. print $usage;
  22. exit(0);
  23. }
  24. if ( $opt_d + $opt_w + $opt_m != 1) {
  25. die $usage;
  26. }
  27. if ( $opt_f ) {
  28. chdir $opt_f || die "$progname: Unable to chdir to $opt_f; $!";
  29. }
  30. my ($start, $end) = &get_duration;
  31. my $fin= $ENV{"TMP"}."\$$.csv";
  32. write_csv($start, $end, $fin);
  33. my $fout = "$opt_f\" . basename($progname,".pl") . ".xls";
  34. graph_csv($start, $end, $fin, $fout);
  35. unlink($fin);
  36. exit(0);
  37. sub write_csv {
  38. my ($start, $end, $fname)= @_;
  39. # Process all the log files
  40. open(CSV, ">$fname");
  41. print CSV "Site, Maximum, Minimum, Halfwayn";
  42. foreach my $fname (sort glob("*.log")) {
  43. my ($t, $lastt, $sumt, $deltat, $max, $lastmax, $summax, $min, $lastmin, $summin);
  44. open(LOG, "<$fname") || die "$progname: Unable to open $fname; $!";
  45. <LOG>; # Skip the header line
  46. while (<LOG>) {
  47. chomp;
  48. ($t, $max, $min)= split/ /;
  49. if ($t < $start) { last }; # Log has latest first
  50. if ($t <= $end) {
  51. if ($lastmax) { # Zeroes mean the link was down.
  52. $deltat= $lastt - $t;
  53. $sumt += $deltat;
  54. $summax += $lastmax * $deltat;
  55. $summin += $lastmin * $deltat;
  56. }
  57. ($lastt, $lastmax, $lastmin)= ($t, $max, $min);
  58. }
  59. }
  60. # This is site specific. The devices we ping have names like SSSS-rtr
  61. # or SSSS-lan where SSSS is the site name. This strips off the "-rtr"
  62. # or "-lan" suffix.
  63. my $target= ucfirst( basename($fname, "-lan.log", "-rtr.log", ".log") );
  64. if ($sumt) {
  65. print CSV "$target, ". ($summax/$sumt) .", ". ($summin/$sumt) .", ". (($summax+$summin)/(2*$sumt)) ."n";
  66. }
  67. close(LOG);
  68. }
  69. close(CSV);
  70. }
  71. sub get_duration {
  72. # Returns the starttime & endtime to be reported on
  73. my($starttime, $endtime);
  74. my $t= time;
  75. my ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime($t);
  76. if ($opt_d) {
  77. $endtime= $t - ($sec + 60*$min + 60*60*$hour);
  78. $starttime= $endtime - 24*60*60;
  79. } elsif ($opt_w) {
  80. $endtime= $t - ($sec + 60*$min + 60*60*$hour + 24*60*60*$wday);
  81. $starttime= $endtime - 7*24*60*60;
  82. } else { # opt_m
  83. $endtime= $t - ($sec + 60*$min + 60*60*$hour + 24*60*60*($mday-1));
  84. $starttime= $endtime - days_in_month($mon - 1, $year)*24*60*60;
  85. }
  86. ($starttime, $endtime);
  87. }
  88. sub days_in_month {
  89. (31, $_[1] % 4 ? 28 : 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[${_[0]}];
  90. }
  91. sub graph_csv {
  92. use Win32::OLE::Const 'Microsoft Excel';
  93. use Win32::OLE::Const 'Microsoft Office';
  94. use POSIX;
  95. my ($start, $end, $fin, $fout)= @_;
  96. # use existing instance if Excel is already running
  97. my $xl;
  98. eval {$xl = Win32::OLE->GetActiveObject('Excel.Application')};
  99. die "$progname: Excel not installed" if $@;
  100. unless (defined $xl) {
  101. $xl = Win32::OLE->new('Excel.Application', sub {$_[0]->Quit;})
  102. || die "$progname: Cannot start Excel; $!";
  103. }
  104. # open the CSV
  105. my $book = $xl->Workbooks->Open($fin);
  106. # Sort data into descending order
  107. my $sheet = $book->Worksheets(1);
  108. my $a1 = $sheet->Cells(1, 1);
  109. my $range = $sheet->Range($a1, $a1->End(xlDown)->End(xlToRight));
  110. $range->Sort( {Key1 => $sheet->Range("D2"), Order1 => xlDescending} );
  111. # Put data into a chart. The most that can be sensibly squeezed in
  112. # is 52 sites. So select the slowest.
  113. $sheet->Range($a1, $sheet->Cells(53, 4))->Select;
  114. $book->Charts->Add;
  115. # And format it.
  116. my $chart= $book->ActiveChart;
  117. $chart->{'ChartType'} = xlStockHLC;
  118. $chart->{'HasLegend'} = msoFalse;
  119. $chart->{'HasTitle'} = msoTrue;
  120. # The description here fits ping response times.
  121. $chart->ChartTitle->Characters->{'Text'} =
  122. "Typical Maximum & Minimum Round Trip Times (msecs) between ".
  123. localtime($start) ." and ". localtime($end);
  124. $chart->PlotArea->Interior->{'ColorIndex'} = xlNone;
  125. $chart->ChartGroups(1)->HiLoLines->Border->{'Weight'} = xlMedium;
  126. $chart->PageSetup->{'LeftMargin'} = 5;
  127. $chart->PageSetup->{'RightMargin'} = 5;
  128. $chart->PageSetup->{'TopMargin'} = 5;
  129. $chart->PageSetup->{'BottomMargin'} = 10;
  130. $chart->PageSetup->{'Orientation'} = xlLandscape;
  131. $chart->Axes(xlCategory)->TickLabels->Font->{'Size'} = 8;
  132. $chart->Axes(xlValue)->TickLabels->Font->{'Size'} = 8;
  133. # save and exit
  134. $book->SaveAs($fout, xlWorkbookNormal);
  135. $book->Close;
  136. undef $xl;
  137. }