diff --git a/smmapdfw/smmapd/snmp_subagent.c b/smmapdfw/smmapd/snmp_subagent.c index 3775671..fcc3229 100644 --- a/smmapdfw/smmapd/snmp_subagent.c +++ b/smmapdfw/smmapd/snmp_subagent.c @@ -5,49 +5,136 @@ #include #include +#include "stats.h" +#include "smmapd.h" + + +typedef struct var_cnt_map_s { + char* var; + int cnt; +} var_cnt_map_t; int number1 = 42; +int counter32 = 1; +int integer32 = 1; +var_cnt_map_t *var_cnt_map = NULL; +int num_var_cnt_map = 0; int handle_number1(netsnmp_mib_handler *handler, - netsnmp_handler_registration *reginfo, - netsnmp_agent_request_info *reqinfo, - netsnmp_request_info *requests) + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) { - switch(reqinfo->mode) { + switch(reqinfo->mode) { - case MODE_GET: - snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER, - (u_char *) &number1, - sizeof(number1)); - break; + case MODE_GET: + snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER, + (u_char *) &number1, + sizeof(number1)); + break; - default: - return SNMP_ERR_GENERR; - } + default: + return SNMP_ERR_GENERR; + } - return SNMP_ERR_NOERROR; + return SNMP_ERR_NOERROR; } -#define NETSNMP_REGISTER_SCALAR(A, B) netsnmp_register_scalar(netsnmp_create_handler_registration(#A, B, A##_oid, OID_LENGTH(A##_oid), HANDLER_CAN_RONLY)); printf("registered: %s\n", #A) +int +handle_it(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests, + u_char type) +{ + int i, cnt, value; + printf("*** handler: %s\n", reginfo->handlerName); + for (i=0; ihandlerName, var_cnt_map[i].var)) { + cnt = var_cnt_map[i].cnt; + break; + } + printf("*** cnt: %d\n", cnt); + + switch(reqinfo->mode) { + case MODE_GET: + value = getStatCounter(cnt); + snmp_set_var_typed_value(requests->requestvb, type, + (u_char *) &value, + sizeof(value)); + break; + + default: + return SNMP_ERR_GENERR; + } + + return SNMP_ERR_NOERROR; +} + +int +handle_counter32(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) +{ + return handle_it(handler, reginfo, reqinfo, requests, ASN_COUNTER); +} + +int +handle_integer32(netsnmp_mib_handler *handler, + netsnmp_handler_registration *reginfo, + netsnmp_agent_request_info *reqinfo, + netsnmp_request_info *requests) +{ + return handle_it(handler, reginfo, reqinfo, requests, ASN_INTEGER); +} + +void map_var_cnt(int cnt, char* var) { + var_cnt_map = (var_cnt_map_t*) realloc(var_cnt_map, sizeof(var_cnt_map_t) * (num_var_cnt_map + 1)); + var_cnt_map[num_var_cnt_map].var = var; + var_cnt_map[num_var_cnt_map].cnt = cnt; + num_var_cnt_map++; +} + +#define NETSNMP_REGISTER_SCALAR(A, B, C) netsnmp_register_scalar(netsnmp_create_handler_registration(#A, B, A##_oid, OID_LENGTH(A##_oid), HANDLER_CAN_RONLY)); map_var_cnt(C, #A); printf("registered: %s\n", #A) void init_dhsMIBObjects(void) { - static oid dhsNumber1_oid[] = { 1,3,6,1,4,1,9676,2,1,1 }; + static oid dhsNumber1_oid[] = { 1,3,6,1,4,1,9676,2,1,1 }; + static oid dhsAccepted_oid[] = { 1,3,6,1,4,1,9676,2,1,2,1 }; + static oid dhsFailed_oid[] = { 1,3,6,1,4,1,9676,2,1,2,2 }; + static oid dhsRunningNwThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,2,3 }; + static oid dhsNwThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,2,4 }; + static oid dhsFailedNwThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,2,5 }; + static oid dhsOKReturned_oid[] = { 1,3,6,1,4,1,9676,2,1,2,6 }; + static oid dhsTEMPReturned_oid[] = { 1,3,6,1,4,1,9676,2,1,2,7 }; + static oid dhsPERMReturned_oid[] = { 1,3,6,1,4,1,9676,2,1,2,8 }; + static oid dhsNOTFOUNDReturned_oid[] = { 1,3,6,1,4,1,9676,2,1,2,9 }; + static oid dhsIllegalInputFailure_oid[] = { 1,3,6,1,4,1,9676,2,1,2,10 }; + static oid dhsUnknownClassFailure_oid[] = { 1,3,6,1,4,1,9676,2,1,2,11 }; + static oid dhsTimeoutFailure_oid[] = { 1,3,6,1,4,1,9676,2,1,2,12 }; + static oid dhsNetStringFailure_oid[] = { 1,3,6,1,4,1,9676,2,1,2,13 }; DEBUGMSGTL(("dhsMIBObjects", "Initializing\n")); -/* - netsnmp_register_scalar( - netsnmp_create_handler_registration("dhsNumber1", handle_number1, - dhsNumber1_oid, OID_LENGTH(dhsNumber1_oid), - HANDLER_CAN_RONLY - )); -*/ -NETSNMP_REGISTER_SCALAR(dhsNumber1, handle_number1); + NETSNMP_REGISTER_SCALAR(dhsNumber1, handle_number1, 0); + NETSNMP_REGISTER_SCALAR(dhsAccepted, handle_counter32, STAT_CNT_ACCEPTED); + NETSNMP_REGISTER_SCALAR(dhsFailed, handle_counter32, STAT_CNT_FAILED); + NETSNMP_REGISTER_SCALAR(dhsRunningNwThreads, handle_integer32, STAT_CNT_NETWORKER_R_THREADS); + NETSNMP_REGISTER_SCALAR(dhsNwThreads, handle_counter32, STAT_CNT_NETWORKER_THREADS); + NETSNMP_REGISTER_SCALAR(dhsFailedNwThreads, handle_counter32, STAT_CNT_NETWORKER_THREADS_FAILED); + NETSNMP_REGISTER_SCALAR(dhsOKReturned, handle_counter32, SMM_OK+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsTEMPReturned, handle_counter32, SMM_TEMP_NOK+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsPERMReturned, handle_counter32, SMM_PERM_NOK+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsNOTFOUNDReturned, handle_counter32, SMM_NOT_FOUND_NOK+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsIllegalInputFailure, handle_counter32, SMM_ILLEGAL_INPUT+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsUnknownClassFailure, handle_counter32, SMM_UNKNOWN_CLASS+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsTimeoutFailure, handle_counter32, SMM_TIMEOUT_NOK+STAT_CNT_OFFSET); + NETSNMP_REGISTER_SCALAR(dhsNetStringFailure, handle_counter32, SMM_NETSTRING_UNPARSABLE+STAT_CNT_OFFSET); } @@ -58,13 +145,10 @@ void snmp_subagent_main () { init_dhsMIBObjects(); init_snmp("smmapd_subagent"); - /* main loop here... */ while(1) { -printf("*** main loop\n"); agent_check_and_process(1); } - /* at shutdown time */ snmp_shutdown("mysubagent"); } #endif