私はカスタムSNMP Mibで作業していましたが、適切なデータを返すようにエージェントを取得しようとしている間に壁に立ちました。net-snmp perlサブエージェントがsnmpgetによってトリガーされていない
MIB(smilint -l 6
を実行することによって検証):
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
エージェントファイル:私はエージェントを実行すると
#!/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";
}
私は、次を得る:
Running new agent
Starting subagent!
Registering agent with oid idb
Agent registered
だから私はことを知っています多くは働いている。私は、次のコマンドを実行したときしかし:
snmpget -v 1 -c mycommunity localhost:161 test2.0
を私は、このエラーメッセージが表示されます:
Error in packet
Reason: (noSuchName) There is no such variable name in this MIB.
Failed object: IDB-MIB::test2.0
私はMIBファイルが正しく設定されていることsnmptranslateから知っています。私はsnmpget(-DALLを使って)のデバッグを見て、MIBがロードされ、正しく解析されていることを確認しました。
私の質問は次のとおりです。なぜ、私のサブエージェントはリクエストを受け付けないのですか?
更新:
私は、しかしsmilintはすべての問題を報告し、snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3.0
を実行すると、オブジェクト(IDB-MIBの名前を報告していない私のMIBファイルが有効でないことを@EhevuTovで言われてきました。 :test2.0)は正しく検索されますが、データは見つかりません。
私はIDB-MIB::test2 = No Such Object available on this agent at this OID
を取得しています。私のエージェントは正しく登録されていないと思われますが、エラーは発生しません。
アップデート2:
私は、エージェントコードで周りのビットをいじってきました。 CPANのドキュメント(http://metacpan.org/pod/NetSNMP::agent)に基づいて、$agent->register
ファンクションコールは、成功した場合は0
を返すように見えます。だから私は、リターンコードをチェックして、この得た:
Agent registered. Result: NetSNMP::agent::netsnmp_handler_registration=SCALAR(0x201e688)
でData::Dumper
結果を使用して、それをプリントアウト:私は漠然とし祝福を理解、しかし、そうであっても、私は全く分からないものを、この結果を持って
$VAR1 = bless(do{\(my $o = 34434624)}, 'NetSNMP::agent::netsnmp_handler_registration');
を意味するはずです。だから私はエージェントが何とか間違っていると思っています。誰もがこれらのエージェントをデバッグする方法を知っていますか?マスターのsnmpdに正しくロードされているかどうかを調べることができますか?
適切なMIBがないようです。 – EhevuTov
ああ、タイプミス。それを修正してもまだ動作していないようです(他の問題がないことを確認するには、mib checkerを使って実行しました。http://www.simpleweb.org/ietf/mibs/validate/) –
* nix OSを使っているなら、ライブラリとソフトウェアスイートである 'libsmi'をインストールし、' smilint' MIBチェッカーを使うことをお勧めします。私は新しいMIBに変更したり書き込んだりするたびに私のためにチェックする.shスクリプトを書いています。 – EhevuTov