--- buildwan.pl.orig Fri Jun 16 00:17:53 2006 +++ buildwan.pl Thu Dec 14 15:41:08 2006 @@ -1,4 +1,4 @@ -#!/usr/bin/perl +#!%%PERL%% # # Try to build configuration files for all the routers in the WAN, # by recursively scanning them. Can take a long time to run! @@ -16,7 +16,7 @@ use strict; use Net::SNMP; use FileHandle; -use vars qw($opt_L $opt_h $opt_s $opt_c $opt_D $opt_w $opt_N $opt_A); +use vars qw($opt_L $opt_h $opt_s $opt_c $opt_D $opt_w $opt_N $opt_A $opt_p); use Getopt::Std; my( $conffile, %config,@cfgfiles, $pathsep ); @@ -32,7 +32,12 @@ my($IPIFINDEX) = "1.3.6.1.2.1.4.20.1.2"; my($IPROUTEGW) = "1.3.6.1.2.1.4.21.1.7"; my($CPUOID) = "1.3.6.1.4.1.9.2.1.58.0"; +my($FNDRYCPUOID) = "1.3.6.1.4.1.1991.1.1.2.1.35.0"; my($MEMOID) = "1.3.6.1.4.1.9.9.48.1.1.1.5.1"; # have to find out +my($FNDRYMEMOID) = "1.3.6.1.4.1.1991.1.1.2.1.55.0"; +my($FNDRYMAXMEMOID) = "1.3.6.1.4.1.1991.1.1.2.1.54.0"; +my($FNDRYBGPOID) = "1.3.6.1.4.1.1991.1.2.11.1.27.0"; +my($FNDRYTEMPOID) = "1.3.6.1.4.1.1991.1.1.1.1.18.0"; # Cisco 7200 Series Temperature my($CISCOTEMP) = "1.3.6.1.4.1.9.9.13.1.3.1"; @@ -47,7 +52,8 @@ my( $domain ) = "...\.adsw\.com"; my( @community ) = ( "public" ); my( $community ); -my( $workdir ) = "/var/rrdtool/auto"; +my( $workdir ) = "/var/db/rrdtool"; +my( $pathadd ) = "/usr/local/bin"; my( @queue ) = ( ); my( $subdir ) = ""; my( @filelist ) = (); @@ -80,8 +86,9 @@ { my($snmp, $resp, $snmperr, $k); my($n,$v,$ip); - my($cpuok,$memok) ; + my($cpuok,$memok,$bgpok,$tempok); my($rcomm) = ""; + my($fndrymaxmem); $router = $_[0]; $cpuok = $memok = ""; @@ -268,15 +275,48 @@ $routerhostname = $routerip if(!$routerhostname); # now check to see if the router has an OID for CPU and mem - $resp = $snmp->get_request( $CPUOID, $MEMOID ); + $resp = $snmp->get_request( $MEMOID ); if( $resp ) { - $cpuok = $CPUOID if( $resp->{$CPUOID} ); $memok = $MEMOID if( $resp->{$MEMOID} ); + } else { + $resp = $snmp->get_request( $FNDRYMEMOID ); + if( $resp ) { + $memok = $FNDRYMEMOID if( $resp->{$FNDRYMEMOID} ); + $resp = $snmp->get_request( $FNDRYMAXMEMOID ); + if( $resp ) { + $fndrymaxmem = $resp->{$FNDRYMAXMEMOID} if( $resp->{$FNDRYMAXMEMOID} ); + } + } } + # Try $CPUOID, if this doesn't work, try Foundry one + $resp = $snmp->get_request( $CPUOID ); + if( $resp ) { + $cpuok = $CPUOID if( $resp->{$CPUOID} ); + } else { + $resp = $snmp->get_request( $FNDRYCPUOID ); + if( $resp ) { + $cpuok = $FNDRYCPUOID if( $resp->{$FNDRYCPUOID} ); + } + } + + # Try to check if BGP routes exists + $resp = $snmp->get_request( $FNDRYBGPOID ); + if( $resp ) { + $bgpok = $FNDRYBGPOID if( $resp->{$FNDRYBGPOID} ); + } + + # Try to check if router has temp sensors (currently only foundry !) + $resp = $snmp->get_request( $FNDRYTEMPOID ); + if( $resp ) { + $tempok = $FNDRYTEMPOID if( $resp->{$FNDRYTEMPOID} ); + } + + $routers{$router} = { interfaces=>{%interfaces}, name=>$routerdesc, ip=>$routerip, hostname=>$routerhostname, community=>$rcomm, - cpu=>$cpuok, mem=>$memok }; + cpu=>$cpuok, mem=>$memok, fndrymaxmem=>$fndrymaxmem, + bgp=>$bgpok, temp=>$tempok }; print "\rFinished router $routerhostname at address $routerip\n"; @@ -332,15 +372,20 @@ my($k,$nextip,$icon); my($t,$d,$f); my($mb,$pfx); + my $descr; $n = ucfirst $n if($n !~ /\./); foreach $k ( keys %$ifp ) { + my $descr; + $descr = $ifp->{$k}->{descr}; + $descr =~ s/\n//g; $icon = "interface-sm.gif"; $pfx = ""; $d = ""; $t = $h.".".$k; - $t = $h.".".$ifp->{$k}->{descr} if($ifp->{$k}->{descr}); + #$t = $h.".".$ifp->{$k}->{descr} if($ifp->{$k}->{descr}); + $t = $h.".".$descr if($descr); $t =~ s/[\[\]#\/\\\s]+/./g; $t =~ s/\.+/./g; $t = lc $t; @@ -349,7 +394,7 @@ if(!$ifp->{$k}->{speed} or !$c or !$h) { $pfx = "# "; } - if(!$includelans and $ifp->{$k}->{descr} =~ /(ether|token)/i) { + if(!$includelans and $descr =~ /(ether|token)/i) { $pfx = "# "; } # print "$k".$ifp->{$k}{state}.": ".$ifp->{$k}{descr} @@ -388,10 +433,10 @@ print CFG $pfx."Title[".$t."]: $n"; print CFG " (".$ifp->{$k}->{ip}.")" if($ifp->{$k}->{ip}); - print CFG ": ".$ifp->{$k}->{descr}." $d\n"; + print CFG ": ".$descr." $d\n"; print CFG $pfx."PageTop[".$t."]:

Traffic analysis for " - .$ifp->{$k}->{descr}."

\n"; - print CFG $pfx."SetEnv[".$t."]: MRTG_INT_DESCR=\"".$ifp->{$k}->{descr} + .$descr."\n"; + print CFG $pfx."SetEnv[".$t."]: MRTG_INT_DESCR=\"".$descr ."\" MRTG_INT_IP=\"".$ifp->{$k}->{ip}."\"\n"; if($mb > 1000000) { print CFG $pfx."routers.cgi*UnScaled[$t]: none\n" @@ -408,7 +453,7 @@ .$ifp->{$k}->{destination}[2]." router-sm.gif\n"; } print CFG $pfx."routers.cgi*ShortDesc[$t]: " - .$ifp->{$k}->{descr}." (".(ucfirst $ifp->{$k}->{destination}[0]) + .$descr." (".(ucfirst $ifp->{$k}->{destination}[0]) .")\n" if( $ifp->{$k}->{destination}[0] # and ($ifp->{$k}->{destination}[0] !~ /^\d/i) @@ -431,7 +476,8 @@ open CFG, ">$fname"; print CFG "# MRTG config for router ".$routers{$rk}{hostname} ." community ".$routers{$rk}{community} - ."\n\nWorkdir: $workdir\nLogformat: rrdtool\nOptions[_]: growright bits \n"; + ."\n\nWorkdir: $workdir\n" + ."PathAdd: $pathadd\nLogformat: rrdtool\nOptions[_]: growright bits \n"; print CFG "routers.cgi*Icon: router-sm.gif\n" ."routers.cgi*ShortDesc: ".$routers{$rk}{name}."\n\n"; @@ -451,6 +497,7 @@ .$routers{$rk}{name}." CPU Load\n"; print CFG "PageTop[".$routers{$rk}{hostname}.".CPU]: CPU Stats\n"; print CFG "routers.cgi*Mode[".$routers{$rk}{hostname}.".CPU]: cpu\n"; + print CFG "routers.cgi*UnScaled[".$routers{$rk}{hostname}.".CPU]: none\n"; print CFG "routers.cgi*ShortDesc[".$routers{$rk}{hostname} .".CPU]: CPU Stats\n"; } else { @@ -461,7 +508,11 @@ print CFG "Target[".$routers{$rk}{hostname}.".MEM]: " .$routers{$rk}{mem}."&".$routers{$rk}{mem}.":" .$routers{$rk}{community}."\@".$routers{$rk}{hostname}."\n"; - print CFG "MaxBytes[".$routers{$rk}{hostname}.".MEM]: 64000000\n"; + if( $routers{$rk}{mem} == $FNDRYMEMOID ) { + print CFG "MaxBytes[".$routers{$rk}{hostname}.".MEM]: ".$routers{$rk}{fndrymaxmem}."\n"; + } else { + print CFG "MaxBytes[".$routers{$rk}{hostname}.".MEM]: 64000000\n"; + } print CFG "Options[".$routers{$rk}{hostname}.".MEM]: " ."nopercent integer gauge noo\n"; print CFG "routers.cgi*UnScaled[".$routers{$rk}{hostname}.".MEM]: none\n"; @@ -480,6 +531,61 @@ } else { print CFG "# Unable to identify a Memory usage OID in MIB\n"; } + + if( $routers{$rk}{bgp} ) { + print CFG "# BGP routes\n"; + print CFG "Target[".$routers{$rk}{hostname}.".BGP]: " + .$routers{$rk}{bgp}."&".$routers{$rk}{bgp}.":" + .$routers{$rk}{community}."\@".$routers{$rk}{hostname}."\n"; + print CFG "MaxBytes[".$routers{$rk}{hostname}.".BGP]: 100000000\n"; + print CFG "Options[".$routers{$rk}{hostname}.".BGP]: " + ."absolute nopercent integer gauge noo\n"; + print CFG "routers.cgi*UnScaled[".$routers{$rk}{hostname}.".BGP]: none\n"; + print CFG "Title[".$routers{$rk}{hostname}.".BGP]: " + .$routers{$rk}{name}." Total BGP routes\n"; + print CFG "ShortLegend[".$routers{$rk}{hostname}.".BGP]: Routes\n"; + print CFG "YLegend[".$routers{$rk}{hostname}.".BGP]: BGP Routes\n"; + print CFG "PageTop[".$routers{$rk}{hostname}.".BGP]: Total BGP Routes\n"; + print CFG "LegendI[".$routers{$rk}{hostname}.".BGP]: Routes:\n"; + print CFG "Legend1[".$routers{$rk}{hostname}.".BGP]: Routes\n"; + print CFG "Legend3[".$routers{$rk}{hostname}.".BGP]: Peak Routes\n"; + print CFG "routers.cgi*ShortDesc[".$routers{$rk}{hostname} + .".BGP]: BGP Routes\n"; + print CFG "routers.cgi*Options[".$routers{$rk}{hostname} + .".BGP]: noo, nopercent, absolute, nototal, nopercentile\n"; + } else { + print CFG "# No BGP routes OID in MIB\n"; + } + + if( $routers{$rk}{temp} ) { + print CFG "# Temperature\n"; + # Warning Foundry OID is temperature * 2, so we have to divide it by 2 + print CFG "Target[".$routers{$rk}{hostname}.".TEMP]: " + .$routers{$rk}{temp}."&".$routers{$rk}{temp}.":" + .$routers{$rk}{community}."\@".$routers{$rk}{hostname}." / 2\n"; + # 100°C is sufficient to handle this. At this temperature, we can think + # that router ... near to die. + print CFG "MaxBytes[".$routers{$rk}{hostname}.".TEMP]: 100\n"; + print CFG "Options[".$routers{$rk}{hostname}.".TEMP]: " + ."absolute nopercent gauge noo\n"; + print CFG "routers.cgi*UnScaled[".$routers{$rk}{hostname}.".TEMP]: none\n"; + print CFG "Title[".$routers{$rk}{hostname}.".TEMP]: " + .$routers{$rk}{name}." Temperature\n"; + print CFG "ShortLegend[".$routers{$rk}{hostname}.".TEMP]: °C\n"; + print CFG "PageTop[".$routers{$rk}{hostname}.".TEMP]: Temperature\n"; + print CFG "LegendI[".$routers{$rk}{hostname}.".TEMP]: Temperature\n"; + print CFG "Legend1[".$routers{$rk}{hostname}.".TEMP]: Temperature\n"; + print CFG "Legend3[".$routers{$rk}{hostname}.".TEMP]: Peak Temperature\n"; + print CFG "routers.cgi*ShortDesc[".$routers{$rk}{hostname} + .".TEMP]: Temperature\n"; + print CFG "routers.cgi*Options[".$routers{$rk}{hostname} + .".TEMP]: noo, nopercent, absolute, nototal, nopercentile\n"; + print CFG "routers.cgi*Icon[".$routers{$rk}{hostname} + .".TEMP]: temp-sm.gif\n"; + } else { + print CFG "# No Temperature OID in MIB\n"; + } + close CFG; @@ -495,10 +601,10 @@ $script = "/cgi-bin/routers2.pl"; } -getopts('hc:D:s:Lw:NA'); +getopts('hc:D:s:Lw:NAp:'); if($opt_h or $#ARGV<0) { - print "Usage: buildwan -h\n buildwan [-L][-A][-N][-s ][-c ][-D ] -w ...\n"; + print "Usage: buildwan -h\n buildwan [-L][-A][-N][-s ][-c ][-D ] -w -p ...\n"; print "-L: Include ethernet/token ring Lan interfaces\n"; print "-A: Include ethernet/token ring Lan interfaces even if they are down\n"; print "-N: Don't browse network neighors.\n"; @@ -506,6 +612,7 @@ print "-D: Specify domain name to be stripped from hostnames in descriptions\n"; print "-c: Specify SNMP community string (default is 'public'), separate with commas\n"; print "-w: Specify Work directory where the .rrd files go.\n"; + print "-p: Specify the rddtool path (default is /usr/local/bin).\n"; exit 1; } @@ -515,6 +622,7 @@ $includelans = 1 if($opt_L); $includealllan = 1 if($opt_A); $workdir = $opt_w if($opt_w); +$pathadd = $opt_p if($opt_p); @community = split /,\s*/,$opt_c if($opt_c); @community = ( 'public' ) if(!@community); if($opt_D) {