/* Copyright (C) 2004, Wolfgang Hottgenroth This file is part of smmapdfw. smmapdfw is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. smmapdfw is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with smmapdfw. If not, write to the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "config.h" #if ENABLE_NETSNMP==1 #include #include #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) { switch(reqinfo->mode) { case MODE_GET: snmp_set_var_typed_value(requests->requestvb, ASN_COUNTER, (u_char *) &number1, sizeof(number1)); break; default: return SNMP_ERR_GENERR; } return SNMP_ERR_NOERROR; } 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; for (i=0; ihandlerName, var_cnt_map[i].var)) { cnt = var_cnt_map[i].cnt; break; } 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) void init_dhsMIBObjects(void) { 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 }; static oid dhsVCacheEntries_oid[] = { 1,3,6,1,4,1,9676,2,1,3,1 }; static oid dhsVRunningWorkerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,2 }; static oid dhsVWorkerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,3 }; static oid dhsVFailedWorkerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,4 }; static oid dhsVTimedOutWorkerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,5 }; static oid dhsVRunningCheckerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,6 }; static oid dhsVCheckerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,7 }; static oid dhsVFailedCheckerThreads_oid[] = { 1,3,6,1,4,1,9676,2,1,3,8 }; static oid dhsVAnsweredFromCache_oid[] = { 1,3,6,1,4,1,9676,2,1,3,9 }; static oid dhsVReturnedOK_oid[] = { 1,3,6,1,4,1,9676,2,1,3,10 }; static oid dhsVReturnedNOK_oid[] = { 1,3,6,1,4,1,9676,2,1,3,11 }; static oid dhsVReturnedTNOK_oid[] = { 1,3,6,1,4,1,9676,2,1,3,12 }; DEBUGMSGTL(("dhsMIBObjects", "Initializing\n")); 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); NETSNMP_REGISTER_SCALAR(dhsVCacheEntries, handle_integer32, STAT_CNT_VERIFIER_CACHE); NETSNMP_REGISTER_SCALAR(dhsVRunningWorkerThreads, handle_integer32, STAT_CNT_VERIFIER_WORKER_R_THREADS); NETSNMP_REGISTER_SCALAR(dhsVWorkerThreads, handle_counter32, STAT_CNT_VERIFIER_WORKER_THREADS); NETSNMP_REGISTER_SCALAR(dhsVFailedWorkerThreads, handle_counter32, STAT_CNT_VERIFIER_WORKER_THREADS_FAILED); NETSNMP_REGISTER_SCALAR(dhsVTimedOutWorkerThreads, handle_counter32, STAT_CNT_VERIFIER_WORKER_THREADS_TIMEOUT); NETSNMP_REGISTER_SCALAR(dhsVRunningCheckerThreads, handle_integer32, STAT_CNT_VERIFIER_CHECKER_R_THREADS); NETSNMP_REGISTER_SCALAR(dhsVCheckerThreads, handle_counter32, STAT_CNT_VERIFIER_CHECKER_THREADS); NETSNMP_REGISTER_SCALAR(dhsVFailedCheckerThreads, handle_counter32, STAT_CNT_VERIFIER_CHECKER_THREADS_FAILED); NETSNMP_REGISTER_SCALAR(dhsVAnsweredFromCache, handle_counter32, STAT_CNT_VERIFIER_ANSWERED_FROM_CACHE); NETSNMP_REGISTER_SCALAR(dhsVReturnedOK, handle_counter32, STAT_CNT_VERIFIER_RETURNED_OK); NETSNMP_REGISTER_SCALAR(dhsVReturnedNOK, handle_counter32, STAT_CNT_VERIFIER_RETURNED_NOK); NETSNMP_REGISTER_SCALAR(dhsVReturnedTNOK, handle_counter32, STAT_CNT_VERIFIER_RETURNED_TNOK); } void snmp_subagent_main () { snmp_disable_log(); netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1); init_agent("smmapd_subagent"); init_dhsMIBObjects(); init_snmp("smmapd_subagent"); while(1) { agent_check_and_process(1); } snmp_shutdown("mysubagent"); } #endif