2013-08-08 15 views
8

ho lavorato su un costume SNMP MIB e mi è venuta contro un muro durante il tentativo di ottenere un agente per restituire i dati corretti.net-snmp perl subagente non essere innescato da snmpget

MIB (convalidato eseguendo smilint -l 6): file di

IDB-MIB DEFINITIONS ::= BEGIN 

IMPORTS 
     MODULE-IDENTITY, OBJECT-TYPE, Integer32, enterprises 
      FROM SNMPv2-SMI 
     MODULE-COMPLIANCE, OBJECT-GROUP FROM SNMPv2-CONF; 

idb MODULE-IDENTITY 
    LAST-UPDATED "201307300000Z" -- Midnight 30 July 2013 
    ORGANIZATION "*********" 
    CONTACT-INFO "email: *******" 
    DESCRIPTION "description" 
    REVISION "201307300000Z" -- Midnight 29 July 2013 
    DESCRIPTION "First Draft" 
::= { enterprises 42134 } 

iDBCompliance MODULE-COMPLIANCE 
    STATUS current 
    DESCRIPTION 
     "Compliance statement for iDB" 
    MODULE 
     GROUP testGroup 
     DESCRIPTION 
      "This group is a test group" 
::= {idb 1} 

test2 OBJECT-TYPE 
SYNTAX   Integer32 
UNITS   "tests" 
MAX-ACCESS  read-write 
STATUS   current 
DESCRIPTION 
     "A test object" 
DEFVAL { 5 } 
::= { idb 3 } 

testGroup OBJECT-GROUP 
     OBJECTS { 
      test2 
     } 
     STATUS current 
     DESCRIPTION "all test objects" 
::= { idb 2 } 

END 

Agente:

#!/usr/bin/perl 

use NetSNMP::OID(':all'); 
use NetSNMP::agent(':all'); 
use NetSNMP::ASN(':all'); 

sub myhandler { 
    my ($handler, $registration_info, $request_info, $requests) = @_; 
    print "Handling request\n"; 
    for ($request = $requests; $request; $request = $request->next()) { 
     # 
     # Work through the list of varbinds 
     # 
     my $oid = $request->getOID(); 
     print "Got request for oid $oi\n"; 
     if ($request_info->getMode() == MODE_GET) { 
      if ($oid == new NetSNMP::OID($rootOID . ".3")) { 
       $request->setValue(ASN_INTEGER, 2); 
      } 
     } 
    } 
} 

{ 
    $subagent = 0; 

    print "Running new agent\n"; 
    my $rootOID = ".1.3.6.1.4.1.42134"; 
    my $regoid = new NetSNMP::OID($rootOID); 
    if (!$agent) { 
     $agent = new NetSNMP::agent('Name'=>'my_agent_name','AgentX' => 1); 
     $subagent = 1; 
     print "Starting subagent\n"; 
    } 
    print "Registering agent\n"; 
    $agent->register("my_agent_name", $regoid, \&myhandler); 
    print "Agent registered\n"; 

    if ($subagent) { 
     $SIG{'INT'} = \&shut_it_down; 
     $SIG{'QUIT'} = \&shut_it_down; 
     $running = 1; 

     while ($running) { 
      $agent->agent_check_and_process(1); 
     } 

     $agent->shutdown(); 
    } 
} 

sub shut_it_down() { 
    $running = 0; 
    print "Shutting down agent\n"; 
} 

Quando eseguo l'agente ricevo il seguente:

Running new agent 
Starting subagent! 
Registering agent with oid idb 
Agent registered 

Quindi so che molto sta funzionando. Tuttavia quando ho eseguito il seguente comando:

snmpget -v 1 -c mycommunity localhost:161 test2.0 

ricevo questo messaggio di errore:

Error in packet 
Reason: (noSuchName) There is no such variable name in this MIB. 
Failed object: IDB-MIB::test2.0 

So per snmptranslate che il file MIB è impostato correttamente. Ho anche controllato il debug per snmpget (usando -DALL) per assicurarmi che il mib sia stato caricato e analizzato correttamente.

Quindi la mia domanda è: perché è il mio agente secondario non viene passata la richiesta?

Aggiornamento:

mi è stato detto da @EhevuTov che il mio file MIB non è valida, tuttavia smilint non segnalare eventuali problemi e funzionante snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3.0 fa segnalare il nome dell'oggetto (IDB-MIB: : test2.0) correttamente, ma non trova alcun dato per questo.

sto ottenendo IDB-MIB::test2 = No Such Object available on this agent at this OID, che mi fa pensare che il mio agente non sta registrando correttamente, tuttavia non è gettare eventuali errori.

Aggiornamento 2:

mi è stato trafficando con il codice agente un po '. Sulla base della documentazione CPAN (http://metacpan.org/pod/NetSNMP::agent), sembra che la chiamata $agent->register funzione deve restituire 0 in caso di successo. Così ho controllato il codice di ritorno e ottenuto questo:

Agent registered. Result: NetSNMP::agent::netsnmp_handler_registration=SCALAR(0x201e688) 

stamparlo utilizzando Data::Dumper risultati in:

$VAR1 = bless(do{\(my $o = 34434624)}, 'NetSNMP::agent::netsnmp_handler_registration'); 

ho vagamente capire cosa benedica fa, ma anche così, non ho idea di che cosa questo risultato dovrebbe significare. Quindi sto iniziando a pensare che l'agente abbia torto in qualche modo. Qualcuno sa come eseguire il debug di questi agenti? C'è un posto dove posso vedere se viene caricato correttamente nel master snmpd?

+0

Non sembra che tu abbia un MIB adeguato. – EhevuTov

+0

Ah, errore di battitura. Risolto il problema e non sembra funzionare (l'ho passato attraverso un controllo di mib, http://www.simpleweb.org/ietf/mibs/validate/, per assicurarmi che non ci fossero altri problemi) –

+2

Se tu Usiamo un sistema operativo * nix, quindi suggerisco di installare 'libsmi', che è una libreria e una suite software, e usarlo anche con il controllo MIB' smilint'. Scrivo uno script .sh che lo controlla per me ogni volta che cambio/scrivo nel nuovo MIB. – EhevuTov

risposta

2

E ho risolto il problema. Non era con il MIB, era con l'agente (che avevo pensato che funzionasse bene tutto il tempo quindi non mi sono mai preso la briga di controllarlo).

ero stato in esecuzione l'agente stand-alone, in quanto sembrava che stava lavorando bene (mai gettato eventuali errori durante la registrazione del gestore). Apparentemente però, deve essere eseguito direttamente da snmpd.

ho spostato in una directory che snmpd può accedere (a causa anche a quanto pare snmpd non può eseguire script da/root, anche se è in esecuzione come root), e ha aggiunto queste righe nel snmpd.conf:

perl print "\nRunning agents now\n"; 
perl do "/usr/share/snmp/agent.pl" || print "Problem running agent script: $!\n"; 
perl print "Agents run\n"; 

Si noti che queste due linee erano già presenti:

disablePerl false 
perlInitFile /usr/share/snmp/snmp_perl.pl 

ora posso eseguire il comando snmpget e ottenere la risposta attesa.

> snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3 
IDB-MIB::test2 = INTEGER: 2 tests