net-snmp perl子代理不是由snmpget触发的

前端之家收集整理的这篇文章主要介绍了net-snmp perl子代理不是由snmpget触发的前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在研究自定义的SNMP Mib,我试图让代理返回正确的数据时遇到了问题.

MIB(通过运行smilint -l 6验证):

  1. IDB-MIB DEFINITIONS ::= BEGIN
  2.  
  3. IMPORTS
  4. MODULE-IDENTITY,OBJECT-TYPE,Integer32,enterprises
  5. FROM SNMPv2-SMI
  6. MODULE-COMPLIANCE,OBJECT-GROUP FROM SNMPv2-CONF;
  7.  
  8. idb MODULE-IDENTITY
  9. LAST-UPDATED "201307300000Z" -- Midnight 30 July 2013
  10. ORGANIZATION "*********"
  11. CONTACT-INFO "email: *******"
  12. DESCRIPTION "description"
  13. REVISION "201307300000Z" -- Midnight 29 July 2013
  14. DESCRIPTION "First Draft"
  15. ::= { enterprises 42134 }
  16.  
  17. iDBCompliance MODULE-COMPLIANCE
  18. STATUS current
  19. DESCRIPTION
  20. "Compliance statement for iDB"
  21. MODULE
  22. GROUP testGroup
  23. DESCRIPTION
  24. "This group is a test group"
  25. ::= {idb 1}
  26.  
  27. test2 OBJECT-TYPE
  28. Syntax Integer32
  29. UNITS "tests"
  30. MAX-ACCESS read-write
  31. STATUS current
  32. DESCRIPTION
  33. "A test object"
  34. DEFVAL { 5 }
  35. ::= { idb 3 }
  36.  
  37. testGroup OBJECT-GROUP
  38. OBJECTS {
  39. test2
  40. }
  41. STATUS current
  42. DESCRIPTION "all test objects"
  43. ::= { idb 2 }
  44.  
  45. END

代理文件

  1. #!/usr/bin/perl
  2.  
  3. use NetSNMP::OID(':all');
  4. use NetSNMP::agent(':all');
  5. use NetSNMP::ASN(':all');
  6.  
  7. sub myhandler {
  8. my ($handler,$registration_info,$request_info,$requests) = @_;
  9. print "Handling request\n";
  10. for ($request = $requests; $request; $request = $request->next()) {
  11. #
  12. # Work through the list of varbinds
  13. #
  14. my $oid = $request->getOID();
  15. print "Got request for oid $oi\n";
  16. if ($request_info->getMode() == MODE_GET) {
  17. if ($oid == new NetSNMP::OID($rootOID . ".3")) {
  18. $request->setValue(ASN_INTEGER,2);
  19. }
  20. }
  21. }
  22. }
  23.  
  24. {
  25. $subagent = 0;
  26.  
  27. print "Running new agent\n";
  28. my $rootOID = ".1.3.6.1.4.1.42134";
  29. my $regoid = new NetSNMP::OID($rootOID);
  30. if (!$agent) {
  31. $agent = new NetSNMP::agent('Name'=>'my_agent_name','AgentX' => 1);
  32. $subagent = 1;
  33. print "Starting subagent\n";
  34. }
  35. print "Registering agent\n";
  36. $agent->register("my_agent_name",$regoid,\&myhandler);
  37. print "Agent registered\n";
  38.  
  39. if ($subagent) {
  40. $SIG{'INT'} = \&shut_it_down;
  41. $SIG{'QUIT'} = \&shut_it_down;
  42. $running = 1;
  43.  
  44. while ($running) {
  45. $agent->agent_check_and_process(1);
  46. }
  47.  
  48. $agent->shutdown();
  49. }
  50. }
  51.  
  52. sub shut_it_down() {
  53. $running = 0;
  54. print "Shutting down agent\n";
  55. }

当我运行代理时,我得到以下内容

  1. Running new agent
  2. Starting subagent!
  3. Registering agent with oid idb
  4. Agent registered

所以我知道有很多工作要做.但是,当我运行以下命令时:

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

我收到此错误消息:

  1. Error in packet
  2. Reason: (noSuchName) There is no such variable name in this MIB.
  3. 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.所以我检查了返回代码,得到了这个:

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

使用Data :: Dumper将其打印出来:

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

我模糊地理解了什么是祝福,但即便如此,我也不知道这个结果应该是什么意思.所以我开始认为代理人在某种程度上是错误的.有谁知道如何调试这些代理?有什么地方我可以看看它是否正确加载到主snmpd?

解决方法

我已经解决了这个问题.它与MIB没有关系,它与代理商(我曾经认为一直工作正常,所以我从不打扰检查它).

我一直在运行代理,因为它似乎工作正常(在注册处理程序时从未丢失任何错误).显然,它需要由snmpd直接运行.

我将它移动到snmpd可以访问的目录(因为显然snmpd也无法从/ root运行脚本,即使它以root身份运行),并在snmpd.conf中添加了这些行:

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

请注意,这两行已经存在:

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

我现在可以运行snmpget命令并获得预期的响应.

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

猜你在找的Perl相关文章