【问题标题】:net-snmp perl subagent not being triggered by snmpgetnet-snmp perl 子代理没有被 snmpget 触发
【发布时间】:2013-08-08 22:57:51
【问题描述】:

我一直在开发自定义 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 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

我从 snmptranslate 得知 mib 文件设置正确。我什至查看了 snmpget 的调试(使用 -DALL),以确保正确加载和解析 mib。

所以我的问题是:为什么我的子代理没有通过请求?

更新:

@EhevuTov 告诉我我的 MIB 文件无效,但是 smilint 没有报告任何问题,并且运行 snmpget -v 2c -c mycommunity localhost:161 .1.3.6.1.4.1.42134.3.0 确实报告了对象的名称 (IDB-MIB::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' );

我隐约明白 bless 是做什么的,但即便如此,我也不知道这个结果应该是什么意思。所以我开始认为代理在某种程度上是错误的。有谁知道如何调试这些代理?有什么地方我可以查看它是否正确加载到主 snmpd 中?

【问题讨论】:

  • 您似乎没有正确的 MIB。
  • 啊,错字。修复了它,但它似乎仍然无法正常工作(我通过 mib 检查器运行它,simpleweb.org/ietf/mibs/validate,以确保没有其他问题)
  • 如果您使用的是*nix 操作系统,那么我建议安装libsmi,它是一个库和软件套件,并且也使用它的smilint MIB 检查器。我编写了一个 .sh 脚本,每当我更改/写入新的 MIB 时,它都会为我检查它。
  • 感谢您,非常有帮助。它显示了我的 MIB 中的另一个错误,我也已修复。但即使在那之后(并重新启动 snmpd 以防万一),代理仍然没有被调用。请注意,MIB 没有显示任何进一步的问题。
  • 运行snmpget -v 1 -c mycommunity localhost:161 test2 或:snmpget -v 1 -c mycommunity localhost:161 test2.0.1 时会发生什么

标签: perl snmp mib


【解决方案1】:

我已经解决了这个问题。不是 MIB,而是代理(我一直认为代理一直运行良好,所以我从不费心检查它)。

我一直在独立运行代理,因为它看起来工作正常(注册处理程序时从未抛出任何错误)。显然,它需要由 snmpd 直接运行。

我将它移到了 snmpd 可以访问的目录(因为显然 snmpd 也无法从 /root 运行脚本,即使它以 root 身份运行),并在 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";

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多