/** * Get snmp value to the struct my_oid_result. * Author : lining 15810423651 [email protected] * @param netsnmp_variable_list *vars : the return pdu variable value. * @param my_oid_result : the struct my_oid_result. * @return void. */ void get_bulkwalk_oid_values(netsnmp_variable_list *vars, my_oid_result *oid_result) { unsigned int count = 0; oid_result->oid_name_length = vars->name_length; for(count=0; count < vars->name_length; count++) { oid_result->oid_name[count] = *(vars->name+count); } oid_result->val_len = vars->val_len; oid_result->type = vars->type; if(vars->type == SNMP_NOSUCHOBJECT) { return; } if(vars->type == SNMP_NOSUCHINSTANCE) { return; } if(vars->type == SNMP_ENDOFMIBVIEW) { return; } if (vars->type == ASN_OCTET_STR) { for(count=0; count < vars->val_len; count++) { oid_result->val.string[count] = vars->val.string[count]; } return; } if (vars->type == ASN_BIT_STR) { sprintf(oid_result->val.bitstring, "%s" ,vars->val.bitstring); return; } if (vars->type == ASN_OPAQUE) { return; } if (vars->type == ASN_INTEGER) { oid_result->val.integer = *vars->val.integer; return; } if (vars->type == ASN_UINTEGER) { oid_result->val.integer = *vars->val.integer; return; } if (vars->type == ASN_OBJECT_ID) { oid_result->objid_length = vars->val_len/sizeof(oid); for(count=0; count < oid_result->objid_length; count++) { oid_result->val.objid[count] = vars->val.objid[count]; } return; } if (vars->type == ASN_TIMETICKS) { oid_result->val.integer = *(u_long *)vars->val.integer; return; } if (vars->type == ASN_IPADDRESS) { oid_result->val.string[0] = vars->val.string[0]; oid_result->val.string[1] = vars->val.string[1]; oid_result->val.string[2] = vars->val.string[2]; oid_result->val.string[3] = vars->val.string[3]; return; } if (vars->type == ASN_OPAQUE_I64) { printI64(oid_result->val.string, vars->val.counter64); return; } if (vars->type == ASN_OPAQUE_COUNTER64 || vars->type == ASN_OPAQUE_U64 || vars->type == ASN_COUNTER64) { printU64(oid_result->val.string, vars->val.counter64); return; } if (vars->type == ASN_COUNTER) { oid_result->val.integer = *vars->val.integer; return; } if (vars->type == ASN_GAUGE) { oid_result->val.integer = *vars->val.integer; return; } if (vars->type == ASN_OPAQUE_FLOAT) { oid_result->val.floatVal = *vars->val.floatVal; return; } if (vars->type == ASN_OPAQUE_DOUBLE) { oid_result->val.doubleVal = *vars->val.doubleVal; return; } if (vars->type == ASN_NULL) { return; } }
/** * Get snmp value to the structure my_poid_result-> * Author : lining 15810423651 [email protected] * @param netsnmp_variable_list *vars : the return pdu variable value. * @param my_oid_result : the structure my_poid_result-> * @return void. */ void get_oid_value(netsnmp_variable_list *vars, my_oid_result **oid_result) { unsigned int count = 0; (*oid_result)->oid_name_length = vars->name_length; for(count=0; count < vars->name_length; count++) { (*oid_result)->oid_name[count] = *(vars->name+count); } (*oid_result)->val_len = vars->val_len; (*oid_result)->type = vars->type; if(vars->type == SNMP_NOSUCHOBJECT) { return; } if(vars->type == SNMP_NOSUCHINSTANCE) { return; } if(vars->type == SNMP_ENDOFMIBVIEW) { return; } if (vars->type == ASN_OCTET_STR) { int hex = 0; int x; u_char * cp; int allow_realloc = 1; u_char *buf = NULL; size_t buf_len = 256, out_len = 0; for (cp = vars->val.string, x = 0; x < (int)vars->val_len; x++, cp++) { if (!isprint(*cp) && !isspace(*cp)) { hex = 1; } } if(!hex) { for(count=0; count < vars->val_len; count++) { (*oid_result)->val.string[count] = vars->val.string[count]; } return; } else { buf = (u_char *) calloc(buf_len, 1); sprint_realloc_hexstring(&buf, &buf_len, &out_len, allow_realloc, vars->val.string, vars->val_len); for(count=0; count < strlen(buf); count++) { (*oid_result)->val.string[count] = buf[count]; } (*oid_result)->val.string[strlen(buf)] = 0; free(buf); return; } } if (vars->type == ASN_BIT_STR) { sprintf((*oid_result)->val.bitstring, "%s" ,vars->val.bitstring); return; } if (vars->type == ASN_OPAQUE) { return; } if (vars->type == ASN_INTEGER) { (*oid_result)->val.integer = *vars->val.integer; (*oid_result)->val.integer = (*oid_result)->val.integer & 0x00000000ffffffff; return; } if (vars->type == ASN_UINTEGER) { (*oid_result)->val.integer = *vars->val.integer; (*oid_result)->val.integer = (*oid_result)->val.integer & 0x00000000ffffffff; return; } if (vars->type == ASN_OBJECT_ID) { (*oid_result)->objid_length = vars->val_len/sizeof(oid); for(count=0; count < (*oid_result)->objid_length; count++) { (*oid_result)->val.objid[count] = vars->val.objid[count]; } return; } if (vars->type == ASN_TIMETICKS) { (*oid_result)->val.integer = *(u_long *)vars->val.integer; return; } if (vars->type == ASN_IPADDRESS) { (*oid_result)->val.string[0] = vars->val.string[0]; (*oid_result)->val.string[1] = vars->val.string[1]; (*oid_result)->val.string[2] = vars->val.string[2]; (*oid_result)->val.string[3] = vars->val.string[3]; return; } if (vars->type == ASN_OPAQUE_I64) { printI64((*oid_result)->val.string, vars->val.counter64); return; } if (vars->type == ASN_OPAQUE_COUNTER64 || vars->type == ASN_OPAQUE_U64 || vars->type == ASN_COUNTER64) { printU64((*oid_result)->val.string, vars->val.counter64); return; } if (vars->type == ASN_COUNTER) { (*oid_result)->val.integer = *vars->val.integer; return; } if (vars->type == ASN_GAUGE) { (*oid_result)->val.integer = *vars->val.integer; return; } if (vars->type == ASN_OPAQUE_FLOAT) { (*oid_result)->val.floatVal = *vars->val.floatVal; return; } if (vars->type == ASN_OPAQUE_DOUBLE) { (*oid_result)->val.doubleVal = *vars->val.doubleVal; return; } if (vars->type == ASN_NULL) { return; } return; }
/* Handling of results */ static void noit_snmp_log_results(noit_module_t *self, noit_check_t *check, struct snmp_pdu *pdu) { struct check_info *info = check->closure; struct variable_list *vars; struct timeval duration; char buff[128]; stats_t current; int nresults = 0; noit_check_stats_clear(check, ¤t); if(pdu) for(vars = pdu->variables; vars; vars = vars->next_variable) nresults++; gettimeofday(¤t.whence, NULL); sub_timeval(current.whence, check->last_fire_time, &duration); current.duration = duration.tv_sec * 1000 + duration.tv_usec / 1000; current.available = pdu ? NP_AVAILABLE : NP_UNAVAILABLE; current.state = (nresults == info->noids) ? NP_GOOD : NP_BAD; snprintf(buff, sizeof(buff), "%d/%d gets", nresults, info->noids); current.status = buff; /* We have no results over which to iterate. */ if(!pdu) { noit_check_set_stats(check, ¤t); return; } /* manipulate the information ourselves */ nresults = 0; for(vars = pdu->variables; vars; vars = vars->next_variable) { char *sp; int oid_idx; double float_conv; u_int64_t u64; int64_t i64; char *endptr; char varbuff[256]; /* find the oid to which this is the response */ oid_idx = nresults; /* our current idx is the most likely */ if(info->oids[oid_idx].oidlen != vars->name_length || memcmp(info->oids[oid_idx].oid, vars->name, vars->name_length * sizeof(oid))) { /* Not the most obvious guess */ for(oid_idx = info->noids - 1; oid_idx >= 0; oid_idx--) { if(info->oids[oid_idx].oidlen == vars->name_length && memcmp(info->oids[oid_idx].oid, vars->name, vars->name_length * sizeof(oid))) break; } } if(oid_idx < 0) { snprint_variable(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); noitL(nlerr, "Unexpected oid results to %s`%s`%s: %s\n", check->target, check->module, check->name, varbuff); nresults++; continue; } #define SETM(a,b) noit_stats_set_metric(check, ¤t, \ info->oids[oid_idx].confname, a, b) if(info->oids[oid_idx].type_should_override) { snprint_value(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); sp = strchr(varbuff, ' '); if(sp) sp++; noit_stats_set_metric_coerce(check, ¤t, info->oids[oid_idx].confname, info->oids[oid_idx].type_override, sp); } else { switch(vars->type) { case ASN_OCTET_STR: sp = malloc(1 + vars->val_len); memcpy(sp, vars->val.string, vars->val_len); sp[vars->val_len] = '\0'; SETM(METRIC_STRING, sp); free(sp); break; case ASN_INTEGER: case ASN_GAUGE: SETM(METRIC_INT32, vars->val.integer); break; case ASN_TIMETICKS: case ASN_COUNTER: SETM(METRIC_UINT32, vars->val.integer); break; case ASN_INTEGER64: printI64(varbuff, vars->val.counter64); i64 = strtoll(varbuff, &endptr, 10); SETM(METRIC_INT64, (varbuff == endptr) ? NULL : &i64); break; case ASN_COUNTER64: printU64(varbuff, vars->val.counter64); u64 = strtoull(varbuff, &endptr, 10); SETM(METRIC_UINT64, (varbuff == endptr) ? NULL : &u64); break; case ASN_FLOAT: if(vars->val.floatVal) float_conv = *(vars->val.floatVal); SETM(METRIC_DOUBLE, vars->val.floatVal ? &float_conv : NULL); break; case ASN_DOUBLE: SETM(METRIC_DOUBLE, vars->val.doubleVal); break; case SNMP_NOSUCHOBJECT: case SNMP_NOSUCHINSTANCE: SETM(METRIC_STRING, NULL); break; default: snprint_variable(varbuff, sizeof(varbuff), vars->name, vars->name_length, vars); /* Advance passed the first space and use that unless there * is no space or we have no more string left. */ sp = strchr(varbuff, ' '); if(sp) sp++; SETM(METRIC_STRING, (sp && *sp) ? sp : NULL); } } nresults++; } noit_check_set_stats(check, ¤t); }