`

net-snmp开发简介

    博客分类:
  • SNMP
阅读更多
1、安装

./configure

make

make install


2、配置参数/文件

只有适当的配置snmpd.conf文件,snmpd才能运行起来。

位置:

可以在./configure的时候指定配置文件所在的位置,也可以用--with-persistent-directory="path"的命令行指定配置文件所在的位置。

文件的配置:

配置文件对于net-snmp的运行十分重要,net-snmp中提供了一个EXAMPLE.conf。

可以在EXAMPLE.conf的基础上进行修改,需要修改的地方主要包括:

1) com2sec 设置可访问的IP地址,访问的口令以及分组

#     sec.name                source                  community

com2sec local              localhost                  private

com2sec mynetwork    10.8.0.0/16              private

2)group   设置安全用户名的组

#              sec.model          sec.name

group         MyRWGroup v1         local

group         MyRWGroup v2c        local

group         MyRWGroup usm        local

group         MyROGroup v1         mynetwork

group         MyROGroup v2c        mynetwork

group         MyROGroup usm        mynetwork

3)view  可以对哪些MIB子树进行访问

#               incl/excl                subtree                          mask

view all          included              .1

4)access   指定各个组对MIB子数的读写权限

#       context sec.model  sec.level  match             read  write  notif
access MyROGroup ""      any       noauth    exact  all    none    none
access MyRWGroup ""      any       noauth    exact  all    all    none


3、命令行

在./configure ; make; make install之后在net-snmp/agent目录下会生成一系列的可执行文件。可以用命令行调用这些执行文件,主要用于测试。主要的命令包括:

先在一个窗口中执行./snmpd

1、snmptable

再打开另一个窗口执行snmptable –v 1 –c demopublic -Os localhost  sysORTable,会显示sysORTable的详细信息。(获得table的信息)

2、snmpget

可以执行 snmpget –v 1 –c public localhost SNMPv2-MIB::sysUpTime.0,会得到sysUpTime变量的值。(获得普通变量的信息)。

3、......

自己查吧 :http://net-snmp.sourceforge.net/wiki/index.php/Tutorials


4、创建私有MIB文件

想要扩展agent吗?先学写MIB文件。

MIB文件的格式比较简单,参照标准MIB文件写就OK了,之后可以用MG-soft编译。在archlinux上MIB文件库是放在/usr/share/snmp/mibs/下面。

几点注意的问题:

1、注意IMPORTS 私有mib的上级节点

2、注意IMPORTS 变量的类型名,如DisplayString,直接使用的话是不能识别的。

3、注意大小写。

4、注意编译的时候一定把error和warning全都消灭掉。


5、扩展 agent

到这里你已经应该正确的写出了一个私有的MIB文件,你需要把它放置到系统的MIB文件库中。我的系统的MIB库路径是/usr/share/snmp/mibs/。

然后开始学习使用MIB2C这个强大的工具,它的作用是把你写好的一个MIB文件,转化成一个或多个在net-snmp下可以使用的.c/.h文件。

一个简单的例子:当你写成了一个叫做ucdDemoPublic的私有MIB文件。

mib2c -c mib2c.scalar.conf  ucdDemoPublic就可以生成ucdDemoPublic.c和ucdDemoPublic.h

MIB2C有很多版本,也有很多参数可供选择,可以在netsnmp的官网上查到:http://net-snmp.sourceforge.net/docs/man/mib2c.html

重要的参数是 –c 后面的那个.conf值:

mib2c.mfd.conf
mib2c.scalar.conf
mib2c.int_watch.conf
mib2c.iterate.conf
mib2c.create-dataset.conf
mib2c.array-user.conf
mib2c.column_defines.conf
mib2c.column_enums.conf

一个重要的问题:

在使用mib2c时,需要配置一个mib2c的配置文件:snmp.conf

我的配置文件路径是:/var/net-snmp/snmp.conf

在配置文件中要加入类似下面的语句,表示我要把XXX-MIB.txt这个mib文件转化成c文件。

mibfile /usr/share/snmp/mibs/XXX-MIB.txt

简单变量的代码生成

用mib2c.scalar.conf生成简单MIB变量的XXX.c和XXX.h,如上例。生成MIB之后需要自己根据具体参数的含义,修改get或set时的动作。在XXX.c中包含两个重要的函数:init_XXX()和handle_XXX(),需要在init_XXX中修改oid,在handle_XXX中的case MODE_GET和case MODE_SET_ACTION中设置GTE和SET的函数。

Table变量的代码生成

用mib2c.mfd.conf生成table类型的MIB文件,生成的文件比较多,包括:XXX.c/.h;XXX_data_access.c/.h; XXX_data_get.c/.h; XXX_data_set.c/.h; XXX_enums.h; XXX_interface.c/.h; XXX_oids.h;

Snmpget的修改:需要修改的是XXX_data_access.c中的XXX__container_load函数,修改XXXTable中的变量值。

Snmpset的修改:需要修改的是:

XXX_data_set.c:XXXTable_commit中设置rowreq_ctx->column_set_flags的值,表示已经修改了XXXTable中的某一项。

XXX_data_set.c:中所有的XXX_set.c中指定自己想要的值。

代码集成     

生成了正确的.c/.h文件之后,需要把代码继承到snmpd中,有两种比较靠谱的方法:

1、  把所扩展的agent MIB,静态的集成到snmpd中。方法:把所生成的.c/.h文件拷贝到/net-snmp/agent/mibgroup下面,然后重新 ./configure --with-mib-modules="XXX"; make; make install, 好了你的私有MIB已经被静态集成到snmpd里面了,最后用命令行snmpget;snmpset试验一下。

2、  是动态加载的方式,自己写一个makefile,把所有生成的.c/.h编译成为一个.so,把这个.so放到一个特定的路径下面,并在snmpd.conf文件中指明.so的位置。

1)编译的时候除指定-fPIC -shared -O0参数之外,还需要指定= -I. `net-snmp-config --cflags`,在最后链接成.so的时候还需要指定`net-snmp-config --libs`参数

2)在需要在snmpd.conf文件中指定.so的位置:如

dlmod exampleTable /usr/lib/exampleTable.so

3)在运行./snmpd的时候需要指定所需的.so如:

./snmpd –f –L –Dexample,DLmod,

这样也可以实现对agent的动态扩展。


6、扩展trap


net-snmp的trap也是可以扩展的,我用的方法是把写好的trap代码(.c)放到snmp/snmplib下面,修改一下snmplib的Makefile,make;make install,即可

其代码的样例如下:


view plaincopy to clipboardprint?
#include <net-snmp/net-snmp-config.h>  
#include <net-snmp/net-snmp-includes.h>  
config_require(util_funcs)          
int  TrapSendTest()  
{  
    netsnmp_session session,*ss;  
    netsnmp_pdu *pdu;  
    long sysuptime;  
    char csysuptime[20];  
    int status = 0;  
    oid oid_sysuptime[] = { 1,3,6,1,2,1,1,3,0 };  
    char *cp1 = "10.8.72.1", *cp2 = "public";   
 
    snmp_sess_init(&session);  
    session.version = SNMP_VERSION_2c;  
    session.peername = cp1;  
    session.remote_port = 162;  
    session.community = (unsigned char*)cp2;  
    session.community_len = strlen((char *)session.community);  
    session.retries = 3;  
    session.timeout = 2000;  
    session.sessid = 0;  
 
    SOCK_STARTUP;  
    ss = snmp_add(&session,netsnmp_transport_open_client("snmptrap",   
        session.peername),  
        NULL,   
        NULL);  
    if (ss == NULL)   
    {  
        snmp_sess_perror("snmptable", &session);  
        SOCK_CLEANUP;  
    }  
    pdu = snmp_pdu_create(SNMP_MSG_TRAP2);    
    sysuptime = get_uptime();  
    sprintf(csysuptime, "%ld", sysuptime);   
    status = snmp_add_var(pdu, oid_sysuptime, OID_LENGTH(oid_sysuptime), 't', csysuptime);   
    if(status != 0)  
    {   
        snmp_sess_perror("snmptrap add sysuptime error!", &session);  
        return -1;  
    }  
    status = snmp_send(ss, pdu);  
    if (status == 0)  
    {   
        snmp_sess_perror("snmptrap send info error!", &session);  
        snmp_free_pdu(pdu);  
        return -2;  
    }   
    snmp_close(ss);  
    snmp_shutdown("snmptrap");  
    return 0;  

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
config_require(util_funcs)       
int  TrapSendTest()
{
    netsnmp_session session,*ss;
    netsnmp_pdu *pdu;
    long sysuptime;
    char csysuptime[20];
    int status = 0;
    oid oid_sysuptime[] = { 1,3,6,1,2,1,1,3,0 };
    char *cp1 = "10.8.72.1", *cp2 = "public";

    snmp_sess_init(&session);
    session.version = SNMP_VERSION_2c;
    session.peername = cp1;
    session.remote_port = 162;
    session.community = (unsigned char*)cp2;
    session.community_len = strlen((char *)session.community);
    session.retries = 3;
    session.timeout = 2000;
    session.sessid = 0;

    SOCK_STARTUP;
    ss = snmp_add(&session,netsnmp_transport_open_client("snmptrap",
        session.peername),
        NULL,
        NULL);
    if (ss == NULL)
    {
        snmp_sess_perror("snmptable", &session);
        SOCK_CLEANUP;
    }
    pdu = snmp_pdu_create(SNMP_MSG_TRAP2); 
    sysuptime = get_uptime();
    sprintf(csysuptime, "%ld", sysuptime);
    status = snmp_add_var(pdu, oid_sysuptime, OID_LENGTH(oid_sysuptime), 't', csysuptime);
    if(status != 0)
    {
        snmp_sess_perror("snmptrap add sysuptime error!", &session);
        return -1;
    }
    status = snmp_send(ss, pdu);
    if (status == 0)
    {
        snmp_sess_perror("snmptrap send info error!", &session);
        snmp_free_pdu(pdu);
        return -2;
    }
    snmp_close(ss);
    snmp_shutdown("snmptrap");
    return 0;
}


在实际用的时候,改一改参数就OK了。

Makefile的修改:

在.o和.lo编译目标列表尾部加入你所加入的文件名即可:XXX.o和XXX.lo, 这样你扩展的trap就静态加入snmpd中了

Snmpd的调用:snmpd的监听程序和你所扩展的trap程序是不能顺序运行的,否则会互相影响。所以要fork一下,父子进程分别运行。


7、调试方法




1、可以使用strace  -f  -L ./snmpd的方法跟踪snmpd调用的系统调用,来猜测snmpd的运行流程         

2、由于snmpd是后台运行的,可以用syslog.


8、总结

net-snmp很好很强大,但是总是有BUG,当你实在找不到错误原因时,不妨找找它的BUG


好运!



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sealyao/archive/2009/09/12/4545082.aspx
分享到:
评论

相关推荐

    net-snmp开发详解

    移植net-snmp和应用net-snmp开发流程详解。适合于初学者

    net-snmp源码包,学习开发

    net-snmp-5.9.1.tar.gz,可移植,开发学习

    Net-SNMP代理开发实例程序

    这个是本人由于公司需要扩展Net-SNMP的Agent而写的一个开发流程文档,压缩包中也包含程序的源代码,和配置文件。根据Net-SNMP官方的实例程序,详细介绍了SNMP代理开发的各个步骤,各位读者按照步骤可以轻松的完成一...

    net-snmp agent开发详解-

    扩展一个子代理,让SNMPD以主代理的模式运行,对于SNMPD我们只要让它启动就可以,不需要任何的更改和配置,把子代理编译生成的程序运行起来就可以扩展自定义的MIB库

    net-snmp开发

    本文档是有关于net-snmp开发具体流程,每一步具体操作和注意事项说明。

    net-snmp开发教程

    net-snmp比较详细开发教程,详细介绍了net-snmp开发过程以及net-snmp开发环境配置和相应工具的使用,

    net-snmp_开发

    net-snmp 的基本开发流程。 包括开发环境,开发方法等。 供 SNMP 网管开发参考。

    用net-snmp的api实现trap接收,windows+linux

    用net-snmp的c apis实现trap的接收,类似于snmptrapd工具的实现,但是更为简单。

    net-snmp-5.3.1.tar.gz_NET-SNMP_net-snmp-5_net-snmp-5.3_net-snmp-

    有两个开放的SNMP开发库,也是现在用的最多的!一个net-snmp,一个是snmp++,都可以夸平台,但是net-snmp是基于c语言的,而snmp++是基于C++的,并且一般多用于Windows,反之net-snmp多用于Linux!

    用NET-SNMP软件包开发简单客户端代理

    对于net-snmp我也是一个初学者,开始学习时也碰到了很多低级的问题。在很多论坛上(事实上比较少^_^, 建议大家直接去sourcefoge社区看关于net-snmp的mail-list),都没有比较初级入门的文章,本着开源学习的精神,把...

    net-snmp编译好的lib库

    net-snmp5.7.1版本的lib库及dll文件,使用VS2010编译出来的,...包含netsnmp.lib netsnmpagent.lib netsnmpmibs.lib netsnmptrapd.lib netsnmp.dll,以及相应的头文件,可以在windows平台下开发net-snmp的Agent扩展程序

    NET-SNMP流程图 (1)_SNMP_snmp流程_NET-SNMP_原理图_

    NET-SNMP协议原理流程图解 SNMP、NET-SNMP开发

    net-snmp5.5-win

    net-snmp5.5-win 是在windows下的snmp软件开发包,同时包括net-snmp的开发库,帮助文档等等,不错!我毕设就是用它了!

    用NET-SNMP软件包开发简单客户端代理.pdf

    用NET-SNMP软件包开发简单客户端代理.pdf

    Net-SNMP动态库方式扩展MIB示例源码

    Net-SNMP动态库方式扩展MIB,Hello SNMP扩展示例,仅供参考,做相关开发的可以自行动态扩展

    NET-SNMP安装配置手册

    第1章 net-snmp安装及配置 第2章 net-snmp测试 第3章 snmpd.conf详解 第4章 net-snmp指令 第5章 JAVA开发 第6章 Linux常用OID 第7章 snmpd.conf示例配置

    net-snmp,snmpwalk(windows最新版本)

    该工具是运行于windows平台的exe可执行文件,跟linux平台的snmpwalk...通过snmpwalk也可以查看支持SNMP协议(可网管)的设备的一些其他信息,比如cisco交换机或路由器IP地址、内存使用率等,也可用来协助开发SNMP功能。

    net-snmp开始教程

    本人写的net-snmp开发教程,详细介绍了net-snmp开发过程。以及net-snmp开发环境配置。相应工具的使用。

    NET-SNMP开发简述

    从NET-SNMP的安装配置、SNMP get、set、trap等主要三个用例的实现来描述使用NET-SNMP开发的全过程

Global site tag (gtag.js) - Google Analytics