src/types_list.c: Added a function to parse a generic list of `types'.
authorFlorian Forster <octo@huhu.verplant.org>
Thu, 3 May 2007 08:49:16 +0000 (10:49 +0200)
committerFlorian Forster <octo@huhu.verplant.org>
Thu, 3 May 2007 08:49:16 +0000 (10:49 +0200)
It's not yet tested, but it compiles ;)

src/Makefile.am
src/collectd.c
src/configfile.c
src/types_list.c [new file with mode: 0644]
src/types_list.h [new file with mode: 0644]

index bbbd8dc..ecfebfb 100644 (file)
@@ -20,7 +20,8 @@ collectd_SOURCES = collectd.c collectd.h \
                   utils_ignorelist.c utils_ignorelist.h \
                   common.c common.h \
                   plugin.c plugin.h \
-                  configfile.c configfile.h
+                  configfile.c configfile.h \
+                  types_list.c types_list.h
 collectd_CPPFLAGS = $(LTDLINCL)
 collectd_CPPFLAGS += -DPREFIX='"${prefix}"'
 collectd_CPPFLAGS += -DCONFIGFILE='"${sysconfdir}/${PACKAGE_NAME}.conf"'
index 0986e40..49998f9 100644 (file)
@@ -25,6 +25,7 @@
 
 #include "plugin.h"
 #include "configfile.h"
+#include "types_list.h"
 
 /*
  * Global variables
@@ -213,6 +214,7 @@ static int do_init (void)
        }
 #endif
 
+       read_types_list ();
        plugin_init_all ();
 
        return (0);
index c63240e..45495c1 100644 (file)
@@ -81,7 +81,8 @@ static cf_global_option_t cf_global_options[] =
        {"PIDFile",   NULL, PIDFILE},
        {"Hostname",  NULL, NULL},
        {"Interval",  NULL, "10"},
-       {"ReadThreads", NULL, "5"}
+       {"ReadThreads", NULL, "5"},
+       {"TypesDS",   NULL, PLUGINDIR"/types.db"} /* FIXME: Configure path */
 };
 static int cf_global_options_num = STATIC_ARRAY_LEN (cf_global_options);
 
diff --git a/src/types_list.c b/src/types_list.c
new file mode 100644 (file)
index 0000000..847d098
--- /dev/null
@@ -0,0 +1,178 @@
+/**
+ * collectd - src/types_list.c
+ * Copyright (C) 2007  Florian octo Forster
+ *
+ * This program 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; only version 2 of the License is applicable.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Florian octo Forster <octo at verplant.org>
+ **/
+
+#include "collectd.h"
+#include "common.h"
+
+#include "plugin.h"
+#include "configfile.h"
+
+static int parse_ds (data_source_t *dsrc, char *buf, size_t buf_len)
+{
+  char *dummy;
+  char *saveptr;
+  char *fields[8];
+  int   fields_num;
+
+  if (buf_len < 11)
+    return (-1);
+
+  if (buf[buf_len - 1] == ',')
+  {
+    buf_len--;
+    buf[buf_len] = '\0';
+  }
+
+  dummy = buf;
+  saveptr = NULL;
+
+  fields_num = 0;
+  while (fields_num < 8)
+  {
+    if ((fields[fields_num] = strtok_r (dummy, ":", &saveptr)) == NULL)
+      break;
+    dummy = NULL;
+    fields_num++;
+  }
+
+  if (fields_num != 4)
+    return (-1);
+
+  strncpy (dsrc->name, fields[0], sizeof (dsrc->name));
+  dsrc->name[sizeof (dsrc->name) - 1] = '\0';
+
+  if (strcasecmp (fields[1], "GAUGE") == 0)
+    dsrc->type = DS_TYPE_GAUGE;
+  else if (strcasecmp (fields[1], "COUNTER") == 0)
+    dsrc->type = DS_TYPE_COUNTER;
+  else
+    return (-1);
+
+  if (strcasecmp (fields[2], "U") == 0)
+    dsrc->min = NAN;
+  else
+    dsrc->min = atof (fields[2]);
+
+  if (strcasecmp (fields[3], "U") == 0)
+    dsrc->max = NAN;
+  else
+    dsrc->max = atof (fields[3]);
+
+  DEBUG ("parse_ds: dsrc = {%s, %i, %lf, %lf};",
+      dsrc->name, dsrc->type, dsrc->min, dsrc->max);
+
+  return (0);
+} /* int parse_ds */
+
+static void parse_line (char *buf, size_t buf_len)
+{
+  char  *fields[64];
+  size_t fields_num;
+  data_set_t ds;
+  int i;
+
+  fields_num = strsplit (buf, fields, 64);
+  if (fields_num < 2)
+    return;
+
+  memset (&ds, '\0', sizeof (ds));
+
+  strncpy (ds.type, fields[0], sizeof (ds.type));
+  ds.type[sizeof (ds.type) - 1] = '\0';
+
+  ds.ds_num = fields_num - 1;
+  ds.ds = (data_source_t *) calloc (ds.ds_num, sizeof (data_source_t));
+  if (ds.ds == NULL)
+    return;
+
+  for (i = 0; i < ds.ds_num; i++)
+    if (parse_ds (ds.ds + i, fields[i + 1], strlen (fields[i + 1])) != 0)
+    {
+      sfree (ds.ds);
+      return;
+    }
+
+  DEBUG ("parse_line: ds = {%s, %i, %p};",
+      ds.type, ds.ds_num, (void *) ds.ds);
+
+  plugin_register_data_set (&ds);
+  sfree (ds.ds);
+} /* void parse_line */
+
+static void parse_file (FILE *fh)
+{
+  char buf[4096];
+  size_t buf_len;
+
+  while (fgets (buf, sizeof (buf), fh) != NULL)
+  {
+    buf_len = strlen (buf);
+
+    if (buf_len >= 4095)
+    {
+      NOTICE ("Skipping line with more than 4095 characters.");
+      do
+      {
+       if (fgets (buf, sizeof (buf), fh) == NULL)
+         break;
+       buf_len = strlen (buf);
+      } while (buf_len >= 4095);
+      continue;
+    } /* if (buf_len >= 4095) */
+
+    if ((buf_len == 0) || (buf[0] == '#'))
+      continue;
+
+    parse_line (buf, buf_len);
+  } /* while (fgets) */
+} /* void parse_file */
+
+int read_types_list (void)
+{
+  const char *file;
+  FILE *fh;
+
+  file = global_option_get ("TypesDB");
+  if (file == NULL)
+    return (-1);
+
+  fh = fopen (file, "r");
+  if (fh == NULL)
+  {
+    char errbuf[1024];
+    ERROR ("open (%s) failed: %s", 
+       file, sstrerror (errno, errbuf, sizeof (errbuf)));
+    return (-1);
+  }
+
+  parse_file (fh);
+
+  fclose (fh);
+  fh = NULL;
+
+  DEBUG ("Done parsing `%s'", file);
+
+  return (0);
+} /* int read_types_list */
+
+/*
+ * vim: shiftwidth=2:softtabstop=2:tabstop=8
+ */
diff --git a/src/types_list.h b/src/types_list.h
new file mode 100644 (file)
index 0000000..c7e6aa0
--- /dev/null
@@ -0,0 +1,27 @@
+#ifndef TYPES_LIST_H
+#define TYPES_LIST_H 1
+
+/**
+ * collectd - src/types_list.h
+ * Copyright (C) 2007  Florian octo Forster
+ *
+ * This program 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; only version 2 of the License is applicable.
+ *
+ * This program 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 this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ * Authors:
+ *   Florian octo Forster <octo at verplant.org>
+ **/
+
+int read_types_list (void);
+
+#endif /* TYPES_LIST_H */