Sté*_*ane 7 c c++ snmp net-snmp
我写了一个AgentX应用程序(Linux,gcc,g ++),它可以很好地发送回缩放器.这是我现在正在做的事情:
init_agent( "blah" );
netsnmp_register_read_only_scalar( netsnmp_create_handler_registration( "foo1", handle_foo1, oid, oid.size(), HANDLER_CAN_RONLY ) );
init_snmp( "blah" );
while ( true )
{
// internal stuff
agent_check_and_process(1); // where 1==block
}
Run Code Online (Sandbox Code Playgroud)
handle_foo1(...)调用函数snmp_set_var_typed_value(...)返回在应用程序中的全局C结构中缓存的值.
我现在要做的是修改此代码以支持SNMP表.表的内容作为STL容器存储/缓存在应用程序中.这是一个相对简单的SNMP表,具有连续的行,所有列都由Integer32,Gauge32,InetAddress和TruthValue等类型组成.问题是我在net-snmp网站上看不到很好的代码示例,只是很多doxygen页面.
我的问题:
我应该看什么API?这些是正确的电话:
netsnmp_register_read_only_table_data();
netsnmp_create_table_data();
netsnmp_create_table_data_row();
netsnmp_table_data_add_row();
Run Code Online (Sandbox Code Playgroud)
......或者我应该使用哪些更简单的东西?
Sté*_*ane 15
我认为net-snmp最大的痛苦就是谷歌索引的那些Doxygen页面,但它提供了几乎为零的可用内容..h对于大多数开发人员而言,读取文件可能已经很明显了,事实上net-snmp提供了许多不同的API层,我发现很少有文档可用.我们需要的不是托管Doxygen的几十个相同的网站副本,而是一些很好的例子.
最后,mib2c工具是我获得足够的示例代码以使整个工作正常工作的方式.我想我尝试用每个net-snmp .conf文件运行mib2c ,并花了很多时间阅读它生成的代码以便更好地理解.以下是我发现给我最好的提示:
该.conf文件是在这里: /etc/snmp/mib2c.*
以下页面也很有用:
据我所知,net-snmp API中有许多帮助器/层.所以这个示例伪代码可能不适用于所有人,但这是我个人使用net-snmp v5.4让我的表工作的方式:
跨多个函数需要变量(使其成为全局变量,还是结构的成员?)
netsnmp_tdata *table = NULL;
Run Code Online (Sandbox Code Playgroud)
表示表的一行的结构(必须与MIB定义匹配)
struct MyTable_entry
{
long myTableIndex;
...insert one line here for each column of the table...
int valid; // add this one to the end
}
Run Code Online (Sandbox Code Playgroud)
使用snmpd初始化表
std::string name( "name_of_the_table_from_mib" );
table = netsnmp_tdata_create_table( name.c_str(), 0 );
netsnmp_table_registration_info *table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
netsnmp_table_helper_add_indexes( table_info, ASN_INTEGER, 0 ); // index: myTableIndex
// specify the number of columns in the table (exclude the index which was already added)
table_info->min_column = COLUMN_BLAH;
table_info->max_column = MAX_COLUMN_INDEX;
netsnmp_handler_registration *reg = netsnmp_create_handler_registration( name.c_str(), MyTable_handler, oid, oid.size(), HANDLER_CAN_RONLY );
netsnmp_tdata_register( reg, table, table_info );
Run Code Online (Sandbox Code Playgroud)
处理请求的处理程序
int myTable_handler( netsnmp_mib_handler *handler, netsnmp_handler_registration *reginfo, netsnmp_agent_request_info *reqinfo, netsnmp_request_info *requests )
{
if ( reqInfo->mode != MODE_GET ) return SNMP_ERR_NOERROR;
for ( netsnmp_request_info *request = requests; request; request = request->next )
{
MyTable_entry *table_entry = (MyTable_entry*)netsnmp_tdata_extract_entry( request );
netsnmp_table_request_info *table_info = netsnmp_extract_table_info( request );
if ( table_entry == NULL ) { netsnmp_set_request_error( reqinfo, request, SNMP_NOSUCHINSTANCE); continue; }
switch ( table_info->colnum )
{
// ...this is similar to non-table situations, eg:
case COLUMN_BLAH:
snmp_set_var_typed_integer( request->requestvb, ASN_INTEGER, table_entry->blah ); break;
// ...
default: netsnmp_set_request_error( reqinfo, request, SNMP_NOSUCHOBJECT );
}
}
return SNMP_ERR_NOERROR;
}
Run Code Online (Sandbox Code Playgroud)
在表中构建/添加行
if ( table == NULL ) return; // remember our "global" variable named "table"?
// start by deleting all of the existing rows
while ( netsnmp_tdata_row_count(table) > 0 )
{
netsnmp_tdata_row *row = netsnmp_tdata_row_first( table );
netsnmp_tdata_remove_and_delete_row( table, row );
}
for ( ...loop through all the data you want to add as rows into the table... )
{
MyTable_entry *entry = SNMP_MALLOC_TYPEDEF( MyTable_entry );
if ( entry == NULL ) ... return;
netsnmp_tdata_row *row = netsnmp_tdata_create_row();
if ( row == NULL ) SNMP_FREE( entry ); .... return;
entry->myTableIndex = 123; // the row index number
// populate the table the way you need
entry->blah = 456;
// ...
// add the data into the row, then add the row to the table
entry->valid = 1;
row->data = entry;
netsnmp_tdata_row_add_index( row, ASN_INTEGER, &(entry->myTableIndex), sizeof(entry->myTableIndex) );
netsnmp_tdata_add_row( table, row );
}
Run Code Online (Sandbox Code Playgroud)
把它放在一起
在我的例子中,构建行的最后一个函数由系统中的其他一些事件周期性地触发.因此,每当新的统计数据可用时,每隔一段时间就重建一次表,删除所有旧行,并插入新行.我没有打算尝试修改现有的行.相反,我发现从头开始重建表更容易.
| 归档时间: |
|
| 查看次数: |
16159 次 |
| 最近记录: |