Ejemplo n.º 1
0
/**
 * 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;
	}
}
Ejemplo n.º 2
0
/**
 * 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;
}
Ejemplo n.º 3
0
/* 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, &current);

  if(pdu)
    for(vars = pdu->variables; vars; vars = vars->next_variable)
      nresults++;

  gettimeofday(&current.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, &current);
    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, &current, \
                                        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, &current, 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, &current);
}