2012-10-17 2 views
0
/* 
* Note: this file originally auto-generated by mib2c using 
* $ 
*/ 

#include <net-snmp/net-snmp-config.h> 
#include <net-snmp/net-snmp-includes.h> 
#include <net-snmp/agent/net-snmp-agent-includes.h> 
#include "pool.h" 

/** Initializes the pool module */ 
void 
init_pool(void) 
{ 
    /* here we initialize all the tables we're planning on supporting */ 
    initialize_table_poolTable(); 
} 

    //Determine the first/last column names 

/** Initialize the poolTable table by defining its contents and how it's structured */ 
void 
initialize_table_poolTable(void) 
{ 
    const oid poolTable_oid[] = {1,3,6,1,4,1,21068,4,2}; 
    const size_t poolTable_oid_len = OID_LENGTH(poolTable_oid); 
    netsnmp_handler_registration *reg; 
    netsnmp_iterator_info   *iinfo; 
    netsnmp_table_registration_info *table_info; 

    DEBUGMSGTL(("pool:init", "initializing table poolTable\n")); 

    reg = netsnmp_create_handler_registration(
       "poolTable",  poolTable_handler, 
       poolTable_oid, poolTable_oid_len, 
       HANDLER_CAN_RONLY 
      ); 

    table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info); 
    netsnmp_table_helper_add_indexes(table_info, 
          ASN_INTEGER, /* index: ifIndex */ 
          0); 
    table_info->min_column = 1; 
    table_info->max_column = COLUMN_POOLINOCTETS; 

    iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info); 
    iinfo->get_first_data_point = poolTable_get_first_data_point; 
    iinfo->get_next_data_point = poolTable_get_next_data_point; 
    iinfo->table_reginfo  = table_info; 

    netsnmp_register_table_iterator(reg, iinfo); 

    /* Initialise the contents of the table here */ 
} 

    /* Typical data structure for a row entry */ 
struct poolTable_entry { 
    /* Index values */ 
    long ifIndex; 

    /* Column values */ 
    u_long poolInOctets; 

    /* Illustrate using a simple linked list */ 
    int valid; 
    struct poolTable_entry *next; 
}; 

struct poolTable_entry *poolTable_head; 

/* create a new row in the (unsorted) table */ 
struct poolTable_entry * 
poolTable_createEntry(
       long ifIndex 
       ) { 
    struct poolTable_entry *entry; 

    entry = SNMP_MALLOC_TYPEDEF(struct poolTable_entry); 
    if (!entry) 
     return NULL; 

    entry->ifIndex = ifIndex; 
    entry->next = poolTable_head; 
    poolTable_head = entry; 
    return entry; 
} 

/* remove a row from the table */ 
void 
poolTable_removeEntry(struct poolTable_entry *entry) { 
    struct poolTable_entry *ptr, *prev; 

    if (!entry) 
     return; /* Nothing to remove */ 

    for (ptr = poolTable_head, prev = NULL; 
      ptr != NULL; 
      prev = ptr, ptr = ptr->next) { 
     if (ptr == entry) 
      break; 
    } 
    if (!ptr) 
     return; /* Can't find it */ 

    if (prev == NULL) 
     poolTable_head = ptr->next; 
    else 
     prev->next = ptr->next; 

    SNMP_FREE(entry); /* XXX - release any other internal resources */ 
} 


/* Example iterator hook routines - using 'get_next' to do most of the work */ 
netsnmp_variable_list * 
poolTable_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 = poolTable_head; 
    return poolTable_get_next_data_point(my_loop_context, my_data_context, 
            put_index_data, mydata); 
} 

netsnmp_variable_list * 
poolTable_get_next_data_point(void **my_loop_context, 
          void **my_data_context, 
          netsnmp_variable_list *put_index_data, 
          netsnmp_iterator_info *mydata) 
{ 
    struct poolTable_entry *entry = (struct poolTable_entry *)*my_loop_context; 
    netsnmp_variable_list *idx = put_index_data; 

    if (entry) { 
     snmp_set_var_typed_integer(idx, ASN_INTEGER, entry->ifIndex); 
     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 poolTable table */ 
int 
poolTable_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 poolTable_entry   *table_entry; 

    DEBUGMSGTL(("pool: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 poolTable_entry *) 
           netsnmp_extract_iterator_context(request); 
      table_info =  netsnmp_extract_table_info(  request); 

      switch (table_info->colnum) { 
      case COLUMN_POOLINOCTETS: 
       if (!table_entry) { 
        netsnmp_set_request_error(reqinfo, request, 
               SNMP_NOSUCHINSTANCE); 
        continue; 
       } 
       snmp_set_var_typed_integer(request->requestvb, ASN_COUNTER, 
              table_entry->poolInOctets); 
       break; 
      default: 
       netsnmp_set_request_error(reqinfo, request, 
              SNMP_NOSUCHOBJECT); 
       break; 
      } 
     } 
     break; 

    } 
    return SNMP_ERR_NOERROR; 
} 

위의 코드는 mib2c 생성 코드입니다. 하위 에이전트로 컴파일 중입니다 ... 그러나 어떤 종류의 값도 표시하지 않습니다. 그것을 구현하기위한 다음 단계는 무엇이되어야합니까? 어디에서 데이터를 얻을 수 있습니까? 그것을 구현하도록 도와주세요. 사전에이 OIDmib2c 생성 코드의 구현

Thansks에서이 에이전트에 사용할 수

snmpwalk를 -c 공공 -v의 2C 로컬 호스트 1.3.6.1.4.1.21068 POOL-MIB :: 엘리트 = 아니오 이러한 개체입니다.

답변

1

데이터를 poolTable_head 링크 된 데이터 목록에 추가해야합니다. 당신은 이렇게 할 수 있습니다 :

그리고 그 코드를 넣으십시오. 예를 들어 initialize_table_poolTable() 함수의 맨 아래에 넣을 수 있습니다.

mib2c는 많은 코딩 스타일을 생성하며 위의 내용을 기반으로 올바른 스타일을 선택했다고 확신하지는 않습니다. 데이터가 매우 정적이어서 보이지 않는 것처럼 보이기 때문에 ' 정기적으로 poolInOctets 번호를 업데이트하려면 경보 (snmp_alarm (3) 참조)를 설정해야합니다.

+0

나는 당신의 제안을 따랐지만 지금은 "현재이 OID에 해당 인스턴스가 없습니다"라고 표시합니다 –

+0

어디에서 변경해야합니까? 동일한 테이블에 수천 개의 데이터를 추가하고 싶습니다. 또는 당신이 말했듯이 나는 다른 방법을 사용하기를 원하지만, 나는 그다지 쉽게 찾을 수없는 것을 선택하기 위해 많은 snmp 코딩에 대해 모른다. –

관련 문제