Schrift
[thread]4383[/thread]

SNMP query mittels Perl: SNMP query mittels Perl

Leser: 1


<< >> 8 Einträge, 1 Seite
tomi
 2005-11-21 16:05
#36938 #36938
User since
2005-11-21
3 Artikel
BenutzerIn
[default_avatar]
Hi an alle,

Ich habe ein Problem mit SNMP Abfragen bei Perl, bei dem ich nun schon etwas länger sitze und einfach nicht mehr weiter weiss.

Das Skript soll die Interfaces von Cisco Routern abfragen. Soweit funktioniert das ganze auch (mit ifDescr) erhalte ich zB die Descriptions aller Interfaces.

Da Cisco aber Probleme mit Interfaces macht (gelöschte Interfaces werden noch als aktiv angezeigt), wollte ich nun eine neue MIB einbinden, damit ich die OID .1.3.6.1.4.1.9.2.2.1.1.28 verwenden kann.

Mittels snmpwalk -v 1 -c public host .1.3.6.1.4.1.9.2.2.1.1.28 erhalte ich auch das korrekte Ergebnis.
Wenn ich das ganze aber mit dem Perl-Script versuche, erhalte ich jede mal: Unknown Object Identifier (Sub-id not found: (top) -> local)

Ich weiss hier nun echt nicht mehr weiter, zumal es mittels snmpwalk funktioniert. Auch funktioniert das Script auf einer Solaris 6 Maschine...?!?!?

Habt ihr eine Idee woras es liegen könnte, bzw. was ich hier falsch mache?

Liebe Grüße & Vielen Dank
Tomi

PS: anbei noch ein Code Schnippsel:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        my $if_state = new SNMP::VarList(
                                 ["local.2.1.1.28"],
                                 ["ifName"]); # .1.3.6.1.2.1.31.1.1.1.1

       do {
           my ($desc1,$short) = $session->getnext($if_state);
           $index++;

print "DESC: $desc1\n";

       # no response is bad community or dead daemon or other failure...
       if ($session->{ErrorNum}) {
           next if ($session->{ErrorNum}==2);
           $counter++;
           push @$longerr, "$host no session: $session->{ErrorStr}\n";
       }
svenXY
 2005-11-21 17:32
#36939 #36939
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
und wenn Du einfach
Code (perl): (dl )
my $if_state = new SNMP::VarList(["1.3.6.1.4.1.9.2.2.1.1.28"]);

benutzt?

Ansonsten schaue ich es mir gerne an, wenn Du so viel code postest, dass ich nicht noch ein ganzes Programm drumbauen muss.

Gruss,
svenXY\n\n

<!--EDIT|svenXY|1132587244-->
tomi
 2005-11-21 17:49
#36940 #36940
User since
2005-11-21
3 Artikel
BenutzerIn
[default_avatar]
Hi,

das hab ich schon versucht...gleiches ergebnis :-(

anbei ein funktionstüchtiger code (host und community müssen entsprechend angepasst werden)

vielen dank
tomi


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#!/usr/bin/perl

#use strict;

use SNMP;
use Getopt::Long;

# Nagios specific
#use lib "/opt/nagios/libexec";
#use utils qw(%ERRORS $TIMEOUT);

# prototype
sub checkInterfaces($$$$$$);

$host="cisco-router";
$community = $o_community || "pubic";
$version = $o_version || "1";
$timeout = $o_timeout || "10000000";
$retries = $o_retries || "10";

# create session
($session, $error) = new SNMP::Session(
   DestHost => $host,
   Community => $community,
   Version => $version,
   Timeout => $timeout,
   Retries => $retries);

# if session does not exist ... exit
if (!defined($session)) {
   print "ERROR opening session\n";
   exit $ERRORS{"UNKNOWN"};
}


   # get Number of Interfaces on this Host
   $ifcount = $session->get(["ifNumber",0]);

   # get sysDescr field and check if device is a 375x l3-switch
   #my $sysdescr = $session->get(["sysDescr",0]);

   $num_o_errors = checkInterfaces(0, $ifcount, $session, $version, \@longerr, $host);



sub checkInterfaces($$$$$$) {

   my($index, $ifcount, $border, $version, $session, $host, $longerr, $not_to_search);
   $index = $_[0];
   $ifcount = $_[1];
   $session= $_[2];
   $version = $_[3];
   $longerr = $_[4];
   $host = $_[5];
   my %admin_states = ((my $admin_state_ok=1)=>"adminUp",
                       2=>"adminDown",
                       3=>"adminTest");
   my %oper_states = ((my $oper_state_ok=1)=>"up",
                      2=>"down",
                      3=>"testing",
                      4=>"unknown",
                      5=>"sleeping");
   my $counter = 0;

      my $if_state = new SNMP::VarList(
                                 ["ifDescr"],
                                 ["ifAdminStatus"],
                                 ["ifOperStatus"],
                                 ["ifAlias"],  # .1.3.6.1.2.1.31.1.1.1.18
                                 ["ifName"]); # .1.3.6.1.2.1.31.1.1.1.1
       my $desc;
       my $desc2 = undef;

       do {
           my ($name,$admin,$oper,$desc1,$short) = $session->getnext($if_state);
           $index++;

           $desc = $desc1?$desc1:$desc2?$desc2:"N/A";
           $short = $name if (!$short);

           if ($session->{ErrorNum}) {
               next if ($session->{ErrorNum}==2);
               $counter++;
               push @$longerr, "$host no session: $session->{ErrorStr}";
               #last;
           }
           print "Name: $name, Admin-State: $admin, Oper-State: $oper, Desc: $desc, Shotname: $short\n";
       } while ($index <= $ifcount-1); # -1 to get rid of last...unused...element
   return $counter;


}
svenXY
 2005-11-22 11:53
#36941 #36941
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
Sorry, ich krieg hier irgendwie das SNMP Modul nicht korrekt installiert :blush: (ja, ich weiss, wie es geht, aber es krankt irgendwo) und ich habe leider nicht die Zeit, hier während der Arbeitszeit stundenlang Module zu installieren.
Aber es gibt auch noch Net::SNMP als anderes Modul. Vielleicht funktioniert'S ja damit?

Sorry nochmal,
Sven
esskar
 2005-11-22 12:06
#36942 #36942
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=svenXY,22.11.2005, 10:53]und ich habe leider nicht die Zeit, hier während der Arbeitszeit stundenlang Module zu installieren.[/quote]
hmm, wenn es für die Arbeit ist, sollte es kein Thema sein.

Gibts Fehlermeldungen?
benutzt du cpan oder ppm? oder was anderes?
svenXY
 2005-11-22 13:07
#36943 #36943
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
OK, hab's mit Net::SNMP auf ner anderen Kiste probiert.

Erst der snmpwalk:
Code: (dl )
1
2
3
4
$ snmpwalk -v 2c -c community host 1.3.6.1.4.1.9.2.2.1.1.28
SNMPv2-SMI::enterprises.9.2.2.1.1.28.1 = ""
SNMPv2-SMI::enterprises.9.2.2.1.1.28.2 = ""
SNMPv2-SMI::enterprises.9.2.2.1.1.28.3 = ""

Die eigentlichen OIDs sind also ...28.1, ...28.2 und ...28.3

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#! /usr/local/bin/perl

   use strict;
use lib '/usr/lib/perl5/vendor_perl/5.8.5/i386-linux-thread-multi/auto';

   use Net::SNMP;

   my ($session, $error) = Net::SNMP->session(
      -version     => 'snmpv2c',
      -hostname  => shift || 'localhost',
      -community => shift || 'public',
      -port      => shift || 161 
   );

   if (!defined($session)) {
      printf("ERROR: %s.\n", $error);
      exit 1;
   }

   my $oid = '1.3.6.1.4.1.9.2.2.1.1.28.1';

   my $result = $session->get_request(
      -varbindlist => [ $oid ]
   );

   if (!defined($result)) {
      printf("ERROR: %s.\n", $session->error);
      $session->close;
      exit 1;
   }

   printf("oid '%s' ->  '%s'\n",
      $oid, $result->{$oid} 
   );

   $session->close;

   exit 0;

ergibt dann auch folgerichtig (bei mir):
Code: (dl )
1
2
$ perl ~/snmp_test2.pl host community
oid '1.3.6.1.4.1.9.2.2.1.1.28.1' -> ''

und wenn ich mir nochmal Deinen OP anschaue, dann sehe ich den Fehler: Unknown Object Identifier (Sub-id not found: (top) -> local), der sich m.E eher auf Deine Variablendefinition ["local.2.1.1.28"] bezieht. Wie auch immer, wahrscheinlich brauchst Du hier auch ein walk und kein get.

Vielleicht hilft das hier: http://search.cpan.org/~dtown/Net-SNMP-5.2.0/lib/Net/SNMP.pm#3._Non-blocking_SNMPv2c_get-bulk-request_for_ifTable

Gruss,
svenXY
svenXY
 2005-11-22 13:13
#36944 #36944
User since
2005-09-15
33 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,22.11.2005, 11:06]
hmm, wenn es für die Arbeit ist, sollte es kein Thema sein.

Gibts Fehlermeldungen?
benutzt du cpan oder ppm? oder was anderes?[/quote]

ähhh, nein, es ist nicht für meine Arbeit, ich versuche nur, ihm zu helfen :-)

Hab's mit nem rpm (FC3) probiert, aber auch mit cpan (da ist SNMP veraltet) und von Sourceforge. Alles nicht wirklich erhellend. Problem ist auch, dass die Module irgendwo in site_lib landen, wo @INC nicht danach sucht, aber wenn ich sie dann mit use lib explöizit dazunehme, bekomme ich "NetSNMP::default_store object version 5.1.3.1 does not match bootstrap parameter 5.2.1.2 at /usr/lib/perl5/5.8.5/i386-linux-thread-multi/DynaLoader.pm line 253.". Ist auch nicht wirklich wichtig. Das ist mein Desktop. Auf dem Server läuft das Net::SNMP Modul problemlos.

Gruss,
Sven\n\n

<!--EDIT|svenXY|1132658181-->
tomi
 2005-11-22 14:35
#36945 #36945
User since
2005-11-21
3 Artikel
BenutzerIn
[default_avatar]
hi,

ES FUNKT... ihr habt mich auf die richtige fährte gebracht.

sowohl mit Net::SNMP als auch mit SNMP. (Net::SNMP scheint in dieser hinsicht leichter zu sein.)
damit ich aber nicht alles umbauen musste, hab ich es mit dem vorhandenen modul SNMP versucht....

so funktioniert es:
den block für if_state einfach wie folgt in die do-schleife hängen

my $if_state = new SNMP::VarList(
["ifDescr",$index],
["ifAdminStatus",$index],
["ifOperStatus",$index],
["ifAlias",$index],
["1.3.6.1.4.1.9.2.2.1.1.28",$index],
["ifName",$index]);

ob das schön ist, weiss ich aber nicht, da bei jedem durchlaufen der schleife die variable $if_state neu gesetzt wird.

event. bau ich das wirklich noch mit Net::SNMP ...

VIELEN DANK für euere hilfe
lg
tomi
<< >> 8 Einträge, 1 Seite



View all threads created 2005-11-21 16:05.