net-snmp添加自定义mib树

发布于:2025-07-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

首先我们把前面mib2c生成的文件修改 下面重新做了个简单点的MIB树

--
-- 
-- MIB generated by MG-SOFT Visual MIB Builder Version 6.0  Build 88
-- Saturday, July 26, 2025 at 09:24:54
--

	ARHANGELSK-GLOBAL-REG DEFINITIONS ::= BEGIN
 
		IMPORTS
			enterprises, OBJECT-TYPE, MODULE-IDENTITY			
				FROM SNMPv2-SMI;
	
	
		-- 1.3.6.1.4.1.2
		arhangelskNode1 MODULE-IDENTITY 
			LAST-UPDATED "202507251837Z"		-- July 25, 2025 at 18:37 GMT
			ORGANIZATION 
				"Organization."
			CONTACT-INFO 
				"Contact-info."
			DESCRIPTION 
				"Description."
			::= { enterprises 2 }

		
	
--
-- Node definitions
--
	
		-- 1.3.6.1.4.1.2.1
		arhangelskNode0 OBJECT-TYPE
			SYNTAX INTEGER
			MAX-ACCESS read-write
			STATUS current
			DESCRIPTION
				"Description."
			::= { arhangelskNode1 1 }

		
	
	END

--
-- 
--

只有一个int型的值 可读写

然后我们使用mib2c生成对应的框架代码 ,这里只有标量 所以只需要生成一次,生成之后我们把对应的c文件改成如下:

/*
 * Note: this file originally auto-generated by mib2c
 * using mib2c.scalar.conf
 */

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

/* 定义标量节点的 OID 和存储变量 */
#define ARHANGELSKNODE0_OID "1.3.6.1.4.1.2.1"
static int arhangelskNode0_value = 42;  // 初始值
/** Initializes the arhangelskNode1 module */
void
init_arhangelskNode1(void)
{
    const oid arhangelskNode0_oid[] = { 1,3,6,1,4,1,2,1 };

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

    netsnmp_register_scalar(
        netsnmp_create_handler_registration("arhangelskNode0", handle_arhangelskNode0,
                               arhangelskNode0_oid, OID_LENGTH(arhangelskNode0_oid),
                               HANDLER_CAN_RWRITE
        ));
}

int
handle_arhangelskNode0(netsnmp_mib_handler *handler,
                          netsnmp_handler_registration *reginfo,
                          netsnmp_agent_request_info   *reqinfo,
                          netsnmp_request_info         *requests)
{
    int ret;
    int new_value;
    /* 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_INTEGER,  // 数据类型
              (u_char*)&arhangelskNode0_value,  // 数据指针
              sizeof(arhangelskNode0_value)     // 数据长度
          );
            break;

        /*
         * SET REQUEST
         *
         * multiple states in the transaction.  See:
         * http://www.net-snmp.org/tutorial-5/toolkit/mib_module/set-actions.jpg
         */
        case MODE_SET_RESERVE1:
             /* 验证输入类型 */
            ret = netsnmp_check_vb_type(requests->requestvb, ASN_INTEGER);
            if (ret != SNMP_ERR_NOERROR) {
                netsnmp_set_request_error(reqinfo, requests, ret);
                return ret;
            }
            break;

        case MODE_SET_RESERVE2:
           /* 分配临时存储(非必需,此处省略) */
            break;

        case MODE_SET_FREE:
             /* 释放临时资源(此处省略) */
            break;

        case MODE_SET_ACTION:
            /* 更新值并验证范围 */
            new_value = *(int*)requests->requestvb->val.string;
            if (new_value < 0 || new_value > 100) {
                return SNMP_ERR_WRONGVALUE;  // 值越界
            }
            arhangelskNode0_value = new_value;
            break;
            break;

        case MODE_SET_COMMIT:
             /* 提交变更(此处省略) */
            break;

        case MODE_SET_UNDO:
             /* 回滚变更(此处省略) */
            break;

        default:
            /* we should never get here, so this is a really bad error */
            snmp_log(LOG_ERR, "unknown mode (%d) in handle_arhangelskNode0\n", reqinfo->mode );
            return SNMP_ERR_GENERR;
    }

    return SNMP_ERR_NOERROR;
}

这里主要修改了设置和获取值时候的逻辑

修改完之后 我们就可以把这些代码集成到net-snmp

我们先从官网下载net-snmp

Net-SNMP

这里我下载的是net-snmp-5.9.4

先安装依赖环境

apt install -y build-essential libssl-dev libperl-dev pkg-config

然后解压源码包,解压后:

把我们前面mib2c生成的.c .h文件拷贝到源码目录agent/mibgroup下面

然后进行配置 configure后面接的是我们的模块名

./configure --with-mib-modules="arhangelskNode1"

然后就是 编译生成 make 、make install

完成之后 会在 snmpd 会拷贝到 /usr/local/sbin/snmpd

源码编译之后没有snmpd.conf 自己可以从其他地方拷贝一个 或者vi新建一个

然后就可以通过 如下命令启动snmpd snmpd.conf在当前目录下

snmpd -c snmpd.conf 

如果提示

snmpd: error while loading shared libraries: libnetsnmpagent.so.40: cannot open shared object file: No such file or directory

实际这个文件存在

这个时候需要ldconfig就好了

有其他文件我们可以通过snmpd -c /etc/snmp/snmpd.conf -f -Le -d 命令调试启动过程中遇到的问题

启动之后我们就可以测试了

假设我们的配置文件snmpd.conf如下:

# 创建用户时指定不同密码
createUser test MD5 "12345678" DES "123456789"
rwuser test


# 视图配置
view SystemView included .1.3.6.1.4.1.2
view SystemView included .1.3.6.1.2.1.25.1

# 访问控制
rocommunity public default -V SystemView

然后我们启动snmpd 测试结果如下

注意最后一项 不能省略后面的.0 不然会提示有问题 这里也可以看到 DES没有用 具体我也不知道为什么 但是如果带了des参数的话不能太短 应该是对密码长度有要求


网站公告

今日签到

点亮在社区的每一天
去签到