int version;
void *sess_handle;
c_complain_t complaint;
- uint32_t interval;
+ cdtime_t interval;
data_definition_t **data_list;
int data_list_len;
};
* +-> csnmp_config_add_host_community
* +-> csnmp_config_add_host_version
* +-> csnmp_config_add_host_collect
- * +-> csnmp_config_add_host_interval
*/
static void call_snmp_init_once (void)
{
return (0);
} /* int csnmp_config_add_host_collect */
-static int csnmp_config_add_host_interval (host_definition_t *hd, oconfig_item_t *ci)
-{
- if ((ci->values_num != 1)
- || (ci->values[0].type != OCONFIG_TYPE_NUMBER))
- {
- WARNING ("snmp plugin: The `Interval' config option needs exactly one number argument.");
- return (-1);
- }
-
- hd->interval = ci->values[0].value.number >= 0
- ? (uint32_t) ci->values[0].value.number
- : 0;
-
- return (0);
-} /* int csnmp_config_add_host_interval */
-
static int csnmp_config_add_host (oconfig_item_t *ci)
{
host_definition_t *hd;
else if (strcasecmp ("Collect", option->key) == 0)
csnmp_config_add_host_collect (hd, option);
else if (strcasecmp ("Interval", option->key) == 0)
- csnmp_config_add_host_interval (hd, option);
+ cf_util_get_cdtime (option, &hd->interval);
else
{
WARNING ("snmp plugin: csnmp_config_add_host: Option `%s' not allowed here.", option->key);
cb_data.data = hd;
cb_data.free_func = csnmp_host_definition_destroy;
- memset (&cb_interval, 0, sizeof (cb_interval));
- if (hd->interval != 0)
- cb_interval.tv_sec = (time_t) hd->interval;
+ CDTIME_T_TO_TIMESPEC (hd->interval, &cb_interval);
- status = plugin_register_complex_read (cb_name, csnmp_read_host,
- /* interval = */ &cb_interval, /* user_data = */ &cb_data);
+ status = plugin_register_complex_read (/* group = */ NULL, cb_name,
+ csnmp_read_host, /* interval = */ &cb_interval,
+ /* user_data = */ &cb_data);
if (status != 0)
{
ERROR ("snmp plugin: Registering complex read function failed.");
/* TODO: Check if negative values wrap around. Problem: negative temperatures. */
static value_t csnmp_value_list_to_value (struct variable_list *vl, int type,
- double scale, double shift)
+ double scale, double shift,
+ const char *host_name, const char *data_name)
{
value_t ret;
uint64_t tmp_unsigned = 0;
{
/* We'll handle this later.. */
}
-#ifdef ASN_NULL
- else if (vl->type == ASN_NULL)
- {
- /* Don't print a warning. */
- defined = 0;
- }
-#endif
else
{
- WARNING ("snmp plugin: I don't know the ASN type `%i'", (int) vl->type);
+ char oid_buffer[1024];
+
+ memset (oid_buffer, 0, sizeof (oid_buffer));
+ snprint_objid (oid_buffer, sizeof (oid_buffer) - 1,
+ vl->name, vl->name_length);
+
+#ifdef ASN_NULL
+ if (vl->type == ASN_NULL)
+ INFO ("snmp plugin: OID \"%s\" is undefined (type ASN_NULL)",
+ oid_buffer);
+ else
+#endif
+ WARNING ("snmp plugin: I don't know the ASN type #%i "
+ "(OID: \"%s\", data block \"%s\", host block \"%s\")",
+ (int) vl->type, oid_buffer,
+ (data_name != NULL) ? data_name : "UNKNOWN",
+ (host_name != NULL) ? host_name : "UNKNOWN");
+
defined = 0;
}
for (i = 0; i < num_chars; i++)
{
/* Check for control characters. */
- if ((src[i] >= 0) && (src[i] < 32))
+ if ((unsigned char)src[i] < 32)
return (csnmp_strvbcopy_hexstring (dst, vb, dst_size));
dst[i] = src[i];
}
static int csnmp_instance_list_add (csnmp_list_instances_t **head,
csnmp_list_instances_t **tail,
- const struct snmp_pdu *res)
+ const struct snmp_pdu *res,
+ const host_definition_t *hd, const data_definition_t *dd)
{
csnmp_list_instances_t *il;
struct variable_list *vb;
}
else
{
- value_t val = csnmp_value_list_to_value (vb, DS_TYPE_COUNTER, 1.0, 0.0);
+ value_t val = csnmp_value_list_to_value (vb, DS_TYPE_COUNTER,
+ /* scale = */ 1.0, /* shift = */ 0.0, hd->name, dd->name);
ssnprintf (il->instance, sizeof (il->instance),
"%llu", val.counter);
}
/* Allocate a new `csnmp_list_instances_t', insert the instance name and
* add it to the list */
if (csnmp_instance_list_add (&instance_list, &instance_list_ptr,
- res) != 0)
+ res, host, data) != 0)
{
ERROR ("snmp plugin: csnmp_instance_list_add failed.");
status = -1;
vt->subid = vb->name[vb->name_length - 1];
vt->value = csnmp_value_list_to_value (vb, ds->ds[i].type,
- data->scale, data->shift);
+ data->scale, data->shift, host->name, data->name);
vt->next = NULL;
if (value_table_ptr[i] == NULL)
for (i = 0; i < data->values_len; i++)
if (snmp_oid_compare (data->values[i].oid, data->values[i].oid_len,
vb->name, vb->name_length) == 0)
- vl.values[i] = csnmp_value_list_to_value (vb, ds->ds[i].type,
- data->scale, data->shift);
+ vl.values[i] = csnmp_value_list_to_value (vb, ds->ds[i].type,
+ data->scale, data->shift, host->name, data->name);
} /* for (res->variables) */
if (res != NULL)
static int csnmp_read_host (user_data_t *ud)
{
host_definition_t *host;
- time_t time_start;
- time_t time_end;
+ cdtime_t time_start;
+ cdtime_t time_end;
int status;
int success;
int i;
if (host->interval == 0)
host->interval = interval_g;
- time_start = time (NULL);
- DEBUG ("snmp plugin: csnmp_read_host (%s) started at %u;", host->name,
- (unsigned int) time_start);
+ time_start = cdtime ();
if (host->sess_handle == NULL)
csnmp_host_open_session (host);
success++;
}
- time_end = time (NULL);
- DEBUG ("snmp plugin: csnmp_read_host (%s) finished at %u;", host->name,
- (unsigned int) time_end);
- if ((uint32_t) (time_end - time_start) > host->interval)
+ time_end = cdtime ();
+ if ((time_end - time_start) > host->interval)
{
- WARNING ("snmp plugin: Host `%s' should be queried every %"PRIu32
- " seconds, but reading all values takes %u seconds.",
- host->name, host->interval, (unsigned int) (time_end - time_start));
+ WARNING ("snmp plugin: Host `%s' should be queried every %.3f "
+ "seconds, but reading all values takes %.3f seconds.",
+ host->name,
+ CDTIME_T_TO_DOUBLE (host->interval),
+ CDTIME_T_TO_DOUBLE (time_end - time_start));
}
if (success == 0)