Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40063
  • 博文数量: 8
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 118
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-29 20:23
文章分类
文章存档

2010年(4)

2009年(4)

我的朋友

分类: 系统运维

2010-01-07 14:03:18

写动态加载对象的方法与写普通SNMP模块的方法基本一致,只是设置上的区别。
开始前,需要确认snmpd主代理已采用了支持DLMOD的编译选项。编译时使用
./configure --enable-shared $OTHER_OPTIONS
安装好后用
snmpd -H | grep dlmod
查看是否已经支持DLMOD。
同样的,准备好三个文件:MIB文件,对象实现的头文件,.c文件。这些文件与普通的SNMP模块的区别在于,需定义一个“去初始化”函数
void deinit_nstFILENAME(void)
在该函数中使用unregister_mib函数注销OID。
注意在snmpd.conf中为目标位置开放读/写的权限

我用的三个文件为
NET-SNMP-TUTORIAL-MIB.txt(MIB文件)
nstAgentPluginObject.h
nstAgentPluginObject.c

准备好这三个文件后开始配置
1、编译共享库文件
可以直接使用命令行编译,也可写成MAKE文件。命令行
cc `net-snmp-config --cflags` -fPIC -shared -g -O0 -o nstAgentPluginObject.so nstAgentPluginObject.c `net-snmp-config --libs`
其中`net-snmp-config --cflag`,`net-snmp-config --libs`参数指定编译链接时所用的脚本和库,-fPIC表示生成位置无关代码(position-independent code),-shared表示生成共享库,一般-fPIC与-shared同时使用。-g生成调试信息。-O0不采用编译优化。-o OBJFILENAME指定目标文件名。
2、将生成的共享库动态加载到主代理
• 以独立的终端启动snmpd代理,输出指定的调试信息
snmpd -f -L -DnstAgentPluginObject,dlmod
• 查看当前不存在指定的模块
snmpget -v2c -c COMMUNITYNAME localhost NET-SNMP-TUTORIAL-MIB::nstAgetnPluginObject.0
输出
nstAgentPluginObject.0 = No Such Object available on this agent at this OID
• 在代理MIB库中创建表项以支持新的模块动态加载。该表控制动态模块名,共享库路径,模块是否加载。
snmpset -v2c -c COMMUNITYNAME localhost UCD-DLMOD-MIB::dlmodStatus.1 i create
• 查看表项已创建
snmptable localhost UCD-DLMOD-MIB::dlmodTable
输出
    SNMP table: dlmodTable
    dlmodName dlmodPath dlmodError dlmodStatus
    unloaded (或3)
• 指定共享库的位置和动态模块名
snmpset -v2c -c COMMUNITYNAME localhost UCD-DLMOD-MIB::dlmodName.1 s "nstAgentPluginObject" UCD-DLMOD-MIB::dlmodPath.1 s "(全路径)/nstAgentPluginObject.so"
输出
    dlmodName.1 = "nstAgentPluginObject"
    dlmodName.1 = "/path/to/nstAgentPluginObject.so"
• 查看表项值
snmpTable -v2c -c COMMUNITYNAME localhost UCD-DLMOD-MIB::dlmodTable
输出
    SNMP table: dlmodTable
    dlmodName dlmodPath dlmodError dlmodStatus
    nstAgentPluginObject (全路径)/nstAgentPluginObject.so unloaded
• 加载共享库(其实是置上标志)
snmpset -v2c -c COMMUNITYNAME localhost UCD-DLMOD-MIB::dlmodStatus.1 i load
输出
    dlmodStatus.1 = loaded(1)
• 查看表项值
snmpTable -v2c -c COMMUNITYNAME localhost UCD-DLMOD-MIB::dlmodTable
输出
    SNMP table: dlmodTable
    dlmodName dlmodPath dlmodError dlmodStatus
    nstAgentPluginObject (全路径)/nstAgentPluginObject.so loaded
• 测试
snmpget -v2c -c COMMUNITYNAME localhost NET-SNMP-TUTORIAL-MIB::nstAgentPluginObject.0
输出
    nstAgentPluginObject.0 = INTEGER: 3
成功
3、实际使用中多采取直接在snmpd.conf文件中指定模块在snmpd启动时加载,在snmpd.conf中添加命令
dlmod nstAgentPluginObject (全路径)/nstAgentPluginObject.so

原指导文档见


阅读(7407) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

99次轮回2016-05-09 10:11:31

LZ你好,不知道你还更不更新帖子。目前我的一个项目遇到一个问题,想请教一下。我使用net-snmp代理管理网络设备,当管理端来一个命令时,代理端并不知道请求的结果是什么,需要一种异步的方式,把结果返回给管理端。举个例子,查询系统名称,一般的方式是,管理端命令下来,代理端立马就能把结果返回。现在是管理端来一个命令,代理端需要和其他设备进行通信,而结果不知道什么时候回来。对于这种情况,不知道你有什么建议方法,谢谢!

chinaunix网友2010-02-22 18:52:55

LZ精神可嘉,谢谢了!