- 论坛徽章:
- 0
|
背景:基于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;
- }
复制代码 现在问题就是只能读取内存中第一次存的信息,如果我再启动其他进程,它查不到啊 。。。怎么解决,急急急!! |
|