mrtg-archiver
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:7k
源码类别:

SNMP编程

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. #
  3. # MRTG Archiver by O.Krotoff
  4. #
  5. # Version 0.2
  6. #
  7. use strict;
  8. use Getopt::Long;
  9. use File::Copy;
  10. use POSIX qw(strftime);
  11. my @targets;
  12. my %titles;
  13. my $target;
  14. my $ArchiveDir = 'archive';
  15. my $WorkDir = 'mrtgdata';
  16. my $ConfigFile = 'mrtg.cfg';
  17. my ($subdir, $timedir, $archpath, $archindex, $suffix, $img_suffix);
  18. my ($archperiod);
  19. my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $week);
  20. my ($cur_target, $cur_date, $cur_group);
  21. my $DayPartRE   = '^<B>`Daily'';
  22. my $WeekPartRE  = '^<B>`Weekly'';
  23. my $MonthPartRE = '^<B>`Monthly'';
  24. my $YearPartRE  = '^<B>`Yearly'';
  25. my $GroupRE     = '^(d+.d+.d+.d+)'; # To group targets by router IP
  26. my $BackShift   = 0;
  27. my ($DayFlag, $WeekFlag, $MonthFlag, $YearFlag);
  28. ($DayFlag, $WeekFlag, $MonthFlag, $YearFlag) = (0, 0, 0, 0);
  29. $img_suffix = 'png';
  30. GetOptions('d!'        => $DayFlag,
  31.    'w!'        => $WeekFlag,
  32.    'm!'        => $MonthFlag,
  33.    'y!'        => $YearFlag,
  34.    'conf=s'    => $ConfigFile,
  35.    'arch=s'    => $ArchiveDir,
  36.    'back=i'    => $BackShift
  37.   );
  38. $timedir = 'days'   if $DayFlag;
  39. $timedir = 'weeks'  if $WeekFlag;
  40. $timedir = 'months' if $MonthFlag;
  41. $timedir = 'years'  if $YearFlag;
  42. $suffix = 'day'   if $DayFlag;
  43. $suffix = 'week'  if $WeekFlag;
  44. $suffix = 'month' if $MonthFlag;
  45. $suffix = 'year'  if $YearFlag;
  46. $archperiod = 'Daily'   if $DayFlag;
  47. $archperiod = 'Weekly'  if $WeekFlag;
  48. $archperiod = 'Monthly' if $MonthFlag;
  49. $archperiod = 'Yearly'  if $YearFlag;
  50. @targets = ();
  51. open(CFGFILE, $ConfigFile) || die "Can't open configuration file $ConfigFilen";
  52. while(<CFGFILE>) {
  53.   if(/^WorkDir:s*(.*)s*$/) {
  54.     $WorkDir = $1;
  55.   } elsif(/^Target[(.*)]:/) {
  56.     $cur_target = $1;
  57.     push @targets, $cur_target;
  58.   } elsif(/^Title[$cur_target]:s*(.*)s*$/) {
  59.     $titles{$cur_target} = $1;
  60.   }
  61. }
  62. ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) =
  63.   localtime(time - $BackShift);
  64. $week = strftime("%W", $sec, $min, $hour, $mday, $mon, $year);
  65. $year += 1900;
  66. $mon  += 1;
  67. # $week = int($yday / 7) + 1;
  68. if($DayFlag) {
  69.   $subdir = sprintf "%4d-%02d-%02d", $year, $mon, $mday;
  70.   $cur_date = sprintf "%02d/%02d/%4d", $mday, $mon, $year;
  71. } elsif($WeekFlag) {
  72.   $subdir = sprintf "%4d-%02d", $year, $week;
  73.   $cur_date = sprintf "%02d/%4d, week %2d", $mon, $year, $week;
  74. } elsif($MonthFlag) {
  75.   $subdir = sprintf "%4d-%02d", $year, $mon;
  76.   $cur_date = sprintf "%02d/%4d", $mon, $year;
  77. } elsif($YearFlag) {
  78.   $subdir = sprintf "%4d", $year;
  79.   $cur_date = $subdir;
  80. }
  81. $archpath = "$ArchiveDir/$timedir/$subdir";
  82. $archindex = "$ArchiveDir/$timedir/index.html";
  83. if(-f $archindex) {
  84.   open(ARCHINDEX, "< $archindex") || die "Can't open $archindex !n";
  85.   open(OUTARCHINDEX, "> $archindex.new") || die "Can't open $archindex.new !n";
  86.   while(<ARCHINDEX>) {
  87.     if(m{^<!-- Start -->}) {
  88.       print OUTARCHINDEX $_;
  89.       print OUTARCHINDEX "<li> <a href="$subdir/index.html">$cur_date</a> n";
  90.       if($DayFlag && $mday == 1) {
  91. print OUTARCHINDEX "<li> <hr> n";
  92.       }
  93.       if($WeekFlag && $week == 1) {
  94. print OUTARCHINDEX "<li> <hr> n";
  95.       }
  96.       if($MonthFlag && $mon == 1) {
  97. print OUTARCHINDEX "<li> <hr> n";
  98.       }
  99.     } else {
  100.       print OUTARCHINDEX $_;
  101.     }
  102.   }
  103.   close(ARCHINDEX);
  104.   close(OUTARCHINDEX);
  105.   unlink($archindex);
  106.   rename("$archindex.new", $archindex);
  107. } else {
  108.   open(OUTARCHINDEX, "> $archindex") || die "Can't create $archindex !n";
  109.   print OUTARCHINDEX <<ARCHINDSTOP;
  110. <html>
  111. <head>
  112. <title>MRTG Statistics $archperiod Archive</title>
  113. </head>
  114. <body bgcolor=white textcolor=black>
  115. <h1>MRTG Statistics $archperiod Archive</h1>
  116. <a href="../index.html">Back to archive index</a>
  117. <hr>
  118. <ul>
  119. <!-- Start -->
  120. <li> <a href="$subdir/index.html">$cur_date</a> <!-- First one -->
  121. </ul>
  122. <hr>
  123. MRTG Statistics Archiver by <a href="mailto:krot@tnsplus.kz">Krot</a>.
  124. </body>
  125. </html>
  126. ARCHINDSTOP
  127. }
  128. # print "Archive dir is: $archpath n";
  129. unless(-d $archpath) {
  130.   mkdir($archpath, 0755)
  131.     || die "Can't create archive dir! n";
  132. }
  133. open(INDEXFILE, "> $archpath/index.html") || die "Can't create index.html file!n";
  134. print INDEXFILE <<INDEXTOP;
  135. <html>
  136. <head>
  137. <title>MRTG Statistics Archive --- $cur_date</title>
  138. </head>
  139. <body bgcolor=white textcolor=black>
  140. <h2>MRTG Statistics Archive --- $cur_date</h2>
  141. <a href="/cgi-bin/mrtg/mrtgnav?prev">&lt; Prev</a>&nbsp;
  142. <a href="/cgi-bin/mrtg/mrtgnav?index">Back to $archperiod archive index</a>&nbsp;
  143. <a href="/cgi-bin/mrtg/mrtgnav?next">Next &gt;</a>
  144. <hr>
  145. <ul>
  146. INDEXTOP
  147. $cur_group = '';
  148. foreach $target (@targets) {
  149.   if(open(HTMLFILE, "$WorkDir/$target.html")) {
  150. #    print "Processing $target...n";
  151.     if($GroupRE) {
  152.        $target =~ /$GroupRE/;
  153. #      $titles{$target} =~ /$GroupRE/;
  154.       if($cur_group ne $1) {
  155. print INDEXFILE "</ul>" if $cur_group;
  156. $cur_group = $1;
  157. print INDEXFILE " <li>$cur_groupn <ul>n";
  158.       }
  159.     }
  160.     print INDEXFILE "  <li><a href=$target.html> $titles{$target} </a>n";
  161.     copy("$WorkDir/$target-$suffix.$img_suffix", "$archpath/$target-$suffix.$img_suffix") 
  162.       || die "Failed to copy file $archpath/$target-$suffix.$img_suffix !n";
  163.     open(OUTFILE, "> $archpath/$target.html")
  164.       || die "Can't create archive file $archpath/$target.html !n";
  165.     my $inHead = 0;
  166.     my $inDayPart   = 0;
  167.     my $inWeekPart  = 0;
  168.     my $inMonthPart = 0;
  169.     my $inYearPart  = 0;
  170.     my $inTail = 0;
  171.     while(<HTMLFILE>) {
  172.       chomp;
  173.       if(/^<!DOCTYPE/)            { $inHead = 2    }
  174.       elsif(/^<HR/ && $inHead)    {
  175. $inHead--;
  176. print OUTFILE <<NAVBLOCK if $inHead;
  177. <a href="/cgi-bin/mrtg/mrtgnav?prev">&lt; Prev</a>&nbsp;
  178. <a href="/cgi-bin/mrtg/mrtgnav?index">Index</a>&nbsp;
  179. <a href="/cgi-bin/mrtg/mrtgnav?next">Next &gt;</a>
  180. NAVBLOCK
  181. print OUTFILE "<HR>" unless $inHead;
  182.       }
  183.       elsif(/$DayPartRE/)          { $inDayPart = 1  }
  184.       elsif(/^<HR/ && $inDayPart) { $inDayPart = 0  }
  185.       elsif(/$WeekPartRE/)          { $inWeekPart = 1  }
  186.       elsif(/^<HR/ && $inWeekPart) { $inWeekPart = 0  }
  187.       elsif(/$MonthPartRE/)          { $inMonthPart = 1  }
  188.       elsif(/^<HR/ && $inMonthPart) { $inMonthPart = 0  }
  189.       elsif(/$YearPartRE/)           { $inYearPart = 1  }
  190.       elsif(/<HR/ && $inYearPart) { $inYearPart = 0; $inTail = 1;  }
  191.       next if $inHead && (/^<META/ || /^<!--/);
  192.       s{</[Hh](d)>}{ --- $cur_date</H$1>} if $inHead;
  193.       s{SRC="(mrtg-[lmr])}{SRC="/mrtg-images/$1}g if $inTail;
  194.       print OUTFILE $_."n" if ($inHead || ($inDayPart && $DayFlag) ||
  195. ($inWeekPart && $WeekFlag) ||
  196. ($inMonthPart && $MonthFlag) ||
  197. ($inYearPart && $YearFlag) ||
  198. $inTail);
  199.     }
  200.     close(OUTFILE);
  201.     close(HTMLFILE);
  202.   }
  203. }
  204. print INDEXFILE " </ul>" if $GroupRE;
  205. print INDEXFILE <<INDEXTAIL;
  206. </ul>
  207. <hr>
  208. MRTG Statistics Archiver by <a href="mailto:krot@tnsplus.kz">Krot</a>.
  209. </body>
  210. </html>
  211. INDEXTAIL