mrtg-archiver
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:7k
- #!/usr/bin/perl
- #
- # MRTG Archiver by O.Krotoff
- #
- # Version 0.2
- #
- use strict;
- use Getopt::Long;
- use File::Copy;
- use POSIX qw(strftime);
- my @targets;
- my %titles;
- my $target;
- my $ArchiveDir = 'archive';
- my $WorkDir = 'mrtgdata';
- my $ConfigFile = 'mrtg.cfg';
- my ($subdir, $timedir, $archpath, $archindex, $suffix, $img_suffix);
- my ($archperiod);
- my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $week);
- my ($cur_target, $cur_date, $cur_group);
- my $DayPartRE = '^<B>`Daily'';
- my $WeekPartRE = '^<B>`Weekly'';
- my $MonthPartRE = '^<B>`Monthly'';
- my $YearPartRE = '^<B>`Yearly'';
- my $GroupRE = '^(d+.d+.d+.d+)'; # To group targets by router IP
- my $BackShift = 0;
- my ($DayFlag, $WeekFlag, $MonthFlag, $YearFlag);
- ($DayFlag, $WeekFlag, $MonthFlag, $YearFlag) = (0, 0, 0, 0);
- $img_suffix = 'png';
- GetOptions('d!' => $DayFlag,
- 'w!' => $WeekFlag,
- 'm!' => $MonthFlag,
- 'y!' => $YearFlag,
- 'conf=s' => $ConfigFile,
- 'arch=s' => $ArchiveDir,
- 'back=i' => $BackShift
- );
- $timedir = 'days' if $DayFlag;
- $timedir = 'weeks' if $WeekFlag;
- $timedir = 'months' if $MonthFlag;
- $timedir = 'years' if $YearFlag;
- $suffix = 'day' if $DayFlag;
- $suffix = 'week' if $WeekFlag;
- $suffix = 'month' if $MonthFlag;
- $suffix = 'year' if $YearFlag;
- $archperiod = 'Daily' if $DayFlag;
- $archperiod = 'Weekly' if $WeekFlag;
- $archperiod = 'Monthly' if $MonthFlag;
- $archperiod = 'Yearly' if $YearFlag;
- @targets = ();
- open(CFGFILE, $ConfigFile) || die "Can't open configuration file $ConfigFilen";
- while(<CFGFILE>) {
- if(/^WorkDir:s*(.*)s*$/) {
- $WorkDir = $1;
- } elsif(/^Target[(.*)]:/) {
- $cur_target = $1;
- push @targets, $cur_target;
- } elsif(/^Title[$cur_target]:s*(.*)s*$/) {
- $titles{$cur_target} = $1;
- }
- }
- ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) =
- localtime(time - $BackShift);
- $week = strftime("%W", $sec, $min, $hour, $mday, $mon, $year);
- $year += 1900;
- $mon += 1;
- # $week = int($yday / 7) + 1;
- if($DayFlag) {
- $subdir = sprintf "%4d-%02d-%02d", $year, $mon, $mday;
- $cur_date = sprintf "%02d/%02d/%4d", $mday, $mon, $year;
- } elsif($WeekFlag) {
- $subdir = sprintf "%4d-%02d", $year, $week;
- $cur_date = sprintf "%02d/%4d, week %2d", $mon, $year, $week;
- } elsif($MonthFlag) {
- $subdir = sprintf "%4d-%02d", $year, $mon;
- $cur_date = sprintf "%02d/%4d", $mon, $year;
- } elsif($YearFlag) {
- $subdir = sprintf "%4d", $year;
- $cur_date = $subdir;
- }
- $archpath = "$ArchiveDir/$timedir/$subdir";
- $archindex = "$ArchiveDir/$timedir/index.html";
- if(-f $archindex) {
- open(ARCHINDEX, "< $archindex") || die "Can't open $archindex !n";
- open(OUTARCHINDEX, "> $archindex.new") || die "Can't open $archindex.new !n";
- while(<ARCHINDEX>) {
- if(m{^<!-- Start -->}) {
- print OUTARCHINDEX $_;
- print OUTARCHINDEX "<li> <a href="$subdir/index.html">$cur_date</a> n";
- if($DayFlag && $mday == 1) {
- print OUTARCHINDEX "<li> <hr> n";
- }
- if($WeekFlag && $week == 1) {
- print OUTARCHINDEX "<li> <hr> n";
- }
- if($MonthFlag && $mon == 1) {
- print OUTARCHINDEX "<li> <hr> n";
- }
- } else {
- print OUTARCHINDEX $_;
- }
- }
- close(ARCHINDEX);
- close(OUTARCHINDEX);
- unlink($archindex);
- rename("$archindex.new", $archindex);
- } else {
- open(OUTARCHINDEX, "> $archindex") || die "Can't create $archindex !n";
- print OUTARCHINDEX <<ARCHINDSTOP;
- <html>
- <head>
- <title>MRTG Statistics $archperiod Archive</title>
- </head>
- <body bgcolor=white textcolor=black>
- <h1>MRTG Statistics $archperiod Archive</h1>
- <a href="../index.html">Back to archive index</a>
- <hr>
- <ul>
- <!-- Start -->
- <li> <a href="$subdir/index.html">$cur_date</a> <!-- First one -->
- </ul>
- <hr>
- MRTG Statistics Archiver by <a href="mailto:krot@tnsplus.kz">Krot</a>.
- </body>
- </html>
- ARCHINDSTOP
- }
- # print "Archive dir is: $archpath n";
- unless(-d $archpath) {
- mkdir($archpath, 0755)
- || die "Can't create archive dir! n";
- }
- open(INDEXFILE, "> $archpath/index.html") || die "Can't create index.html file!n";
- print INDEXFILE <<INDEXTOP;
- <html>
- <head>
- <title>MRTG Statistics Archive --- $cur_date</title>
- </head>
- <body bgcolor=white textcolor=black>
- <h2>MRTG Statistics Archive --- $cur_date</h2>
- <a href="/cgi-bin/mrtg/mrtgnav?prev">< Prev</a>
- <a href="/cgi-bin/mrtg/mrtgnav?index">Back to $archperiod archive index</a>
- <a href="/cgi-bin/mrtg/mrtgnav?next">Next ></a>
- <hr>
- <ul>
- INDEXTOP
- $cur_group = '';
- foreach $target (@targets) {
- if(open(HTMLFILE, "$WorkDir/$target.html")) {
- # print "Processing $target...n";
- if($GroupRE) {
- $target =~ /$GroupRE/;
- # $titles{$target} =~ /$GroupRE/;
- if($cur_group ne $1) {
- print INDEXFILE "</ul>" if $cur_group;
- $cur_group = $1;
- print INDEXFILE " <li>$cur_groupn <ul>n";
- }
- }
- print INDEXFILE " <li><a href=$target.html> $titles{$target} </a>n";
- copy("$WorkDir/$target-$suffix.$img_suffix", "$archpath/$target-$suffix.$img_suffix")
- || die "Failed to copy file $archpath/$target-$suffix.$img_suffix !n";
- open(OUTFILE, "> $archpath/$target.html")
- || die "Can't create archive file $archpath/$target.html !n";
- my $inHead = 0;
- my $inDayPart = 0;
- my $inWeekPart = 0;
- my $inMonthPart = 0;
- my $inYearPart = 0;
- my $inTail = 0;
- while(<HTMLFILE>) {
- chomp;
- if(/^<!DOCTYPE/) { $inHead = 2 }
- elsif(/^<HR/ && $inHead) {
- $inHead--;
- print OUTFILE <<NAVBLOCK if $inHead;
- <a href="/cgi-bin/mrtg/mrtgnav?prev">< Prev</a>
- <a href="/cgi-bin/mrtg/mrtgnav?index">Index</a>
- <a href="/cgi-bin/mrtg/mrtgnav?next">Next ></a>
- NAVBLOCK
- print OUTFILE "<HR>" unless $inHead;
- }
- elsif(/$DayPartRE/) { $inDayPart = 1 }
- elsif(/^<HR/ && $inDayPart) { $inDayPart = 0 }
- elsif(/$WeekPartRE/) { $inWeekPart = 1 }
- elsif(/^<HR/ && $inWeekPart) { $inWeekPart = 0 }
- elsif(/$MonthPartRE/) { $inMonthPart = 1 }
- elsif(/^<HR/ && $inMonthPart) { $inMonthPart = 0 }
- elsif(/$YearPartRE/) { $inYearPart = 1 }
- elsif(/<HR/ && $inYearPart) { $inYearPart = 0; $inTail = 1; }
- next if $inHead && (/^<META/ || /^<!--/);
- s{</[Hh](d)>}{ --- $cur_date</H$1>} if $inHead;
- s{SRC="(mrtg-[lmr])}{SRC="/mrtg-images/$1}g if $inTail;
- print OUTFILE $_."n" if ($inHead || ($inDayPart && $DayFlag) ||
- ($inWeekPart && $WeekFlag) ||
- ($inMonthPart && $MonthFlag) ||
- ($inYearPart && $YearFlag) ||
- $inTail);
- }
- close(OUTFILE);
- close(HTMLFILE);
- }
- }
- print INDEXFILE " </ul>" if $GroupRE;
- print INDEXFILE <<INDEXTAIL;
- </ul>
- <hr>
- MRTG Statistics Archiver by <a href="mailto:krot@tnsplus.kz">Krot</a>.
- </body>
- </html>
- INDEXTAIL