net-snmp perl子代理不是由snmpget触发的
我一直在研究自定义的SNMP Mib,我试图让代理返回正确的数据时遇到了问题.
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 requestn"; for ($request = $requests; $request; $request = $request->next()) { # # Work through the list of varbinds # my $oid = $request->getOID(); print "Got request for oid $oin"; if ($request_info->getMode() == MODE_GET) { if ($oid == new NetSNMP::OID($rootOID . ".3")) { $request->setValue(ASN_INTEGER,2); } } } } { $subagent = 0; print "Running new agentn"; 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 subagentn"; } print "Registering agentn"; $agent->register("my_agent_name",$regoid,&;myhandler); print "Agent registeredn"; 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 agentn"; } 当我运行代理时,我得到以下内容: 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 我从snmptranslate知道mib文件设置正确.我甚至查看了snmpget的调试(使用-DALL)以确保正确加载和解析mib. 所以我的问题是:为什么我的子代理没有通过请求? 更新: 我被@EhevuTov告知我的MIB文件无效,但是smilint没有报告任何问题并且运行snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3.0报告了NAME对象(IDB-MIB :: test2.0)正确,但没有找到任何数据. 我在这个OID上获得IDB-MIB :: test2 =此代理上没有这样的对象,这让我认为我的代理没有正确注册,但是它没有丢失任何错误. 更新2: 我一直在调整代理代码.根据CPAN文档(http://metacpan.org/pod/NetSNMP::agent),如果成功,$agent->寄存器函数调用应该返回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没有关系,它与代理商(我曾经认为一直工作正常,所以我从不打扰检查它).
我一直在运行代理,因为它似乎工作正常(在注册处理程序时从未丢失任何错误).显然,它需要由snmpd直接运行. 我将它移动到snmpd可以访问的目录(因为显然snmpd也无法从/ root运行脚本,即使它以root身份运行),并在snmpd.conf中添加了这些行: perl print "nRunning agents nown"; perl do "/usr/share/snmp/agent.pl" || print "Problem running agent script: $!n"; perl print "Agents runn"; 请注意,这两行已经存在: disablePerl false perlInitFile /usr/share/snmp/snmp_perl.pl 我现在可以运行snmpget命令并获得预期的响应. > snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3 IDB-MIB::test2 = INTEGER: 2 tests (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |