snmp/mib采用子代理模式,编码,部署(二)---多实例处理
snmp/mib采用子代理模式,编码,部署(二)---多实例处理
0.本文针对net-snmp中mib表做处理,即单张表对应后台多个实例.
1.源代码生成
拷贝GSC-MIB-0805.txt到/usr/share/snmp/mibs(具体看自己安装目录,如果找不到,下面解析mib时会报错报出路径)
重启snmpd服务,service restart snmpd
snmptranslate -Tp -IR GSC-MIB::atcaBoardTable //针对table表格实现
[root@VM-4-14-opencloudos mibs]# snmptranslate -Tp -IR GSC-MIB::atcaBoardTable
+--atcaBoardTable(5)
|
+--atcaBoardEntry(1)
| Index: atcaBoardInfoIndex
|
+-- ---- Unsigned atcaBoardInfoIndex(1)
| Range: 1..65535
+-- CR-- String atcaBoardCPU1Temperature(2)
+-- CR-- String atcaBoardCPU2Temperature(3)
+-- CR-- String atcaBoardPowerState(4)
+-- CR-- String atcaBoardRunSoftwareName(5)
+-- CR-- String atcaBoardCpuUtillization(6)
+-- CR-- String atcaBoardMemoryUtilization(7)
+-- CR-- String atcaBoardDiskUtilization(8)
+-- CR-- String atcaBoardPowerValue(9)
至此mib解析成功,下面来生成表格处理迭代器代码.
2.代码生成
mib2c mib2c.iterate.conf GSC-MIB::atcaBoardTable
出现很多选项,自己可以看,选择合适的,这里我们选择最灵活的一种方式迭代器方式:2,2,1,1
[root@VM-4-14-opencloudos home]# mib2c mib2c.iterate.conf GSC-MIB::atcaBoardTable
Replacing previous mibNode mib2c.iterate.conf with GSC-MIB::atcaBoardTable
writing to -
mib2c has multiple configuration files depending on the type of
code you need to write. You must pick one depending on your need.
You requested mib2c to be run on the following part of the MIB tree:
OID: atcaBoardTable
numeric translation: .1.3.6.1.4.1.12001.5.5
number of scalars within: 0
number of tables within: 1
number of notifications within: 0
First, do you want to generate code that is compatible with the
ucd-snmp 4.X line of code, or code for the newer Net-SNMP 5.X code
base (which provides a much greater choice of APIs to pick from). You
can also generate C-header files containing define statements for
column numbers, enums, etc. Or do you simply want to translate the
MIB structures into documentation?
1) ucd-snmp style code
2) Net-SNMP style code
3) Generate header files
4) Generate documentation
Select your choice : 2
**********************************************************************
GENERATING CODE FOR TABLES:
**********************************************************************
The Net-SNMP agent API is extremely extensive and, in fact, lets
each programmer write agent code according to the style that works
best for them based on their experience and their preference. We're
going to ask you a serious of questions that will help mib2c
generate code that best suits *your* needs, as the programmer that
will be responsible for taking the code and further refining it. If
you don't like how the results look, you are always welcome to
re-run mib2c and select a different set of options.
There are essentially two tasks involved in processing requests
for OIDs within a MIB table - firstly identifying the relevant row
of the table for a given request, and then returning (or updating)
the appropriate column value within that row. Many MIB tables model
the state of some external system (the kernel, a device, processes,
etc), and the MIB implementation module (the code we're about to
produce a template for) acts as an interface between this underlying
system and the SNMP side. Other tables hold data internally that is
only available within the agent itself, or at least the master copy
of the data is held within the agent.
There are a number of different code templates that can be used to
implement MIB tables, using various approaches to these two tasks.
There are three basic approaches to identifying the relevant row:
1) Pass the request through to the table-specific code, and
identify the requested row there (for both GET and GETNEXT
requests). This is typically the most efficient way to get
up-to-date information, but relies on suitable
(programmer-provided) code within the MIB handler.
Most importantly, you should be an expert to use this choice.
This will produce code based on the table_dataset handler.
2) Have table-specific code to provide information about which
rows exist in the table (by iterating through them in turn),
but utilise standard helper code to select the appropriate
row for a given request. This is particularly suitable for
tables where the data is naturally stored in a "random" order
(or differently to the MIB table index), or where rows are
frequently added to or removed from the table.
However searching for the requested row is not very efficient,
and performance can be slow - particularly for large tables with
many rows.
3) Hold a locally cached copy of the contents of the table (or at
least a cache of which rows are valid), and utilise standard
helper code to select the appropriate row. This is
significantly faster than the iterator-based approach, but
cached data is inevitably slightly "stale" with respect to the
data from the underlying system being managed. This approach,
since it relies on caching of data, is also results in a larger
memory footprint. It is less appropriate for tables where rows
are frequently added or removed externally to the agent (i.e.,
not via SNMP requests).
This approach can also be used where _all_ use of the table is
via SNMP, and there is no external "underlying system". In
this case, the local cache is the canonical version of the
table.
4) Do not generate code for the tables.
Select the option that best fits your requirements: 2
Having identified the appropriate row for a given request, there are
three basic styles of code for returning (or updating) the requested
column value from within this row:
1) A single handler routine, which contains all the code needed to
handle GET and SET requests for each of the column objects.
The code typically looks like a single function with a large 'case'
statement covering each of the columns.
This will produce code based on the 'iterator' hepler.
2) A set of individual routines, each of which is concerned
with a particular aspect of processing the request.
Each column object within the table has one routine for
retrieving the current value, and another for setting a new one.
This will produce code based on the 'iterate_access' hepler.
3) A (different) set of individual routines, each of which is
smaller and more tightly focused than the code generated by
style 2. The aim here is to reduce the amount of SNMP specific
knowledge required to implement a module, and hide much of the
SNMP terminology and processing within standard generated code
(which can simply be used sight unseen).
This will produce code based on the 'mfd' hepler ('MIB for Dummies').
4) Do not generate code for the tables.
(In all cases, GETNEXT requests are automatically converted
into the equivalent GET request, so the MIB specific code
need only be concerned with GET and SET requests.).
Select the code style you wish to use: 1
The same template code can be generated using
mib2c -c mib2c.iterate.conf atcaBoardTable
This framework can work in one of two ways:
1) Hold a local cached copy of some external data
which is then used to service incoming requests.
2) Query the external data directly for each request.
The first is typically more efficient, but results in
slightly "stale" data (depending on the expiration timeout
for the cache) and greater memory usage. The second can
provide more up-to-date information, but at the cost of
higher processing overheads.
Which is more appropriate for your needs?
Select your choice : 1
writing to atcaBoardTable.h
writing to atcaBoardTable.c
**********************************************************************
* NOTE WELL: The code generated by mib2c is only a template. *YOU* *
* must fill in the code before it'll work most of the time. In many *
* cases, spots that MUST be edited within the files are marked with *
* /* XXX */ or /* TODO */ comments. *
**********************************************************************
running indent on atcaBoardTable.h
running indent on atcaBoardTable.c
3.代码修改
其中迭代器产生的table并不是必须要使用,我们需要的是它的框架代码。可以用自己定义的数据来替代table表,也可以在其他业务代码时插入table表,在snmp请求中查询
table表,本代码中实例只有6个,只使用table表存储index,其余字段使用自定义数组存储数据。贴上前后代码可使用merage比较。
3.1 原有代码
/*
* Note: this file originally auto-generated by mib2c
* using mib2c.iterate.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 "atcaBoardTable.h"
/** Initializes the atcaBoardTable module */
void
init_atcaBoardTable(void)
{
/* here we initialize all the tables we're planning on supporting */
initialize_table_atcaBoardTable();
}
/** Initialize the atcaBoardTable table by defining its contents and how it's structured */
void
initialize_table_atcaBoardTable(void)
{
const oid atcaBoardTable_oid[] = {1,3,6,1,4,1,12001,5,5};
const size_t atcaBoardTable_oid_len = OID_LENGTH(atcaBoardTable_oid);
netsnmp_handler_registration *reg;
netsnmp_iterator_info *iinfo;
netsnmp_table_registration_info *table_info;
DEBUGMSGTL(("atcaBoardTable:init", "initializing table atcaBoardTable\n"));
reg = netsnmp_create_handler_registration(
"atcaBoardTable", atcaBoardTable_handler,
atcaBoardTable_oid, atcaBoardTable_oid_len,
HANDLER_CAN_RWRITE
);
table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
netsnmp_table_helper_add_indexes(table_info,
ASN_UNSIGNED, /* index: atcaBoardInfoIndex */
0);
table_info->min_column = COLUMN_ATCABOARDCPU1TEMPERATURE;
table_info->max_column = COLUMN_ATCABOARDPOWERVALUE;
iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
iinfo->get_first_data_point = atcaBoardTable_get_first_data_point;
iinfo->get_next_data_point = atcaBoardTable_get_next_data_point;
iinfo->table_reginfo = table_info;
netsnmp_register_table_iterator( reg, iinfo );
netsnmp_inject_handler_before( reg,
netsnmp_get_cache_handler(ATCABOARDTABLE_TIMEOUT,
atcaBoardTable_load, atcaBoardTable_free,
atcaBoardTable_oid, atcaBoardTable_oid_len),
TABLE_ITERATOR_NAME);
/* Initialise the contents of the table here */
}
/* Typical data structure for a row entry */
struct atcaBoardTable_entry {
/* Index values */
u_long atcaBoardInfoIndex;
/* Column values */
char atcaBoardCPU1Temperature[NNN];
size_t atcaBoardCPU1Temperature_len;
char old_atcaBoardCPU1Temperature[NNN];
size_t old_atcaBoardCPU1Temperature_len;
char atcaBoardCPU2Temperature[NNN];
size_t atcaBoardCPU2Temperature_len;
char old_atcaBoardCPU2Temperature[NNN];
size_t old_atcaBoardCPU2Temperature_len;
char atcaBoardPowerState[NNN];
size_t atcaBoardPowerState_len;
char old_atcaBoardPowerState[NNN];
size_t old_atcaBoardPowerState_len;
char atcaBoardRunSoftwareName[NNN];
size_t atcaBoardRunSoftwareName_len;
char old_atcaBoardRunSoftwareName[NNN];
size_t old_atcaBoardRunSoftwareName_len;
char atcaBoardCpuUtillization[NNN];
size_t atcaBoardCpuUtillization_len;
char old_atcaBoardCpuUtillization[NNN];
size_t old_atcaBoardCpuUtillization_len;
char atcaBoardMemoryUtilization[NNN];
size_t atcaBoardMemoryUtilization_len;
char old_atcaBoardMemoryUtilization[NNN];
size_t old_atcaBoardMemoryUtilization_len;
char atcaBoardDiskUtilization[NNN];
size_t atcaBoardDiskUtilization_len;
char old_atcaBoardDiskUtilization[NNN];
size_t old_atcaBoardDiskUtilization_len;
char atcaBoardPowerValue[NNN];
size_t atcaBoardPowerValue_len;
char old_atcaBoardPowerValue[NNN];
size_t old_atcaBoardPowerValue_len;
/* Illustrate using a simple linked list */
int valid;
struct atcaBoardTable_entry *next;
};
struct atcaBoardTable_entry *atcaBoardTable_head;
/* create a new row in the (unsorted) table */
struct atcaBoardTable_entry *
atcaBoardTable_createEntry(
u_long atcaBoardInfoIndex,
) {
struct atcaBoardTable_entry *entry;
entry = SNMP_MALLOC_TYPEDEF(struct atcaBoardTable_entry);
if (!entry)
return NULL;
entry->atcaBoardInfoIndex = atcaBoardInfoIndex;
entry->next = atcaBoardTable_head;
atcaBoardTable_head = entry;
return entry;
}
/* remove a row from the table */
void
atcaBoardTable_removeEntry( struct atcaBoardTable_entry *entry ) {
struct atcaBoardTable_entry *ptr, *prev;
if (!entry)
return; /* Nothing to remove */
for ( ptr = atcaBoardTable_head, prev = NULL;
ptr != NULL;
prev = ptr, ptr = ptr->next ) {
if ( ptr == entry )
break;
}
if ( !ptr )
return; /* Can't find it */
if ( prev == NULL )
atcaBoardTable_head = ptr->next;
else
prev->next = ptr->next;
SNMP_FREE( entry ); /* XXX - release any other internal resources */
}
/* Example cache handling - set up linked list from a suitable file */
int
atcaBoardTable_load( netsnmp_cache *cache, void *vmagic ) {
FILE *fp;
struct atcaBoardTable_entry *this;
char buf[STRMAX];
/* The basic load routine template assumes that the data to
be reported is held in a file - with one row of the file
for each row of the table.
If your data is available via a different API, you
should amend this initial block (and the control of the
'while' loop) accordingly.
'XXX' marks where the template is incomplete and
code will definitely need to be added. */
fp = fopen( "/data/for/atcaBoardTable", "r" );
if ( !fp ) {
return -1;
}
while ( fgets( buf, STRMAX, fp )) {
this = SNMP_MALLOC_TYPEDEF( struct atcaBoardTable_entry );
/* XXX - Unpick 'buf' to extract the individual field values
and then populate the 'this' data structure with them */
this->next = atcaBoardTable_head;
atcaBoardTable_head = this; /* Iterate helper is fine with unordered lists! */
}
fclose(fp);
return 0; /* OK */
}
void
atcaBoardTable_free( netsnmp_cache *cache, void *vmagic ) {
struct atcaBoardTable_entry *this, *that;
for ( this = atcaBoardTable_head; this; this=that ) {
that = this->next;
SNMP_FREE( this ); /* XXX - release any other internal resources */
}
atcaBoardTable_head = NULL;
}
/* Example iterator hook routines - using 'get_next' to do most of the work */
netsnmp_variable_list *
atcaBoardTable_get_first_data_point(void **my_loop_context,
void **my_data_context,
netsnmp_variable_list *put_index_data,
netsnmp_iterator_info *mydata)
{
*my_loop_context = atcaBoardTable_head;
return atcaBoardTable_get_next_data_point(my_loop_context, my_data_context,
put_index_data, mydata );
}
netsnmp_variable_list *
atcaBoardTable_get_next_data_point(void **my_loop_context,
void **my_data_context,
netsnmp_variable_list *put_index_data,
netsnmp_iterator_info *mydata)
{
struct atcaBoardTable_entry *entry = (struct atcaBoardTable_entry *)*my_loop_context;
netsnmp_variable_list *idx = put_index_data;
if ( entry ) {
snmp_set_var_typed_integer( idx, ASN_UNSIGNED, entry->atcaBoardInfoIndex );
idx = idx->next_variable;
*my_data_context = (void *)entry;
*my_loop_context = (void *)entry->next;
return put_index_data;
} else {
return NULL;
}
}
/** handles requests for the atcaBoardTable table */
int
atcaBoardTable_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 atcaBoardTable_entry *table_entry;
DEBUGMSGTL(("atcaBoardTable:handler", "Processing request (%d)\n", reqinfo->mode));
switch (reqinfo->mode) {
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardCPU1Temperature,
table_entry->atcaBoardCPU1Temperature_len);
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardCPU2Temperature,
table_entry->atcaBoardCPU2Temperature_len);
break;
case COLUMN_ATCABOARDPOWERSTATE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardPowerState,
table_entry->atcaBoardPowerState_len);
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardRunSoftwareName,
table_entry->atcaBoardRunSoftwareName_len);
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardCpuUtillization,
table_entry->atcaBoardCpuUtillization_len);
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardMemoryUtilization,
table_entry->atcaBoardMemoryUtilization_len);
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardDiskUtilization,
table_entry->atcaBoardDiskUtilization_len);
break;
case COLUMN_ATCABOARDPOWERVALUE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardPowerValue,
table_entry->atcaBoardPowerValue_len);
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHOBJECT);
break;
}
}
break;
/*
* Write-support
*/
case MODE_SET_RESERVE1:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCPU1Temperature));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCPU2Temperature));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDPOWERSTATE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardPowerState));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardRunSoftwareName));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCpuUtillization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardMemoryUtilization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardDiskUtilization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDPOWERVALUE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardPowerValue));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
default:
netsnmp_set_request_error( reqinfo, request,
SNMP_ERR_NOTWRITABLE );
return SNMP_ERR_NOERROR;
}
}
break;
case MODE_SET_RESERVE2:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( !table_row ) {
table_row = atcaBoardTable_createEntry(
, *table_info->indexes->val.integer
);
if (table_row) {
netsnmp_insert_iterator_context( request, table_row );
} else {
netsnmp_set_request_error( reqinfo, request,
SNMP_ERR_RESOURCEUNAVAILABLE );
return SNMP_ERR_NOERROR;
}
}
break;
}
}
break;
case MODE_SET_FREE:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
}
break;
}
}
break;
case MODE_SET_ACTION:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
memcpy( table_entry->old_atcaBoardCPU1Temperature,
table_entry->atcaBoardCPU1Temperature,
sizeof(table_entry->atcaBoardCPU1Temperature));
table_entry->old_atcaBoardCPU1Temperature_len =
table_entry->atcaBoardCPU1Temperature_len;
memset( table_entry->atcaBoardCPU1Temperature, 0,
sizeof(table_entry->atcaBoardCPU1Temperature));
memcpy( table_entry->atcaBoardCPU1Temperature,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCPU1Temperature_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
memcpy( table_entry->old_atcaBoardCPU2Temperature,
table_entry->atcaBoardCPU2Temperature,
sizeof(table_entry->atcaBoardCPU2Temperature));
table_entry->old_atcaBoardCPU2Temperature_len =
table_entry->atcaBoardCPU2Temperature_len;
memset( table_entry->atcaBoardCPU2Temperature, 0,
sizeof(table_entry->atcaBoardCPU2Temperature));
memcpy( table_entry->atcaBoardCPU2Temperature,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCPU2Temperature_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDPOWERSTATE:
memcpy( table_entry->old_atcaBoardPowerState,
table_entry->atcaBoardPowerState,
sizeof(table_entry->atcaBoardPowerState));
table_entry->old_atcaBoardPowerState_len =
table_entry->atcaBoardPowerState_len;
memset( table_entry->atcaBoardPowerState, 0,
sizeof(table_entry->atcaBoardPowerState));
memcpy( table_entry->atcaBoardPowerState,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardPowerState_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
memcpy( table_entry->old_atcaBoardRunSoftwareName,
table_entry->atcaBoardRunSoftwareName,
sizeof(table_entry->atcaBoardRunSoftwareName));
table_entry->old_atcaBoardRunSoftwareName_len =
table_entry->atcaBoardRunSoftwareName_len;
memset( table_entry->atcaBoardRunSoftwareName, 0,
sizeof(table_entry->atcaBoardRunSoftwareName));
memcpy( table_entry->atcaBoardRunSoftwareName,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardRunSoftwareName_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
memcpy( table_entry->old_atcaBoardCpuUtillization,
table_entry->atcaBoardCpuUtillization,
sizeof(table_entry->atcaBoardCpuUtillization));
table_entry->old_atcaBoardCpuUtillization_len =
table_entry->atcaBoardCpuUtillization_len;
memset( table_entry->atcaBoardCpuUtillization, 0,
sizeof(table_entry->atcaBoardCpuUtillization));
memcpy( table_entry->atcaBoardCpuUtillization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCpuUtillization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
memcpy( table_entry->old_atcaBoardMemoryUtilization,
table_entry->atcaBoardMemoryUtilization,
sizeof(table_entry->atcaBoardMemoryUtilization));
table_entry->old_atcaBoardMemoryUtilization_len =
table_entry->atcaBoardMemoryUtilization_len;
memset( table_entry->atcaBoardMemoryUtilization, 0,
sizeof(table_entry->atcaBoardMemoryUtilization));
memcpy( table_entry->atcaBoardMemoryUtilization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardMemoryUtilization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
memcpy( table_entry->old_atcaBoardDiskUtilization,
table_entry->atcaBoardDiskUtilization,
sizeof(table_entry->atcaBoardDiskUtilization));
table_entry->old_atcaBoardDiskUtilization_len =
table_entry->atcaBoardDiskUtilization_len;
memset( table_entry->atcaBoardDiskUtilization, 0,
sizeof(table_entry->atcaBoardDiskUtilization));
memcpy( table_entry->atcaBoardDiskUtilization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardDiskUtilization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDPOWERVALUE:
memcpy( table_entry->old_atcaBoardPowerValue,
table_entry->atcaBoardPowerValue,
sizeof(table_entry->atcaBoardPowerValue));
table_entry->old_atcaBoardPowerValue_len =
table_entry->atcaBoardPowerValue_len;
memset( table_entry->atcaBoardPowerValue, 0,
sizeof(table_entry->atcaBoardPowerValue));
memcpy( table_entry->atcaBoardPowerValue,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardPowerValue_len =
request->requestvb->val_len;
break;
}
}
break;
case MODE_SET_UNDO:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCPU1Temperature,
table_entry->old_atcaBoardCPU1Temperature,
sizeof(table_entry->atcaBoardCPU1Temperature));
memset( table_entry->old_atcaBoardCPU1Temperature, 0,
sizeof(table_entry->atcaBoardCPU1Temperature));
table_entry->atcaBoardCPU1Temperature_len =
table_entry->old_atcaBoardCPU1Temperature_len;
}
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCPU2Temperature,
table_entry->old_atcaBoardCPU2Temperature,
sizeof(table_entry->atcaBoardCPU2Temperature));
memset( table_entry->old_atcaBoardCPU2Temperature, 0,
sizeof(table_entry->atcaBoardCPU2Temperature));
table_entry->atcaBoardCPU2Temperature_len =
table_entry->old_atcaBoardCPU2Temperature_len;
}
break;
case COLUMN_ATCABOARDPOWERSTATE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardPowerState,
table_entry->old_atcaBoardPowerState,
sizeof(table_entry->atcaBoardPowerState));
memset( table_entry->old_atcaBoardPowerState, 0,
sizeof(table_entry->atcaBoardPowerState));
table_entry->atcaBoardPowerState_len =
table_entry->old_atcaBoardPowerState_len;
}
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardRunSoftwareName,
table_entry->old_atcaBoardRunSoftwareName,
sizeof(table_entry->atcaBoardRunSoftwareName));
memset( table_entry->old_atcaBoardRunSoftwareName, 0,
sizeof(table_entry->atcaBoardRunSoftwareName));
table_entry->atcaBoardRunSoftwareName_len =
table_entry->old_atcaBoardRunSoftwareName_len;
}
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCpuUtillization,
table_entry->old_atcaBoardCpuUtillization,
sizeof(table_entry->atcaBoardCpuUtillization));
memset( table_entry->old_atcaBoardCpuUtillization, 0,
sizeof(table_entry->atcaBoardCpuUtillization));
table_entry->atcaBoardCpuUtillization_len =
table_entry->old_atcaBoardCpuUtillization_len;
}
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardMemoryUtilization,
table_entry->old_atcaBoardMemoryUtilization,
sizeof(table_entry->atcaBoardMemoryUtilization));
memset( table_entry->old_atcaBoardMemoryUtilization, 0,
sizeof(table_entry->atcaBoardMemoryUtilization));
table_entry->atcaBoardMemoryUtilization_len =
table_entry->old_atcaBoardMemoryUtilization_len;
}
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardDiskUtilization,
table_entry->old_atcaBoardDiskUtilization,
sizeof(table_entry->atcaBoardDiskUtilization));
memset( table_entry->old_atcaBoardDiskUtilization, 0,
sizeof(table_entry->atcaBoardDiskUtilization));
table_entry->atcaBoardDiskUtilization_len =
table_entry->old_atcaBoardDiskUtilization_len;
}
break;
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardPowerValue,
table_entry->old_atcaBoardPowerValue,
sizeof(table_entry->atcaBoardPowerValue));
memset( table_entry->old_atcaBoardPowerValue, 0,
sizeof(table_entry->atcaBoardPowerValue));
table_entry->atcaBoardPowerValue_len =
table_entry->old_atcaBoardPowerValue_len;
}
break;
}
}
break;
case MODE_SET_COMMIT:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
table_entry->valid = 1;
}
}
}
break;
}
return SNMP_ERR_NOERROR;
}
3.2 修改后代码
/*
* Note: this file originally auto-generated by mib2c
* using mib2c.iterate.conf
* add by zhuwei 20250331
*/
#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include "atcaBoardTable.h"
#include "atca_data.h"
#define NNN 32
#define STRMAX 256
extern ATCA_STATUS_INFO_T gAtcaStatusInfo;
struct atcaBoardTable_entry *
atcaBoardTable_createNewEntry(u_long atcaBoardInfoIndex,struct atcaBoardTable_entry *entryInsert) ;
struct atcaBoardTable_entry *atcaBoardTable_createEntry(u_long atcaBoardInfoIndex) ;
/** Initializes the atcaBoardTable module */
void
init_atcaBoardTable(void)
{
/* here we initialize all the tables we're planning on supporting */
initialize_table_atcaBoardTable();
}
/** Initialize the atcaBoardTable table by defining its contents and how it's structured */
void
initialize_table_atcaBoardTable(void)
{
const oid atcaBoardTable_oid[] = {1,3,6,1,4,1,12001,5,5};
const size_t atcaBoardTable_oid_len = OID_LENGTH(atcaBoardTable_oid);
netsnmp_handler_registration *reg;
netsnmp_iterator_info *iinfo;
netsnmp_table_registration_info *table_info;
DEBUGMSGTL(("atcaBoardTable:init", "initializing table atcaBoardTable\n"));
reg = netsnmp_create_handler_registration(
"atcaBoardTable", atcaBoardTable_handler,
atcaBoardTable_oid, atcaBoardTable_oid_len,
HANDLER_CAN_RWRITE
);
table_info = SNMP_MALLOC_TYPEDEF( netsnmp_table_registration_info );
netsnmp_table_helper_add_indexes(table_info,
ASN_UNSIGNED, /* index: atcaBoardInfoIndex */
0);
table_info->min_column = COLUMN_ATCABOARDINFOINDEX;
table_info->max_column = COLUMN_ATCABOARDPOWERVALUE;
iinfo = SNMP_MALLOC_TYPEDEF( netsnmp_iterator_info );
iinfo->get_first_data_point = atcaBoardTable_get_first_data_point;
iinfo->get_next_data_point = atcaBoardTable_get_next_data_point;
iinfo->table_reginfo = table_info;
netsnmp_register_table_iterator( reg, iinfo );
netsnmp_inject_handler_before( reg,
netsnmp_get_cache_handler(ATCABOARDTABLE_TIMEOUT,
atcaBoardTable_load, atcaBoardTable_free,
atcaBoardTable_oid, atcaBoardTable_oid_len),
TABLE_ITERATOR_NAME);
/* Initialise the contents of the table here */
atcaBoardTable_createEntry(1);
atcaBoardTable_createEntry(2);
atcaBoardTable_createEntry(3);
atcaBoardTable_createEntry(4);
atcaBoardTable_createEntry(5);
atcaBoardTable_createEntry(6);
}
/* Typical data structure for a row entry */
struct atcaBoardTable_entry {
/* Index values */
u_long atcaBoardInfoIndex;
/* Column values */
char atcaBoardCPU1Temperature[NNN];
size_t atcaBoardCPU1Temperature_len;
char old_atcaBoardCPU1Temperature[NNN];
size_t old_atcaBoardCPU1Temperature_len;
char atcaBoardCPU2Temperature[NNN];
size_t atcaBoardCPU2Temperature_len;
char old_atcaBoardCPU2Temperature[NNN];
size_t old_atcaBoardCPU2Temperature_len;
char atcaBoardPowerState[NNN];
size_t atcaBoardPowerState_len;
char old_atcaBoardPowerState[NNN];
size_t old_atcaBoardPowerState_len;
char atcaBoardRunSoftwareName[NNN];
size_t atcaBoardRunSoftwareName_len;
char old_atcaBoardRunSoftwareName[NNN];
size_t old_atcaBoardRunSoftwareName_len;
char atcaBoardCpuUtillization[NNN];
size_t atcaBoardCpuUtillization_len;
char old_atcaBoardCpuUtillization[NNN];
size_t old_atcaBoardCpuUtillization_len;
char atcaBoardMemoryUtilization[NNN];
size_t atcaBoardMemoryUtilization_len;
char old_atcaBoardMemoryUtilization[NNN];
size_t old_atcaBoardMemoryUtilization_len;
char atcaBoardDiskUtilization[NNN];
size_t atcaBoardDiskUtilization_len;
char old_atcaBoardDiskUtilization[NNN];
size_t old_atcaBoardDiskUtilization_len;
char atcaBoardPowerValue[NNN];
size_t atcaBoardPowerValue_len;
char old_atcaBoardPowerValue[NNN];
size_t old_atcaBoardPowerValue_len;
/* Illustrate using a simple linked list */
int valid;
struct atcaBoardTable_entry *next;
};
struct atcaBoardTable_entry *atcaBoardTable_head;
/* create a new row in the (unsorted) table */
struct atcaBoardTable_entry *
atcaBoardTable_createEntry(u_long atcaBoardInfoIndex)
{
struct atcaBoardTable_entry *entry;
entry = SNMP_MALLOC_TYPEDEF(struct atcaBoardTable_entry);
if (!entry)
return NULL;
entry->atcaBoardInfoIndex = atcaBoardInfoIndex;
entry->next = atcaBoardTable_head;
atcaBoardTable_head = entry;
return entry;
}
struct atcaBoardTable_entry *
atcaBoardTable_createNewEntry(u_long atcaBoardInfoIndex,struct atcaBoardTable_entry *entryInsert)
{
struct atcaBoardTable_entry *entry;
entry = SNMP_MALLOC_TYPEDEF(struct atcaBoardTable_entry);
if (!entry)
return NULL;
*entry = *entryInsert;
entry->atcaBoardInfoIndex = atcaBoardInfoIndex;
entry->next = atcaBoardTable_head;
atcaBoardTable_head = entry;
return entry;
}
/* remove a row from the table */
void
atcaBoardTable_removeEntry( struct atcaBoardTable_entry *entry ) {
struct atcaBoardTable_entry *ptr, *prev;
if (!entry)
return; /* Nothing to remove */
for ( ptr = atcaBoardTable_head, prev = NULL;
ptr != NULL;
prev = ptr, ptr = ptr->next ) {
if ( ptr == entry )
break;
}
if ( !ptr )
return; /* Can't find it */
if ( prev == NULL )
atcaBoardTable_head = ptr->next;
else
prev->next = ptr->next;
SNMP_FREE( entry ); /* XXX - release any other internal resources */
}
/* Example cache handling - set up linked list from a suitable file */
int
atcaBoardTable_load( netsnmp_cache *cache, void *vmagic ) {
FILE *fp;
struct atcaBoardTable_entry *this;
char buf[STRMAX];
/* The basic load routine template assumes that the data to
be reported is held in a file - with one row of the file
for each row of the table.
If your data is available via a different API, you
should amend this initial block (and the control of the
'while' loop) accordingly.
'XXX' marks where the template is incomplete and
code will definitely need to be added. */
fp = fopen( "/data/for/atcaBoardTable", "r" );
if ( !fp ) {
return -1;
}
while ( fgets( buf, STRMAX, fp )) {
this = SNMP_MALLOC_TYPEDEF( struct atcaBoardTable_entry );
/* XXX - Unpick 'buf' to extract the individual field values
and then populate the 'this' data structure with them */
this->next = atcaBoardTable_head;
atcaBoardTable_head = this; /* Iterate helper is fine with unordered lists! */
}
fclose(fp);
return 0; /* OK */
}
void
atcaBoardTable_free( netsnmp_cache *cache, void *vmagic ) {
struct atcaBoardTable_entry *this, *that;
for ( this = atcaBoardTable_head; this; this=that ) {
that = this->next;
SNMP_FREE( this ); /* XXX - release any other internal resources */
}
atcaBoardTable_head = NULL;
}
/* Example iterator hook routines - using 'get_next' to do most of the work */
netsnmp_variable_list *
atcaBoardTable_get_first_data_point(void **my_loop_context,
void **my_data_context,
netsnmp_variable_list *put_index_data,
netsnmp_iterator_info *mydata)
{
*my_loop_context = atcaBoardTable_head;
return atcaBoardTable_get_next_data_point(my_loop_context, my_data_context,
put_index_data, mydata );
}
netsnmp_variable_list *
atcaBoardTable_get_next_data_point(void **my_loop_context,
void **my_data_context,
netsnmp_variable_list *put_index_data,
netsnmp_iterator_info *mydata)
{
struct atcaBoardTable_entry *entry = (struct atcaBoardTable_entry *)*my_loop_context;
netsnmp_variable_list *idx = put_index_data;
if ( entry ) {
snmp_set_var_typed_integer( idx, ASN_UNSIGNED, entry->atcaBoardInfoIndex );
idx = idx->next_variable;
*my_data_context = (void *)entry;
*my_loop_context = (void *)entry->next;
return put_index_data;
} else {
return NULL;
}
}
/** handles requests for the atcaBoardTable table */
int
atcaBoardTable_handler(
netsnmp_mib_handler *handler,
netsnmp_handler_registration *reginfo,
netsnmp_agent_request_info *reqinfo,
netsnmp_request_info *requests)
{
int ret;
netsnmp_request_info *request;
netsnmp_table_request_info *table_info;
struct atcaBoardTable_entry *table_entry;
DEBUGMSGTL(("atcaBoardTable:handler", "Processing request (%d)\n", reqinfo->mode));
switch (reqinfo->mode) {
/*
* Read-support (also covers GetNext requests)
*/
case MODE_GET:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDINFOINDEX:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_integer(request->requestvb, ASN_INTEGER,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].slot);
break;
case COLUMN_ATCABOARDCPU1TEMPERATURE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCPU1Temperature,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCPU1Temperature));
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
#if 0
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
table_entry->atcaBoardCPU2Temperature,
table_entry->atcaBoardCPU2Temperature_len);
#endif
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCPU2Temperature,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCPU2Temperature));
break;
case COLUMN_ATCABOARDPOWERSTATE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardPowerState,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardPowerState));
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardRunSoftwareName,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardRunSoftwareName));
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCpuUtillization,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardCpuUtillization));
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardMemoryUtilization,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardMemoryUtilization));
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardDiskUtilization,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardDiskUtilization));
break;
case COLUMN_ATCABOARDPOWERVALUE:
if ( !table_entry ) {
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHINSTANCE);
continue;
}
snmp_set_var_typed_value( request->requestvb, ASN_OCTET_STR,
gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardPowerValue,
strlen(gAtcaStatusInfo.boardInfo[table_entry->atcaBoardInfoIndex-1].atcaBoardPowerValue));
break;
default:
netsnmp_set_request_error(reqinfo, request,
SNMP_NOSUCHOBJECT);
break;
}
}
break;
#if 0
/*
* Write-support
*/
case MODE_SET_RESERVE1:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCPU1Temperature));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCPU2Temperature));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDPOWERSTATE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardPowerState));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardRunSoftwareName));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardCpuUtillization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardMemoryUtilization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardDiskUtilization));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
case COLUMN_ATCABOARDPOWERVALUE:
/* or possibly 'netsnmp_check_vb_type_and_size' */
ret = netsnmp_check_vb_type_and_max_size(
request->requestvb, ASN_OCTET_STR, sizeof(table_entry->atcaBoardPowerValue));
if ( ret != SNMP_ERR_NOERROR ) {
netsnmp_set_request_error( reqinfo, request, ret );
return SNMP_ERR_NOERROR;
}
break;
default:
netsnmp_set_request_error( reqinfo, request,
SNMP_ERR_NOTWRITABLE );
return SNMP_ERR_NOERROR;
}
}
break;
case MODE_SET_RESERVE2:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( !table_row ) {
struct atcaBoardTable_entry *table_row;
table_row = atcaBoardTable_createEntry(*table_info->indexes->val.integer);
if (table_row) {
netsnmp_insert_iterator_context( request, table_row );
} else {
netsnmp_set_request_error( reqinfo, request,
SNMP_ERR_RESOURCEUNAVAILABLE );
return SNMP_ERR_NOERROR;
}
}
break;
}
}
break;
case MODE_SET_FREE:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
}
break;
}
}
break;
case MODE_SET_ACTION:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
memcpy( table_entry->old_atcaBoardCPU1Temperature,
table_entry->atcaBoardCPU1Temperature,
sizeof(table_entry->atcaBoardCPU1Temperature));
table_entry->old_atcaBoardCPU1Temperature_len =
table_entry->atcaBoardCPU1Temperature_len;
memset( table_entry->atcaBoardCPU1Temperature, 0,
sizeof(table_entry->atcaBoardCPU1Temperature));
memcpy( table_entry->atcaBoardCPU1Temperature,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCPU1Temperature_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
memcpy( table_entry->old_atcaBoardCPU2Temperature,
table_entry->atcaBoardCPU2Temperature,
sizeof(table_entry->atcaBoardCPU2Temperature));
table_entry->old_atcaBoardCPU2Temperature_len =
table_entry->atcaBoardCPU2Temperature_len;
memset( table_entry->atcaBoardCPU2Temperature, 0,
sizeof(table_entry->atcaBoardCPU2Temperature));
memcpy( table_entry->atcaBoardCPU2Temperature,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCPU2Temperature_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDPOWERSTATE:
memcpy( table_entry->old_atcaBoardPowerState,
table_entry->atcaBoardPowerState,
sizeof(table_entry->atcaBoardPowerState));
table_entry->old_atcaBoardPowerState_len =
table_entry->atcaBoardPowerState_len;
memset( table_entry->atcaBoardPowerState, 0,
sizeof(table_entry->atcaBoardPowerState));
memcpy( table_entry->atcaBoardPowerState,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardPowerState_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
memcpy( table_entry->old_atcaBoardRunSoftwareName,
table_entry->atcaBoardRunSoftwareName,
sizeof(table_entry->atcaBoardRunSoftwareName));
table_entry->old_atcaBoardRunSoftwareName_len =
table_entry->atcaBoardRunSoftwareName_len;
memset( table_entry->atcaBoardRunSoftwareName, 0,
sizeof(table_entry->atcaBoardRunSoftwareName));
memcpy( table_entry->atcaBoardRunSoftwareName,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardRunSoftwareName_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
memcpy( table_entry->old_atcaBoardCpuUtillization,
table_entry->atcaBoardCpuUtillization,
sizeof(table_entry->atcaBoardCpuUtillization));
table_entry->old_atcaBoardCpuUtillization_len =
table_entry->atcaBoardCpuUtillization_len;
memset( table_entry->atcaBoardCpuUtillization, 0,
sizeof(table_entry->atcaBoardCpuUtillization));
memcpy( table_entry->atcaBoardCpuUtillization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardCpuUtillization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
memcpy( table_entry->old_atcaBoardMemoryUtilization,
table_entry->atcaBoardMemoryUtilization,
sizeof(table_entry->atcaBoardMemoryUtilization));
table_entry->old_atcaBoardMemoryUtilization_len =
table_entry->atcaBoardMemoryUtilization_len;
memset( table_entry->atcaBoardMemoryUtilization, 0,
sizeof(table_entry->atcaBoardMemoryUtilization));
memcpy( table_entry->atcaBoardMemoryUtilization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardMemoryUtilization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
memcpy( table_entry->old_atcaBoardDiskUtilization,
table_entry->atcaBoardDiskUtilization,
sizeof(table_entry->atcaBoardDiskUtilization));
table_entry->old_atcaBoardDiskUtilization_len =
table_entry->atcaBoardDiskUtilization_len;
memset( table_entry->atcaBoardDiskUtilization, 0,
sizeof(table_entry->atcaBoardDiskUtilization));
memcpy( table_entry->atcaBoardDiskUtilization,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardDiskUtilization_len =
request->requestvb->val_len;
break;
case COLUMN_ATCABOARDPOWERVALUE:
memcpy( table_entry->old_atcaBoardPowerValue,
table_entry->atcaBoardPowerValue,
sizeof(table_entry->atcaBoardPowerValue));
table_entry->old_atcaBoardPowerValue_len =
table_entry->atcaBoardPowerValue_len;
memset( table_entry->atcaBoardPowerValue, 0,
sizeof(table_entry->atcaBoardPowerValue));
memcpy( table_entry->atcaBoardPowerValue,
request->requestvb->val.string,
request->requestvb->val_len);
table_entry->atcaBoardPowerValue_len =
request->requestvb->val_len;
break;
}
}
break;
case MODE_SET_UNDO:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCPU1Temperature,
table_entry->old_atcaBoardCPU1Temperature,
sizeof(table_entry->atcaBoardCPU1Temperature));
memset( table_entry->old_atcaBoardCPU1Temperature, 0,
sizeof(table_entry->atcaBoardCPU1Temperature));
table_entry->atcaBoardCPU1Temperature_len =
table_entry->old_atcaBoardCPU1Temperature_len;
}
break;
case COLUMN_ATCABOARDCPU2TEMPERATURE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCPU2Temperature,
table_entry->old_atcaBoardCPU2Temperature,
sizeof(table_entry->atcaBoardCPU2Temperature));
memset( table_entry->old_atcaBoardCPU2Temperature, 0,
sizeof(table_entry->atcaBoardCPU2Temperature));
table_entry->atcaBoardCPU2Temperature_len =
table_entry->old_atcaBoardCPU2Temperature_len;
}
break;
case COLUMN_ATCABOARDPOWERSTATE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardPowerState,
table_entry->old_atcaBoardPowerState,
sizeof(table_entry->atcaBoardPowerState));
memset( table_entry->old_atcaBoardPowerState, 0,
sizeof(table_entry->atcaBoardPowerState));
table_entry->atcaBoardPowerState_len =
table_entry->old_atcaBoardPowerState_len;
}
break;
case COLUMN_ATCABOARDRUNSOFTWARENAME:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardRunSoftwareName,
table_entry->old_atcaBoardRunSoftwareName,
sizeof(table_entry->atcaBoardRunSoftwareName));
memset( table_entry->old_atcaBoardRunSoftwareName, 0,
sizeof(table_entry->atcaBoardRunSoftwareName));
table_entry->atcaBoardRunSoftwareName_len =
table_entry->old_atcaBoardRunSoftwareName_len;
}
break;
case COLUMN_ATCABOARDCPUUTILLIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardCpuUtillization,
table_entry->old_atcaBoardCpuUtillization,
sizeof(table_entry->atcaBoardCpuUtillization));
memset( table_entry->old_atcaBoardCpuUtillization, 0,
sizeof(table_entry->atcaBoardCpuUtillization));
table_entry->atcaBoardCpuUtillization_len =
table_entry->old_atcaBoardCpuUtillization_len;
}
break;
case COLUMN_ATCABOARDMEMORYUTILIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardMemoryUtilization,
table_entry->old_atcaBoardMemoryUtilization,
sizeof(table_entry->atcaBoardMemoryUtilization));
memset( table_entry->old_atcaBoardMemoryUtilization, 0,
sizeof(table_entry->atcaBoardMemoryUtilization));
table_entry->atcaBoardMemoryUtilization_len =
table_entry->old_atcaBoardMemoryUtilization_len;
}
break;
case COLUMN_ATCABOARDDISKUTILIZATION:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardDiskUtilization,
table_entry->old_atcaBoardDiskUtilization,
sizeof(table_entry->atcaBoardDiskUtilization));
memset( table_entry->old_atcaBoardDiskUtilization, 0,
sizeof(table_entry->atcaBoardDiskUtilization));
table_entry->atcaBoardDiskUtilization_len =
table_entry->old_atcaBoardDiskUtilization_len;
}
break;
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
atcaBoardTable_removeEntry(table_data, table_row );
} else {
memcpy( table_entry->atcaBoardPowerValue,
table_entry->old_atcaBoardPowerValue,
sizeof(table_entry->atcaBoardPowerValue));
memset( table_entry->old_atcaBoardPowerValue, 0,
sizeof(table_entry->atcaBoardPowerValue));
table_entry->atcaBoardPowerValue_len =
table_entry->old_atcaBoardPowerValue_len;
}
break;
}
}
break;
case MODE_SET_COMMIT:
for (request=requests; request; request=request->next) {
table_entry = (struct atcaBoardTable_entry *)
netsnmp_extract_iterator_context(request);
table_info = netsnmp_extract_table_info( request);
switch (table_info->colnum) {
case COLUMN_ATCABOARDCPU1TEMPERATURE:
case COLUMN_ATCABOARDCPU2TEMPERATURE:
case COLUMN_ATCABOARDPOWERSTATE:
case COLUMN_ATCABOARDRUNSOFTWARENAME:
case COLUMN_ATCABOARDCPUUTILLIZATION:
case COLUMN_ATCABOARDMEMORYUTILIZATION:
case COLUMN_ATCABOARDDISKUTILIZATION:
case COLUMN_ATCABOARDPOWERVALUE:
if ( table_entry && !table_entry->valid ) {
table_entry->valid = 1;
}
}
}
break;
#endif
default:
netsnmp_set_request_error( reqinfo, request,
SNMP_ERR_NOTWRITABLE );
}
return SNMP_ERR_NOERROR;
}
4.编译运行
主循环程序见上一篇博客.
[root@VM-4-14-opencloudos home]# snmpwalk -v2c -c public localhost 1.3.6.1.4.1.12001.5.5
SNMPv2-SMI::enterprises.12001.5.5.1.1.1 = INTEGER: 1
SNMPv2-SMI::enterprises.12001.5.5.1.1.2 = INTEGER: 2
SNMPv2-SMI::enterprises.12001.5.5.1.1.3 = INTEGER: 3
SNMPv2-SMI::enterprises.12001.5.5.1.1.4 = INTEGER: 4
SNMPv2-SMI::enterprises.12001.5.5.1.1.5 = INTEGER: 5
SNMPv2-SMI::enterprises.12001.5.5.1.1.6 = INTEGER: 6
SNMPv2-SMI::enterprises.12001.5.5.1.2.1 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.2.2 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.2.3 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.2.4 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.2.5 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.2.6 = STRING: "40C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.1 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.2 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.3 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.4 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.5 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.3.6 = STRING: "50C"
SNMPv2-SMI::enterprises.12001.5.5.1.4.1 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.4.2 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.4.3 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.4.4 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.4.5 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.4.6 = STRING: "POWER OK"
SNMPv2-SMI::enterprises.12001.5.5.1.5.1 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.5.2 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.5.3 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.5.4 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.5.5 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.5.6 = STRING: "SNMP"
SNMPv2-SMI::enterprises.12001.5.5.1.6.1 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.6.2 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.6.3 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.6.4 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.6.5 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.6.6 = STRING: "X86_64"
SNMPv2-SMI::enterprises.12001.5.5.1.7.1 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.7.2 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.7.3 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.7.4 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.7.5 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.7.6 = STRING: "8192M"
SNMPv2-SMI::enterprises.12001.5.5.1.8.1 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.8.2 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.8.3 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.8.4 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.8.5 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.8.6 = STRING: "256G"
SNMPv2-SMI::enterprises.12001.5.5.1.9.1 = STRING: "?"
SNMPv2-SMI::enterprises.12001.5.5.1.9.2 = STRING: "?"
SNMPv2-SMI::enterprises.12001.5.5.1.9.3 = STRING: "?"
SNMPv2-SMI::enterprises.12001.5.5.1.9.4 = STRING: "?"
SNMPv2-SMI::enterprises.12001.5.5.1.9.5 = STRING: "?"
SNMPv2-SMI::enterprises.12001.5.5.1.9.6 = STRING: "?"
相关文章:
snmp/mib采用子代理模式,编码,部署(二)---多实例处理
snmp/mib采用子代理模式,编码,部署(二)---多实例处理 0.本文针对net-snmp中mib表做处理,即单张表对应后台多个实例. 1.源代码生成 拷贝GSC-MIB-0805.txt到/usr/share/snmp/mibs(具体看自己安装目录,如果找不到,下面解…...
吾爱破解安卓逆向学习笔记(4p)
学习目标,了解安卓四大组件,activity生命周期,同时了解去除部分广告和更新提示。 广告类型 1.启动页广告 2.更新广告 3.横幅广告 安卓四大组件 组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面,意思可以…...
使用Redis实现轻量级消息队列
使用消息中间件如RabbitMQ或kafka虽然好,但也给服务器带来很大的内存开销,当系统的业务量,并发量不高时,考虑到服务器和维护成本,可考虑使用Redis实现一个轻量级的消息队列,实现事件监听的效果。下面介绍下…...
stm32第十天外部中断和NVIC讲解
一:外部中断基础知识 1.STM32外部中断框架 中断的概念:在主程序运行过程中,出现了特点的中断触发条件,使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行 1&…...
26考研——线性表_ 线性表的链式表示_单链表(2)
408答疑 文章目录 三、 线性表的链式表示单链表概念单链表的结构头结点 单链表上基本操作的实现单链表的初始化带头结点和不带头结点的初始化操作注意 求表长操作按序号查找结点按值查找表结点插入结点操作扩展:对某一结点进行前插操作 删除结点操作扩展:…...
MATLAB 控制系统设计与仿真 - 31
二次型最优控制 考虑到系统如果以状态空间方程的形式给出,其性能指标为: 其中F,Q,R是有设计者事先选定。线性二次最优控制问题简称LQ(Linear Quadractic)问题,就是寻找一个控制,使得系统沿着由指定初态出发的相应轨迹,其性能指标J取得最小值。 LQ问题分…...
蓝桥杯15届JAVA_A组
将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 2 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter;public class Main{static BufferedReader in new BufferedReader(new In…...
deepseek v3 0324实现工作流编辑器
HTML 工作流编辑器 以下是一个简单的工作流编辑器的HTML实现,包含基本的拖拽节点、连接线和可视化编辑功能: <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewp…...
【NLP 面经 3】
目录 一、Transformer与RNN对比 多头自注意力机制工作原理 相比传统 RNN 在处理长序列文本的优势 应对过拟合的改进方面 二、文本分类任务高维稀疏文本效果不佳 特征工程方面 核函数选择方面 模型参数调整方面 三、NER中,RNN模型效果不佳 模型架构方面 数据处理方面…...
20250331-智谱-沉思
背景 收到GLM沉思的消息,立马试用下。感觉真的太及时了。 (背景:为了客户的需求“AI辅助写作”实验了2款开源workflow,2款在线workflow,好几款多智能体框架后,心中无底之际。。。) 1. GLM(开启…...
Java EE(17)——网络原理——IP数据报结构IP协议解析(简述)
一.IP数据报结构 (1)版本:指明协议的版本,IPv4就是4,IPv6就是6 (2)首部长度:单位是4字节,表示IP报头的长度范围是20~60字节 (3)8位区分服务:实际上只有4位TOS有效,分别是最小延时,最…...
26考研|高等代数:线性空间
线性空间这一章在整个高等代数学习过程中是非常精华的部分,在学习这一章的过程中会有部分的概念较为抽象,一定要抓紧抓牢对于概念的理解,反复阅读与感受,同时也可以根据已知的解析几何中介绍的二维空间或者三维空间进行类推比较&a…...
基础算法篇(3)(蓝桥杯常考点)-图论
前言 这期是蓝桥杯常考点的最后一章了,其中的dijkstra算法更是蓝桥杯中的高频考点 图的基本相关概念 有向图和无向图 自环和重边 稠密图和稀疏图 对于不带权的图,一条路径的路径长度是指该路径上各边权值的总和 对于带权的图,一条路径长度时…...
git错误:fatal: detected dubious ownership in repository at xxxxxx
1、报错说明 这个错误通常是由于Git仓库目录的拥有者或权限问题引起的。Git检测到仓库目录的所有权可能存在不一致或不安全的情况。 通常导致此报错的可能原因: (1)文件或目录的拥有者不一致: 仓库目录中的某些文件或子目录可能…...
【Linux】进程间通信(IPC)-- 无名管道、命名管道
IPC机制 实现进程间通信 在多个进程间传输数据或共享信息的机制。 数据交换,共享资源,进程同步,消息传递。 IPC实现原理:通信进程能够访问相同的内存区域。 方法: 管道:无名管道pipe、命名管道FIFO S…...
每日一题-力扣-2278. 字母在字符串中的百分比 0331
字母在字符串中的百分比求解方案 | 力扣 2278 题解 问题描述 给定一个字符串 s 和一个字母 letter,我们需要计算 letter 在 s 中出现的百分比,并将结果向下取整。例如,如果字符串是 "foobar",字母是 "o"&…...
【分布式】深入剖析 Sentinel 限流:原理、实现
在当今分布式系统盛行的时代,流量的剧增给系统稳定性带来了巨大挑战。Sentinel 作为一款强大的流量控制组件,在保障系统平稳运行方面发挥着关键作用。本文将深入探讨 Sentinel 限流的原理、实现方案以及其优缺点,助力开发者更好地运用这一工具…...
[leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)
题目链接 题意 给定一个 n n n个点 m m m条边的无向图 每条边有边权 求1-n的路径中最小的边权是多少 每条路可以重复走 思路 把边按边权降序排序 用并查集维护连通性 遍历每条边 每次合并边的起点和终点 如果1和n联通 并且这条边在1和n的这个连通块中 就对ans取min Code…...
关于CodeJava的学习笔记——11
一、GUI 1、最简单的GUI 只有一个按钮的GUI import java.awt.*; import javax.swing.*; public class SimpleGUI{JFrame frame;Button bt;public SimpleGUI(){frame new JFrame("标题栏内容");bt new Button("点我啊");frame.add(bt);frame.setSize(8…...
首个物业plus系列展 2025上海国际智慧物业博览会开幕
AI赋能服务升级!首个“物业plus”系列展 2025上海国际智慧物业博览会盛大开幕 3月31日,2025上海国际智慧物业博览会(简称“上海物博会”)在上海新国际博览中心N4馆隆重开幕。本届展会由广州旭杨国际展览有限公司主办,…...
嵌入式八股文学习——虚函数相关知识学习
虚函数 什么是虚函数?虚函数示例解析代码解析: 使用虚函数的注意事项1. 虚函数的声明与定义2. 派生类中的虚函数 哪些函数不能声明为虚函数1. 普通函数(非成员函数)2. 构造函数3. 内联成员函数4. 静态成员函数5. 友元函数总结 纯虚…...
rk3586开发版新增系统调用(Android13)
一、前言 最近想学一下kernel和hal,所以买了一块板子,带了个摄像头和屏幕,1100,学习投资了。这个Android内核定一个系统调用感觉是真的麻烦,主要是有一层bionic C,一开始不熟悉的时候还是花了点时间去配置。 二、kernel修改 include/uapi/asm-generic…...
OCR第三个方案:PP-OCRv4的初步探索
一、PP-OCR历史简要回顾 先请出PP-OCR官网,理解上有出入的,以官网为准。 1.1 PP-OCR系列历史 PP-OCRv1(2020):首创3.5M超轻量模型,奠定两阶段架构基础(检测方向分类识别)PP-OCRv2…...
物联网开发项目:AS608+ESP32S3+Vue构建指纹识别系统(二)——ESP32部分
一、前言 接着上一篇文章介绍的关于AS608模块的介绍以及关于指纹特征库的提取与导入分析,如果亲自上手了的话,那么对于Arduino IDE和AS608的基本操作已经熟悉了。 在这一个月之中,抛开中途有事耽误了,终于是基本上完成了我们整个项…...
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析
程序化广告行业(46/89):竞价结算规则、底价策略与内部排名解析 大家好!在之前的几篇博客中,我们已经深入探讨了程序化广告的多个重要方面,从基础概念到实际操作流程。我写这些博客的目的,就是希…...
ICLR 2025 Spotlight:让机器人实现「自主进化」,蚂蚁数科、清华提出具身协同框架 BodyGen
最近,全球 AI 和机器学习顶会 ICLR 2025 公布了论文录取结果:由蚂蚁数科与清华大学联合团队提出的全新具身协同框架 BodyGen 成功入选 Spotlight(聚光灯/特别关注)论文。 论文出自蚂蚁数科与清华大学兴军亮老师团队合作的科研项目…...
第十九章:Python-pyttsx3 库实现文本转语音功能
前言 在开发语音交互应用或需要文本转语音功能的项目时,pyttsx3 是一个非常实用的 Python 库。它支持离线语音合成,无需联网即可将文本转换为语音。本文将详细介绍 pyttsx3 的功能、用法以及常见问题的解决方法,并通过示例代码帮助你快速上手…...
Unity 2022.3.x部分Android设备播放视频黑屏问题
Android平台视频兼容性问题很多…类似的黑屏问题真的很头大,总结一些常见问题: 1. 视频文件不支持压缩 如果使用AssetBundle加载视频,这个AssetBundle压缩格式要选None。有人可能会说最新版Unity已经支持bundle压缩下播放视频,稳…...
vLLM 部署 openai whisper 模型实现语音转文字
vLLM 部署 openai whisper 模型实现语音转文字 1. 安装 vLLM2. 启动 openai whisper 模型 1. 安装 vLLM pip install vllm vllm[audio] --pre --extra-index-url https://wheels.vllm.ai/nightly --upgrade2. 启动 openai whisper 模型 CUDA_VISIBLE_DEVICES0 \ VLLM_WORKER_…...
【Zabbix技术系列文章】第④篇——Zabbix 数据可视化
在当今数字化运维时代,面对海量的监控数据,如何从中快速获取有价值的信息至关重要。Zabbix 的数据可视化功能为我们提供了直观、高效的解决方案,它能将复杂的监控数据转化为清晰易懂的图表和仪表盘,助力运维人员迅速发现问题、分析…...
