求助 net-snmp 自定义mib 表格式更新问题

hubi 2015-07-14 03:35:47
背景:基于net-snmp开源框架,自己定义私有MIB,这个MIB格式是table的方式,通过mib2c生成相应的源文件,在源文件的基础上修改。
问题:定义的私有MIB中,比如系统运行状态信息,如相关进程信息,这些是动态的,实时的,我的代码中只是在初始化话的时候,获取一次进程信息。不知道怎么去更新它,value的方式比较简单,但表格式就不知道怎么弄了,对net snmp的源码不熟。希望哪位大神在这方面有经验的,指导下,困恼了好多天了。

以下是部分关键代码:

//这一部分是初始化话我定义的MIB文件中的各个表,一进程table为例
void
init_dpiProject(void)
{
/* here we initialize all the tables we're planning on supporting */
initialize_table_DevBasicInfoTable();
initialize_table_DevHardwareTable();
initialize_table_DevSoftwareTable();
initialize_table_DevProcessTable();
initialize_table_DevCpuTable();
initialize_table_DevinterAccessTable();
initialize_table_DevStatisticTable();
}
复制代码
//这个代码我从系统中取出进程信息,插入到DevProcessTable_head链表中
/** Initialize the DevProcessTable table by defining its contents and how it's structured */
void
initialize_table_DevProcessTable(void)
{
const oid DevProcessTable_oid[] = {1,3,6,1,4,1,ENTERPRISE_ID,0,1,0,4};
const size_t DevProcessTable_oid_len = OID_LENGTH(DevProcessTable_oid);
netsnmp_handler_registration *reg;
netsnmp_iterator_info *iinfo;
netsnmp_table_registration_info *table_info;

DEBUGMSGTL(("dpiProject:init", "initializing table DevProcessTable\n"));

reg = netsnmp_create_handler_registration(
"DevProcessTable", DevProcessTable_handler,
DevProcessTable_oid, DevProcessTable_oid_len,
HANDLER_CAN_RONLY
);

table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
netsnmp_table_helper_add_indexes(table_info,
ASN_INTEGER, /* index: processIdx */
0);
//1.mod by zhouziheng
table_info->min_column = COLUMN_MIN;
table_info->max_column = COLUMN_MAX;

//2.mod by zhouziheng
//获取运行时信息,DevProcess
get_runtime_devInfo(&dev_runtimeInfo);

struct DevProcessTable_entry *p_devProcessTable_entry;
int index;
for (index = 1; index < dev_runtimeInfo.processNum + 1; ++index)
{
p_devProcessTable_entry = DevProcessTable_createEntry(index, &dev_runtimeInfo);
}

DevProcessTable_head = p_devProcessTable_entry;
//end by zhouziheng

iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
iinfo->get_first_data_point = DevProcessTable_get_first_data_point;
iinfo->get_next_data_point = DevProcessTable_get_next_data_point;
iinfo->table_reginfo = table_info;

netsnmp_register_table_iterator( reg, iinfo );
netsnmp_inject_handler_before( reg,
netsnmp_get_cache_handler(DEVPROCESSTABLE_TIMEOUT,
DevProcessTable_load, DevProcessTable_free,
DevProcessTable_oid, DevProcessTable_oid_len),
TABLE_ITERATOR_NAME);

/* Initialise the contents of the table here */
}
复制代码
//当snmp请求过来时,会进入这个函数
//add by zhouziheng
static int flag = 1 ;
/** handles requests for the DevProcessTable table */
int
DevProcessTable_handler(
netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{

netsnmp_request_info *request;
netsnmp_table_request_info *table_info;
struct DevProcessTable_entry *table_entry;

DEBUGMSGTL(("dpiProject:handler", "Processing request (%d)\n", reqinfo->mode));

//mod by zhouziheng
if ( 1 == flag )
{
DevProcessTable_free_head();
DevProcessTable_load_head();
flag = 0;
}

table_entry = DevProcessTable_head;

switch (reqinfo->mode)
{
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request=requests; request; request=request->next)
{
#if 0
table_entry = (struct DevProcessTable_entry *)
netsnmp_extract_iterator_context(request);
#endif
table_info = netsnmp_extract_table_info( request);

switch (table_info->colnum) {
case COLUMN_PROCESSIDX:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer( request->requestvb, ASN_INTEGER,
table_entry->processIdx);
break;
case COLUMN_PROCESS:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->process,
table_entry->process_len);
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHOBJECT);
break;
}
}
break;

}
#if 0
if (NULL != DevProcessTable_head)
{
DevProcessTable_head = DevProcessTable_head->next;
}
else
{
flag = 1;
}
#endif
return SNMP_ERR_NOERROR;
}
复制代码
现在问题就是只能读取内存中第一次存的信息,如果我再启动其他进程,它查不到啊 。。。怎么解决,急急急!!
...全文
164 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,424

社区成员

发帖
与我相关
我的任务
社区描述
其他开发语言 其他开发语言
社区管理员
  • 其他开发语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧