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

SNMP编程

开发平台:

C/C++

  1. # pie.pl
  2. #
  3. # CGI script to generate a pie graph (GIF) showing WAN traffic broken down by
  4. # source or destination.
  5. # This script is currently invoked via CGI by analyse.pl
  6. #
  7. # Modification History
  8. ######################
  9. # v1.0    Oct 98 Tony Farr Original coding
  10. # v2.0 17 Nov 98 Tony Farr Change to CGI script. Split out analyse as separate script.
  11. # v2.1 23/12/98 Tony Farr Add description of period to top of graph
  12. ##############################################################################
  13. use strict;
  14. use File::Basename;
  15. use CGI;
  16. use CGI::Carp qw(fatalsToBrowser);
  17. use GIFgraph::pie;
  18. use GD;
  19. my ($period, $field, $str, $summarise);
  20. my $LOGPATH= "D:\logs\whodo"; # Directory where csv/logs are stored.
  21. my $q = new CGI;
  22. if ($q->param('src_duration')) { # Show sources
  23. $period= $q->param('src_duration');
  24. $str= $q->param('dest');
  25. $field= 1;
  26. } else { # Show destinations
  27. $period= $q->param('dest_duration');
  28. $str= $q->param('src');
  29. $field= 2;
  30. }
  31. $summarise= $q->param('summarise');
  32. my ($end, @flist)= get_input_files($period, $LOGPATH);
  33. my $trafficref= get_traffic($str, $summarise, $field, @flist);
  34. print $q->header('image/gif');
  35. make_graph($period, $end, $trafficref, "-");
  36. exit 0;
  37. sub get_input_files {
  38. # Returns a list of input files to be processed
  39. my($period, $path)= @_;
  40. my(@retvals, $fname, $lastfname, $start, $end);
  41. if ($period ne "30 minutes") {
  42. my($t,$mday,$mon,$year,$wday);
  43. $t= time();
  44. if ($period eq "day") {
  45. $t -= 24*60*60;
  46. ($mday,$mon,$year) = ( localtime($t) )[3..5];
  47. $end= $start= sprintf("%d%02d%02d",$year+1900,$mon+1,$mday);
  48. } elsif ($period eq "week") {
  49. $wday = (localtime($t))[6];
  50. $t -= ($wday+1)*24*60*60;
  51. ($mday,$mon,$year) = ( localtime($t) )[3..5];
  52. $end= sprintf("%d%02d%02d",$year+1900,$mon+1,$mday);
  53. $t -= 6*24*60*60;
  54. ($mday,$mon,$year) = ( localtime($t) )[3..5];
  55. $start= sprintf("%d%02d%02d",$year+1900,$mon+1,$mday);
  56. } elsif ($period eq "month") {
  57. $mday = (localtime($t))[3];
  58. $t -= $mday*24*60*60;
  59. ($mday,$mon,$year) = ( localtime($t) )[3..5];
  60. $end= sprintf("%d%02d%02d",$year+1900,$mon+1,$mday);
  61. $t -= (days_in_month($mon,$year+1900) - 1) * 24 * 60 * 60;
  62. ($mday,$mon,$year) = ( localtime($t) )[3..5];
  63. $start= sprintf("%d%02d%02d",$year+1900,$mon+1,$mday);
  64. } else {
  65. die "$0: Logic error; $!";
  66. }
  67. }
  68. while ( $fname = glob("$path/*.csv") ) {
  69. if ($period eq "30 minutes") {
  70. if ($fname gt $retvals[0]) {
  71. $retvals[0]= $fname;
  72. $lastfname= basename($fname);
  73. }
  74. } else {
  75. my $datepart= substr( basename($fname), 0, 8 );
  76. if ($datepart ge $start && $datepart le $end) {
  77. push(@retvals, $fname);
  78. if ($datepart gt $lastfname) {
  79. $lastfname= $datepart;
  80. }
  81. }
  82. }
  83. }
  84. if (length($lastfname) > 8) {
  85. $lastfname =~ s|^(dddd)(dd)(dd)-(dd)(dd).*|$4:$5 on $3/$2/$1|;
  86. } else {
  87. $lastfname =~ s|^(dddd)(dd)(dd).*|$3/$2/$1|;
  88. }
  89. ($lastfname, @retvals);
  90. }
  91. sub days_in_month {
  92. (31, $_[1] % 4 ? 28 : 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)[${_[0]}];
  93. }
  94. sub get_traffic {
  95. # Read the log files (specified in @flist) & summarise into a hash
  96. my($s, $summarise, $field, @flist)= @_;
  97. my($fname, $src, $dst, $bytes, $key, %traffic, $sum);
  98. foreach $fname (@flist) {
  99. open(CSV, "< $fname") || warn "$0: unable to open $fname; $!";
  100. <CSV>; # Logs start with a couple of header lines
  101. <CSV>;
  102. while (<CSV>) {
  103. ($src, $dst, $bytes)= split(/,/, $_);
  104. if ( $field == 1 ? $dst =~ $s : $src =~ $s ) {
  105. $key= ($field == 1) ? $src : $dst ;
  106. $traffic{$key} += $bytes;
  107. $sum+= $bytes;
  108. }
  109. }
  110. close(CSV);
  111. }
  112. if ( $summarise ) {
  113. my $significant= $sum * .025;
  114. foreach $s (keys %traffic) {
  115. if ( $traffic{$s} < $significant ) {
  116. $traffic{"Miscellaneous"} += $traffic{$s};
  117. delete $traffic{$s};
  118. }
  119. }
  120. }
  121. return %traffic;
  122. }
  123. sub make_graph {
  124. # Take a (reference to a) hash containing traffic stats & create a pie chart
  125. my($period, $end, $dataref, $fname)= @_;
  126. my @sources= sort( {uc($a) cmp uc($b)} keys(%$dataref) );
  127. my @traffic= map($$dataref{$_},@sources);
  128. my ($t, $sum);
  129. foreach $t (@traffic) {
  130. $sum+= $t;
  131. }
  132. for (my $i = 0; $i <= $#sources; $i++) {
  133. $t= int(100*$traffic[$i]/$sum + .5);
  134. $sources[$i]= $i+1 . ". $sources[$i] ($t%)";
  135. }
  136. my $my_graph = new GIFgraph::pie(500, 510 + $#sources*11);
  137. $my_graph->set( 'start_angle' => 180, '3d' => 0, 'title' => "For the $period ending $end" );
  138. $my_graph->set_text_clr("black");
  139. $my_graph->set_legend(@sources);
  140. $my_graph->set_legend_font(gdSmallFont);
  141. $my_graph->plot_to_gif( $fname, [[1..$#sources+1], @traffic] );
  142. }