net-snmp添加自定义MIB

我所知道的添加自定义MIB的方法有三种

1.静态加载,将生成的.c和.h文件加入到相应的位置,重新编译snmp库,优点是不需要修改配置文件,缺点是每次添加都得重新编译;

2.动态加载,将生成的.c和.h文件再编译成.so库,修改snmpd.conf配置文件。优点是每次添加不需要重新编译,缺点是必须支持dlmod命令;

3.子代理扩展,将生成的.c和.h文件编译成可执行程序,运行该程序和snmpd即可,优点是操作简单,缺点是需要运行两个程序才行。

三种方法的前几步是一样的,都是编写MIB,生成.c和.h文件,补全.c文件。

1.编写MIB

MIB的语法见http://blog.csdn.net/shanzhizi/article/details/15340305,写得很清楚,很详细。

下面给出我自己的MIB文件。

-- Test-SLK-MIB.txt

Test-SLK-MIB DEFINITIONS ::= BEGIN

IMPORTS

OBJECT-GROUP, MODULE-COMPLIANCE, NOTIFICATION-GROUP

FROM SNMPv2-CONF

enterprises, Integer32, Unsigned32, OBJECT-TYPE, MODULE-IDENTITY,

NOTIFICATION-TYPE

FROM SNMPv2-SMI

DisplayString

FROM SNMPv2-TC;

Test MODULE-IDENTITY

LAST-UPDATED "201601221450Z"       --必须以Z结尾

ORGANIZATION

""

CONTACT-INFO

""

DESCRIPTION

"Video‘s Server MIB."

::= { enterprises 745352 }

Time OBJECT IDENTIFIER ::= { Test 1 }

GetTime OBJECT-TYPE

SYNTAX DisplayString

MAX-ACCESS read-only

STATUS current

DESCRIPTION

"Example : 2016/1/22"

::= { Time 1 }

END

-- Test-SLK-MIB.txt

这个MIB文件很简单,只有一个OID 1.3.6.1.4.1.745352.1.1,把这个MIB放入MIBS文件夹,我的位于/usr/local/snmp/share/snmp/mibs。

2.生成.c和.h文件

运行命令mib2c Test-SLK-MIB::Test 出现的选项依次选2和1.

[[email protected] mibs]# env MIBS="+/etc/snmp/mibs/Test-MIB.my" mib2c Test

writing to -

mib2c has multiple configuration files depending on the type of

code you need to write.  You must pick one depending on your need.

You requested mib2c to be run on the following part of the MIB tree:

OID:                              Test

numeric translation:              .1.3.6.1.4.1.16535

number of scalars within:         1

number of tables within:          0

number of notifications within:   0

First, do you want to generate code that is compatible with the

ucd-snmp 4.X line of code, or code for the newer Net-SNMP 5.X code

base (which provides a much greater choice of APIs to pick from):

1) ucd-snmp style code

2) Net-SNMP style code

Select your choice : 2

**********************************************************************

GENERATING CODE FOR SCALAR OBJECTS:

**********************************************************************

It looks like you have some scalars in the mib you requested, so I

will now generate code for them if you wish.  You have two choices

for scalar API styles currently.  Pick between them, or choose not

to generate any code for the scalars:

1) If you‘re writing code for some generic scalars

(by hand use: "mib2c -c mib2c.scalar.conf Test")

2) If you want to magically "tie" integer variables to integer

scalars

(by hand use: "mib2c -c mib2c.int_watch.conf Test")

3) Don‘t generate any code for the scalars

Select your choice: 1

using the mib2c.scalar.conf configuration file to generate your code.

writing to Test.h

writing to Test.c

**********************************************************************

* NOTE WELL: The code generated by mib2c is only a template.  *YOU*  *

* must fill in the code before it‘ll work most of the time.  In many *

* cases, spots that MUST be edited within the files are marked with  *

* /* XXX */ or /* TODO */ comments.                                  *

**********************************************************************

running indent on Test.h

running indent on Test.c

生成的Test.c文件:

/*

* Note: this file originally auto-generated by mib2c using

*        $

*/

#include <net-snmp/net-snmp-config.h>

#include <net-snmp/net-snmp-includes.h>

#include <net-snmp/agent/net-snmp-agent-includes.h>

#include "Test.h"

/** Initializes the Test module */

void

init_Test(void)

{

const oid       GetTime_oid[] = { 1, 3, 6, 1, 4, 1, 745352, 1, 1 };

DEBUGMSGTL(("Test", "Initializing\n"));

netsnmp_register_scalar(netsnmp_create_handler_registration

("GetTime", handle_GetTime, GetTime_oid,

OID_LENGTH(GetTime_oid), HANDLER_CAN_RONLY));

}

int

handle_GetTime(netsnmp_mib_handler *handler,

netsnmp_handler_registration *reginfo,

netsnmp_agent_request_info *reqinfo,

netsnmp_request_info *requests)

{

/*

* We are never called for a GETNEXT if it‘s registered as a

* "instance", as it‘s "magically" handled for us.

*/

/*

* a instance handler also only hands us one request at a time, so

* we don‘t need to loop over a list of requests; we‘ll only get one.

*/

switch (reqinfo->mode) {

case MODE_GET:

snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,

/*

* XXX: a pointer to the scalar‘s data

*/ ,

/*

* XXX: the length of the data in bytes

*/ );

break;

default:

/*

* we should never get here, so this is a really bad error

*/

snmp_log(LOG_ERR, "unknown mode (%d) in handle_GetTime\n",

reqinfo->mode);

return SNMP_ERR_GENERR;

}

return SNMP_ERR_NOERROR;

}

3.补全Test.c

在代码中XXX处添加相应的值,代码中都有说明,XXX: a pointer to the scalar‘s data,这个要我们填一个指针,XXX: the length of the data in bytes 这个要我们填数据的大小,当然要先定义,然后去获取啊。

补全后

/*

* Note: this file originally auto-generated by mib2c using

*        $

*/

#include <net-snmp/net-snmp-config.h>

#include <net-snmp/net-snmp-includes.h>

#include <net-snmp/agent/net-snmp-agent-includes.h>

#include "Test.h"

#include <time.h>

/** Initializes the Test module */

void

init_Test(void)

{

const oid       GetTime_oid[] = { 1, 3, 6, 1, 4, 1, 745352, 1, 1 };

DEBUGMSGTL(("Test", "Initializing\n"));

netsnmp_register_scalar(netsnmp_create_handler_registration

("GetTime", handle_GetTime, GetTime_oid,

OID_LENGTH(GetTime_oid), HANDLER_CAN_RONLY));

}

int

handle_GetTime(netsnmp_mib_handler *handler,

netsnmp_handler_registration *reginfo,

netsnmp_agent_request_info *reqinfo,

netsnmp_request_info *requests)

{

/*

* We are never called for a GETNEXT if it‘s registered as a

* "instance", as it‘s "magically" handled for us.

*/

/*

* a instance handler also only hands us one request at a time, so

* we don‘t need to loop over a list of requests; we‘ll only get one.

*/

time_t t;

switch (reqinfo->mode) {

case MODE_GET:

time(&t);

char szTime[100];

snprintf(szTime,100,"%s",ctime(&t));

snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,

/*

* XXX: a pointer to the scalar‘s data

*/ szTime,

/*

* XXX: the length of the data in bytes

*/ strlen(szTime));

break;

default:

/*

* we should never get here, so this is a really bad error

*/

snmp_log(LOG_ERR, "unknown mode (%d) in handle_GetTime\n",

reqinfo->mode);

return SNMP_ERR_GENERR;

}

return SNMP_ERR_NOERROR;

}

接下来根据方法不同,步骤也不同。

一、静态链接

把Test.c和Test.h复制到/net-snmp-5.7.3/agent/mibgroups,这里是说net-snmp源码里。

编译./configure --prefix=/usr/local/snmp --with-mib-modules=Test,make && make install。

静态加载成功

二、动态加载

编写makefile文件

CC=gcc

FLAGS=-I. `net-snmp-config --cflags` -g

DLFLAGS=-shared -fPIC -g

Test.so: Test.c

$(CC) $(CFLAGS) $(DLFLAGS) -c -o Test.o Test.c

$(CC) $(CFLAGS) $(DLFLAGS) -o Test.so Test.o

.PHONY : clean

clean :

rm -f *.so *.o

编译生成.so库。

修改snmpd.conf配置文件,在文件末尾加入dlmod Test ${Test.so所在绝对路径}/Test.so

启动snmpd,

/usr/local/snmpd -f -L -DTest,dlmod -c /usr/local/snmp/etc/snmpd.conf

动态加载完成

三、子代理扩展

生成Test程序:

net-snmp-config --compile-subagent Test Test.c

启动snmpd,Test

/usr/local/snmpd -c /usr/local/snmp/etc/snmpd.conf

./Test

完成

时间: 2024-08-05 15:24:28

net-snmp添加自定义MIB的相关文章

基于SNMP的MIB扩展方法研究

文章较长,此文章背景:毕业设计,直接去搜索我的毕业设计选题,当时还傻傻的用百度,在百度文库和CSDN等下载了很多论文.搜索到的论文有以下几种: 1)完全胡扯,听说MIB“树状”模型,直接就有写ta用二叉树实现了,恩,我上次用了Java和氧化还原反应成功拿到抓到外星人,你信不信? 2)介绍了很多知识背景,然后一下子ta们就实现了,他们做了什么工作很少涉及. 3)有位盆友一直写自己在做这件事情,ta也说网上有很多方法,但是没有有价值的方法,ta决定实现一个,但是,ta再也没有更新ta的博客.o(╯□

SNMP与MIB

简单网络管理协议(SNMP:Simple Network Management Protocol)是一套网络管理协议,注意,SNMP是一个强大的网络管理协议,而不是"简单"的.利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态.修改网络设备配置.接收网络事件警告等. TCP/IP网络管理由3部分组成: 一个管理信息库M I B( Management Information Base).管理信息库包含所有代理进程的所有可被查询和修改的参数. 关于 M

SNMP 原理与实战详解

原文地址:http://freeloda.blog.51cto.com/2033581/1306743 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeloda.blog.51cto.com/2033581/1306743 大纲 一.什么是SNMP 二.SNMP背景 三.SNMP结构概述 四.SNMP支持的网管操作 五.SNMP的实现结构 六.SNMP的技术内容 七.SNMP的发展历史 八.SNMP的技术术语 九.综合

SNMP:简单网络管理协议

为什么需要监控? 随着当前企业IT环境中服务器.应用程序数量和类型的不断增加,运维部门需要通过科学和高效的手段尽可能详细.实时和准确的获取整个架构中具体到每个服务器.每个系统甚至每个应用程序工作的细节,并且会对所获取到的原始数据进行分析.绘图和统计.以便为后续的性能调优.架构调整提供参考依据. 常见的检测对象涵盖了IT运行环境的方方面面,包括机房环境.硬件.网络等,而每一个方面所涉及的监控项目则种类繁多.例如对硬件环境的检测中,所涵盖内容就包括服务器的温度/风扇转速等指标:针对系统环境的监控,包

SNMP的相关知识及C#开发事项

项目中会用到SNMP来上报设备信息,所以最近收集了一些关于SNMP的一些文档,暂时保存到这里.在学习和开发中,如果遇到不容易解决的问题,也会记录到这里 SNMP介绍及命令 SNMP基础简介 SNMP协议学习 C# 一个简单实用 SNMP 的例子 通过这个例子,我们可以从底层了解SNMP的通讯方式.可以看到,SNMP是利用UDP进行通讯(默认是161或162端口),拼凑固定格式的数据包发送到管理端,并解析返回数据.当然在实际开发中,我们不会一个字节一个字节的去凑.可以利用现成的开源项目,最出名的就

闲话SNMP

解剖SNMP: 首先把SNMP解个小剖.SNMP分为SNMP管理器(服务器),SNMP代理(客户端),MIB(数据库). SNMP管理器是用SNMP控制和监视网络主机活动的系统.最常见的是NMS.具体产品见CiscoWorks2000. SNMP代理是被管理设备的软件部分,维护和报告设备的数据给管理系统.比如ADSL里面的SNMP客户端就是SNMP代理的一种. MIB是用于网络管理信息的虚拟信息存储区,包括管理对象的集合.MIB模块是由SNMP MIB模块语言写成.SNMP代理包括了MIB变量,

SNMP详解

什么是SNMP 简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议.该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor Protocol). SNMP为不同厂家生产的不同种类.不同型号的设备定义了一个统一的规范,大大简化了设备管理员的管理工作,提高工作效率. SNMP的工作方式 SNMP可以让一个管

snmp基础知识

1; 全称为simple network management protocol,中文为简单网络管理协议. 2; snmp协议的版本; 1; snmp v1(版本1); 有三个community认证, 分别是read-only( 只能获取信息 ).read-write( 能获取信息,也能发送控制指令 ).trap( agent主动联机nms ); 2; snmp v2(版本2); 功能增强,但仍基于community的认证; 因此又称2c版本; 3; snmp v3(版本3); 这个版本认证加强

SNMP概述–运维必知的协议基础

一.什么是SNMP? SNMP是  “Simple Network Management Protocol” 的缩写,中文意思是简单网络管理协议,它是由互联网工作小组在RFC1157中定义的应用层协议,用于在网络实体或节点之间交换管理或监控信息. 二.为什么需要SNMP? 作为运维人员,我们很大一部分的工作就是为了保证我们的网络能够正常.稳定的运行.因此监控,控制,管理各种网络设备成了我们日常的工作.在网络兴起的早期,维护方式就是运维人员蹲在近端对设备进行各种操作,当网络设备越来越多,网络规模越