Perl NetSNMP::agent 的使用

Perl NetSNMP::agent 的使用

我已经搜过论坛了,几乎找不到可以参考的资料。

我尝试用 NetSNMP::agent 模块来收集一些 lvs 的信息。然后让 cacti 通过 snmp 抓取。

按照 man snmpd.conf , 以及 NetSNMP::agent 的资料 我做了最简单的尝试。

创建一个 perl 脚本:

use Data::Dumper;
use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR);
sub myroutine  { print "abcd\n"; }
$agent->register('mylink', '.1.3.6.1.4.1.8225.4712', \&myroutine);


然后在 snmpd.conf 里面加入一行(我尝试了两种方法)

perl 'do /filepath';

perl do "/filepath";

但是都没办法获得数据:

snmpwalk -c tvu -v2c 172.16.1.200 .1.3.6.1.4.1.8225.4712
SNMPv2-SMI::enterprises.8225.4712 = No Such Object available on this agent at this OID

有人能帮忙么?
光 print 是不行的,需要 setValue。

哥们,告诉你一个网上冲浪的诀窍:凡事尽量看官网,那里资料比较多。
http://search.cpan.org/~hardaker ... m#Sub-agent_example
多谢老版
我看了官网,但是资历实在太浅,越看越迷糊。

我写上去的那两行 是 man snmpd.conf 里面的。

谢谢指点,我再研究研究。


QUOTE:
原帖由 latteye 于 2008-12-5 12:02 发表
多谢老版
我看了官网,但是资历实在太浅,越看越迷糊。

我写上去的那两行 是 man snmpd.conf 里面的。

谢谢指点,我再研究研究。

EXAMPLE 这个单词认识吗?
例子啊!例子!
完全可用的例子。
你用一个模块,却不去先看它的文档,跑论坛上搜,就算是能搜到答案也是别人嚼过的。
再给你个教程,也是官网上的。
http://www.net-snmp.org/wiki/ind ... ng_snmpd_using_perl
你不去官网,跑来上论坛搜索,真搞不懂你是怎么想的。
我从昨天中午就开始看 官方文档。你所给的链接我都看过。并且很认真的看了一天了。如果他的例子一下子就能跑起来,我也不用费劲来这里问。
论坛只在半个小时前搜了一下。

我知道我比较笨,但请不要认为我是白痴。

好,牢骚就发到这里。我还是得解决具体的问题。

我现在得让这个模块跑起来,所以写的越简单越好。我参考 Embedded agent example 写了一段。

        use NetSNMP::agent;
        my $agent;

        sub myhandler {
            my ($handler, $registration_info, $request_info, $requests) = @_;
              my $request = $requests;
                my $value = "OK";
                $request->setValue(ASN_OCTET_STR, $value);
        }

        $agent = new NetSNMP::agent(
                                'Name' => 'lvs'
                                );

        $agent->register("lvs", ".1.3.6.1.4.1.8072.9999.9999.7375",
                         \&myhandler);

        $agent->main_loop();


我现在是这么理解的。$agent->register 定义了名字和 oid。并且等待 &myhandler 的返回作为 snmp 的输出。
$request->setValue 则定义了输出的值以及值的类型。

my ($handler, $registration_info, $request_info, $requests) = @_;  其实是给 snmpd 用的,他接受了 C 传递过来的东西。在这里我先不去考虑他。

我直接将返回值定义为了 "OK"

不过这段还是没有能run起来。

[root@cacti ~]# snmpwalk -c tvu -v2c 172.16.1.200 .1.3.6.1.4.1.8072.9999.9999.7375
NET-SNMP-MIB::netSnmpPlaypen.7375 = No Such Object available on this agent at this OID

不知道问题出在了哪里,这个东西讨厌的是,没有log可以看。

非常感谢版主的帮助。



QUOTE:
原帖由 latteye 于 2008-12-5 13:06 发表
这个东西讨厌的是,没有log可以看。

你重启 snmpd 了没有?看过 /var/log/messages 和 /var/log/snmpd.log 了没有?

如果你从 snmpd.log 里面看到

QUOTE:
/etc/snmp/snmpd.conf: line xxx: Warning: Unknown token: perl.

那多半是你的 snmpd 不支持 embed perl,这一点在 man 5 snmpd.conf 里面说的很清楚:

QUOTE:
EMBEDDED PERL SUPPORT
       Warning: though embedded perl is working, not much functionality has been implemented yet and thus writing mib module pieces for the agent within perl
       is not trivial at this point.  It should get better in future releases.

       The  net-snmp  package has ability to call perl scripts directly inside the agent through embedded perl technology (similar to mod_perl for the apache
       web server).  This must be turned on at compile time by passing --enable-embedded-perl to the configure script when the package is built.  To  see  if
       your package was built with embedded perl, run "net-snmp-config --configure-options" and see if that flag was used.

你可以在你的机器上运行一下 net-snmp-config 命令检查一下。
我采用的是 sub agent 方式,需要在 snmpd.conf 中加上 “master agentx”。


QUOTE:
原帖由 flw 于 2008-12-5 13:33 发表

你重启 snmpd 了没有?看过 /var/log/messages 和 /var/log/snmpd.log 了没有?

如果你从 snmpd.log 里面看到

那多半是你的 snmpd 不支持 embed perl,这一点在 man 5 snmpd.conf 里面说的很清楚:

...

我仔细的看过 man 中和 perl 相关的部分。我也注意到了 perl 的支持是需要在 configure 的时候加入参数的。所以我很认真的将 rpm 的 src 文件抓了下来,检查过 config 文件。不用担心, CentOS 里面的rpm 已经加入了 snmpd 的支持。

另外,我确定我每次都重启过 snmpd 服务。

刚才又尝试了另外一段 例子:

        use NetSNMP::OID (':all');
        use NetSNMP::agent (':all');
        my $agent;

        sub myhandler {
            my ($handler, $registration_info, $request_info, $requests) = @_;
                for ($request = $requests; $request; $request = $request->next()) {
                my $value = "OK";
                $request->setValue(ASN_OCTET_STR, $value);
        }


{
        my $rootOID = ".1.3.6.1.4.1.8072.9999.9999.7375";
        my $regoid = new NetSNMP::OID($rootOID);
        $agent->register("lvs", $regoid,
                         \&myhandler);

       # $agent->main_loop();



看起来这段例子的不同之处在于他调用了 NetSNMP::OID 去处理了一次 oid 数字。我不知道是否有必要。难道 oid 真的不只是一串数字加标点?通过处理是有其他的格式?

总之,这段代码也没有跑起来。

你提到的 AgentX,之前我也很纳闷是什么意思,因为看到过:

        my $agent = new NetSNMP::agent(
                                # makes the agent read a my_agent_name.conf file

                                'Name' => "my_agent_name",
                                'AgentX' => 1
                                );



我再去仔细看看这段的概念,以及 agentx master 的效果。

谢谢!
1,run "net-snmp-config --configure-options" and see if that flag was used.
2,你看过 /var/log/messages 和 /var/log/snmpd.log 了吗?没什么异常吗?


QUOTE:
原帖由 flw 于 2008-12-5 13:56 发表
1,run "net-snmp-config --configure-options" and see if that flag was used.
2,你看过 /var/log/messages 和 /var/log/snmpd.log 了吗?没什么异常吗?

不知道为啥,我没有 net-snmp-config 命令,我再去找找。

我没有在 syslogd 里面分 net-snmp 的log,所以都在 messages 里面。一切正常。当我的启动的时候:

[Copy to clipboard] [ - ]
CODE:
Dec  5 05:40:16 localhost snmpd[4056]: Turning on AgentX master support.
Dec  5 05:40:16 localhost snmpd[4056]: Creating directory: /var/agentx
Dec  5 05:40:16 localhost snmpd[4056]: NET-SNMP version 5.3.1
Dec  5 05:40:21 localhost snmpd[4056]: Connection from UDP: [172.16.1.1]:32768
Dec  5 05:40:21 localhost snmpd[4056]: Received SNMP packet(s) from UDP: [172.16.1.1]:32768
Dec  5 05:40:21 localhost snmpd[4056]: Connection from UDP: [172.16.1.1]:32768

在最近的一次测试中我加入了 “master agentx”所以能看到上面的log。平时的话只有一行 “NET-SNMP version 5.3.1”。当然如果我加入了一行错误的 perl 脚本(彻底错误的那种),也能看到log报错的“Dec  4 08:48:51 localhost snmpd[2128]: embedded perl support failed to initalize”。但是现在已经没有这个情况了。

我之前提到“没有 log 能看”是指的 这段嵌入 perl 到底跑的咋样,没有log可以看。

刚刚加入了“master agentx”和:

       my $agent = new NetSNMP::agent(
                                'AgentX' => 1
                                );


还是没有得到正确的返回。
我再多看看wiki吧。

如果版主有现成可用的 perl 脚本,能给我参考的话,不胜感激。网页上的例子,很多都跑不起来。