Filterchain: if we don't find a writer, output the available writers to syslog.
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 23 May 2015 13:44:24 +0000 (15:44 +0200)
committerMarc Fournier <marc.fournier@camptocamp.com>
Tue, 26 May 2015 12:12:09 +0000 (14:12 +0200)
src/daemon/filter_chain.c
src/daemon/plugin.c
src/daemon/plugin.h

index b93435f..32ce736 100644 (file)
@@ -733,6 +733,8 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
           "all write plugins failed with status %i (ENOENT). "
           "Most likely this means you didn't load any write plugins.",
           status);
+
+      plugin_log_available_writers ();
     }
     else if (status != 0)
     {
@@ -763,6 +765,8 @@ static int fc_bit_write_invoke (const data_set_t *ds, /* {{{ */
             "Filter subsystem: Built-in target `write': Dispatching value to "
             "the `%s' plugin failed with status %i.",
             plugin_list[i].plugin, status);
+
+       plugin_log_available_writers ();
       }
       else
       {
index 25bd37b..b69e65b 100644 (file)
@@ -307,6 +307,56 @@ static int register_callback (llist_t **list, /* {{{ */
        return (0);
 } /* }}} int register_callback */
 
+static void log_list_callbacks (llist_t **list, /* {{{ */
+                               const char *comment)
+{
+       char *str;
+       int len;
+       llentry_t *le;
+       int i;
+       int n;
+       char **keys;
+
+       n = llist_size(*list);
+       if (n == 0)
+       {
+               INFO("%s [none]", comment);
+               return;
+       }
+
+       keys = calloc(n, sizeof(char*));
+
+       if (keys == NULL)
+       {
+               ERROR("%s: failed to allocate memory for list of callbacks",
+                     comment);
+
+               return;
+       }
+
+       for (le = llist_head (*list), i = 0, len = 0;
+            le != NULL;
+            le = le->next, i++)
+       {
+               keys[i] = le->key;
+               len += strlen(le->key) + 6;
+       }
+       str = malloc(len + 10);
+       if (str == NULL)
+       {
+               ERROR("%s: failed to allocate memory for list of callbacks",
+                     comment);
+       }
+       else
+       {
+               *str = '\0';
+               strjoin(str, len, keys, n, "', '");
+               INFO("%s ['%s']", comment, str);
+               free(str);
+       }
+       free(keys);
+} /* }}} void log_list_callbacks */
+
 static int create_register_callback (llist_t **list, /* {{{ */
                const char *name, void *callback, user_data_t *ud)
 {
@@ -1398,6 +1448,11 @@ int plugin_unregister_read (const char *name) /* {{{ */
        return (0);
 } /* }}} int plugin_unregister_read */
 
+void plugin_log_available_writers ()
+{
+       log_list_callbacks (&list_write, "Available writers:");
+}
+
 static int compare_read_func_group (llentry_t *e, void *ud) /* {{{ */
 {
        read_func_t *rf    = e->value;
index 86a2d66..beeb576 100644 (file)
@@ -322,6 +322,17 @@ int plugin_unregister_data_set (const char *name);
 int plugin_unregister_log (const char *name);
 int plugin_unregister_notification (const char *name);
 
+/*
+ * NAME
+ *  plugin_log_available_writers
+ *
+ * DESCRIPTION
+ *  This function can be called to output a list of _all_ registered
+ *  writers to the logfacility.
+ *  Since some writers dynamically build their name it can be hard for
+ *  the configuring person to know it. This function will fill this gap. 
+ */
+void plugin_log_available_writers ();
 
 /*
  * NAME