2016-06-03 2 views
3

Ich wurde gebeten, einen HP OpenView Agent auf einer Remote-Unix-Plattform zu installieren, um SNMP-Traps zu erfassen, die von einer Clientanwendung weitergeleitet werden.SNMPv3 zu SNMPv2 Klebeschicht

Ich habe seit dem entdeckt, dass die Client-Anwendung SNMPv3-Traps nur weiterleiten kann, und die Agenten, die wir verwenden, können nur SNMPv2-Traps akzeptieren.

Ich habe entdeckt, dass ich in der Lage sein kann, dieses Problem durch die Verwendung des Perl-Moduls NetSNMP::TrapReceiver zu lösen, aber ich bin unklar, wie dies eingerichtet ist/wie/wenn Sie eine v3-Trap in eine v2-Falle konvertieren können.

Mein Ziel ist es, die v3-Falle zu erfassen und, hoffentlich über ein Skript oder ein Werkzeug, dies in eine v2-Falle umzuwandeln und sie an einem alternativen Port zurückzuschicken.

+0

Entschuldigung, das ist zu weit um es sinnvoll zu beantworten. Es sollte möglich sein, einen SNMPv3-Trap abzufangen und einen neuen SNMPv2-Trap mit ungefähr ähnlichen Informationen zu erstellen. – Sobrique

+1

@Sobrique Ich stimme nicht zu, dass es zu breit ist. Vielleicht würde eine Umformulierung helfen: "Wie kann ich [NetSNMP :: TrapReceiver] (https://metacpan.org/pod/NetSNMP::TrapReceiver) verwenden, um SNMP-v3-Traps abzufangen und als v2-Traps weiterzuleiten?" Da snmptrapd beliebigen Perl-Code ausführen kann, erwarte ich, dass die Lösung nicht sehr lang ist. – ThisSuitIsBlackNot

+0

Ich bin verwirrt über Ihre Struktur: Sie erwähnen nirgends einen * Netzwerk-Manager *. Bedeutet Ihre * "Client-Anwendung" * Ihren neuen HP OpenView-Agenten? In welchem ​​Fall sind * die von uns verwendeten Agenten *? Dies ist ein Fall, in dem es nützlich wäre, ein Bild zu posten. – Borodin

Antwort

0

Durch Zufall habe ich die gleiche Aufgabe für jetzt. Also meine Entscheidung mit NetSNMP :: TRAPRECEIVER ist hier:

#!/usr/bin/perl 

use strict; 
use warnings; 
use diagnostics; 

use Net::SNMP; 
use SNMP; 
use Switch; 


my $snmpTrapDestHost = "127.0.0.1"; 
my $snmpTrapRemotePort = 16162; #other than default trap port or we got infinite trap loop 
my $snmpTrapCommunity = "public"; 
my $snmpTrapVersion = "2c"; 


my $sess = new SNMP::TrapSession(DestHost => $snmpTrapDestHost, Community => $snmpTrapCommunity, Version => $snmpTrapVersion, RemotePort => $snmpTrapRemotePort); 

sub my_receiver { 
    print "********** PERL RECEIVED A NOTIFICATION:\n"; 

    my @bunchOfVarbinds; 
    foreach my $x (@{$_[1]}) 
    { 
     printf "'%s' type='%d' value='%s'\n", $x->[0], $x->[2], $x->[1]; 
     my $lsOid = $x->[0]; 
     my $liOid = &SNMP::translateObj($lsOid); 
     my $lsVal = $x->[1]; 
     my $lType = $x->[2]; 
     my $lVal; 
# You need some convertion here, cause we got data in "human readable" format 
     switch($lType) 
     { 
      case Net::SNMP::OBJECT_IDENTIFIER 
      { 
       $lType = "OBJECTID"; 
       if ($lsVal =~ /OID\:\s+(.*)$/) 
       { 
        $lVal = $1 
       } 
       else 
       { 
        $lVal = $lsVal; 
       } 
       $lVal = &SNMP::translateObj($lVal); 
      } 
      case Net::SNMP::TIMETICKS 
      { 
       $lType = "TICKS"; 
       if($lsVal =~ /Timeticks\:\s+\((\d+)\)\s+.*$/) 
       { 
        $lVal = $1; 
       } 
       else 
       { 
        my ($d, $h, $m, $s) = split(/\:/, $lsVal); 
        $lVal = $d * 24; 
        $lVal = ($lVal + $h)*60; 
        $lVal = ($lVal + $m)*60; 
        $lVal = ($lVal + $s)*100; 
       } 
      } 
      case Net::SNMP::OCTET_STRING 
      { 
       $lType = "OCTETSTR"; 
       my $isHex; 
       ($isHex, $lVal) = split(/STRING\:\s*/, $lsVal); 
       if (!defined($lVal)) 
       { 
        $lVal = $lsVal; 
       } 
       $lVal =~ s/"//g; 

       if (defined($isHex)) 
       { 
        if($isHex eq "Hex-") 
        { 
         $lVal =~ s/\n//g; 
         $lVal =~ s/ //g; 
        } 
       } 
      } 
      case Net::SNMP::INTEGER 
      { 
       $lType = "INTEGER"; 
       $lVal = $lsVal; 
      } 
      case Net::SNMP::IPADDRESS 
      { 
# IPADDR 
# NETADDR 
       $lType = "IPADDR"; 
       $lVal = $lsVal; 
      } 
      case Net::SNMP::COUNTER 
      { 
# COUNTER 
       $lType = "COUNTER"; 
       $lVal = $lsVal; 
      } 
      case Net::SNMP::COUNTER64 
      { 
# COUNTER64 
       $lType = "COUNTER64"; 
       $lVal = $lsVal; 
      } 
      case Net::SNMP::GAUGE 
      { 
# GAUGE 
       $lType = "GAUGE"; 
       $lVal = $lsVal; 
      } 
      case Net::SNMP::NULL 
      { 
# NULL 
       $lType = "NULL"; 
       $lVal = $lsVal; 
      } 
      else 
      { 
# UINTEGER 
# OPAQUE 
       $lVal = $lsVal; 
      } 
     }   
     push @bunchOfVarbinds, new SNMP::Varbind([$liOid, undef, $lVal, $lType]); 

    } 

    my $vl = new SNMP::VarList(@bunchOfVarbinds); 

    $sess->trap(
        oid => $initiTrapProxyServiceOid, 
        uptime => $trapUptimeValue, 
        $vl 
       ); 

    return NETSNMPTRAPD_HANDLER_OK; 
} 

$SNMP::use_numeric = 1; 
NetSNMP::TrapReceiver::register("all", \&my_receiver) || 
warn "failed to register perl trap handler\n"; 
print STDERR "Loaded perl snmptrapd handler\n"; 

Ich bin Neuling in Perl so werden alle Korrekturen geschätzt.

Verwandte Themen