NET-SNMP开发实践.doc_第1页
NET-SNMP开发实践.doc_第2页
NET-SNMP开发实践.doc_第3页
NET-SNMP开发实践.doc_第4页
NET-SNMP开发实践.doc_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

NET-SNMP开发实践【摘 要】最近项目中需要用SNMP实现对APACHE http server的监控,由于项目后台开发使用C语言,故选择使用NET-SNMP包来实现对SNMP的开发与实现。对于NET-SNMP本人才刚入门,总会碰到N多的问题,网上对于NET-SNMP的资料就更少了,特别是缺少NET-SNMP的所涉及的整个开发过程。所以就有了一个冲动就是把学习中的过程写下来。本文将从NET-SNMP的安装配置、SNMP get、set、trap等主要三个用例的实现来描述使用NET-SNMP开发的全过程。【关键字】SNMP、MIB、ASN1、OID【系统环境】由于移植及运行环境等原因,本文的程序代码及命令的使用环境及版本如下:OS: SunOS solaris 5.9 Generic_112234-12 i86pc i386 i86pcPerl: This is perl, v5.6.1 built for i86pc-solaris-64intNet-snmp: Version: 5.4.1GCC:Reading specs from /usr/local/lib/gcc/i386-pc-solaris2.9/3.4.1/specs gcc version 3.4.11 NET-SNMP基本介绍为了节约篇幅,关于SNMP(简单网络管理协议)的相关内容这里就不用介绍了。目前关于SNMP的开发包主要有NET-SNMP(for C)、SNMP+(for C+)、SNMP4J(snmp+的JAVA版本)、SNMPJ(NET-SNMP的JAVA版本)。NET-SNMP的早期版本(5.X以前)叫ucd-snmp,源自于卡耐基梅隆大学的SNMP软件包CMU snmp ,由加州大学Davis分校(University of California at Davis)开发与维护,后来由SourceForge (/url)开发维护管理, 并更名为net-snmp(5.X及以后版本),其最新版本为5.4.1。NET-SNMP的主要内容包括: 完整的API用于SNMP(支持V1、V2、V3版本)应用开发(包括c、perl、Python等的API) 一个可扩展的SNMP代理程序(snmpd);开发员可以扩展自己的代理程序 一套工具命令集(snmpget、snmpset、snmptrap、snmpwalk、snmp等) 一个trap接收进程,用于接收和显示trap。并可以将trap记录到日志文件里 一个图形化的MIB浏览工具(tkmib:基于Tk/Perl的)2 NET-SNMP的安装、配置2.1 NET-SNMP的安装NET-SNMP包目前可以移植的版本包括各种UNIX(基于SYSTEM V内核及基于BSD内核)、LINUX、WINX版本。目前NET-SNMP包的安装主要有程序编译安装与二进制文件安装两种方式,源程序安装可以从NET-SNMP的官网下载然后按照常规的configure, make ,make install三个步骤就可成功编译安装。其相关的二进制安装可以到其官网及各OS厂商的网站下载。FOR SOLARIS 9的安装请到SUN的官网下载:gcc-3.4.1-sol9-intel-local.gz、libgcc-3.4.1-sol9-intel-local.gz、netsnmp-5.4.1-sol9-x86-local.gz、openssl-0.9.8h-sol9-x86-local.gz。其遵循的安装过程为:gzip d xxx.gz (解压缩)tar xvf *.tar (如果有打包文件,请解包)pkgadd d ./xxxx(安装)安装完毕后,请在/etc/profile中设置好BIN的PATH路径。2.2 NET-SNMP的配置2.2.1 snmpconf配置我们使用/usr/local/bin/ snmpconf,其由perl编写,所以在运行前,请确认您的PERL安装路径,并更改snmpconf的第1行PERL脚本BIN路径。Snmpconf脚本主要用来配置snmpd.conf、snmptrapd.conf。snmpconf运行后是一个可以交互的配置设置过程,主要设置:System information setup 包括位置、联系人信息等。Access control setup community name、Agent Operating Mode AGENT IP、PORT等。设置完毕后,用户可以自己修改snmpd.conf文件中的参数信息。2.2.2 启动snmpd使用NET-SNMP的snmpd可扩展的代理进程替换OS的snmpd。为了方便系统启动时,自动运行net-snmp代理程序,生成/etc/rc3.d/ S78net-snmp shell文件(solaris的多用户运行等级为3):S78net-snmp 此SHELL脚本请参考S78net-snmp。屏蔽原来OS的SNMPD的配置文件/etc/rc3.d/ S76snmpdx及S77dmi文件。启动NET-SNMP的代理程序:./ S78net-snmp start。停止NET-SNMP的代理程序:./ S78net-snmp stop。2.2.3 测试NET-SNMP snmpd# snmpget -v 1 -c public localhost sysDescr.0SNMPv2-MIB:sysDescr.0 = STRING: SunOS solaris 5.9 Generic_112234-12 i86pc# snmpget -v 1 -c public localhost sysLocation.0SNMPv2-MIB:sysLocation.0 = STRING: wangzuxiang至此NET-SNMP的安装、配置完成。3 NET-SNMP的开发3.1 SNMP GET开发获取MIB中OID对象值(snmpget操作)的开发非常简单,其大致的过程为: 初始化一个SNMP会话; 定义会话属性; 增加一个MIB到当前的MIB目录树中(可选项); 创建一个PDU包 (Primary Data Unit) ; 设置OID(或多个)到PDU中; 发送请求并等待响应; 根据响应值处理业务数据; 释放PDU资源; 关闭会话。mydemo.c范例为获取MIB表sysDescr对象(该对象表示设备的描述信息)、sysName、sysLocation等对象值,也可以使用snmptranslate -On将其名称转换为OID。例如:% snmptranslate ...0(转换OID名称) SNMPv2-MIB:sysUpTime.0% snmptranslate -On SNMPv2-MIB:sysUpTime.0(转换OID) ...0 % snmptranslate -Tp -IR system(显示MIB树结构)+-system(1) | +- -R- String sysDescr(1) | Textual Convention: DisplayString +- -R- ObjID sysObjectID(2) +- -R- TimeTicks sysUpTime(3) +- -RW- String sysContact(4)编译mydemo.c:Gcc o mydemo mydemo.c -lsnmp运行mydemo:./mydemoSNMPv2-MIB:sysDescr.0 = STRING: SunOS solaris 5.9 Generic_112234-12 i86pcSNMPv2-MIB:sysName.0 = STRING: solarisSNMPv2-MIB:sysLocation.0 = STRING: wangzuxiang值 #1 是一个字符串: SunOS solaris 5.9 Generic_112234-12 i86pc值 #2 是一个字符串: solaris值 #3 是一个字符串: wangzuxiang注意:在实际的开发过程中,如果轮询多个agent上的MIB OID对象时,可以使用异步的多路复用技术来实现。类似代码如下:while (active_hosts) /*轮询某个AGENT*/ int fds = 0, block = 1; fd_set fdset; struct timeval timeout; FD_ZERO(&fdset); snmp_select_info(&fds, &fdset, &timeout, &block); fds = select(fds, &fdset, NULL, NULL, block ? NULL : &timeout); if (fds mode)下的MODE_SET_COMMIT(SET操作)与MODE_GET(GET操作)实现。编译成.so文件:gcc I. -c -o nstAgentPluginObject.o nstAgentPluginObject.cgcc -g -fPIC -shared -o nstAgentPluginObject.so nstAgentPluginObject.o(编译成SO库)3.2.3 加载动态库Net-snmp的snmpd加载动态库以实现agent的扩展有2种加载方式:(1)不停止SNMPD进程的情况下加载。UCD-DLMOD-MIB.txt定义了MIB条目的模块名,动态库路径及状态。使用此方法可以在不重起代理的情况下配置各动态模块加载与卸载。其详细的MIB定义:cat /usr/local/share/snmp/mibs/UCD*DLMOD*.txt。 查看哪些.so被加载#snmpget -v 1 -c public localhost UCD-DLMOD-MIB:dlmodStatus.1 尝试获取某个MIB的OID值#Snmpget-v2c -c public localhost NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 = No Such Object available on this agent at this OID(其表示没有找到) UCD-DLMOD-MIB表中创建一个模块实例#snmpset -v 1 -c private localhost UCD-DLMOD-MIB:dlmodStatus.1 i create UCD-DLMOD-MIB:dlmodStatus.1 = INTEGER: create(6) 获取dlmodStatus值#snmpget -v 1 -c public localhost UCD-DLMOD-MIB:dlmodStatus.1UCD-DLMOD-MIB:dlmodStatus.1 = INTEGER: unloaded(2)说明模块实例已经存在,但没有被加载 设置需装载模块的名称及路径#snmpset -v 1 -c private localhost UCD-DLMOD-MIB:dlmodName.1 s nstAgentPluginObject UCD-DLMOD-MIB:dlmodPath.1 s /oracle/agent/plugin/nstAgentPluginObject.so UCD-DLMOD-MIB:dlmodName.1 = STRING: nstAgentPluginObjectUCD-DLMOD-MIB:dlmodPath.1 = STRING: /oracle/agent/plugin/nstAgentPluginObject.so 装载模块# snmpset -v 1 -c private localhost UCD-DLMOD-MIB:dlmodStatus.1 i loadUCD-DLMOD-MIB:dlmodStatus.1 = INTEGER: load(4) 确认模块被加载#snmpget -v 1 -c public localhost UCD-DLMOD-MIB:dlmodStatus.1UCD-DLMOD-MIB:dlmodStatus.1 = INTEGER: loaded(1) 测试新加载的.so是否成功#snmpget -v 1 -c public localhost NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 = INTEGER: 3(2)修改配置文件snmpd.conf加载在/usr/local/share/snmp/snmpd.conf文件中增加一行:dlmod nstAgentPluginObject /oracle/agent/plugin/nstAgentPluginObject.so3.2.4 测试代理$snmpget -v 1 -c public localhost NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 = INTEGER: 123456$snmpset -v 1 -c private localhost NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 i 1000NET-SNMP-TUTORIAL-MIB:nstAgentPluginObject.0 = INTEGER: 1000调用设置后,你会发现在/oracle/agent/plugin/test.log中的内容增加一行: 1000 mode=0x33.3 Trap的开发3.3.1 准备MIB文件在SNMPV1版本中MIB的TRAP定义与V2版本中不完全一样,V2版本开始叫notification。我们使用比较简单的V1版本来定义含有TRAP功能的MIB文件UCD-TRAP-TEST-MIB.txt。在/usr/local/share/snmp/snmp.conf中增加一行:mibs +UCD-TRAP-TEST-MIB将UCD-TRAP-TEST-MIB.txt拷贝到/usr/local/share/snmp/mibs目录中。3.3.2 Send trapTrap的发送有几种实现情况,用户可以用snmp_add_var以及snmp_send等API编写应用来触发TRAP事件,也可以在MIB2C中mib2c.notify.conf配置模板在代理中实现TRAP的发送。发送TRAP的代码可以详细参考mytrap.c。编译:Gcc o mytrap mytrap.c lsnmp执行:./mytrap3.3.3 启动SNMPTRAPD进程 修改snmptrapd.conf文件:修改或产生/usr/loc1的snmptrapd进程默认下不接收任何TRAP,所以需要配置此文件,内容如下:al/share/snmp/snmptrapd.conf文件(在NET-SNMP5.4.1中好象没有自

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论