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?
Non sembra che tu abbia un MIB adeguato. – EhevuTov
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) –
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