The program extracts IPAddress tagged data from a xml file, saves them in a txt file. Then it uses that data to get more information for each device via SNMP. It saves all of these infos in different txt files and then generates one resultfile where all informations are sorted per device in a cvs file style so it can be used to automatically be read by programs like CiscoWorks 2000 to update device informations. in the end it parses the results and deltes incomplet lines.

UPDATED 06.09.04

#!/usr/bin/perl -w ############################################################# #This program generates a list of informations by parsing an# #xml file and then extrating the informations via SNMP, # #saving the result in a textfile. # #Ver:1.0 written by:Ronin # ############################################################# use Net::SNMP; use strict; use warnings; use diagnostics; use XML::Simple; use Data::Dumper; ###################################################################### +###################### #This part of the program generates an IP and a name file with one ip +address per line. # #It reads the IPAddress ansd the DeviceName tagged information from th +e xml file it parses.# #The IP addresses and device names are then saved in a txt file. + # #The information saved here are later used and referred to as ipfile.t +xt and namefile.txt # #Ver:1.0 written by :Ronin # ###################################################################### +###################### #open xml file my $xmlfile = $ARGV[0]; my $ref = eval { XMLin($xmlfile) }; #erase or creat the ipfile and the namefile open ERASER, ">ipfile.txt"; close ERASER; open ERASER, ">namefile.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 porgram uses the above saved IP addresses # #reading them from the file and looping for as many times as # #necessary. It gets all informations from manually added MIB knots # #and saves these informations in seperate files. Then it parses all # #files including the name file and generates a full unedited listing# #saving it in another file. This unedited file is then reopened and # #edited so that only the wanted usefull informations remains. +# #The final file is then saved (in Ver 1.0 as finallist.txt). +# #Ver:1.0 written by: Ronin # ##################################################################### #open ipfile open IPFILE, "ipfile.txt" or die "Can't get IPs - $!\n"; #Sets knots und community my $community = 'public'; my $ifIndex = '1.3.6.1.2.1.47.1.1.1.1.6'; my $ifDescr = '1.3.6.1.2.1.47.1.1.1.1.11'; my $ifDescr2 = '1.3.6.1.2.1.47.1.1.1.1.2'; #erase or create files open ERASER, ">serlist.txt"; close ERASER; open ERASER, ">desclist.txt"; close ERASER; open ERASER, ">finallist.txt"; close ERASER; #looping as long as there are IP addersses my %record; #my $count; while ( my $ip = <IPFILE> ) { chomp $ip; print "Got: $ip\n"; + #open session my ( $session, $error ) = Net::SNMP->session( -hostname => $ip, -community => $community, -port => 161 ); my $response; #goto index table and hash index if ( defined( $response = $session->get_table($ifIndex) ) ) { #get serialnumbers foreach my $index ( values %{$response} ) { my $this_desc = "$ifDescr.$index"; my $description; if ( defined( $description = $session->get_request($this_d +esc) ) ) { #print serialno. to file my @serial = values %{$description}; open OUTPUT1, ">>serlist.txt"; print OUTPUT1 @serial, "\n"; close OUTPUT1; } } #get description foreach my $index ( values %{$response} ) { my $this_desc = "$ifDescr2.$index"; my $description2; if ( defined( $description2 = $session->get_request($this_ +desc) ) ) { #print describtion to file my @desc = values %{$description2}; open OUTPUT2, ">>desclist.txt"; print OUTPUT2 @desc, "\n"; close OUTPUT2; } } #create final file open(OUT, "serlist.txt"); open(OUT2, "desclist.txt"); open(OUT3, "namefile.txt"); my @outlist; while (<OUT>) { my %hash; my @temp = split(/;/,$_); $hash{'file1'} = $temp[0]; $hash{'file2'} = <OUT2>; $hash{'file3'} = <OUT3>; #delete Return foreach (values %hash) { $_ =~ s/\n//gi; } push(@outlist,\%hash); $record{$hash{file1}} = \%hash if $hash{file1}; } #print to file open ALLOUT, ">finallist.txt"; foreach my $hashref (values %record) { print ALLOUT "$hashref->{'file3'};$hashref->{'file1'};$has +href->{'file2'}}\n"; } close ALLOUT; #\@outlist, \%record; close(OUT); #open the file # open SCAN, "<alllist.txt"; #Search for pattern ;; and if found ignore that line # my @data = grep { !/\S+;;/ } <SCAN>; #write the rest to a file # open FINOUT, ">>finallist.txt"; # print FINOUT @data, "\n"; #$/ = "$data"; #while (<$data>) #{ # my %seen; # my @output= grep !$seen{$_}++, split (/^/m, $_); # #print FINOUT @output; # } # close SCAN; } #close session $session->close(); #last if ++$count > 20; }

In reply to Extracting xml data and using them for SNMP by theroninwins

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.