cfgmaker.cisco
上传用户:shbosideng
上传日期:2013-05-04
资源大小:1555k
文件大小:19k
- #! /pkg/gnu/bin/perl
- # -*- mode: Perl -*-
- ##################################################################
- # MRTG 2.7.2 -- Config file creator
- ##################################################################
- # Created by Tobias Oetiker <oetiker@ee.ethz.ch>
- # this produces a config file for one router, by bulling info
- # off the router via snmp
- #################################################################
- #
- # Distributed under the GNU copyleft
- use BER "0.57";
- use SNMP_Session "0.59";
- use SNMP_util "0.57";
- use Socket;
- use strict;
- use vars '$DEBUG';
- my $DEBUG = 0;
- my ($session, %ipaddr, %iphost);
- sub main {
- snmpmapOID('ipAdEntAddr' => '1.3.6.1.2.1.4.20.1.1',
- 'ipAdEntIfIndex' => '1.3.6.1.2.1.4.20.1.2',
- 'sysObjectID' => '1.3.6.1.2.1.1.2.0',
- 'CiscolocIfDescr' => '1.3.6.1.4.1.9.2.2.1.1.28',
- 'ifAlias' => '1.3.6.1.2.1.31.1.1.1.18');
- my(%ifType_d)=('1'=>'Other',
- '2'=>'regular1822',
- '3'=>'hdh1822',
- '4'=>'ddnX25',
- '5'=>'rfc877x25',
- '6'=>'ethernetCsmacd',
- '7'=>'iso88023Csmacd',
- '8'=>'iso88024TokenBus',
- '9'=>'iso88025TokenRing',
- '10'=>'iso88026Man',
- '11'=>'starLan',
- '12'=>'proteon10Mbit',
- '13'=>'proteon80Mbit',
- '14'=>'hyperchannel',
- '15'=>'fddi',
- '16'=>'lapb',
- '17'=>'sdlc',
- '18'=>'ds1',
- '19'=>'e1',
- '20'=>'basicISDN',
- '21'=>'primaryISDN',
- '22'=>'propPointToPointSerial',
- '23'=>'ppp',
- '24'=>'softwareLoopback',
- '25'=>'eon',
- '26'=>'ethernet-3Mbit',
- '27'=>'nsip',
- '28'=>'slip',
- '29'=>'ultra',
- '30'=>'ds3',
- '31'=>'sip',
- '32'=>'frame-relay',
- '33'=>'rs232',
- '34'=>'para',
- '35'=>'arcnet',
- '36'=>'arcnetPlus',
- '37'=>'atm',
- '38'=>'miox25',
- '39'=>'sonet',
- '40'=>'x25ple',
- '41'=>'iso88022llc',
- '42'=>'localTalk',
- '43'=>'smdsDxi',
- '44'=>'frameRelayService',
- '45'=>'v35',
- '46'=>'hssi',
- '47'=>'hippi',
- '48'=>'modem',
- '49'=>'aal5',
- '50'=>'sonetPath',
- '51'=>'sonetVT',
- '52'=>'smdsIcip',
- '53'=>'propVirtual',
- '54'=>'propMultiplexor',
- '55'=>'100BaseVG',
- #### New IF Types added 9/24/98 by Russ Carleton (roccor@livenetworking.com)
- #### based on the IANA file updated at ftp://ftp.isi.edu/mib/ianaiftype.mib
- '56'=>'Fibre Channel',
- '57'=>'HIPPI Interface',
- '58'=>'Obsolete for FrameRelay',
- '59'=>'ATM Emulation of 802.3 LAN',
- '60'=>'ATM Emulation of 802.5 LAN',
- '61'=>'ATM Emulation of a Circuit',
- '62'=>'FastEthernet (100BaseT)',
- '63'=>'ISDN & X.25',
- '64'=>'CCITT V.11/X.21',
- '65'=>'CCITT V.36',
- '66'=>'CCITT G703 at 64Kbps',
- '67'=>'Obsolete G702 see DS1-MIB',
- '68'=>'SNA QLLC',
- '69'=>'Full Duplex Fast Ethernet (100BaseFX)',
- '70'=>'Channel',
- '71'=>'Radio Spread Spectrum (802.11)',
- '72'=>'IBM System 360/370 OEMI Channel',
- '73'=>'IBM Enterprise Systems Connection',
- '74'=>'Data Link Switching',
- '75'=>'ISDN S/T Interface',
- '76'=>'ISDN U Interface',
- '77'=>'Link Access Protocol D (LAPD)',
- '78'=>'IP Switching Opjects',
- '79'=>'Remote Source Route Bridging',
- '80'=>'ATM Logical Port',
- '81'=>'AT&T DS0 Point (64 Kbps)',
- '82'=>'AT&T Group of DS0 on a single DS1',
- '83'=>'BiSync Protocol (BSC)',
- '84'=>'Asynchronous Protocol',
- '85'=>'Combat Net Radio',
- '86'=>'ISO 802.5r DTR',
- '87'=>'Ext Pos Loc Report Sys',
- '88'=>'Apple Talk Remote Access Protocol',
- '89'=>'Proprietary Connectionless Protocol',
- '90'=>'CCITT-ITU X.29 PAD Protocol',
- '91'=>'CCITT-ITU X.3 PAD Facility',
- '92'=>'MultiProtocol Connection over Frame/Relay',
- '93'=>'CCITT-ITU X213',
- '94'=>'Asymetric Digitial Subscriber Loop (ADSL)',
- '95'=>'Rate-Adapt Digital Subscriber Loop (RDSL)',
- '96'=>'Symetric Digitial Subscriber Loop (SDSL)',
- '97'=>'Very High Speed Digitial Subscriber Loop (HDSL)',
- '98'=>'ISO 802.5 CRFP',
- '99'=>'Myricom Myrinet',
- '100'=>'Voice recEive and transMit (voiceEM)',
- '101'=>'Voice Foreign eXchange Office (voiceFXO)',
- '102'=>'Voice Foreign eXchange Station (voiceFXS)',
- '103'=>'Voice Encapulation',
- '104'=>'Voice Over IP Encapulation',
- '105'=>'ATM DXI',
- '106'=>'ATM FUNI',
- '107'=>'ATM IMA',
- '108'=>'PPP Multilink Bundle',
- '109'=>'IBM IP over CDLC',
- '110'=>'IBM Common Link Access to Workstation',
- '111'=>'IBM Stack to Stack',
- '112'=>'IBM Virtual IP Address (VIPA)',
- '113'=>'IBM Multi-Protocol Channel Support',
- '114'=>'IBM IP over ATM',
- '115'=>'ISO 802.5j Fiber Token Ring',
- '116'=>'IBM Twinaxial Data Link Control (TDLC)',
- '117'=>'Gigabit Ethernet',
- '118'=>'Higher Data Link Control (HDLC)',
- '119'=>'Link Access Protocol F (LAPF)',
- '120'=>'CCITT V.37',
- '121'=>'CCITT X.25 Multi-Link Protocol',
- '122'=>'CCITT X.25 Hunt Group',
- '123'=>'Transp HDLC',
- '124'=>'Interleave Channel',
- '125'=>'Fast Channel',
- '126'=>'IP (for APPN HPR in IP Networks)',
- '127'=>'CATV MAC Layer',
- '128'=>'CATV Downstream Interface',
- '129'=>'CATV Upstream Interface',
- '130'=>'Avalon Parallel Processor',
- '131'=>'Encapsulation Interface',
- '132'=>'Coffee Pot',
- '133'=>'Circuit Emulation Service',
- '134'=>'ATM Sub Interface',
- '135'=>'Layer 2 Virtual LAN using 802.1Q',
- '136'=>'Layer 3 Virtual LAN using IP',
- '137'=>'Layer 3 Virtual LAN using IPX',
- '138'=>'IP Over Power Lines',
- '139'=>'Multi-Media Mail over IP',
- '140'=>'Dynamic synchronous Transfer Mode (DTM)',
- '141'=>'Data Communications Network',
- '142'=>'IP Forwarding Interface'
- );
- my($vendor)=0;
- if ($ARGV[0] eq '--vendor') {
- $vendor = 1; shift @ARGV};
- my($community,$router) = ($1,$2) if $ARGV[0] =~ /(.*)@(.*)/;
- die <<USAGE unless $community && $router;
- USAGE: cfgmaker [--vendor] 'community'@'router'
- use the --vendor option to try and wrestle some better information
- from willing livingston and cisco routers ... (may not work)
- EXAMPLE: cfgmaker public@ezwf7.ethz.ch >>mrtg.cfg
- USAGE
- print "# Add a WorkDir: /some/path line to this filenn";
- $session = SNMP_Session->open ($router, $community, 161)
- || die "Error opening SNMP session to $router";
-
- my($sysDescr,$sysContact,$sysName,$sysLocation,$ifNumber,$sysObjectID) =
- snmpget("$community@$router",
- 'sysDescr','sysContact','sysName', 'sysLocation', 'ifNumber', 'sysObjectID');
- $sysDescr =~ s/rn?/<BR>/g; # Change returns to <BR>
- my($cisco_router_sysid) = '1.3.6.1.4.1.9';
- my($livingston_router_sysid) = '1.3.6.1.4.1.307';
- my($ciscobox) = ($sysObjectID =~ /^$cisco_router_sysid/);
- my($portmaster) = ($sysObjectID =~ /^$livingston_router_sysid/);
- print <<ECHO;
- WorkDir: /pkg/mon/www/mrtg/
- Refresh: 300
- Interval: 5
- WriteExpires: yes
- #Global Modifications:
- Unscaled[_]: ymwd
- Options[_]: bits,growright
- YLegend[_]: Bits Per Second
- ShortLegend[_]: b/s
- LegendI[_]: Bits/s:
- LegendO[_]: Bits/s:
- #################################################################
- # Location: $sysLocation
- # Contact: $sysContact
- # System Name: $sysName
- #
- # System Description including Software and Hardware Versions.
- #
- # $sysDescr
- #################################################################
- # Modified Mrtg cfgmaker Configuration file for SMNP Equipment
- # Last edited - 1999, Mar 31th, revision 2.0
- # Edited By - mpburton (mpburton@europa.com)
- # Time - 11:10 pm
- # Created By - Jlatimer (J.Latimer@sussex.ac.uk)
- #################################################################
- #---------------------------------------------------------------
- ECHO
- $session->map_table ([[1,3,6,1,2,1,4,20,1,1], # ipAdEntAddr
- [1,3,6,1,2,1,4,20,1,2]], # ipAdEntIf
- sub ($@) {
- my ($index, $ipadentaddr, $ipadentif) = @_;
- grep (defined $_ && ($_=pretty_print $_),
- ($ipadentif, $ipadentaddr));
- $ipaddr{$ipadentif} = $ipadentaddr;
- $iphost{$ipadentif} =
- gethostbyaddr(pack('C4',split(/./,$ipaddr{$ipadentif})), AF_INET);
- if (!defined $iphost{$ipadentif} || ($iphost{$ipadentif} eq '')){
- $iphost{$ipadentif} = 'No hostname defined for IP address';
- }
- });
- print STDERR "Got Addressesn" if $DEBUG;
- print STDERR "Got IfTablen" if $DEBUG;
- my(%sifdesc,%siftype,%sifspeed,%sifadminstatus,%sifoperstatus,%sciscodescr,%sifrawdesc);
- ### May need the cisco IOS version number so we know which oid to use
- ### to get the cisco description.
- ###
- ### - mjd 2/5/98 (Mike Diehn) (mdiehn@mindspring.net)
- ###
- my ($cisco_ver, $cisco_descr_oid, @ciscodescr);
- if ( $ciscobox ) {
- ($cisco_ver) = ($sysDescr =~ m/Versions+([d.]+)(d/o);
- $cisco_descr_oid = ($cisco_ver ge "11.2") ? "ifAlias" : "CiscolocIfDescr";
- }
- #mod by jon: create a hash table to map ifIndex integers to module/port names:
- my $cat5500 = 0;
- if ( $sysDescr =~ /WS-C55.*/i ) {
- $cat5500 = 1;
- }
- my (%iftomp, %iftovlan);
- if ($cat5500) {
- $session->map_table ([[1,3,6,1,4,1,9,5,1,4,1,1,11]], #5500 port group
- sub ($@) {
- my ($rowindex, $index) = @_;
- grep (defined $_ && ($_=pretty_print $_),
- ($index));
- # $rowindex =~ s/.///g;
- $iftomp{$index} = $rowindex;
- # print "row:$rowindex; idx:$index";
- # print "nn";
- });
- #foreach my $key (sort(keys %iftomp)) {
- # print $key, '=', $iftomp{$key}, "n";
- #}
- $session->map_table ([[1,3,6,1,4,1,9,5,1,9,3,1,3]],
- sub ($@) {
- my ($rowindex, $vlan_no) = @_;
- grep (defined $_ && ($_=pretty_print $_),
- ($vlan_no));
- my $ifindex;
- foreach my $key (keys %iftomp) {
- if ($iftomp{$key} eq $rowindex) {
- $ifindex = $key;
- }
- }
- $iftovlan{$ifindex} = $vlan_no;
- });
- #foreach my $key (sort(keys %iftovlan)) {
- # print $key, '=', $iftovlan{$key}, "n";
- #}
- } #end if cat5500
- $session->map_table ([[1,3,6,1,2,1,2,2,1,1], # ifIndex
- [1,3,6,1,2,1,2,2,1,2], # ifDescr
- [1,3,6,1,2,1,2,2,1,3], # ifType
- [1,3,6,1,2,1,2,2,1,5], # ifSpeed
- [1,3,6,1,2,1,2,2,1,7], # ifAdminStatus
- [1,3,6,1,2,1,2,2,1,8]], # ifOperStatus
- sub ($@) {
- my ($rowindex,$index,$ifdescr,$iftype,$ifspeed,$ifadminstatus,$ifoperstatus) = @_;
- grep (defined $_ && ($_=pretty_print $_),
- ($index,$ifdescr,$iftype,$ifspeed,$ifadminstatus,$ifoperstatus));
- if ($cat5500) {
- my ($intname, $tmp_vlan_no) = split (' ',$ifdescr);
- if ( ($intname eq "sc0") || ($intname eq "sl0") ) {
- return;
- }
- if ($intname eq "VLAN") {
- if ($tmp_vlan_no >= 1000) {
- return;
- }
- #The Catalyst software version 4.5 seems to return '0' as the ifSpeed for a
- #VLAN. We set it to 100Mb because we want to watch aggregate VLAN traffic.
- if ($ifspeed == 0) {
- $ifspeed = 100 * 10**6;
- }
- }
- my ($port_num, $vlan_desc);
- $port_num = $iftomp{$index};
- $port_num =~ s/.///g;
- if ($iftovlan{$index} != 1) {
- $vlan_desc = "<font color="#8C1717"> Vlan $iftovlan{$index} </font>";
- }
- else {
- $vlan_desc = "Vlan $iftovlan{$index}";
- }
- if ($iftype != 53) {
- $sifdesc{$index} = "Port $port_num, $vlan_desc, $ifdescr";
- }
- else {
- $sifdesc{$index} = "<font color="#6B238E"> <B> Aggregate Traffic: $ifdescr </B> </font>";
- $sifrawdesc{$index} = $ifdescr;
- }
- }
- else {
- $sifdesc{$index} = $ifdescr;
- }
- $siftype{$index} = $iftype;
- $sifspeed{$index} = $ifspeed;
- $sifadminstatus{$index} = $ifadminstatus;
- $sifoperstatus{$index} = $ifoperstatus;
- if ($portmaster && $vendor) {
-
- # We can only approximate speeds
- #
- # so we think that ppp can do 76800 bit/s, and slip 38400.
- # (actualy, slip is a bit faster, but usualy users with newer modems
- # use ppp). Alternatively, you can set async speed to 115200 or
- # 230400 (the maximum speed supported by portmaster).
- #
- # But if the interface is ptpW (sync), max speed is 128000
- # change it to your needs. On various Portmasters there are
- # various numbers of sync interfaces, so modify it.
- #
- # The most commonly used PM-2ER has only one sync.
- #
- # Paul Makeev (mac@redline.ru)
- #
- if ($siftype{$index} eq '23') {
- if ($sifdesc{$index} eq 'ptpW1') {
- $sifspeed{$index} = 128000;
- } else {
- $sifspeed{$index} = 76800;
- }
- } elsif ($siftype{$index} eq '28') {
- $sifspeed{$index} = 38400;
- } elsif ($siftype{$index} eq '6') {
- $sifspeed{$index} = 10000000;
- }
- }
- ### Move this section south so we know what type of
- ### circuit we're looking at before we retrieve
- ### the cisco interface alias.
- ###
- ### This whole cicso thing should be re-written, but since
- ### this script doesn't need to run quickly...
- ###
- ### - mjd 2/5/98
- ###
- # Get the user configurable interface description entered in the config
- # if it's a cisco-box
- #
- if ($ciscobox && $vendor) {
- my ($enoid, @descr);
- $enoid = $cisco_descr_oid . "." . $index;
- if ( $cisco_ver ge "11.2" or $siftype{$index} != '32' ) {
- ### This is either not a frame-relay sub-interface or
- ### this router is running IOS 11.2+ and interface
- ### type won't matter. In either of these cases, it's
- ### ok to try getting the ifAlias or ciscoLocIfDesc.
- ###
- @descr = snmpget("$community@$router", $enoid);
- } else {
- ### This is a frame-relay sub-interface *and* the router
- ### is running an IOS older than 11.2. Therefore, we can
- ### get neither ifAlias nor ciscoLocIfDesc. Do something
- ### useful.
- ###
- @descr = ("Cisco PVCs descriptions require IOS 11.2+.");
- } # end if else
- ### Put whatever I got into the array we'll use later to append the result
- ### of this operation onto the results from the ifDescr fetch.
- ###
- push @ciscodescr, shift @descr;
- } # end if ($cisco_box && $vendor)
- # especially since cisco does not return a if
- # descr for each interface it has ...
- ## JB 2/8/97 - sometimes IOS inserts E1 controllers in the standard-MIB
- ## interface table, but not in the local interface table. This puts the
- ## local interface description table out-of-sync. the following
- ## modification skips over E1 cards as interfaces.
- #
- ### I suspect that the mod I made above, to use the ifAlias
- ### oid if possible, may cause problems here. If it seems
- ### that your descriptions are out of sync, try commenting
- ### out the "if ( condition )" and it's closing right brace
- ### so that the "shift @ciscodescr" get executed for *all*
- ### iterations of this loop.
- ###
- ### - mjd 2/5/95
- ###
- if ($ciscobox && $siftype{$index} != 18) {
- $sciscodescr{$index} = "<BR>" . (shift @ciscodescr) if @ciscodescr;
- }
- });
- my $index;
- foreach $index ( sort { $a <=> $b } keys %sifdesc) {
- my $c;
- my $speed = int($sifspeed{$index} / 8); # bits to byte
- my $speed_str=&fmi($speed);
- my $name="$iphost{$index}";
- $name = "$router.$index" if not $name or $name =~ /s/;
- if (($sifadminstatus{$index} != 1)
- # this check added by Josh - don't query E1-stack controllers
- || ($siftype{$index} == 18)
- || ($siftype{$index} == 24)
- || ($speed == 0 )
- || ($speed > 400 * 10**6) #speeds of 400 MByte/s are not realistic
- || ($sifoperstatus{$index} == 3)) {
- print <<ECHO;
- ########
- ######## This Interface is one of the following
- ######## - administratively not UP
- ######## - it is in test mode
- ######## - it is a softwareLoopback interface
- ######## - has a unrealistic speed setting
- ######## It is commented out for this reason.
- ########
- ECHO
- $c="# ";
- }else {
- $c = '';
- }
-
- print <<ECHO;
- ${c}
- ECHO
- if ( ($cat5500) && ($siftype{$index} == 53) ) {
- # print "nnhere!! desc:$sifrawdesc{$index}nn";
- my $agg_vlan_no = $sifrawdesc{$index};
- $agg_vlan_no =~ s/D//g;
- my $ctr = 0;
- foreach my $key (sort(keys %iftovlan)) {
- # print "key:$key;agg:$agg_vlan_no;index:$indexnnnn";
- if ($iftovlan{$key} == $agg_vlan_no) {
- # print "nna hit!!nn";
- if ($ctr == 0) {
- print "${c}Target[$name]: $key:$community@$router";
- }
- else {
- print " + $key:$community@$router";
- }
- $ctr++;
- }
- }
- }
- else {
- print "${c}Target[$name]: $index:$community@$router";
- }
- print <<ECHO;
- ${c}
- ${c}Directory[$name]:$sysName
- ${c}MaxBytes[$name]: $speed
- ${c}Title[$name]: $sysName ($iphost{$index}): $sifdesc{$index}
- ${c}PageTop[$name]: <H1>Traffic Analysis for $sifdesc{$index}
- ${c} $sciscodescr{$index}</H1>
- ${c} <TABLE>
- ${c} <TR><TD>System:</TD><TD>$sysName in $sysLocation</TD></TR>
- ${c} <TR><TD>Maintainer:</TD><TD>$sysContact</TD></TR>
- ${c} <TR><TD>Interface:</TD><TD>$sifdesc{$index} ($index)</TD></TR>
- ${c} <TR><TD>IP:</TD><TD>$iphost{$index} ($ipaddr{$index})</TD></TR>
- ${c} <TR><TD>Max Speed:</TD>
- ${c} <TD>$speed_str ($ifType_d{$siftype{$index}})</TD></TR>
- ${c} </TABLE>
- ${c}
- #---------------------------------------------------------------
- ECHO
- }
- }
-
- main;
- exit(0);
- sub fmi {
- my($number) = $_[0];
- my(@short);
- @short = ("Bytes/s","kBytes/s","MBytes/s","GBytes/s");
- my $digits=length("".$number);
- my $divm=0;
- while ($digits-$divm*3 > 4) { $divm++; }
- my $divnum = $number/10**($divm*3);
- return sprintf("%1.1f %s",$divnum,$short[$divm]);
- }