下载net-snmp-5.7.3
解压执行
./configure --build=i686-linux --host=arm-linux CC=arm-linux-gcc --with-endianness=little --prefix=/opt/net-snmp --with-ar=arm-linux-ar LDFLAGS="-static" --disable-embedded-perl --without-perl-modules
-enable-mini-agent -disable-mibs --with-mib-modules=dlmod
在configure中,当我们选择了--enable-mini-agent这个选项之后,将会不自动加载大多数modules,其中包括dlmod mudules,这个模块是用于加载动态库模块。为了使用这个模块,我们需要在选择 --enable-mini-agen之后。再选择--with-mib-modules=dlmod这个选项,同时还要将在agent/mibgroup/ucd-snmp下的dlmod的C文件跟H文件移到agent/mibgroup下,编译就安装之后就可以使用。
之前我有取消的--enable-mini-agent这个参数,但是发现取消之后,虽然dlomd modules能否加载成功,可是当你运行snmp的这个进程的时候,会出现段错误的提示。make
make install
编写mib库
先准备一个xxx.mib
env MIBS="+./RFC1628_UPS_MIB.MIB" mib2c upsMIB
将生成的.so文件的路径添加到snmpd.conf配置文件中,打开snmpd.conf添加内容如下(样例):
dlmod FY04040019(你so文件所在地址)/FY04040019.so
这样以后启动snmpd时就自动加载这个模块了。
编译出.so文件后就可以把该文件链接到snmpd中了,命令如下(该命令用于服务检测,启动以后该终端就一直检测snmp包的信息):
snmpd -f -d -L -DFY04040019,dlmod -DFY04040019 -c /usr/local/share/snmp/snmpd.conf
trap添加
env MIBS="+/opt/net-snmp/RFC1628_UPS_MIB.MIB" mib2c -c mib2c.notify.conf upsMIB
以下为例程
extern const oid snmptrap_oid[]= {1,3,6,1,6,3,1,1,4,1,0};
const size_t snmptrap_oid_len = OID_LENGTH(snmptrap_oid);
void init_TestTraps(void)
{
DEBUGMSGTL(("TestTraps","Initializing\n"));
snmp_alarm_register(1,SA_REPEAT,read_cpudata_repeat,NULL);
}
int
send_cpuRatioHigh_trap(void)
{
netsnmp_variable_list *var_list = NULL;
const oid cpuRatioHigh_oid[]= { 1,3,6,1,4,1,1000,1,1 };
const oid TestTrapDescription_oid[]= { 1,3,6,1,4,1,1000,1,2,1,0 };
static char TestTrapDescription[50];
strcpy(TestTrapDescription,"CPU使用率过高");
/*
* Set the snmpTrapOid.0 value
*/
snmp_varlist_add_variable(&var_list,
snmptrap_oid,snmptrap_oid_len,
ASN_OBJECT_ID,
cpuRatioHigh_oid,sizeof(cpuRatioHigh_oid));
/*
* Add any objects from the trap definition
*/
snmp_varlist_add_variable(&var_list,
TestTrapDescription_oid,OID_LENGTH(TestTrapDescription_oid),
ASN_OCTET_STR,
/* Set an appropriate value for TestTrapDescription */
NULL,0);
/*
* Add any extra(optional)objects here
*/
/*
* Send the trap to the list of configured destinations
* and clean up
*/
send_v2trap(var_list);
snmp_free_varbind(var_list);
return SNMP_ERR_NOERROR;
}
void judge_send_cputrap(int cpu)
{
static unsigned int cputrap_clientreg = 0;
if(cpu > 80)
{
if(cputrap_clientreg == 0){
send_cpuRatioHigh_trap();
cputrap_clientreg = snmp_alarm_register(5,SA_REPEAT,send_cpuRatioHigh_trap,NULL);
}
}
else
{
if(cputrap_clientreg != 0)
{
snmp_alarm_unregister(cputrap_clientreg);
cputrap_clientreg = 0;
}
}
}
void read_cpudata_repeat(unsigned int clientreg,void *clientarg)
{
int cpu = 90;
judge_send_cputrap(cpu);
}