NET-SNMP软件包应⽤1 SNMP协议简介 (1)1.1⽹络管理协议结构 (2)1.2管理信息库 (5)1.3SNMP的版本 (6)2 SNMP开发软件包 (6)3 NET-SNMP软件包简介 (6)3.1NET-SNMP简介和安装 (6)3.2NET-SNMP代理的配置 (7)3.3NET-SNMP⼯具的使⽤ (7)
4 ⽤NET-SNMP软件包扩展代理---LINUX服务器 (9)4.1NET-SNMP中的SCALAR对象和TABLE对象 (9)4.2NET-SNMP扩展代理的两种⽅式(转) (9)4.3⾃定义MIB扩展流程(L INUX服务器上) (10)4.4⾃定义MIB (11)
4.5代理扩展实例——简单变量的实现 (12)4.6代理扩展实例——表对象的实现 (13)a) mib.iterator.conf模版的实现(转) (13)b) mib.iterator_access.conf模版的实现(转) (15)4.7代码的合并 (15)4.8配置和运⾏ (16)
5 ⽤NET-SNMP软件包扩展代理---嵌⼊式板端 (16)6 LINUX环境中开发中的问题与解决 (18)
7 WINDOWS环境中开发中的问题与解决(转) (19)8 总结 (20)9 附录 (21)
9.1 SNMPD.CONF配置⽂件 (21)
9.2主函数FOXMAIL_NEW.C(为调试代理⽽⽤。我⾃⼰未调试) (21)9.3简单变量实现代码--- MIB2C.OLD-API.CONF (22)9.4简单变量实现代码--- MIB2C.SCALAR.CONF (22)9.5表的实现--- MIB2C.MFD.CONF (22)1SNMP协议简介
作为⼀个完备的系统,必须有⼀套反馈机制来调整系统的运⾏。简单⽹络管理协议产⽣的⽬的,就是为了使松散的⽹络更加有效地运⾏。它⼴泛的应⽤于监测⽹络的状态、⽹络设备的运⾏情况、各种电脑设备以及⼀些辅助的外围设备,使得⽹络管理员
通过对节点的查询和设置,发现并定位故障,进⽽采取相应措施维护⽹络。⽹络管理的研究已经发展了许多年,对于⽇益纷繁的需求,简捷性和扩展性仍是研究的主题。本⽂中协议相关资料可以参考RFC⽂档:
RFC1155:Structure and Identification of Management Information for TCP/IP-based InternetsRFC1157:SNMP
RFC1212:Concise MIB DefinitionsRFC1215:A Convention for Defining TrapsRFC1905:Protocol Operations for SNMPv2
RFC2011:SNMPv2 Management Information Base for the Internet Protocol using SMIv2 RFC2578:Structure ofManagement InformationRFC2579:Textual ConventionsRFC2580:Conformance Statements1.1⽹络管理协议结构
SNMP的⽹络管理模型包括以下关键元素:管理端、代理端、管理信息库、⽹络管理协议。它基于tcp/ip协议,属于应⽤层协议,通过udp协议通信。管理端与代理端的通信原语包括:Get,Getnext,Set,Trap。在udp数据包中,发送信息是按ASN.1⾃解释⽅式编码的。但对于许多⼩型被监管设备,可能会运⾏不同协议,或者运⾏完整代理花费很⼤,于是产⽣了代管设备,主代理和⼦代理的概念。在⼩型设备上运⾏⼦代理,把数据发给主代理来完成snmp协议的通信。
MIB管理者
Manager 代理Agent 被管理设备管理操作
相应/通告管理操作相应/通告
管理系统被管理系统简单⽹络管理协议管理信息库⼯作站⽹管基本模型
底层⽹络接⼝IPUDP
SNMP 管理器管理应⽤进程1345
2底层⽹络接⼝IP UDP SNMP 管理代理SNMP 被管理对
象(MIB )1345
2被管理资源应⽤进程对资源实施管理SNMP 管理基站SNMP 管理代理通讯⽹络SNMP 报⽂交互操作图
图中数字:1-----GetRequest 2-----GetNextRequest 3-----SetRequest 4-----GetResponse 5-----TrapSNMP 嵌⼊式代理远程通信模块SNMP 协议模块
MIB 管理模块MIB 处理模块pdu
trap MIB 库注册MIB 库查找参数配置信息获取MIB 库存取陷阱处理Socket通信模块
嵌⼊式Agent 软件结构
1.2 管理信息库
SNMP 以MIB (管理信息结构)为基础来描述被监管资源,由此建⽴的数据集和称之为MIB 库。(它实质上就是制定格式的
⽂本⽂件。)它是⼀种树型结构的数据库,被监管的对象都处于叶⼦节点上。每个被监管对象都由⼀个唯⼀的对象标识符来识别。对象信息的存储结构由MIB 定义的简单变量和表来构造,它⼀般包含描述名(对象标识符)、数据类型、读写规则、功能描述、状态。MIB 的定义可以查询RFC1155,它
定义了四种基本数据类型:INTEGER,OCTET STRING,OBJECT IDENTIFIER和NULL。由这四种基本类型通过
SEQUENCE构造列和表,以及新类型如:NetworkAddress、IpAddress、Counter、Gauge、TimeTicks、Opaque等,以及宏定义。
当然,根据需要还可以构造⾃⼰的数据类型。1.3SNMP的版本
⽬前SNMP有三个版本snmpV1、snmpV2、snmpV3。针对原始的V1版,93版的v2加⼊了安全机制,但⽤户对其并不感兴趣,在96版的v2中⼜删除了安全机制,99年开始酝酿的v3版开始提出⼀个snmp的统⼀架构,采⽤User-based安全模型和View-based访问控制模型提供SNMP⽹络管理的安全性。安全机制是SNMPv3的最具特⾊的内容。2SNMP开发软件包
⽬前,开发SNMP的软件包有许多可以选择如SNMP++、AGENT++、NET-SNMP等。SNMP++是基于C++的,⼀般多⽤于windows。
这⾥我们选⽤的是NET-SNMP。它是⼀个开源软件,基于C语⾔开发,便于移植。
ucd-snmp源⾃于卡耐基.梅隆⼤学的SNMP软件包CMU snmp 2.1.2.1, 由加州⼤学Davis 分校(University of California at Davis)开发与维护, 所以命名为ucd-snmp。2000年11⽉ucd-snmp项⽬转到由
SourceForge(http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html )管理, 并更名为net-snmp。3net-snmp软件包简介3.1NET-SNMP简介和安装
net-snmp早先是在Unix平台下开发的。现可以移植到:HP-UX (10.20 to 9.01 and 11.0)Ultrix (4.5 to 4.2)
Solaris SPARC/ULTRA (2.8 to 2.3), Intel (2.9) and SunOS (4.1.4 to 4.1.2)OSF (4.0, 3.2)
NetBSD (1.5alpha to 1.0)FreeBSD (4.1 to 2.2)BSDi (4.0.1 to 2.1)Linux (kernels 2.4 to 1.3)AIX (4.1.5, 3.2.5)OpenBSD (2.8, 2.6)Irix (6.5 to 5.1)
OS X (10.1.1 and 10.1.2)Dynix/PTX 4.4QNX 6.2.1AWindows
等多个平台。Net-snmp是⼀个代理端软件,但也提供管理端的查询⼯具。安装有两种⽅式:⼀是直接安装的⼆进制包,⼆是需要编译的源代码。
我们在windows平台上安装的⼆进制包,在虚拟Unix平台CygWin上编译安装的源代码。在windows上的⼆进制包的安装⾮常
简单,只需按提⽰就可完成。
源代码和⼆进制包可从http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html /⽹站下载。之所以要先安装⼀个可运⾏的net-snmp系统,是因为我们开发程序运⾏环境的配置⽂件,是按照默认安装路径内部设定搜索的;另外,还可以利⽤其提供的配置⼯具来⽣成配置⽂件,利⽤提供的查询⼯具来测试程序。Linux上的安装流程:
---------------------------------------------------------------------------tar -xvf net-snmp-5.4.1.tarcd net-snmp-5.4.1./configuremakemake install
(修改snmpd.conf配置⽂件:/usr/local/etc/snmp/snmpd.conf 参见【附录】) snmpdps -aef|grep snmpd3.2NET-SNMP代理的配置
运⾏net-snmp之前先要进⾏环境设置,否则⽆法查询到结果。环境配置⽂件由snmpconf命令交互⽣成。运⾏snmpconf后,提⽰有三个配置⽂件:snmpd.conf,snmptraps.conf,snmp.conf。其中:snmpd.conf⽤来配置代理和管理端通信时的参数,只需设置两个参数就可正常运⾏程序了,⼀是community name,有只读rocommunity和读写rwcommunity之分,相当于访问账号,这⾥设rocommunity为public;另⼀个是访问端⼝,设为snmp协议默认的161端⼝。Snmp.conf是与mib库设置相关的配置⽂件。Snmptraps.conf⽤来设置代理陷阱。
另外,snmpconf和mib2c⼯具都是基于perl脚本的,在windows下需要安装perl才能运⾏。按照帮助⽂档的提⽰,下载
ActivePerl安装。并按照帮助⽂档中perl的安装要求,下载在win32环境下所需的其他组件,配置并测试perl模块,使snmpconf和mib2c 能正常运⾏。3.3NET-SNMP⼯具的使⽤
当环境设置好后,运⾏snmpd,即snmp代理进程,就可以使⽤管理⼯具查询其中的信息了。Net-snmp提供的查询⼯具有很多,⼤部分查询命令的格式都⼤同⼩异。这⾥以http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html.dod.internet.mgmt.mib-2.system为例,其Oid为:.1.3.6.1.2.1.1。结构如下:………system .1.3.6.1.2.1.1|——sysDescr .1.3.6.1.2.1.1.1|——sysObjectID .1.3.6.1.2.1.1.2……
snmpget——snmpget [OPTIONS] AGENT OID [OID]...⽤来查询叶⼦节点实例:
snmpget –v2c –c public localhost .1.3.6.1.2.1.1.5.0snmpget –v2c –c public 192.168.12.77 .1.3.6.1.2.1.1.5.0snmpget –v2c –c public 127.0.0.1 .1.3.6.1.2.1.1.5.0说明:
-v2c:使⽤的是2c的snmp版本,可选1|2c|3-c public:community 名为public
localhost: 代理的地址,若代理运⾏在本机上,所以可⽤localhost
snmpgetnext.exe——snmpgetnext [OPTIONS] AGENT OID [OID]...通过⽗节点查询叶⼦节点实例:
snmpgetnext –v2c –c public localhost .1.3.6.1.2.1.1说明:
这个命令假设不知道叶⼦节点,但知道⽗节点,则可遍历到第⼀个叶⼦节点。此例结果等同于上⼀个例⼦。Oid也可输⼊.1.3.6.1.2,因为它是按字典顺序遍历的。
snmptable.exe——snmptable [OPTIONS] AGENT TABLE-OID ⽤来查询表对象实例:
snmptable –v2c –c public localhost http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html .dod.internet.mgmt.mib-2.ip.ipAddrTablesnmpwalk
实例:snmpwalk -v1 192.168.12.77 -c public ucdDemoPublic
snmpset.exe——snmpset [OPTIONS] AGENT OID TYPE V ALUE [OID TYPEV ALUE]...修改数据实例:
snmpset –v2c –c public localhost .1.3.6.1.2.1.4.21.1.3.x i 99说明:
x:在这⾥是索引值,表⽰表项中某⼀列的第⼏个数据,根据要求设定
i: 这⾥是列数据类型,包括i: INTEGER, u: unsigned INTEGER, t: TIMETICKS,a: IPADDRESS o: OBJID, s: STRING, x: HEX STRING,d: DECIMAL STRING, b: BITS U: unsigned int,I: signed int, F: float, D: double
mib2c ⽤来把mib库⽂件编译成.c和.h模版。实例:mib2c t1Table
mib2c -c mib2c.scalar.conf lianyiPublicmib2c -c mib2c.old-api.conf lianyiPublicmib2c -c mib2c.mfd.conf lyTable
mib2c -c mib2c.genhtml.conf ifTable //⽣成mib⽂件的html格式说明:
When you run mib2c, you must specify a MIB node for it to process. You can also specify which configuration file you wouldlike it to use to generate the code. The available options are:mib2c.int_watch.conf
mib2c.old-api.conf //scalar的ucd-snmp选项所⽤;
mib2c.scalar.conf //scalar的net-snmp选项所⽤;mib2c.array-user.conf //
mib2c.create-dataset.conf //Table Data在agent⾥;mib2c.iterate.conf //Table Data在外部时;mib2c.iterate_access.conf //mib2c.mfd.conf //
mib2c.notify.conf //(内容极简单,⽆采⽤价值)mib2c.genhtml.conf模板:⽣成mib⽂件的html格式4⽤net-snmp软件包扩展代理---linux服务器
在利⽤net-snmp做扩展之前的准备⼯作是,⼀下载源代码,⼆编译出库⽂件:netsnmpagent.lib、netsnmphelpers.lib、
netsnmpmibs.lib、netsnmp.lib。这四个库的⼯程⽂件都位于~\\net-snmp-5.2.1.2\\win32\\下对应的⽂件夹中。编译库⽂件时注意把
netsnmp.lib放到最后编译,它可能会参考⼀下前⾯的编译⽂件。本⽂档中实现的代理程序,在源代码包中只需要引⽤这四个库⽂件。
开发⼯具VC6.0的环境设置也需要注意,参考帮助⽂档readme.win32,设置好include ⽬录,library⽬录。在project\\configure的选项link的相关栏⽬中添加上四个库⽂件,还要加上wsock32.lib库。另外,在程序编译过程中会碰到与VC的默认库相冲突的地⽅,按提⽰在上述添加库的地⽅加上/NODEFAULTLIB:XXX.LIB来除去默认库。代理的开发过程基本上遵循:mib模块→转换成C⽂件→编译进代理中。4.1NET-SNMP中的scalar对象和table对象
mib模块⼀般都由变量和表组成。因此Net-snmp把SMI中的对象分为两⼤类:scalar 和table。Scalar就包含我们常⽤的整型,字符串,时间等等数据类型。table就是scalar 的⼀种集合,有⼀个和多个列组成,类似于数据库中的表。它必须具有索引项,⽤来按⼀定顺序检索表项。
Mib2⼯具通过模版把mib⽂件解析成.c和.h⽂件,这些⽂件仅仅是半成品,还需要⼿⼯在相应地⽅添加相应代码。Mib2c有很多模版,可以根据相应需要来调⽤不同的模版。但mib2c⽬前不⽀持同时解析scalar和table 对象,对于具有这两种对象的mib模块,需要分别⽣成代码⽂件,然后再合并成整体。4.2NET-SNMP扩展代理的两种⽅式(转)⽤net-snmp扩展代理,实现⽅式可归结为两种:
⼀是静态库⽅式,通过修改配置头⽂件,在相应地⽅包含新引⼊的mib模块的.c和.h ⽂件,然后重新编译库⽂件和代理程序;⼆是编译动态共享库,只需把新引⼊的mib模块的.c和.h⽂件编译成动态库,通过设置能够让代理程序载⼊。
对于第⼆种⽅式,⼀需要编译成.so动态共享库,⼆需要原代理程序是否包含dlmod或load命令,三还要看系统是否⽀持。⼀般情况下仅⽀持Unix平台。我们在CygWin下试验过Unix平台编译。在VC下的编译环境,基本上都是参考其makefile,configure等⽂件。
第⼀种⽅式允许我们在原有mib库上添加新的mib模块,也可以只针对需要的mib模块编译单独的程序。源代码包中的代理程序⼯程⽂件位于~\\ net-snmp\\win32\\snmpd 下,因为它可移植到多个平台,主程序代码中有许多平台开关,和各种选项,⾮常庞⼤。为了简化开发和调试,我们使⽤了⼀个帮助⽂档中介绍的简化的代理端程序框架。这个框架⾮常精简,在性能上可能⽐原版差很多,但⽤来测试和开发mib库就⽐较⾼效了。程序的运⾏机制:程序启动,载⼊初始化mib模块,然后进⼊⼀个等待呼叫的⽆限循环,代码⽚段如下:… …init_MyMib();… …
while(keep_running){
/* if you use select(), see snmp_select_info() in snmp_api(3) *//* --- OR --- */
agent_check_and_process(1); /* 0 == don't block */}
我们所要做的就是实现init_MyMib()函数,即⾃定义的mib模块。关于⽆限循环中的阻塞与否,根据mib模块⽽定。如果你的应⽤程序需要以⾮阻塞⽅式处理SNMP数据流,就使⽤⼀步接⼝(例如GUI、线程、forking等)。否则,只需要使⽤同步接⼝就可以了。在阻塞模式下,程序会占⽤⼤量cpu资源。具体实现可参见例⼦:【附录7.1】下⾯以Linux下的为例分析;4.3⾃定义MIB扩展流程(Linux服务器上)实现步骤如下:1)定义MIB⽂件
按照SMIV2的语法来定义描述被管理对象的MIB⽂件:***.txt;也使⽤MG-SOFT公司的‖Visual MIB Builder‖可视化设计软件完成MIB库模块的定义;注意事项
◆注意表名必须为―***Table‖, 实体名应该为―***Entry‖;(因为在实践过程中发现若名称不符合,mib2c不能正常执⾏;)
◆Mib⽂件中⽤到的数据类型注意要在IMPORTS中包含到;(若没包含到,便认为是不合理的类型)2)利⽤mib2c⽣成C代码⽂件
MIB库模块定义后,需要在代理程序中增加与所定义的MIB库模块相对应的源代码;⽤mib2c⼯具程序把MIB库模块⽂件转换成C源代码。执⾏流程:
1.把设计好的MIB库⽂件(***.txt)拷贝到net-snmp源代码的mibs⽬录(如:/usr/local/share/snmp/mibs);
2.export MIBS=ALL//export 是设置mib2c后对象名的查找范围。上⾯设置表⽰在mibs⽬录下查找所有⽂件;
3.mib2c modulename// modulename是要转换的对象名,不是mib⽂件名,也不是节点名;mib2c会在当前⽬录下⽣成modulename.h和modulename.c,这两个⽂注意事项:
◆Mib⽂件必须要存放到mib库中:/usr/local/share/snmp/mibs;◆使⽤mib2c⼯具时,要根据需要转换的MIB定义⽂件来选择配置⽂件。传统的MIB定义⽂件⼀般根据⾥⾯的MIB变量是普通的MIB变量还是⼆维表,以及MIB变量值的获取是通过外部资源还是通过agent本⾝,来选择不同的mib2c配置⽂件;
◆在做mib⽂件时,若有表存在,注意标明应为*Table,实体:*Entry.因为在实际应⽤中发现,若表明不为Table结束的,就不能正常⽣成代码⽂
件;
3)添加⾃⼰的实现代码
根据不同的模板修改相应的代码;由模版⽣成的⽂件,不论是简单变量还是表对象,其整体结构都是固定模式。在模版头⽂件中对节点进⾏宏定义,函数声明。在模版实现⽂件中,分为两⼤块:⼀是初始化函数,主要⽤来对变量注册;⼆是响应函数,⽤来响应管理端的查询命令,响应函数的返回值,就是我们要⼿⼯实现的。我们所要做的⼯作就是把数据以⼀种合理的⽅式导⼊到其中。注意事项:
◆注意代码中⽤到的variablen 其中的n值可能有误,需要根据实际修改。有两个地⽅需要修改并保持⼀致。4)编译调试所实现的代码
a)通过修改配置头⽂件,在相应地⽅包含新引⼊的mib模块的.c和.h⽂件,然后重新编译库⽂件和代理程序;b)(先把原snmpd关闭并卸载)
c)./configure -with-mib-modules=\"lyTable lianyiPublic\" //d)makee)make installf)cd /usr/local/sbin/
g)./snmpd -Lf /var/log/snmpd.log –DALL //打印信息到⽇志⽂件snmpd.log4.4⾃定义MIB
这⾥我们定义了⼀个私⼈节点的MIB,位于节点http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html .dod.internet.private.enterprises 下,数字Oid为:.1.3.6.1.4.1。树型结构如下:+--lianyiMIB(321) (.1.3.6.1.4.1.321)|
+--lianyiMIBObjects(1)|
+--lianyiPublic(1)|
+-- -RW- Integer32 s1(1)| Range: 0..21474837+-- -RW- String s2(2)| Size: 0..1024+-- -R-- String s3(3)+-- -R-- String s4(4)|
+--lyTable(5)|
+--lyEntry(1)| Index: lyIndex|
+-- -R-- Integer32 lyIndex(1)+-- -R-- String lyDescr(2)
| Textual Convention: DisplayString| Size: 0..255
+-- -RW- EnumVal lyAdminStatus(3)Values: up(1), down(2), testing(3)4.5代理扩展实例——简单变量的实现●mib2c.old-api.conf参见【附录】●mib2c.scalar.conf参见【附录】流程简单说明
<1>:⽤mib2c -c mib2c.scalar.conf dvsMIB ⽣成.c .h⽂件;<2>:
4.6代理扩展实例——表对象的实现
为了更加有效的描述对象,引⼊表来把⼀系列相关的信息进⾏综合。因此表就由具有⼀个或多个变量的列组成。从实现⽅式和数据结构来看,表是⼀个结构体变量数组;从系统管理来看,就是数据库中的表单。从管理数据库的需求出发,就要求实现表单的插⼊、删除、恢复等基本功能,更⾼级的功能还应实现多个表的依赖关系、触发机制等。在底层实现上这些都要通过操纵结构体数组来完成。
Mib2c提供了表的⽣成模版。其⽬的之⼀是可以降低对SNMP知识的要求,⼆是分离请求中对数据的定位和响应中对数据的处理,使得实现上集中在对数据的处理上。因此它产⽣的模版主要由三个部分组成:⼀是数据结构,对请求数据的构造;⼆是数据检索,对请求数据的定位;三是操纵数据,对请求数据进⾏GET或SET。
不同的需求有不同的实现⽅式,mib2c根据表中导⼊数据的来源提供了两⼤类模版。其分类按照运⾏mib2c时的交互信息:⼀类为数据相对代理处于外部,适合于监视和操纵外部数据的MIB,如从操作系统或其他系统的接⼝提取信息;并且表中的⾏的创建销毁,通常都独⽴于SNMP代理。第⼆类是数据为代理所有,代理对数据的操纵直接反映到数据源。
本⽂档只针对第⼀种类型实现表,且称之为外部⽅式。在mib2c进⼊外部⽅式,仍有三个模版,分别为:
mib2c.iterate.conf,mib2c.iterate_access.conf,mib2c.mfd.conf;前两种⽅式基本⼀样,使⽤了helpers中⼀种叫iterator的API,特点是可以处理⽆序数据,但是效率较低,适合于⼩型数据存储,对内存、响应时间要求不是很严格的应⽤;后⼀种就很复杂了,它提供了更加细致的代码框架,通过多层交互,可以区分实时、半实时、永久型的数据,可以选择数据的存储⽅式,可以做列或表之间的依赖关系,数据结构的⾃动绑定或⼿⼯编辑,以及其他复杂的选项。a)mib.iterator.conf模版的实现(转)
⾸先,这个模版⽣成了lyTable.c和lyTable.h⽂件。在lyTable.c⽂件中包含下列函数和结构体,形参省略:struct Ly Table_entry;void init_Ly Table;
void initialize_table_Ly Table;
Netsnmp_Node_Handler Ly Table_handler;
Netsnmp_First_Data_Point Ly Table_get_first_data_point;Netsnmp_Next_Data_Point Ly Table_get_next_data_point;struct Ly Table_entry *Ly Table_createEntry;void Ly Table_removeEntry;
实现过程我们按数据结构,数据检索,数据操纵来说明函数的调⽤和处理过程。结构体:
struct Ly Table_entry {
/* Index values */ /*这个结构体把ly Table中的*/long UserIndex; /*变量都列举,并指明了索引变量*//*并有⼀个⽣成链表的next指针*//* Column values */
/* long UserIndex;*/ /*去掉重复*/
char UserStatus;u_long CheckTime;long MonSet;long old_MonSet;
/* Illustrate using a simple linked list */
/* int valid;*/ /*没有⽤到的变量*/ struct Ly Table_entry *next;};
通过这个结构体,我们把从外部读⼊的数据做成⼀个链表,并把链表头地址传递给Ly Table_get_first_data_point;Ly Table_get_next_data_point;⽤这两个函数遍历链表。数据的检索:
数据的检索由Ly Table_handler函数来完成,其原型为:int Ly Table_handler(
netsnmp_mib_handler *handler,netsnmp_handler_registration *reginfo,netsnmp_agent_request_info *reqinfo,netsnmp_request_info *requests)检索过程通过⼀个循环包含的两个语句:
for (request=requests; request; request=request->next) {table_entry = (struct Ly Table_entry *) /*检索匹配表中的⾏*/netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info(request); /*检索匹配表中的列*/
这样相当于通过⾏号和列号确定了数据。⽽上⾯的两个函数需要调⽤Ly Table_get_first_data_point;Ly Table_get_next_data_point;来遍历链表。数据的操纵:
数据的操纵涉及到对请求命令的响应,其代码⽚断如下:switch (reqinfo->mode) {case MODE_GET:
switch (table_info->colnum) {case COLUMN_USERINDEX:
snmp_set_var_typed_value( request->requestvb, ASN_INTEGER,table_entry->UserIndex,sizeof(table_entry->UserIndex));
… … … /*对于get命令,通过snmp_set_var_typed_value返回变量值*/ }
case MODE_SET_RESERVE1: /*对于set命令,就涉及这六个步骤,这⾥省略了*/ case MODE_SET_RESERVE2: /*具体实现代码,我们所做的程序中,没有涉及表*/ case MODE_SET_FREE: /*中⾏的创建和删除,模版说明中认为,set ⼀个*/ caseMODE_SET_ACTION: /*不存在的索引,就可以在表中为其创建⼀⾏*/ case MODE_SET_UNDO:case MODE_SET_COMMIT:
} /*代码已合并到mib.iterator_access.conf模版中*/b)mib.iterator_access.conf模版的实现(转)⾸先,这个模版⽣成了Ly Table.cLy Table.h
Ly Table_columns.hLy Table_enums.hLy Table_checkfns_local.hLy Table_checkfns_local.cLy Table_checkfns.hLy Table_checkfns.cLy Table_access.hLy Table_access.c
这些⽂件实际上是对mib.iterator.conf模版功能的细化,提供更加完善⽅式的控制。只有部分需要修改,根据⾃定义的mib,只编辑了Ly Table.c,Ly Table_access.c等⽂件。
它提供了get_XXX()和set_XXX()函数来完成数据的获取和设置,需要⼿⼯实现。数据的组织不再⾃动⽣成,可以⾃⼰以其他⽅式实现,但仍要能关联到遍历函数上。
Ly Table_checkfns_local.c,Ly Table_checkfns.c⽂件都是对set的检查操作。在主体结构和运⾏过程上仍和mib.iterator.conf模版⼀样。
c)mib2c.mfd.conf模版的实现参见【附录】注意:4.7代码的合并
在实现整个mib时,可以对各个对象分别编译,如:
./configure -with-mib-modules=\"lyTable lianyiPublic\"(有⼏个对象就加⼊⼏个对象名,
之间以空格隔开);也可以将代码合并。合并的⽅法只需把简单变量的初始化函数和表实现的初始化函数合并。如在上⾯的⽰例中,
简单变量的初始化函数为:init_lianyiPublic(void);表的初始化函数为:initialize_table_lyTable();
若要把表和简单变量放到⼀起编译,可以将表的初始化函数initialize_table_lyTable()放到简单变量的初始化函数
init_lianyiPublic(void)中调⽤;将init_lianyiPublic(void)作为主函数的初始化函数;同时,修改相关头⽂件的引⽤(将表的各个⽂件包含到简单变量的头⽂件中)。如:在lianyiPublic.h中加⼊:config_require(util_funcs)
/*如果想把表放⼊到该⽂件中⼀起编译
(./configure -with-mib-modules=\"lianyiPublic\"),
就需要在此包含表相关的各个⽂件;如果在此没有加⼊这些⽂件,编译时就需要分别编译:./configure -with-mib-modules=\"lyTable lianyiPublic\"*/
config_require(lyTable)
config_require(lyTable_interface)config_require(lyTable_data_access)config_require(lyTable_data_get)
这样代码的简单合并就完成了。最后以主函数建⽴⼯程编译全部⽂件。4.8配置和运⾏
在主函数中,代理的初始化由三个语句顺序完成:init_agent(\"snmpd \"); /*运⾏代理名*/init_lianyiPublic ();
init_snmp(\"snmpd \"); /*读⼊的配置⽂件名*/
这⾥需要写⼀个名为snmpd.conf的配置⽂件。然后放在安装⽬录~\etc\\snmp下。关闭防⽕墙,在命令提⽰符下运⾏该程序,然后⽤snmpget,snmpgetnext,snmptable,snmpset测试程序。5⽤net-snmp软件包扩展代理---嵌⼊式板端5.1概述
如何将代理程序放⼊嵌⼊式板⼦上?这⾥主要涉及到交叉编译。选择⼀台服务器,在服务器上进⾏交叉编译,编译过之后,再将代理程序snmpd直接放⼊板端指定⽬录,同时在/usr/local/etc/snmp/下放⼊配置⽂件即可。
在服务器上交叉编译的指令为:tar -xzvf net-snmp-5.4.1.tar.gzcd net-snmp-5.4.1
./configure --host=arm-linux-uclibc --with-endianness=little --prefix=/home/a/ly/mysnmp (说明:--host指明了我的⽬标平台;--prefix指明安装路径;)make LDFLAGS=\"-static\"
(说明:static:指明是静态编译)make install
(根据下⾯介绍的⽅法、流程将代理程序和配置⽂件放⼊板端制定位置)交叉编译后,将指定安装⽬录/home/a/ly/mysnmp 下的snmpd⽂件拷贝到板端的/usr/sbin/⽬录下(/usr/sbin/snmpd);然后,放置配置⽂件:/usr/local/etc/snmp/snmpd.conf。
同时:cp /usr/local/etc/snmp/snmpd.conf /var/net-snmp/下⾯是流程的详细介绍:5.2配置
运⾏./configuare --help,仔细查看了其安装编译选项。
./configure --host=arm-linux-uclibc --with-endianness=little --prefix=/home/a/ly/mysnmp说明:
--host指明了我的⽬标平台;
--prefix指明安装路径;/home/a/ly/mysnmp 是我⾃⼰建⽴的⼀个安装路径,该路径可以⾃⼰随意制定;make LDFLAGS=\"-static\"说明:
static:指明是静态编译;如果没有装lib库,可以⽤-static选项,指明是静态编译;若有库,就不需。如果不指出静态编译,那么直接放到板⼦上的程序会提⽰:can’t load library ‘libnetsnmpmibs.so.15’.5.3安装make install说明:
如果在./configuare的时候没有指定安装路径,也可以在此制定。5.4检查
查看下是否已经存在snmpd⽂件。因为得到的snmpd⽂件⽐较⼤,所以可以对它进⾏strip处理:处理过之后就剩下⼏百KB了。5.5移植
将指定安装⽬录/home/a/ly/mysnmp 下的snmpd⽂件拷贝到板端的/usr/sbin/⽬录下(/usr/sbin/snmpd);然后,配置配置⽂件/snmpd.conf。并将该配置⽂件放⼊制定⽬录/usr/local/etc/snmp/ 和/var/net-snmp/ ⽬录下。注意:
snmpd运⾏后会在/var/net-snmp⽬录下⽣成⼀个snmpd.conf ⽂件。根据测试发现:需要把/usr/local/etc/snmp/snmpd.conf下的⽂件拷贝到/var/net-snmp中即:cp /usr/local/etc/snmp/snmpd.conf /var/net-snmp/5.6测试
可以通过简单的指令进⾏测试。如:
snmpget -c public -v2c 192.168.12.75 ifTable.1.ifAdminStatus.36Linux环境中开发中的问题与解决●为什么软件包make不成功?
答:有⼀个很可能的原因:服务器上不⽀持snmp。所以需要在服务器上安装。可执⾏下指令:apt-get install libsnmp9-dev●为什么软件包直接执⾏./configure make 会出错呢?
答:经过反复调试,发现是所⽤软件包的问题。从⽹站上下载下来的⽤在linux上的软件包是net-snmp-5.4.1.tar.gz,若我在window上将该软件包解压后放⼊linux上运⾏就会出现很多错误!我必须把net-snmp-5.4.1.tar.gz⽂件直接放在Linux上解压!可以选择先将其解压为net-snmp-5.4.1.tar ,再进⾏⼆次解压。也可以⽤命令( tar -xzvf net-snmp-5.4.1.tar.gz )将其直接解压!●如何使代理在重启后⾃动运⾏?
答:将程序设置为系统启动时⾃启动。即:
在⽂件/etc/rc.local 中exit 0 之前添加⼀⾏:/usr/local/sbin/snmpd &●如果在linux系统中⾃动安装和卸载snmpd程序?答:使⽤命令:
apt-get install snmpd // 安装snmpd程序apt-get clean
apt-get remove snmpd –purge // 卸载snmpd程序●如何将mib⽂本⽂件转化为树形结构的?
答:以lianyiPublic对象为例,将lianyiPublic对象所在的mib⽂件放在/usr/local/share/snmpd/mibs 中;将snmpd正常运⾏后,然后利⽤命令:mib2c –c mib2c.genhtml.conf lianyiPublic 即可以在当前⽬录下⽣成lianyiPublic.html ⽂件;●⽤OID的数字表⽰可以正常,但是为什么⽤名称表⽰就不⾏?答:需要在头⽂件中加⼊:config_add_mib(LIANYI-MIB)其中参数 LIANYI-MIB 是mib⽂件名LIANYI-MIB.txt●代理未正常运⾏,我该如何查错?
答:我采⽤的查错⽅法是参考其输出的打印信息。这些打印信息存储在/var/log/snmpd.log ⽂件中。要使打印信息存储在该⽂件中,必须在启动代理时按如下指令执⾏:cd /usr/local/sbin/
./snmpd -Lf /var/log/snmpd.log –DALL
同时注意:在执⾏之前存在/var/log/snmpd.log⽂件,并且将⽂件中原来的内容清空!这样便于查找问题。在每次清空snmpd.log⽂件后都需要重新执⾏上述命令以重新启动代理;●各个⽂件的在Linux系统中存放路径是什么?
答:实际上所有路径都可以通过配置⽂件修改的。以下是默认路径:/usr/local/share/snmp/mibs //mib⽂件存放处
/usr/local/etc/snmp/snmpd.conf //配置⽂件
../net-snmp-5.4.1/EXAMPLE.conf //snmpd.conf的实例配置⽂件/usr/local/sbin/snmpd //可执⾏程序●在嵌⼊式板⼦中为了代理未正常运⾏?
答:snmpd运⾏后会在/var/net-snmp⽬录下⽣成⼀个snmpd.conf⽂件。根据测试发现:需要把/usr/local/etc/snmp/snmpd.conf下的⽂件拷贝到/var/net-snmp中
即:cp /usr/local/etc/snmp/snmpd.conf /var/net-snmp/ ;●我⽤⼀般⽤户为什么不能make?
答:经过测试发现,⽤⼀般⽤户安装会提⽰权限不够,所以需要⽤root⽤户。另外,在进⾏配置操作时,通过su 转⼊其他⽤户不能正常进⾏,必须重新登陆SSH。●该包对跨⽹情况的反应是什么?
答:经过测试发现,在内⽹与外⽹分别搭建环境后,可以通过内⽹操纵外⽹的代理,但不能通过外⽹操纵内⽹的代理。如:内⽹ip:192.168.12.77 外⽹ip:218.28.20.156
192.168.12.77(管理端)-------> 218.28.20.156(代理)ok!218.28.20.156(管理端)-------> 192.168.12.77(代理)fail!
所以―管理端—代理端‖的单纯机制还不适合管理端跨⽹操作局域⽹内代理的情况;●
7Windows环境中开发中的问题与解决(转)
在开始拿到这个软件包时,并不知道从哪⾥下⼿,只是按照帮助中关于win32平台下的说明往下做,但在编译源代码包时,编译到代理程序时就进⾏不下去了,出现了很多全局变量的依赖错误,当时的判断是编译环境的设置问题。于是转到CygWin下,利⽤⾃带的makefile来编译整个代码,⾮常成功的编译并安装到CygWin中。我们试着在其中编译了⼏个例⼦以及⾃⼰写的⼏个程序,也成功的通过了。在例⼦中,提供了⼀个makefile⽂件,于是就观察其环境设置。在其gcc的编译中,⽤到了CFLAGS=-I. `net-snmp-config --cflags`BUILDLIBS=`net-snmp-config --libs`
BUILDAGENTLIBS=`net-snmp-config --agent-libs`
查找配置⽂件,发现这⾥⾯涉及到四个关键库(见前⾯环境设置章节),在VC中我都没有加上去。在VC中添加上去后,变量依赖问题⼤⼤减少,发现遗留的错误是由socket引起的。加上wsock32.lib后,在VC下就可以通过先前的程序了。
但程序运⾏时有碰到了问题,查不到结果,或者程序崩溃。最后我们通过检查环境设置,对⽐⽂件,发现问题出在
netsnmpagent.lib这个库上。在原有的基础上重编译这个库,新编译的库⽐原来⼤了⼏倍,也就是说库的编译存在⼀个先后顺序关系,可能这个库要引⽤到其他库,可能VC没那么智能,需要⼿⼯设置。解决这个问题后,后⾯碰到的基本上是编写程序本⾝的错误了。8总结
n et-snmp是⼀个功能很强的软件,这个开源项⽬仍在不断前进中。我们所做的只使⽤了其中的⼀⼩部分功能,主要是学习了它的⼀个开发流程、简单的结构框架,以及⼯具的使⽤;另外也学习了snmp协议,了解了开发包应为⽤户隔离底层细节,提供应⽤接⼝给⽤户。Net-snmp的帮助⽂档并不适合新⼿⼊门,它的帮助都是针对功能写的,⼀般通过它的开发⽹站中的tutorials来编译⼏个例⼦逐渐了解其功能,再回头查看帮助说明。Net-snmp项⽬⽬前放在
http://www.doczj.com/doc/99e45dfe700abb68a982fbec.html /,可以加⼊net-snmp的邮件列表寻求帮助。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务