net-snmp添加自定义mib树
首先我们把前面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 ::= BEGINIMPORTSenterprises, OBJECT-TYPE, MODULE-IDENTITY FROM SNMPv2-SMI;-- 1.3.6.1.4.1.2arhangelskNode1 MODULE-IDENTITY LAST-UPDATED "202507251837Z" -- July 25, 2025 at 18:37 GMTORGANIZATION "Organization."CONTACT-INFO "Contact-info."DESCRIPTION "Description."::= { enterprises 2 }--
-- Node definitions
---- 1.3.6.1.4.1.2.1arhangelskNode0 OBJECT-TYPESYNTAX INTEGERMAX-ACCESS read-writeSTATUS currentDESCRIPTION"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, sowe 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参数的话不能太短 应该是对密码长度有要求