我能够将 95% 的专用 MIB 转换为 C 代码,并使其在子代理中运行,如本Net-SNMP 教程的最后部分所述
为此,我自然而然地使用mib2c.mfd.conf(我刚刚读到mfd代表 Mib For Dummies ......都说了......)
mib2c -I -c mib2c.mfd.conf my_mib_node
它生成了一个长长的 .c 文件,其中几乎所有的 oid 如下所示。
几乎没有为 VideoInetAddr OID 生成任何行
//ABSTRACT OF SOURCE FILE GENERATED BY MIB2C
//...
long VideoFormat = 0; /* XXX: set default value */
// <<<=== NOTHING GENERATED HERE FOR VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER INTEGERS ARE NORMALLY PRESENT
long VideoInetPort = 0; /* XXX: set default value */
//...
void init_my_mib_node(void)
{
//...
const oid VideoFormat_oid[] = { 1,3,6,1,4,1,a,b,c,d,e };
static netsnmp_watcher_info VideoFormat_winfo;
// <<<=== NO OID GENERATED for VideoInetAddr OF TYPE INETADDRESS
// WHEREAS OTHER OIDs ARE NORMALLY GENERATED
static netsnmp_watcher_info VideoInetAddr_winfo; //We have the winfo after all
const oid VideoInetPort_oid[] = { 1,3,6,1,4,1,a,b,c,d,g };
static netsnmp_watcher_info VideoInetPort_winfo;
DEBUGMSGTL(("my_mib_node",
"Initializing VideoFormat scalar integer. Default value = %d\n",
VideoFormat));
reg = netsnmp_create_handler_registration(
"VideoFormat", NULL,
VideoFormat_oid, OID_LENGTH(VideoFormat_oid),
HANDLER_CAN_RWRITE);
netsnmp_init_watcher_info(&VideoFormat_winfo, &VideoFormat,
sizeof(long),ASN_INTEGER, WATCHER_FIXED_SIZE);
if (netsnmp_register_watched_scalar( reg, &VideoFormat_winfo ) < 0 ) {
snmp_log( LOG_ERR, "Failed to register watched VideoFormat" );
//...
}
这工作得很好,需要 5 分钟(无需编写代码,只需调用 init() 函数),我能够获取和设置所有...整数...
未生成某些类型为 InetAddress 的 oid,字符串也未生成
问题
- 是否有能够为每种类型生成代码的 mib conf 文件
我尝试了mib2c.old-api.conf,它也为非整数 oid 生成代码,但我发现它不太方便。还有更多样板代码要编写。