email plugin: Made socket settings configurable.
[collectd.git] / src / plugin.c
index ce4c943..697449e 100644 (file)
@@ -1,6 +1,6 @@
 /**
  * collectd - src/plugin.c
- * Copyright (C) 2005  Florian octo Forster
+ * Copyright (C) 2005,2006  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
@@ -25,7 +25,8 @@
 #include <ltdl.h>
 
 #include "plugin.h"
-#include "multicast.h"
+#include "network.h"
+#include "utils_debug.h"
 
 typedef struct plugin
 {
@@ -38,9 +39,7 @@ typedef struct plugin
 
 static plugin_t *first_plugin = NULL;
 
-#ifdef HAVE_LIBRRD
 extern int operating_mode;
-#endif
 
 static char *plugindir = NULL;
 
@@ -52,7 +51,7 @@ char *plugin_get_dir (void)
                return (plugindir);
 }
 
-void plugin_set_dir (char *dir)
+void plugin_set_dir (const char *dir)
 {
        if (plugindir != NULL)
                free (plugindir);
@@ -116,13 +115,21 @@ int plugin_load_file (char *file)
        lt_dlhandle dlh;
        void (*reg_handle) (void);
 
+       DBG ("file = %s", file);
+
        lt_dlinit ();
        lt_dlerror (); /* clear errors */
 
        if ((dlh = lt_dlopen (file)) == NULL)
+       {
+               const char *error = lt_dlerror ();
+
+               syslog (LOG_ERR, "lt_dlopen failed: %s", error);
+               DBG ("lt_dlopen failed: %s", error);
                return (1);
+       }
 
-       if ((reg_handle = lt_dlsym (dlh, "module_register")) == NULL)
+       if ((reg_handle = (void (*) (void)) lt_dlsym (dlh, "module_register")) == NULL)
        {
                syslog (LOG_WARNING, "Couldn't find symbol ``module_register'' in ``%s'': %s\n",
                                file, lt_dlerror ());
@@ -147,6 +154,8 @@ int plugin_load (const char *type)
        struct stat    statbuf;
        struct dirent *de;
 
+       DBG ("type = %s", type);
+
        dir = plugin_get_dir ();
        ret = 1;
 
@@ -267,11 +276,11 @@ void plugin_init_all (void)
 /*
  * Call `read' on all plugins (if given)
  */
-void plugin_read_all (void)
+void plugin_read_all (const int *loop)
 {
        plugin_t *p;
 
-       for (p = first_plugin; p != NULL; p = p->next)
+       for (p = first_plugin; (*loop == 0) && (p != NULL); p = p->next)
                if (p->read != NULL)
                        (*p->read) ();
 }
@@ -290,9 +299,9 @@ void plugin_register (char *type,
                return;
 
 #ifdef HAVE_LIBRRD
-       if ((operating_mode == MODE_LOCAL) || (operating_mode == MODE_CLIENT))
+       if (operating_mode != MODE_SERVER)
 #endif
-               if (read == NULL)
+               if ((init != NULL) && (read == NULL))
                        syslog (LOG_NOTICE, "Plugin `%s' doesn't provide a read function.", type);
 
        if ((p = (plugin_t *) malloc (sizeof (plugin_t))) == NULL)
@@ -316,7 +325,6 @@ void plugin_register (char *type,
  * Send received data back to the plugin/module which will append DS
  * definitions and pass it on to ``rrd_update_file''.
  */
-#ifdef HAVE_LIBRRD
 void plugin_write (char *host, char *type, char *inst, char *val)
 {
        plugin_t *p;
@@ -329,23 +337,67 @@ void plugin_write (char *host, char *type, char *inst, char *val)
 
        (*p->write) (host, inst, val);
 }
-#endif /* HAVE_LIBRRD */
 
 /*
  * Receive data from the plugin/module and get it somehow to ``plugin_write'':
- * Either using ``multicast_send'' (when in network/client mode) or call it
+ * Either using ``network_send'' (when in network/client mode) or call it
  * directly (in local mode).
  */
 void plugin_submit (char *type, char *inst, char *val)
 {
-#ifdef HAVE_LIBRRD
-       if (operating_mode == MODE_LOCAL)
+        if (operating_mode == MODE_CLIENT)
+               network_send (type, inst, val);
+       else
                plugin_write (NULL, type, inst, val);
-       else if (operating_mode == MODE_CLIENT)
-               multicast_send (type, inst, val);
-       else /* operating_mode == MODE_SERVER */
-               syslog (LOG_ERR, "WTF is the server doing in ``plugin_submit''?!?\n");
-#else
-       multicast_send (type, inst, val);
-#endif
+}
+
+void plugin_complain (int level, complain_t *c, const char *format, ...)
+{
+       char message[512];
+       va_list ap;
+       int step;
+
+       if (c->delay > 0)
+       {
+               c->delay--;
+               return;
+       }
+
+       step = atoi (COLLECTD_STEP);
+       assert (step > 0);
+
+       if (c->interval < step)
+               c->interval = step;
+       else
+               c->interval *= 2;
+
+       if (c->interval > 86400)
+               c->interval = 86400;
+
+       c->delay = c->interval / step;
+
+       va_start (ap, format);
+       vsnprintf (message, 512, format, ap);
+       message[511] = '\0';
+       va_end (ap);
+
+       syslog (level, message);
+}
+
+void plugin_relief (int level, complain_t *c, const char *format, ...)
+{
+       char message[512];
+       va_list ap;
+
+       if (c->interval == 0)
+               return;
+
+       c->interval = 0;
+
+       va_start (ap, format);
+       vsnprintf (message, 512, format, ap);
+       message[511] = '\0';
+       va_end (ap);
+
+       syslog (level, message);
 }