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

SNMP编程

开发平台:

C/C++

  1. #! /usr/bin/perl -w
  2. # -*- mode: Perl -*-
  3. ##################################################################
  4. # MRTG 2.13.2  --- Index Generator
  5. ##################################################################
  6. #
  7. # This reads a mrtg.cfg file form std input or cmdline argument
  8. # and it takes a regexp on the cmdline to specify which 
  9. # targets to look at.
  10. #
  11. # from this info it produces a router index on stdout or
  12. # on the filename specified by the --output option
  13. #
  14. ##################################################################
  15. # Distributed under the GNU General Public License
  16. # Copyright 2000 by Tobias Oetiker <tobi@oetiker.ch>
  17. ##################################################################
  18. $main::GRAPHFMT="png";
  19. require 5.005;
  20. use strict;
  21. # DEBUG TARGETS
  22. # base - basic program flow
  23. #@main::DEBUG=qw(base);
  24. BEGIN {
  25.     # Automatic OS detection ... do NOT touch
  26.     if ( $^O =~ /^(?:(ms)?(dos|win(32|nt)?))/i ) {
  27.         $main::OS = 'NT';
  28.         $main::SL = '\';
  29.         $main::PS = ';';
  30.     } elsif ( $^O =~ /^NetWare$/i ) {
  31.         $main::OS = 'NW';
  32.         $main::SL = '/';
  33.         $main::PS = ';';
  34.     } elsif ( $^O =~ /^VMS$/i ) {
  35.         $main::OS = 'VMS';
  36.         $main::SL = '.';
  37.         $main::PS = ':';
  38.     } else {
  39.         $main::OS = 'UNIX';
  40.         $main::SL = '/';
  41.         $main::PS = ':';
  42.     }
  43. }
  44. use FindBin;
  45. use lib "${FindBin::Bin}";
  46. use lib "${FindBin::Bin}${main::SL}..${main::SL}lib${main::SL}mrtg2";
  47. use MRTG_lib "2.100015";
  48. use Getopt::Long;
  49. use Pod::Usage;
  50. my @argv = @ARGV;
  51. my $argz = "$0";
  52. foreach my $ar (@argv) {
  53.    if ($ar =~ /[ |()]/ ) {
  54.       $ar = sprintf ""%s"", $ar;
  55.    }
  56.    $argz .= " $ar";
  57. }
  58. main();
  59. exit 0;
  60. sub main {
  61.     # default options
  62.     my %opt = (
  63.        sort => 'original',
  64.        show => 'day',
  65.        section => 'h1',
  66.        columns => 2,
  67.        addhead => '',
  68.        bodyopt => 'bgcolor="#ffffff" text="#000000" '.
  69.                   'link="#000000" vlink="#000000" alink="#000000"',
  70.        title => 'MRTG Index Page',
  71.        headlevel => 1,
  72.        pagetopend => '',
  73.        pagetop => '',
  74.        pageend => '',
  75.        prefix => '',
  76.        rrdviewer => '/cgi-bin/14all.cgi',
  77.        optlog => 1,
  78.        bold => 1,
  79.        boldon => '<B>',
  80.        boldoff => '</B>',
  81.        div => 'DIV',
  82.        imgborder => 1,
  83.        cellspacing => 10,
  84.        nolegend => 0,
  85.       );
  86.     $opt{headon} = "<H$opt{headlevel}>";
  87.     $opt{headoff} = "</H$opt{headlevel}>";
  88.     # load real options
  89.     options(%opt);
  90.     #adapt some defaults to the current options
  91.     die "ERROR: --autoprefix requires --output"
  92.       if ($opt{autoprefix} and !defined $opt{output});
  93.     $opt{pageend} = $opt{pagetopend} if (defined $opt{pagetopend} and not $opt{pageend});
  94.     $opt{pagetop} = $opt{pagetopend} if (defined $opt{pagetopend} and not $opt{pagetop});
  95.     $opt{boldon} = $opt{boldoff} = "" if (!$opt{bold});
  96.     $opt{picfirst} = (defined $opt{picfirst}?1:0);
  97.     if ($opt{compact}) {
  98.         $opt{imgborder} = 0;
  99.         $opt{cellspacing} = 0;
  100.         $opt{headon} = $opt{boldon};
  101.         $opt{headoff} = $opt{boldoff};
  102.     }
  103. if ($opt{sidebyside}) {
  104. $opt{div} = 'td';
  105. }
  106.     # slurp config files
  107.     my %rcfg;
  108.     my %cfg;
  109.     my @target;
  110.     my @routers;
  111.     my $cfgfile;
  112.     my %files;
  113.     while (@ARGV) {
  114.            $cfgfile = shift @ARGV;
  115.     readcfg($cfgfile,@routers,%cfg,%rcfg);
  116.     if (($opt{sectionhost}) or ($opt{perhost})) {
  117.      #We need to cache the "hostname" as appeared in cfgfile,
  118.      #since it does change in cfgcheck (for ex. if multiple 
  119.      #overlapping cfgfiles are specified)
  120.      for my $targ (@routers) {
  121.      if ( !defined $rcfg{host}{$targ} and
  122.       !($rcfg{target}{$targ} =~ m/(?<!\)[ `]/) ) {
  123.      $rcfg{target}{$targ} =~ m/.*[^\]@([^:]*)/;
  124.      $rcfg{host}{$targ} = ucfirst $1 if (defined $1);
  125.      }
  126.      }
  127.     }
  128.     cfgcheck(@routers, %cfg, %rcfg, @target);
  129.            for my $targ (@routers) {
  130.                if (! defined $files{$targ}) {
  131.                     $files{$targ}=substr($cfgfile,rindex($cfgfile,'/')+1);
  132.                }
  133.            }
  134.     if ($opt{autoprefix}) {
  135.     $rcfg{prefixes} = {} if (!defined $rcfg{prefixes});
  136.         my $pref = subpath($cfg{htmldir},$opt{output});
  137.     for my $targ (@routers) {
  138.         $rcfg{prefixes}->{$targ} = $pref
  139.           if (! defined $rcfg{prefixes}->{$targ});
  140.     }
  141. }
  142.     }
  143.     # generate index page
  144.     genindex(@routers, %cfg, %rcfg, %opt, %files);
  145. }
  146. sub cleanurl ($) {
  147.     my $url = shift;    
  148.     $url =~ s|([^/.][^/.]*/)../1|$1|g;
  149.     return $url;
  150. }
  151. #Take a path the mrtg (usually the mrtg output directory) and the overview
  152. #file, find the relative path from the overview to the directory
  153. sub subpath ($$) {
  154. my $sub = shift;
  155. my $out = shift;
  156. my @s=split /$main::SL/,$sub;
  157. my @o=split /$main::SL/,$out;
  158. pop @o; #Last is a filename;
  159. for my $i (0..$#s) { #cut common dirs
  160. if (defined $s[0] and
  161.     defined $o[0] and
  162.     $s[0] eq $o[0] ) {
  163.      shift @s;
  164.      shift @o;
  165. }
  166. }
  167. my $ret = join $main::SL,@s;
  168. for my $i (0..$#o) {
  169. $ret = "..$main::SL$ret"; # ".." == "Directory below this one" for
  170. # dos, windows, unix. What about VMS ?
  171. # Is this correct ? HEH
  172. }
  173. $ret .= $main::SL; #Possibly this should be "/" in order not
  174. #to break on platforms !unix, since it will be
  175. #used for generating urls ?
  176. #Don't degenerate in "/" when really no prefix is needed.
  177. $ret = "" if ($ret eq $main::SL);
  178. return $ret;
  179. }
  180. sub genindex ($$$$) {
  181.     my $routers = shift;
  182.     my $cfg = shift;
  183.     my $rcfg = shift;
  184.     my $opt = shift;
  185.     my $cfgfile = shift;
  186.     my $index;
  187.     my $metaCmdLine;
  188.     # -----------------------------------------------------------
  189.     # keep only the items our users want (--filter)
  190.     # -----------------------------------------------------------
  191.     my @filtered;
  192.     ITEM: foreach my $item (@{$routers}) {
  193. foreach my $filter (@{$$opt{filter}}) {
  194.     if ($filter =~ /(.+)([=!]~)(.+)/) {
  195. my ($area,$comp,$regex) = ($1,$2,$3);
  196. my $value;
  197.         for ($area) {
  198.     /^title|pagetop$/ && 
  199.       do { $value = $$rcfg{$area}{$item}; last };
  200.     /^name$/ && 
  201.       do { $value = $item; last };
  202.     die "ERROR: unknown filter area $_n";
  203. };
  204. for ($comp) {
  205.     /^=~$/ &&
  206.       do { next ITEM unless $value =~ /$regex/; last };
  207.     /^!~$/ &&
  208.       do { next ITEM unless $value !~ /$regex/; last };
  209.     die "ERROR: unknown comparison operator $_n";
  210. };
  211.     } else {
  212. die "ERROR: invalid filter expression $filtern";
  213.     }
  214. }
  215. push @filtered, $item;
  216.     };
  217.     # -----------------------------------------------------------
  218.     # get items into proper order (--sort)
  219.     # -----------------------------------------------------------
  220.     my @order;
  221.     for ($$opt{sort}) {
  222. /^original$/ && do {@order = @filtered; last};
  223. /^name$/ &&  do { @order = sort @filtered; last};
  224. /^title$/ && do { @order =
  225.     sort { $$rcfg{title}{$a} cmp $$rcfg{title}{$b} || $a cmp $b }
  226.       @filtered;
  227.   last;
  228.       };
  229. /^descr(iption)?$/ &&
  230.     do {
  231.       @order =
  232.         sort {
  233.   $$rcfg{pagetop}{$a} =~ 
  234.            m[<td>Description:</td>s*<td>(?:S+s+)?(.+?)</td>]i;
  235.   my $aval = lc $1;
  236.   $$rcfg{pagetop}{$b} =~ 
  237.            m[<td>Description:</td>s*<td>(?:S+s+)?(.+?)</td>]i;
  238.   my $bval = lc $1;
  239.   $aval cmp $bval;
  240.         } @filtered;
  241.   last;
  242.       };
  243. die "ERROR: unknown sort order '$$opt{sort}'n";
  244.     }
  245.     # -----------------------------------------------------------
  246.     # issue page top
  247.     # -----------------------------------------------------------
  248.     my $interval =$$cfg{'interval'} ? $$cfg{'interval'} : 5;
  249.     my $expiration = &expistr($interval);
  250.     my $refresh =  $$cfg{'refresh'} ? $$cfg{'refresh'} : 300;
  251.     for ($$opt{show}) {
  252.        $refresh = /^week$/     && 1800
  253.                || /^month$/    && 7200
  254.                || /^year$/     && 86400
  255.                || $refresh ;
  256.     }
  257.     my $gifPath = '';
  258.     if ($$cfg{icondir} || $$opt{icondir}) {
  259.        $gifPath = $$opt{icondir} || $$cfg{icondir};
  260.        #lets make sure there is a trailing path separator
  261.      $gifPath =~ s|/*$|/|;
  262.    } else {
  263.        $gifPath = "$$cfg{imagehtml}";
  264.    }
  265. if ($$opt{optlog}) {
  266.     $metaCmdLine = $argz;
  267. } else {
  268.     $metaCmdLine = "<suppressed>";
  269. }
  270. $metaCmdLine =~ s/&/&amp;/g;   # Must be first, otherwise it will affect the following changes
  271. $metaCmdLine =~ s/"/&quot;/g;
  272. $metaCmdLine =~ s/</&lt;/g;
  273. $metaCmdLine =~ s/>/&gt;/g;
  274.     my $headeradd = $$opt{headeradd} || "";
  275.     $index = <<ECHO;
  276. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  277. <HTML>
  278. <HEAD>
  279.     <TITLE>$$opt{title}</TITLE>
  280.     <!-- Command line is easier to read using "View Page Properties" of your browser -->
  281.     <!-- But not all browsers show that information. :-(                             -->
  282.     <META NAME="Command-Line" CONTENT="$metaCmdLine">
  283.     <META HTTP-EQUIV="Refresh" CONTENT="$refresh">
  284.     <META HTTP-EQUIV="Cache-Control" content="no-cache">
  285.     <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
  286.     <META HTTP-EQUIV="Expires" CONTENT="$expiration">
  287.     <LINK HREF="${gifPath}favicon.ico" rel="shortcut icon" />
  288.     $headeradd
  289. ECHO
  290.     $index .= <<ECHO if ($$opt{addhead});
  291.     $$opt{addhead}
  292. ECHO
  293.     $index .= <<ECHO if ($$opt{optlog});
  294. <style type="text/css">
  295. <!--
  296. /* commandline was: $argz */
  297. /* sorry, no style, just abusing this to place the commandline and pass validation */
  298. -->
  299. </style>
  300. ECHO
  301.     $index .= <<ECHO;
  302. </HEAD>
  303. <BODY $$opt{bodyopt}>
  304. ECHO
  305.     $index .= <<ECHO;
  306. $$opt{pagetop}
  307. $$opt{headon}$$opt{title}$$opt{headoff}
  308. ECHO
  309.     $index .= <<ECHO if $$opt{subtitle};
  310. <p>$$opt{subtitle}</p>
  311. ECHO
  312.     
  313.     $index .= <<ECHO;
  314. <TABLE BORDER=0 CELLPADDING=0 CELLSPACING=$$opt{cellspacing}>
  315. <tr>
  316. ECHO
  317.     # -----------------------------------------------------------
  318.     # print the graph items
  319.     # -----------------------------------------------------------
  320.     my $itemnr = 0;
  321.     my $first = $order[0];
  322.     my $host = $$rcfg{host}{$first} || '';
  323.     
  324.     $index .= "<a NAME="$host"></a><tr><td>$$opt{headon}Interfaces of $host $$opt{headoff}</td></tr>" if $$opt{perhost};
  325.     foreach my $item (@order) {
  326. if ($$opt{perhost}) {
  327. my $newhost = $$rcfg{host}{$item};
  328. if (!($host eq $newhost)) {
  329. $host = $newhost;
  330.         $index .= "<tr><td>$$opt{headon}Interfaces of $host $$opt{headoff}</td></tr>n";
  331. $index .= "<tr>n";
  332. $itemnr=0;
  333. }
  334. }
  335.     $$opt{prefix} = $$rcfg{prefixes}->{$item} if ($$opt{autoprefix});
  336. $itemnr++;
  337. $index .= "<td>";
  338.         my $dirrel = "../" x ($$rcfg{'directory_web'}{$item} =~ tr|/|/|);
  339. # --- produce graph section title ---
  340. my $section;
  341. for ($$opt{section}) {
  342.     /^h1$/ &&
  343.       do{
  344.   if ($$rcfg{pagetop}{$item} =~ m[<h1[^>+]*>(.+?)</h1]i) {
  345.       $section = $1;
  346.       last;
  347.   } else {
  348.       die "ERROR: no H1 line pagetop property in $item sectionn";
  349.   }
  350.       };
  351.     /^title$/ &&
  352.       do{
  353.   $section = $$rcfg{title}{$item}; last
  354.       };
  355.     /^name$/ &&
  356.       do{
  357.   $section = $item; last
  358.       };
  359.             /^descr(iption)?$/ &&
  360.               do{
  361.                   $section = "No Description for $item";
  362.   $$rcfg{setenv}{$item} =~ /MRTG_INT_DESCR="(.*?)"/  #"
  363.                         and $section = $1;
  364.                   $$rcfg{pagetop}{$item} =~ 
  365.               m,<td>Description:</td>s*<td>Q$sectionEs*(.*?)</td>,i
  366.                         and $section = $1;
  367.                   last;
  368.               };
  369.              /^portname$/ && 
  370.                do{
  371.                  $section = "No Portname for $item";
  372.                  $$rcfg{pagetop}{$item} =~ m,<td>Port Name:</td>s*<td>(.*?)</td>,i
  373.                       and  $section = $1;
  374.                  last;
  375.                };
  376.             die "ERROR: unknown sectioning type $_n";
  377. };
  378. if (defined $$rcfg{host}{$item} and
  379. !($section =~ m/bQ$$rcfg{host}{$item}Eb/i)) {
  380. $section = ucfirst $$rcfg{host}{$item} . ": $section";
  381. }
  382. # --- write the actual graph ----
  383. die "ERROR: Unknown show type $$opt{show}n"
  384.   unless $$opt{show} =~ /^day|week|month|year|none$/;
  385. my $image = "$item-$$opt{show}.${main::GRAPHFMT}"
  386.  if $$opt{show} ne 'none';
  387. $index .= "<$$opt{div}>" if (!$$opt{sidebyside});
  388.     if (not $image) {
  389.            if ($$cfg{logformat} eq 'rrdtool') {
  390.                 my $sep = $$opt{rrdviewer} =~ /?/ ? '&' : '?'; 
  391.                 $index .= 
  392.                "<A HREF="$$opt{rrdviewer}".$sep."log=$item&cfg=$$cfgfile{$item}">".
  393.                        "$$opt{boldon}".
  394.                      "$section$$opt{boldoff}</A>";
  395.             } else {
  396.                $index .= "$$opt{boldon}".
  397.              "<A HREF="".cleanurl($$opt{prefix}.
  398.         $$rcfg{directory_web}{$item}).$item.
  399.         ".$$rcfg{extension}{$item}">".
  400.         "$section$$opt{boldoff}</A></$$opt{div}>n<$$opt{div}>";
  401.     }
  402. } else {
  403. #loop used for reversing (text,images) to (images,text) if req.
  404. for my $picfirstloop (1,0) {
  405. if ( $picfirstloop^$$opt{picfirst} ) {
  406. $index .= "$$opt{boldon}$itemnr. $$opt{boldoff}"
  407.      if $$opt{enumerate};
  408.     if ($$opt{clicktext}) {
  409.         $index .= "$$opt{boldon}<A HREF="".cleanurl($$opt{prefix}.
  410.   $$rcfg{directory_web}{$item}).$item.
  411.   ".$$rcfg{extension}{$item}">";
  412. $index .= $section;
  413. $index .= "</A>$$opt{boldoff}";
  414.     } else {
  415.      $index .= "$$opt{boldon}$section$$opt{boldoff}";
  416.     }
  417.           $index .= "</$$opt{div}>n<$$opt{div}>" if $picfirstloop;
  418.     }
  419.     
  420.     if ( !($picfirstloop^$$opt{picfirst}) ) {
  421.      # figure show name for rrd viewer
  422.     if ($$cfg{logformat} eq 'rrdtool') {
  423.                my $sep = $$opt{rrdviewer} =~ /?/ ? '&' : '?'; 
  424.                $index .= "<A HREF="$$opt{rrdviewer}".$sep."log=$item&cfg=$$cfgfile{$item}">".
  425.                           "<IMG BORDER=$$opt{imgborder} ALT="$item Traffic Graph" ".
  426.  "SRC="$$opt{rrdviewer}".$sep."log=$item&cfg=$$cfgfile{$item}&png=$$opt{show}.".
  427.   "s&small=1"></A>"
  428.     } else {
  429. $index .= "<A HREF="".cleanurl($$opt{prefix}.
  430.   $$rcfg{directory_web}{$item}).$item.
  431.   ".$$rcfg{extension}{$item}">";
  432.          $index .= "<IMG BORDER=$$opt{imgborder} ALT="$item Traffic Graph" ".
  433.   "SRC="".cleanurl($$opt{prefix}.
  434.   $$rcfg{directory_web}{$item}.$dirrel.
  435.   $$cfg{imagehtml}.$$rcfg{directory_web}{$item}).
  436.   "$image"";
  437. $index .= ' WIDTH="'.$$opt{width}.'"' 
  438.                       if defined $$opt{width};
  439. $index .= ' HEIGHT="'.$$opt{height}.'"'
  440.       if defined $$opt{height};
  441. $index .= "></A>";
  442. $index .= "<BR>"
  443.       if ( ! defined $$opt{compact} );
  444. $index .= "n<SMALL><!--#flastmod file="".
  445.   cleanurl($$opt{prefix}.$$rcfg{directory_web}{$item}).$item.
  446.   ".$$rcfg{extension}{$item}" --></SMALL>";
  447.     }
  448.     $index .= "</$$opt{div}>n<$$opt{div}>" if $picfirstloop;
  449. }
  450. }
  451. }
  452. $index .= "</$$opt{div}>" if (!$$opt{sidebyside});
  453. $index .= "n</td>";
  454. # --- new table column if necessary ----
  455. if (($itemnr) % $$opt{columns} == 0) {
  456.     $index .= "</tr>n<tr>n";
  457. }
  458.     }
  459.     # -----------------------------------------------------------
  460.     # print page end
  461.     # -----------------------------------------------------------
  462.     my $VERSION = "2.13.2";
  463.     $index .= <<ECHO;
  464. <td></td>
  465. </tr>
  466. </TABLE>
  467. ECHO
  468.    $index .= <<ECHO if (defined $$opt{pageend});
  469. $$opt{pageend}
  470. ECHO
  471.    $index .= <<ECHO if (!$$opt{nolegend});
  472. <BR>
  473. <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
  474.   <TR>
  475.     <TD WIDTH=63><A
  476.     HREF="http://www.ee.ethz.ch/~oetiker/webtools/mrtg/"><IMG
  477.     BORDER=0 SRC="${gifPath}mrtg-l.${main::GRAPHFMT}" WIDTH=63 HEIGHT=25 ALT="MRTG"></A></TD>
  478.     <TD WIDTH=25><A
  479.     HREF="http://www.ee.ethz.ch/~oetiker/webtools/mrtg/"><IMG
  480.     BORDER=0 SRC="${gifPath}mrtg-m.${main::GRAPHFMT}" WIDTH=25 HEIGHT=25 ALT=""></A></TD>
  481.     <TD WIDTH=388><A
  482.     HREF="http://www.ee.ethz.ch/~oetiker/webtools/mrtg/"><IMG
  483.     BORDER=0 SRC="${gifPath}mrtg-r.${main::GRAPHFMT}" WIDTH=388 HEIGHT=25
  484.     ALT="Multi Router Traffic Grapher"></A></TD>
  485.   </TR>
  486. </TABLE>
  487. <TABLE BORDER=0 CELLSPACING=0 CELLPADDING=0>
  488.   <TR VALIGN=top>
  489.   <TD WIDTH=88 ALIGN=RIGHT><FONT FACE="Arial,Helvetica" SIZE=2>
  490.   version $VERSION</FONT></TD>
  491.   <TD WIDTH=388 ALIGN=RIGHT><FONT FACE="Arial,Helvetica" SIZE=2>
  492.   <A HREF="http://www.ee.ethz.ch/~oetiker/">Tobias Oetiker</A>
  493.   <A HREF="mailto:oetiker@ee.ethz.ch">&lt;oetiker@ee.ethz.ch&gt;</A>
  494.   and&nbsp;<A HREF="http://www.bungi.com/">Dave&nbsp;Rand</A>&nbsp;<A HREF="mailto:dlr@bungi.com">&lt;dlr@bungi.com&gt;</A></FONT>
  495.   </TD>
  496. </TR>
  497. </TABLE>
  498. ECHO
  499.    $index .= <<ECHO;
  500. </BODY>
  501. </HTML>
  502. ECHO
  503.     # -----------------------------------------------------------
  504.     # write out the index page
  505.     # -----------------------------------------------------------
  506.     if ($$opt{output}) {
  507. debug ('base', "Writing $$opt{output}");
  508. open X, ">$$opt{output}" or die "ERROR: creating $$opt{output}: $!n";
  509. print X $index;
  510. close X;
  511.     } else {
  512. print $index;
  513.     }
  514. }
  515. sub options ($) {
  516.     my $opt = shift;
  517.     my @options = (
  518.        'help|?',
  519.        'man',
  520.        'output=s',
  521.        'filter=s@',
  522.            'addhead=s',
  523.        'title=s',
  524.            'subtitle=s',        
  525.        'bodyopt=s',
  526.        'pagetopend=s',
  527.        'pagetop=s',
  528.        'pageend=s',
  529.        'columns=i',
  530.        'perhost!',
  531.        'sort=s',
  532.        'enumerate',
  533.        'width=i',
  534.        'height=i',
  535.        'show=s',
  536.        'section=s',
  537.            'version',
  538.        'prefix=s',
  539.                'headeradd=s',
  540.        'clicktext!',
  541.        'optlog!',
  542.        'compact!',
  543.        'headlevel=i',
  544.        'bold!',
  545.        'picfirst!',
  546.        'sidebyside!',
  547.        'nolegend',
  548.        'autoprefix!',
  549.        'sectionhost!',
  550.            'icondir=s',
  551.        'rrdviewer=s');
  552. #generate --option-file from --option
  553. for ( grep /=s$/,@options ) {
  554. my $fileopt = $_;
  555. $fileopt =~ s/=s$/-file=s/;
  556. push @options, $fileopt;
  557. }
  558.     GetOptions( $opt, @options ) or pod2usage(-verbose => 1);
  559.     
  560.     if ($$opt{prefix}){
  561. $$opt{prefix} .= '/';
  562. $$opt{prefix} =~ s|/+$|/|;
  563.     }
  564.     die ("Indexmaker for mrtg-2.13.2n") if $$opt{version};
  565.     pod2usage(-exitval => 1, -verbose => 2) if $$opt{man};
  566.     pod2usage(-verbose => 1) if not @ARGV;
  567.     
  568.     #take care of --fileoption --> --option
  569.     for my $fileopt ( grep /-file$/, keys %{$opt} ) {
  570.      my $orgopt = $fileopt;
  571.      $orgopt =~ s/-file$//;
  572.      $$opt{$orgopt} = &readfile($$opt{$fileopt});
  573.     }
  574. }
  575. #return the contents of a file
  576. sub readfile($) {
  577. my $file = shift;
  578. open F,"<$file" or die "ERROR: can't open $file for read, $!";
  579. my $sl = $/;
  580. $/ = undef;
  581. my $string = <F>;
  582. $/ = $sl;
  583. close F;
  584. return $string;
  585. }
  586. __END__
  587. =pod
  588. =head1 NAME
  589. indexmaker - Creates index files for mrtg web sites (mrtg-2.13.2)
  590. =head1 SYNOPSIS
  591. indexmaker [options] mrtg.cfg [other.cfg ...]
  592. =head1 OPTIONS
  593.  --output=filename   set output filename (default: stdout)
  594.  --filter title=~regexp  select targets by matching regexp against titles
  595.  --filter pagetop=~regexp  select targets by matching regexp against pagetop
  596.  --filter name=~regexp  select targets by matchin regexp against name
  597.  --addhead=text      insert this text between </TITLE> and </HEAD>
  598.  --title=text        set title of generated index file
  599.  --subtitle=text     add a subtitle to the generated index file
  600.  --bodyopt=text      set body tag options
  601.  --headlevel=number  use <Hnumber> at top of page (default: 1)
  602.  --pagetop=text      insert this text between <BODY> and <H1>...</H1>
  603.  --pageend=text      insert this text after the main body
  604.  --pagetopend=text   use this text for pagetop or pageend if undefined
  605.  --nolegend          do not add the Mrtg legend at the end of the page
  606.  --columns=number    show graphs in a table with x columns (default: 2)
  607.  --perhost           show graphs of the same host on a row
  608.  --compact           try to make a vertically more compact page
  609.  --optlog            log the used command line in the page (default: log)
  610.  --sort=title        sort graphs by title
  611.  --sort=name         sort graphs by their name
  612.  --sort=descr        sort graphs by their description
  613.  --sort=original     leave as is (default)
  614.  --enumerate         add a sequence number to the title of each graph
  615.  --picfirst          place pictures before text (default: text first)
  616.  --width=number      set width of graphs (default: not set)
  617.  --height=number
  618.  --sidebyside        place text / pictures side by side (default: above/below)
  619.  --bold              use bold text (default: bold)
  620.  --clicktext         make the text link to the inner page (like the image)
  621.  --show=day          pick which graph to show in the index (default)
  622.  --show=week
  623.  --show=month
  624.  --show=year
  625.  --show=none
  626.  --section=h1        h1 tag from pagetop as section heading (default)
  627.  --section=title     title as section headings for graphs
  628.  --section=name      graph name as section heading
  629.  --section=descr     graph description as section heading
  630.  --section=portname  port name entry in pagetop as section heading
  631.  --sectionhost       Try to prepend the host to the section heading if missing
  632.  --rrdviewer=path    path to rrdviewer (default: /cgi-bin/14all.cgi)
  633.  --icondir=path      path to icondir
  634.  --prefix=path       path from the location of the index.html to the graphs
  635.  --headeradd=string  add string to the html page header
  636.  --autoprefix        try to set prefix automatically
  637.  
  638.  --<opt>-file=file   read string argument for option <opt> from file
  639. =head1 DESCRIPTION
  640. B<Indexmaker> can create web pages which display the status of an
  641. array of mrtg interface status pages.
  642. =over
  643. =item B<--output> I<filename>
  644. set output filename (default: stdout)
  645. =item B<--filter> (B<title>|B<pagetop>|B<name>)(B<=~>|B<!~>)I<regexp>
  646. Several filters may get set.  Each filter can match agains the contents
  647. of a specific section of the mrtg config file. B<Name> refers to the
  648. bit in square brackets (option[name]: bla).
  649. Depending on the match operator chosen (B<=~> or B<!~>) the match will be
  650. positive or negative.
  651. Note that some shells consider B<!> a special character.  It may be
  652. necessary to type B<!~> instead.
  653. =item B<--title> I<text>
  654. Set title of generated index file (default: regexp)
  655. =item B<--bodyopt> I<text>
  656. The value of this argument gets appended to
  657. the E<lt>BODYE<gt> tag. This allows to set document colors.
  658. By default this option is set to
  659.  bgcolor="#ffffff" text="#000000" link="#000000" vlink="#000000" alink="#000000"
  660. =item  B<--columns> I<number>
  661. Display graphs in a table with I<number> columns (default: 2)
  662. =item B<--sort> B<title>|B<name>|B<descr>|B<original>
  663. Sort the graphs in the page either by B<title>, by B<name>, by interface
  664. B<descr>iption, or leave them as is.
  665. =item B<--enumerate>
  666. Add a sequence number to the title of each graph
  667. =item B<--width> I<number>
  668. Set width of graphs
  669. =item B<--height> I<number>
  670. Set the height of the graphs
  671. =item B<--show> B<day>|B<week>|B<month>|B<year>|B<none>
  672. Select which graph to show in the index page. You can supress images
  673. completely with B<--show=none>.
  674. =item B<--section> B<h1>|B<title>|B<name>|B<description>|B<portname>
  675. Select what to use as the title for each graph in the page.  B<h1> is
  676. the H1 section from pagetop, B<title> is the graph title, B<name> is
  677. the bit in square brackets (option[name]: bla), and B<descr> or
  678. B<description> is the text from the Description field of the PageTop
  679. (the Cisco description text if it's available, otherwise just the
  680. interface description). B<portname> is the C<Port Name:> from pagetop.
  681. =item B<--sectionhost>
  682. Extract the hostname from the target line (this does not work if the 
  683. target is a mathematial expression). Prepend the hostname (and a colon)
  684. to the section if not already present.
  685. =item B<--rrdviewer> I<path>
  686. If you have set the B<LogFormat: rrdtool> property in the mrtg.cfg
  687. file, the index will take this into account. The only thing you must
  688. tell it is the path to your grapher cgi. (default: /cgi-bin/14all.cgi)
  689. =item B<--prefix> I<path>
  690. By  default we assume    that  the file generated by indexmaker is stored in
  691. I<WorkDir>.  If you want to  store it somewhere   else, specify how to reach
  692. I<WorkDir>  from  the place where the Index is stored. Note that you have to
  693. use '/' as path separator as this will be used in urls. Speaking of which,
  694. you can even enter a whole url.
  695. =item B<--autoprefix> I<path>
  696. Requires --output.
  697. Try to generate the prefix automatically by comparision of the path to the
  698. output file set with --output and the Htmldir set in the configuration files.
  699. Particulary useful when multiple configuration files are specified, with
  700. different Htmldir settings.
  701. =item B<--optlog>
  702. Default is logging in the generated page the command line, suppress with
  703. --nooptlog . Useful if the commandline contains a complex --pagetop=string
  704. which could confuse simple browsers.
  705. =item B<--someoption-file> I<filename>
  706. For any someoption which takes a I<string> as parameter you can read the
  707. string from a file by adding <-file> to the option keyword. The whole 
  708. content of the file will be read and used as the I<string>. The file must
  709. exist.
  710. =back
  711. =head1 AUTHOR
  712. Tobias Oetiker E<lt>tobi@oetiker.chE<gt>
  713. =head1 LICENSE
  714. GNU General Public License
  715. =head1 COPYRIGHT
  716. 2000-2001 Tobias Oetiker E<lt>tobi@oetiker.chE<gt>
  717. =cut