SNMP

Post Reply
Message
Author
[bKa]_J.J.
Posts: 4
Joined: 14. Apr 2004 17:18

SNMP

#1 Post by [bKa]_J.J. »

Hi @all ,

also ich weiss ja nich ob das hier der richtige Ort ist, aber man kanns ja mal probieren.
Also, ich hab n Perlscript geschrieben, welches das SNMP-Protokoll benutzt um z.B. die Prozessorauslastung eines beliebigen Hosts in einem Netzwerk auszulesen.
Jetzt hab ich das Problem dass wenn der Host ein Windowsrechner ist funktioniert alles wunderbar , wenn dort aber nun Linux läuft erhalte ich einen Fehler .
Kann es evtl. sein das die besagte Prozessorauslastung unter Linux eine andere OID hat als unter Windows, und wenn ja welche !!???

Achso, wems hilft, hier is mal der Quelltext:


#!/usr/bin/perl -w

use SNMP::Multi;
use DBI;
use DBD::mysql;
require ("pm/variables.pm");

&variables();
my @ips1=("192.168.0.101", "192.168.0.1", "192.168.0.100");
&snmp_data();

#=============================================================================================================================

# Datenbankverbindung öffen
sub database_open {
$snmpmulti_connect="DBI:mysql:$database";
$snmpmulti_dbhandle = DBI->connect("$snmpmulti_connect","$sqluser","$sqlpass", {RaiseError => 1, AutoCommit => 1}) or die "Database connection not made:$DBI::errstr";
}


# SQL und Datenbankverbindung beenden
sub database_close {
$snmpmulti_sql->finish();
$snmpmulti_dbhandle->disconnect();
}


# prüfen ob SNMP Protokoll installiert ist
sub snmpcheck_agent {

$snmp_check = $_[0];
if(system ("snmpget -c public $snmp_check 1.3.6.1.2.1.1.1.0 -v2c >/dev/null") eq "0"){
return ("on");
}
else{
return ("off");
}
}


# SNMP Daten sammel und Datenbank füllen
sub snmp_data {

&database_open();
foreach (@ips1){
$snmp_aktip=$_;
if (&snmpcheck_agent($snmp_aktip) eq "on"){
my $snmp_req = SNMP::Multi::VarReq->new (
nonrepeaters => 2,
hosts => [ $snmp_aktip ],
# sysDescr hrProcessorLoad ifDescr
vars => [ [ '1.3.6.1.2.1.1.1' ], [ '1.3.6.1.2.1.25.3.3.1.2' ], [ '1.3.6.1.2.1.2.2.1.2' ],
# ifSpeed ifInOctet ifOutOctets
[ '1.3.6.1.2.1.2.2.1.5' ], [ '1.3.6.1.2.1.2.2.1.10' ], ['1.3.6.1.2.1.2.2.1.16'] ]
);
die "VarReq: $SNMP::Multi::VarReq::error\n" unless $snmp_req;
my $snmp_sm = SNMP::Multi->new (
Method => 'bulkwalk',
MaxSessions => 32,
PduPacking => 16,
Community => 'public',
Version => '2c',
Timeout => 5,
Retries => 3,
UseNumeric => 1,
)
or die "$SNMP::Multi::error";
$snmp_sm->request($snmp_req) or die $snmp_sm->error;
my $snmp_resp = $snmp_sm->execute() or die "Execute: $SNMP::Multi::error\n";
@snmp_gotlist=();
for my $snmp_host ($snmp_resp->hosts()) {
for my $snmp_result ($snmp_host->results()) {
if ($snmp_result->error()) {
print "Error with $snmp_host: " .$snmp_result->error() ."\n";
next;
}
for my $snmp_varlist ($snmp_result->varlists()) {
push (@snmp_gotlist,map {$_->fmt()} @$snmp_varlist);
}
}
}
@snmp_sysdescr=();
@snmp_load=();
@snmp_ifdescr=();
@snmp_ifspeed=();
@snmp_ifin=();
@snmp_ifout=();
@snmp_mac=();
foreach (@snmp_gotlist){
$snmp_one = $_;
$snmp_two = $_;
$snmp_three = $_;
$snmp_four = $_;
$snmp_five = $_;
$snmp_six = $_;
if ($snmp_one =~ /(sysDescr)/){
$snmp_one =~ s/\r|\n//gs;
$snmp_one =~ /(".+")/;
$snmp_one = $1;
$snmp_one =~ s/"//gi;
push (@snmp_sysdescr, $snmp_one);
}
if($snmp_two =~ /(hrProcessorLoad)/){
$snmp_two =~ /(".+")/;
$snmp_two = $1;
$snmp_two =~ s/"//gi;
push (@snmp_load, $snmp_two);
}
if($snmp_three =~ /(ifDescr)/){
$snmp_three =~ /(".+")/;
$snmp_three = $1;
$snmp_three =~ s/"//gi;
push (@snmp_ifdescr, $snmp_three);
}
if($snmp_four =~ /(ifSpeed)/){
$snmp_four =~ /(".+")/;
$snmp_four = $1;
$snmp_four =~ s/"//gi;
push (@snmp_ifspeed, $snmp_four);
}
if($snmp_five =~ /(ifInOctets)/){
$snmp_five =~ /(".+")/;
$snmp_five = $1;
$snmp_five =~ s/"//gi;
push (@snmp_ifin, $snmp_five);
}
if($snmp_six =~ /(ifOutOctets)/){
$snmp_six =~ /(".+")/;
$snmp_six = $1;
$snmp_six =~ s/"//gi;
push (@snmp_ifout, $snmp_six);
}
}

$snmp_a="0";
foreach(@snmp_sysdescr){
if(defined @snmp_sysdescr){
$snmp_mac_temp1 = `snmpwalk -c public $snmp_aktip 1.3.6.1.2.1.2.2.1.6 -v2c`;
@snmp_mac = split (/\n/,$snmp_mac_temp1);
foreach (@snmp_ifdescr) {
$snmp_mac_temp2 = $snmp_mac[$snmp_a];
$snmp_mac_temp2 =~ /(G:.+)/;
$snmp_mac_temp2 = $1;
$snmp_mac_temp2 =~ s/(G: )//gi;
if ($snmp_mac_temp2 eq ""){
$snmp_mac_temp2="[unknown]";
}

$snmpmulti_sql = $snmpmulti_dbhandle->prepare("SELECT sid FROM $table5 WHERE status=1");
$snmpmulti_sql->execute();
@snmp_jo=$snmpmulti_sql->fetchrow_array;
if (defined $snmp_jo[1]) {
die "ERROR";
}
if(defined $snmp_load[0]) {
$snmpmulti_sql = $snmpmulti_dbhandle->prepare("INSERT INTO $table6(ip, sysdescr, cpuload, ifdescr, ifspeed, ifin, mac, ifout, owner_pid, owner_sid) VALUES ('$snmp_aktip', '$snmp_sysdescr[0]', '$snmp_load[0]', '$snmp_ifdescr[$snmp_a]', '$snmp_ifspeed[$snmp_a]', '$snmp_ifin[$snmp_a]', '$snmp_mac_temp2', '$snmp_ifout[$snmp_a]', $$, '$snmp_jo[0]')");
$snmpmulti_sql->execute();
$snmp_a++;
}
else {
$snmpmulti_sql = $snmpmulti_dbhandle->prepare("INSERT INTO $table6(ip, sysdescr, cpuload, ifdescr, ifspeed, ifin, mac, ifout, owner_pid, owner_sid) VALUES ('$snmp_aktip', '$snmp_sysdescr[0]', '[unknown]', '$snmp_ifdescr[$snmp_a]', '$snmp_ifspeed[$snmp_a]', '$snmp_ifin[$snmp_a]', '$snmp_mac_temp2', '$snmp_ifout[$snmp_a]', $$, '$snmp_jo[0]')");
$snmpmulti_sql->execute();
$snmp_a++;
}
}
}
}
}
else {
$snmpmulti_sql = $snmpmulti_dbhandle->prepare("SELECT sid FROM $table5 WHERE status=1");
$snmpmulti_sql->execute();
@snmp_jo=$snmpmulti_sql->fetchrow_array;
$snmp_error="[unreachable]";
$snmpmulti_sql = $snmpmulti_dbhandle->prepare("INSERT INTO $table6(ip, sysdescr, cpuload, ifdescr, ifspeed, ifin, mac, ifout, owner_pid, owner_sid) VALUES ('$snmp_aktip', '$snmp_error', '$snmp_error', '$snmp_error', '$snmp_error', '$snmp_error', '$snmp_error' ,'$snmp_error', $$, '$snmp_jo[0]')");
$snmpmulti_sql->execute();
next;
}
}
&database_close();
}


Gruß und danke schon im Vorraus

Jens

User avatar
Lateralus
prolinux-forum-admin
Posts: 1238
Joined: 05. May 2004 7:35

#2 Post by Lateralus »

Du brauchst einen Demon, der auf die Anfragen reagiert.

http://www.die.net/doc/linux/man/man8/snmpd.8.html

[bKa]_J.J.
Posts: 4
Joined: 14. Apr 2004 17:18

#3 Post by [bKa]_J.J. »

Hey,

natürlich läuft der daemon, aber unter Linux wird wohl offensichtlich die "hrProzessorLoad" (1.3.6.1.2.1.25.3.3.1.2) OID nicht unterstützt. Meine Frage ist eigendlich nur ob die OID unter Linux evtl. eine Andere ist als unter Windows.

Gruß

Jens

Post Reply