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
SNMP
Du brauchst einen Demon, der auf die Anfragen reagiert.
http://www.die.net/doc/linux/man/man8/snmpd.8.html
http://www.die.net/doc/linux/man/man8/snmpd.8.html
-
- Posts: 4
- Joined: 14. Apr 2004 17:18