Beefy Boxes and Bandwidth Generously Provided by pair Networks
Come for the quick hacks, stay for the epiphanies.
 
PerlMonks  

Getting different things from routers and switches via SNMP

by theroninwins (Friar)
on Sep 20, 2004 at 13:29 UTC ( [id://392350]=CUFP: print w/replies, xml ) Need Help??

This prog gets different things from routers which ips and names it parses from an xml file and writes the result in a textfile.

#!/usr/bin/perl -w ###################################################################### +########### #This program consists of two parts. # #The first part is a xml parser that reads out the IPs and names of + # #a file given at the start prompt. The program must therefore be calle +d # #with it's name and the filename of the xml-file as parameter: + # #e.g. "perl walker.pl topo.xml" (topo is then the xml-file that must b +e parsed # #The second part of the program is based on the standard snmpwalk by D +ave Town. # #It reads different OIDs and extracts their infos saving them in diffe +rent # #arrays. It then creates a textfile with ALL entries. This text file + # #"alllist.txt"(v 1.0) is then parsed again and all unwanted entries ar +e deleted.# #the final result is saved in a textfile called "finallist.txt"(v 1.0) +. # #The result is set up as default (v 1.0) like: # #ip;name;serial number;part number;description # #The "alllist.txt", "ipfile.txt" and the "namefile.txt" are afterwards + deleted # #Program. Walker.pl Version:1.0 By: Ronin # ###################################################################### +########### use Net::SNMP qw(oid_lex_sort oid_base_match SNMP_VERSION_1 DEBUG_ALL) +; use strict; use Getopt::Std; use warnings; use diagnostics; use XML::Simple; use Data::Dumper; use vars qw($ip $name $response $response2 $response3 @final1 @final2 +@final3); ###################################################################### +########### #This is the first part of the program that parses the information fro +m the # #xml-file saving the resulting IPS in "ipfile.txt"(v1.0) and the resul +ting # #device names in "namefile.txt"(v1.0) # #Program. Walker.pl Version:1.0 By: Ronin # ###################################################################### +########### #open xml file taking the parameter from the prompt my $xmlfile = $ARGV[0]; my $ref = eval { XMLin($xmlfile) }; #erase or create the ipfile and the namefile open ERASER, ">ipfile.txt"; close ERASER; open ERASER, ">namefile.txt"; close ERASER; open ERASER, ">finallist.txt"; close ERASER; open ERASER, ">alllist.txt"; close ERASER; #see if open worked if ($@) { print "XML Read ERROR"; } else { #go to IPAddress tag and read infos into file foreach my $itemip (@{$ref->{Layer2Details}->{Device}}) { my @ipliste = $itemip->{IPAddress}; my @sorted = @ipliste; open OUTIP, ">>ipfile.txt"; print OUTIP @sorted, "\n"; close OUTIP; } #go to DeviceName tag and read infos into file foreach my $itemname (@{$ref->{Layer2Details}->{Device}}) { my @nameliste = $itemname->{DeviceName}; my @sortedname = @nameliste; open OUTNAME, ">>namefile.txt"; print OUTNAME @sortedname, "\n"; close OUTNAME; } } ###################################################################### +########### #The second part of the program start here and extracts the informatio +n wanted # #creating the result file # #Program. Walker.pl Version:1.0 By: Ronin # + ###################################################################### +########### #open ipfile open IPFILE, "ipfile3.txt" or die "Can't get IPs - $!\n"; open NAMES, "namefile3.txt" or die "Can't get IPs - $!\n"; #erase or create the finallist open ERASER, ">finallist.txt"; close ERASER; + #Sets knots und community my $community = 'public'; my $ifSer = '.1.3.6.1.2.1.47.1.1.1.1.11'; my $ifPart = '.1.3.6.1.2.1.47.1.1.1.1.13'; my $ifDesc = '.1.3.6.1.2.1.47.1.1.1.1.2'; #loop the program until all IPs have been worked with while ( $ip = <IPFILE>, $name = <NAMES> ) { #save ip and name chomp $ip; chomp $name; #delete the .bc.de.bic extention $name =~ s/\.bc\.de\.bic$//; #print which IP is being worked with print "Got: $ip\n"; #open session my ( $s, $e ) = Net::SNMP->session( -hostname => $ip, -community => $community, -port => 161 ); if (!defined($s)) { print ("Falsch nix is!"); } #bind the OIDs to arrays using varbindlist #to keep the original order of the entries my @args = ( -varbindlist => [$ifSer] ); my @args2 = ( -varbindlist => [$ifPart] ); my @args3 = ( -varbindlist => [$ifDesc] ); #check SNMP version if ($s->version == SNMP_VERSION_1) { #extract the wanted information adn save them into an array #using the push statement so the next entry is added at the #end of the array while (defined($s->get_next_request(@args))) { $_ = (keys(%{$s->var_bind_list}))[0]; if (!oid_base_match($ifSer, $_)) { last; } $response=($s->var_bind_list->{$_}); push @final1, $response; @args = (-varbindlist => [$_]); } while (defined($s->get_next_request(@args2))) { $_ = (keys(%{$s->var_bind_list}))[0]; if (!oid_base_match($ifPart, $_)) { last; } $response2 = ($s->var_bind_list->{$_}); push @final2, $response2; @args2 = (-varbindlist => [$_]); } while (defined($s->get_next_request(@args3))) { $_ = (keys(%{$s->var_bind_list}))[0]; if (!oid_base_match($ifDesc, $_)) { last; } $response3=($s->var_bind_list->{$_}); push @final3, $response3; @args3 = (-varbindlist => [$_]); } } #if version is not 1 then use this else { push(@args, -maxrepetitions => 25); outer: while (defined($s->get_bulk_request(@args))) { my @oids = oid_lex_sort(keys(%{$s->var_bind_list})); foreach (@oids) { if (!oid_base_match($ifSer, $_)) { last outer; } #print("%s => %s\n", $_, $s->var_bind_list->{$_}); # Make sure we have not hit the end of the MIB if ($s->var_bind_list->{$_} eq 'endOfMibView') { l +ast outer; } } # Get the last OBJECT IDENTIFIER in the returned list @args = (-maxrepetitions => 25, -varbindlist => [pop(@oids +)]); } } #create the file with ALL entries open OUTPUT, ">alllist.txt"; #print in column style for my $i (0 .. $#final1) { print OUTPUT "$ip;$name;$final1[$i];$ +final2[$i];$final3[$i]\n" } close OUTPUT; #empty the arrays @final1=(); @final2=(); @final3=(); #create the file with the wanted entries open FINISH, "<alllist.txt"; my @data = grep { !/\S+;;/ } <FINISH>; open WRITER,">>finallist.txt"; print WRITER @data; close WRITER; close FINISH; #close the SNMP session $s->close(); } #delete the alllist.txt, ipfile.txt and namefile.txt file unlink 'alllist.txt','ipfile.txt','namefile.txt'; exit 0;

janitored by ybiC: Balanced <readmore> tags around longish codeblock, as per Monastery convention

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: CUFP [id://392350]
Approved by grinder
Front-paged by grinder
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others chilling in the Monastery: (2)
As of 2024-04-20 03:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found