Net: : SNMP bulk request example

From Teknologisk videncenter
Revision as of 09:18, 1 April 2010 by Heth (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search
#!/usr/bin/perl
#===============================================================================
#
#         FILE:  snmpbulk.pl
#
#        USAGE:  ./snmpbulk.pl
#
#  DESCRIPTION:
#
#      OPTIONS:  ---
# REQUIREMENTS:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:  Henrik Thomsen (HeTh), <heth@eucmidt.dk>
#      COMPANY:  EUC MIDT, Viborg, Denmark
#      VERSION:  1.0
#      CREATED:  10/04/08 19:01:51 CEST
#     REVISION:  ---
#===============================================================================
# notes: SNMP-NET  /usr/share/snmp/mibs
use strict;
use warnings;
use Net::FTP;
use Net::SNMP qw(:snmp);
use diagnostics;
my $MIBLIB = "$ENV{'HOME'}/snmp/mib";
my $COMPILELIB = "$ENV{'HOME'}/snmp/compiler";
my $SITECONFIG = "$ENV{'HOME'}/snmp/site.conf";
my @miblist;
my $ciscoMibList = ".1.3.6.1.2.1.1.9.1.3"; #Cisco MIB list
my ( $session,$error,$result);
#my @files =("IP-MIB","IF-MIB","IPMROUTE-MIB","IPMROUTE-STD-MIB","CISCO-IP-IF-MIB");
findCiscoDeviceMibs('192.168.22.1');
checkdepend('cisco',\@miblist);

############################################
# sub: findCiscoDeviceMibs
############################################
sub findCiscoDeviceMibs {
        my $device = shift;
        my $community = shift || 'public';
        ($session, $error) = Net::SNMP->session(
                        -version        => 'snmpv2c',
                        -nonblocking=> 1,
                        -maxmsgsize    => 6500,
                        -hostname       => $device,
                        -community      => $community
);
        if (! defined($session)) {
                printf("SNMP error session til $device med community $community\n");
                exit 1;
        }
        $result = $session->get_bulk_request(
                        -callback               => [\&buildTable, {}],
                        -maxrepetitions => 10,
                        -varbindlist    => [$ciscoMibList]
        );
        snmp_dispatcher();
        print "Now im there\n";
        return \@miblist
}
sub buildTable {
        my ($session, $table) = @_;
        print "Now im here\n";
        if (! defined($session->var_bind_list)) {
                printf("ERROR 3: %s\n", $session->error);
                exit 1;
        }
        my $next;

        foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {
                if (! oid_base_match($ciscoMibList, $oid)) {
                        $next = undef;
                        last;
                }
                $next = $oid;
                $table->{$oid} = $session->var_bind_list->{$oid};
        }
        # Hvis $next er defineret er listen ikke faerdig og
        # der skal hentes flere objekter.
        if ( defined($next)) {
                $result = $session->get_bulk_request(
                                -callback               => [\&buildTable, $table],
                                -maxrepetitions => 10,
                                -varbindlist    => [$next]
                );

                if(! defined($result)) {
                        printf("ERROR: %s\n",$session->error);
                }
        } else {
                # Tabellen er færdig..
                foreach my $oid (oid_lex_sort(keys(%{$table}))) {
                        $table->{$oid} =~ m/SUPPORTS\s+(\S+)/s;
                        push(@miblist,$1);
                }
        }
}
############################################
# sub: checkdepend
#
# Parser mibfil og finder dependencies som
# skal v¦re i MIBLIB f¦r compilering
############################################
sub checkdepend {
        my $site = shift;
        my @filelist = @{$_[0]};
        my $file;
    my $line;
        my @depend;
        my $dependcou=0;
        # Check f¦rst at alle filer er der. Hvis ikke hent dem
        foreach $file (@filelist) {
                if ( ! -r "$MIBLIB/$file.my" ) {
                        $depend[$dependcou] = $file;
                        $dependcou++;
                }
        }
        if (defined $depend[0]) {
                getmibfiles($site, \@depend);
        }
        foreach $file (@filelist) {
            open FILE, "$MIBLIB/$file.my" or die "Kan ikke bne filen $!\n";
        while ( defined( $line = <FILE>) ) {
            if ( $line =~ m/^IMPORTS/ ) {
                                while ( defined( $line = <FILE>) ) {
                   if ( $line =~ m/FROM\s+(\S+)/) {
                                                $1 =~ /(\S+?);?$/;          # Fjern evt ;
                                                $depend[$dependcou] = $1; # fandt afh¦ngigt modul
                                                $dependcou++;
                                        }
                }
            }
                }
    }
        if (defined $depend[0]) {
                getmibfiles($site, \@depend);
        }
}
############################################
# sub: getmibfiles
#
# Hent mibfiler via nettet til MIBLIB. Hvis de
# ikke eksisterer i forvejen.
# Syntax i MIBLIB:
# SITE URL PROTOCOL SNMPVERSION BIBLIOTEK [USERNAME[PASSWORD]]
############################################
sub getmibfiles {
        my $site = shift;       # Entry i SITECONFIG konfigurationsfil
        my @filelist = @{$_[0]};# Filer som skal downloades fra site
        my $url;
        my $protocol;                   # Kun ftp er supporteret indtil videre
        my $snmpver;                    # Version 1,2 eller 3 (Anvendes ikke endnu)
        my $lib;                                # Bibliotek p¦ ftp-server

    # Get site info
        open FILE, $SITECONFIG or die "Kan ikke ¦bne filen $SITECONFIG: $!\n";
        my $line;
        while ( defined( $line = <FILE>) && !defined($lib)) {
                eval {
                        if ( $line =~ m/^[^#\n].*/ ) {
                                $line =~ m/(\S+)\s+(\S+)\s(\S+)\s+(\S+)\s+(\S+)/;
                                if ( $1 eq $site ) {
                                        $url=$2;
                                        $protocol = $3;
                                        $snmpver = $4;
                                        $lib = $5;
                                }
                        }
                };
                if ($@) {
                    print "Der er sket en fejl ved parsing af ",$SITECONFIG;
                    die "\nRaporteret fejl: $@\n";
                }

        }
        if ( ! defined $lib ) {
                print "Kan ikke finde linie $site i $SITECONFIG\n";
        }
        close FILE or die "Kan ikke lukke fil: $!\n";
        #
        eval {
                my $ftp = Net::FTP->new($url, Debug => 1, Passive => 1)
               or die "Cannot connect to $site with url $url: $@";

                $ftp->login("anonymous",'heth@mercantec.dk')
                        or die "Cannot login ", $ftp->message;

                $ftp->cwd($lib)
                        or die "Cannot change working directory ", $ftp->message;
                my @a = $ftp->dir();
                foreach (@a) {
                        print $_,"\n";
                }
                #exit;
                foreach (@filelist) {
                        if ( ! -r "$MIBLIB/$_.my" ) {
                                printf "Downloading [%30.30s]...........",$_;
                                $ftp->get("$_.my","$MIBLIB/$_.my")
                                        or die "get failed ", $ftp->message;
                                #print "DONE in $ftp->transferTime() seconds\n";
                        }
                }
                        $ftp->quit;
        };
        if ($@) {
            print "Der er sket en fejl ved download fra $site url = $url";
            die "\nRaporteret fejl: $@\n";
        }
}