[mrtg] somewhat convenient script

Denis denisa at mtlfab.com
Fri Jul 26 16:31:00 MEST 2002

Hello, everyone.

I wrote a script (see below) that takes regular mrtg pages specified at 
the command line and groups them into four separate, somewhat condenced 
in layout, pages (by day, week, month, and year correspondingly). I find 
it convenient with it to monitor some devices for the current (usually 
daily) status. This script could be added as a cronjob and keep the info 
up to date along with the mrtg data.
Give me some feedback on this if you wish so.

Best regards,


# Description: -The script generates global html-formatted reports of 
the specified statistics files
#                  created by MRTG. By separating the information by 
day, week, month, and year it
#               allows to see all of the device statistics for a 
specific time frame. The output
#        pages are presented in a bit of a compressed format, which 
might be useful to
#        observe more stats on the same page. There's only one column of 
graphs across the
#        page. This script is for the purpose of simplification of html 
global report page
#        generation.
# Input:       -One or more filenames (i.e. <path>/page.html) of the 
html pages generated by the
#               standard MRTG for separate stats, followed by the output 
file name
#        (i.e. <path>/output_file) all separated by spaces at the 
command line
#        (see example of the command below). The output file extension 
is unnesessary
#        because an html extension is added to the given output file name.
#           -If you would like to specify a keyword that will be used in 
the titles and headings
#        of the generated pages, use - sign before it (i.e. -Traffic). 
If no keyword
#        specified, the output file name is being used for the title and 
heading of the out-
#         put html page. Keyword,    however has to be last in the 
command, i.e after the output
#        file name which is essentially required.
# Output:      -Four html-formatted pages (day, week, month, year) in 
the output location specified
#        with the name specified (i.e. 
<output_path>/output_file-[d|w|m|y].html>).                # 
NOTES:       -It is recommended to specify full path with both the input 
and the output files,
#        especially if this script is being used with [cron] for 
automatic updates. If no
#        path specified with the input files when using cron, cron won't 
know where those
#        files are and will generate an error. In case of no path 
specified with the output
#        file, cron will create an output file in the home directory of 
the executing user.

# Syntax:      perl <this_script_name.pl> <path>/file1.html ... 
#        > <path>/output_file [-Keyword]
# Example:     perl report.pl /usr/local/www/html/router1.html 
#        > -Ethernet_Traffic
# 07/17/02 - Denis Antipov


if($ARGV[$#ARGV] =~ /^-/){
   $keyword = pop @ARGV;
   $keyword =~ s/^-//;}
else{      $keyword = $ARGV[$#ARGV];
   $keyword =~ s/.*\///;    #trims off the possible path

#if only 1 input string thus without output file name
if($#ARGV lt 1){ die "Error: Did not provide output file!\a\n";}
else{$outfile = pop @ARGV;}

%content = 

foreach $item (keys %content){
   push @{$content{$item}}, "\n<meta HTTP-EQUIV=\"Refresh\" 
   "\n<meta HTTP-EQUIV=\"Pragma\" CONTENT=\"no-cache\">",
   "\n<meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; 

push @{$content{d}}, "Daily $keyword 
Report</title></head>\n<body>\n<font size=+1>Daily $keyword 
push @{$content{w}}, "Weekly $keyword 
Report</title></head>\n<body>\n<font size=+1>Weekly $keyword 
push @{$content{m}}, "Monthly $keyword 
Report</title></head>\n<body>\n<font size=+1>Monthly $keyword 
push @{$content{y}}, "Yearly $keyword 
Report</title></head>\n<body>\n<font size=+1>Yearly $keyword 

foreach $item (keys %content){    #this is a link to the main menu page, 
you can get rid of it if you don't have such page in the parent dir
   push @{$content{$item}}, "<a href=\"../index.html\"> -> Back to Main 

foreach $filename(@ARGV){
   #line flags
   $d=0, $w=0, $m=0, $y=0;
   open(IN, "<$filename");
   while($line = <IN>){
       if($line =~ m/<TITLE>.*/i){
          $line =~ s/<TITLE>/<b>/g;
          $line =~ s/<\/TITLE>/<\/b>/g;
          foreach $item (keys %content){
           push @{$content{$item}}, "\n$line", "<br>\n";}
       elsif($line =~ m/<!-- Begin `Daily' Graph.*/i){$d=1;}
       elsif($line =~ m/<!-- Begin `Weekly' Graph.*/i){$w=1;}
       elsif($line =~ m/<!-- Begin `Monthly' Graph.*/i){$m=1;}
       elsif($line =~ m/<!-- Begin `Yearly' Graph.*/i){$y=1;}
       elsif($line =~ m/<!-- End `Daily' Graph.*/i){$d=0;}
       elsif($line =~ m/<!-- End `Weekly' Graph.*/i){$w=0;}
       elsif($line =~ m/<!-- End `Monthly' Graph.*/i){$m=0;}
       elsif($line =~ m/<!-- End `Yearly' Graph.*/i){$y=0;}
       #skip the lines above the graph
       next if($line =~ /^<B>/ || $line=~ /^<BR>/ || $line=~/^<HR>/);

       if($d eq 1){push @{$content{d}}, $line;}
       elsif($w eq 1){push @{$content{w}}, $line;}
       elsif($m eq 1){push @{$content{m}}, $line;}
       elsif($y eq 1){push @{$content{y}}, $line;}

foreach $item (keys %content){
   push @{$content{$item}}, "\n<br><a href=\"../index.html\"> -> Main 

foreach $key (keys %content){
   open(OUT, ">$outfile-$key.html") or die "cannot open 
$outfile-$key.html file!";
   flock(OUT, 2);
   print OUT @{$content{$key}};
   flock(OUT, 8);

Unsubscribe mailto:mrtg-request at list.ee.ethz.ch?subject=unsubscribe
Archive     http://www.ee.ethz.ch/~slist/mrtg
FAQ         http://faq.mrtg.org    Homepage     http://www.mrtg.org
WebAdmin    http://www.ee.ethz.ch/~slist/lsg2.cgi

More information about the mrtg mailing list