/**
* collectd - src/plugin.c
- * Copyright (C) 2005-2008 Florian octo Forster
+ * Copyright (C) 2005-2009 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
static llist_t *list_log;
static llist_t *list_notification;
+static fc_chain_t *pre_cache_chain = NULL;
+static fc_chain_t *post_cache_chain = NULL;
+
static c_avl_tree_t *data_sets;
static char *plugindir = NULL;
void plugin_init_all (void)
{
+ const char *chain_name;
int (*callback) (void);
llentry_t *le;
int status;
/* Init the value cache */
uc_init ();
+ chain_name = global_option_get ("PreCacheChain");
+ pre_cache_chain = fc_chain_get_by_name (chain_name);
+
+ chain_name = global_option_get ("PostCacheChain");
+ post_cache_chain = fc_chain_get_by_name (chain_name);
+
+
if ((list_init == NULL) && (list_read == NULL))
return;
pthread_mutex_unlock (&read_lock);
} /* void plugin_read_all */
+/* Read function called when the `-T' command line argument is given. */
int plugin_read_all_once (void)
{
llentry_t *le;
read_func_t *rf;
int status;
+ int return_status = 0;
if (list_read == NULL)
+ {
+ NOTICE ("No read-functions are registered.");
return (0);
+ }
for (le = llist_head (list_read);
le != NULL;
{
NOTICE ("read-function of plugin `%s' failed.",
le->key);
- return status;
+ return_status = -1;
}
}
- return (0);
-} /* void plugin_read_all_once */
+ return (return_status);
+} /* int plugin_read_all_once */
int plugin_write (const char *plugin, /* {{{ */
const data_set_t *ds, const value_list_t *vl)
int plugin_dispatch_values (value_list_t *vl)
{
+ int status;
static c_complain_t no_write_complaint = C_COMPLAIN_INIT_STATIC;
data_set_t *ds;
return (-1);
}
+ if (vl->time == 0)
+ vl->time = time (NULL);
+
DEBUG ("plugin_dispatch_values: time = %u; interval = %i; "
"host = %s; "
"plugin = %s; plugin_instance = %s; "
escape_slashes (vl->type, sizeof (vl->type));
escape_slashes (vl->type_instance, sizeof (vl->type_instance));
+ if (pre_cache_chain != NULL)
+ {
+ status = fc_process_chain (ds, vl, pre_cache_chain);
+ if (status < 0)
+ {
+ WARNING ("plugin_dispatch_values: Running the "
+ "pre-cache chain failed with "
+ "status %i (%#x).",
+ status, status);
+ }
+ else if (status == FC_TARGET_STOP)
+ return (0);
+ }
+
/* Update the value cache */
uc_update (ds, vl);
- fc_process (ds, vl);
+ if (post_cache_chain != NULL)
+ {
+ status = fc_process_chain (ds, vl, post_cache_chain);
+ if (status < 0)
+ {
+ WARNING ("plugin_dispatch_values: Running the "
+ "post-cache chain failed with "
+ "status %i (%#x).",
+ status, status);
+ }
+ }
+ else
+ fc_default_action (ds, vl);
return (0);
} /* int plugin_dispatch_values */