写动态加载对象的方法与写普通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) |