Merge remote-tracking branch 'github/pr/2488'
authorFlorian Forster <octo@collectd.org>
Wed, 18 Oct 2017 18:27:04 +0000 (20:27 +0200)
committerFlorian Forster <octo@collectd.org>
Wed, 18 Oct 2017 18:27:04 +0000 (20:27 +0200)
1  2 
src/collectd.conf.in
src/snmp.c

diff --combined src/collectd.conf.in
  #             Size "+10k"
  #             Recursive true
  #             IncludeHidden false
 +#             RegularOnly true
  #             #FilesSizeType "bytes"
  #             #FilesCountType "files"
  #             #TypeInstance "instance"
  #       Community "community_string"
  #       Collect "std_traffic"
  #       Interval 120
+ #     Timeout 10
+ #     Retries 1
  #   </Host>
  #   <Host "some.server.mydomain.org">
  #       Address "192.168.0.42"
  #       Community "more_communities"
  #       Collect "powerplus_voltge_input"
  #       Interval 300
+ #     Timeout 5
+ #     Retries 5
  #   </Host>
  #</Plugin>
  
  #             Header "X-Custom-Header: custom_value"
  #             SSLVersion "TLSv1"
  #             Format "Command"
 +#             Prefix "collectd"  # metric prefix, only available for KAIROSDB format
  #             Attribute "key" "value"     # only available for KAIROSDB format
  #             TTL 0   # data ttl, only available for KAIROSDB format
  #             Metrics true
diff --combined src/snmp.c
@@@ -63,7 -63,7 +63,7 @@@ struct data_definition_s 
    struct data_definition_s *next;
    char **ignores;
    size_t ignores_len;
 -  int invert_match;
 +  _Bool invert_match;
  };
  typedef struct data_definition_s data_definition_t;
  
@@@ -71,6 -71,8 +71,8 @@@ struct host_definition_s 
    char *name;
    char *address;
    int version;
+   cdtime_t timeout;
+   int retries;
  
    /* snmpv1/2 options */
    char *community;
@@@ -327,14 -329,29 +329,14 @@@ static int csnmp_config_add_data_blackl
    return 0;
  } /* int csnmp_config_add_data_blacklist */
  
 -static int csnmp_config_add_data_blacklist_match_inverted(data_definition_t *dd,
 -                                                          oconfig_item_t *ci) {
 -  if ((ci->values_num != 1) || (ci->values[0].type != OCONFIG_TYPE_BOOLEAN)) {
 -    WARNING("snmp plugin: `InvertMatch' needs exactly one boolean argument.");
 -    return -1;
 -  }
 -
 -  dd->invert_match = ci->values[0].value.boolean ? 1 : 0;
 -
 -  return 0;
 -} /* int csnmp_config_add_data_blacklist_match_inverted */
 -
  static int csnmp_config_add_data(oconfig_item_t *ci) {
 -  data_definition_t *dd;
 -  int status = 0;
 -
 -  dd = calloc(1, sizeof(*dd));
 +  data_definition_t *dd = calloc(1, sizeof(*dd));
    if (dd == NULL)
      return -1;
  
 -  status = cf_util_get_string(ci, &dd->name);
 +  int status = cf_util_get_string(ci, &dd->name);
    if (status != 0) {
 -    free(dd);
 +    sfree(dd);
      return -1;
    }
  
      else if (strcasecmp("Ignore", option->key) == 0)
        status = csnmp_config_add_data_blacklist(dd, option);
      else if (strcasecmp("InvertMatch", option->key) == 0)
 -      status = csnmp_config_add_data_blacklist_match_inverted(dd, option);
 +      status = cf_util_get_boolean(option, &dd->invert_match);
      else {
        WARNING("snmp plugin: Option `%s' not allowed here.", option->key);
        status = -1;
@@@ -582,6 -599,10 +584,10 @@@ static int csnmp_config_add_host(oconfi
    hd->sess_handle = NULL;
    hd->interval = 0;
  
+   /* These mean that we have not set a timeout or retry value */
+   hd->timeout = 0;
+   hd->retries = -1;
    for (int i = 0; i < ci->children_num; i++) {
      oconfig_item_t *option = ci->children + i;
      status = 0;
        status = cf_util_get_string(option, &hd->community);
      else if (strcasecmp("Version", option->key) == 0)
        status = csnmp_config_add_host_version(hd, option);
+     else if (strcasecmp("Timeout", option->key) == 0)
+       cf_util_get_cdtime(option, &hd->timeout);
+     else if (strcasecmp("Retries", option->key) == 0)
+       cf_util_get_int(option, &hd->retries);
      else if (strcasecmp("Collect", option->key) == 0)
        csnmp_config_add_host_collect(hd, option);
      else if (strcasecmp("Interval", option->key) == 0)
@@@ -788,6 -813,15 +798,15 @@@ static void csnmp_host_open_session(hos
      sess.community_len = strlen(host->community);
    }
  
+   /* Set timeout & retries, if they have been changed from the default */
+   if (host->timeout != 0) {
+     /* net-snmp expects microseconds */
+     sess.timeout = CDTIME_T_TO_US(host->timeout);
+   }
+   if (host->retries >= 0) {
+     sess.retries = host->retries;
+   }
    /* snmp_sess_open will copy the `struct snmp_session *'. */
    host->sess_handle = snmp_sess_open(&sess);
  
@@@ -1017,6 -1051,7 +1036,6 @@@ static int csnmp_instance_list_add(csnm
    struct variable_list *vb;
    oid_t vb_name;
    int status;
 -  uint32_t is_matched;
  
    /* Set vb on the last variable */
    for (vb = res->variables; (vb != NULL) && (vb->next_variable != NULL);
      char *ptr;
  
      csnmp_strvbcopy(il->instance, vb, sizeof(il->instance));
 -    is_matched = 0;
 +    _Bool is_matched = 0;
      for (uint32_t i = 0; i < dd->ignores_len; i++) {
        status = fnmatch(dd->ignores[i], il->instance, 0);
        if (status == 0) {
 -        if (dd->invert_match == 0) {
 +        if (!dd->invert_match) {
            sfree(il);
            return 0;
          } else {
          }
        }
      }
 -    if (dd->invert_match != 0 && is_matched == 0) {
 +    if (dd->invert_match && !is_matched) {
        sfree(il);
        return 0;
      }