X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fplugin.c;h=6b17290f32dbe08a9a4bb6406cbc8fef35efdd01;hb=302974149068eeca34e747bed1233d2bb8948a5d;hp=fe7a9e5c9573409d8c533e635a9a5187b832ea36;hpb=39ab70bc40bb5e68c970b694c52c832ddfd5303a;p=collectd.git diff --git a/src/plugin.c b/src/plugin.c index fe7a9e5c..6b17290f 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -31,6 +31,8 @@ #include "plugin.h" #include "configfile.h" #include "utils_llist.h" +#include "utils_cache.h" +#include "utils_threshold.h" /* * Private structures @@ -53,6 +55,7 @@ static llist_t *list_write; static llist_t *list_shutdown; static llist_t *list_data_set; static llist_t *list_log; +static llist_t *list_notification; static char *plugindir = NULL; @@ -133,6 +136,7 @@ static int plugin_load_file (char *file) const char *error = lt_dlerror (); ERROR ("lt_dlopen failed: %s", error); + fprintf (stderr, "lt_dlopen failed: %s\n", error); return (1); } @@ -193,7 +197,7 @@ static void *plugin_read_thread (void *args) rf->wait_time = 86400; NOTICE ("read-function of plugin `%s' " - "failed. Will syspend it for %i " + "failed. Will suspend it for %i " "seconds.", le->key, rf->wait_left); } else @@ -355,6 +359,10 @@ int plugin_load (const char *type) ret = 0; break; } + else + { + fprintf (stderr, "Unable to load plugin %s.\n", type); + } } closedir (dh); @@ -373,6 +381,12 @@ int plugin_register_config (const char *name, return (0); } /* int plugin_register_config */ +int plugin_register_complex_config (const char *type, + int (*callback) (oconfig_item_t *)) +{ + return (cf_register_complex (type, callback)); +} /* int plugin_register_complex_config */ + int plugin_register_init (const char *name, int (*callback) (void)) { @@ -451,12 +465,24 @@ int plugin_register_log (char *name, return (register_callback (&list_log, name, (void *) callback)); } /* int plugin_register_log */ +int plugin_register_notification (const char *name, + int (*callback) (const notification_t *notif)) +{ + return (register_callback (&list_log, name, (void *) callback)); +} /* int plugin_register_log */ + int plugin_unregister_config (const char *name) { cf_unregister (name); return (0); } /* int plugin_unregister_config */ +int plugin_unregister_complex_config (const char *name) +{ + cf_unregister_complex (name); + return (0); +} /* int plugin_unregister_complex_config */ + int plugin_unregister_init (const char *name) { return (plugin_unregister (list_init, name)); @@ -516,6 +542,11 @@ int plugin_unregister_log (const char *name) return (plugin_unregister (list_log, name)); } +int plugin_unregister_notification (const char *name) +{ + return (plugin_unregister (list_notification, name)); +} + void plugin_init_all (void) { int (*callback) (void); @@ -532,6 +563,9 @@ void plugin_init_all (void) start_threads ((num > 0) ? num : 5); } + /* Init the value cache */ + uc_init (); + if (list_init == NULL) return; @@ -635,10 +669,12 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) ds = (data_set_t *) le->value; - DEBUG ("plugin: plugin_dispatch_values: time = %u; host = %s; " - "plugin = %s; plugin_instance = %s; type = %s; " - "type_instance = %s;", - (unsigned int) vl->time, vl->host, + DEBUG ("plugin: plugin_dispatch_values: time = %u; interval = %i; " + "host = %s; " + "plugin = %s; plugin_instance = %s; " + "type = %s; type_instance = %s;", + (unsigned int) vl->time, vl->interval, + vl->host, vl->plugin, vl->plugin_instance, ds->type, vl->type_instance); @@ -659,6 +695,10 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) escape_slashes (vl->plugin_instance, sizeof (vl->plugin_instance)); escape_slashes (vl->type_instance, sizeof (vl->type_instance)); + /* Update the value cache */ + uc_update (ds, vl); + ut_check_threshold (ds, vl); + le = llist_head (list_write); while (le != NULL) { @@ -671,6 +711,33 @@ int plugin_dispatch_values (const char *name, value_list_t *vl) return (0); } /* int plugin_dispatch_values */ +int plugin_dispatch_notification (const notification_t *notif) +{ + int (*callback) (const notification_t *); + llentry_t *le; + /* Possible TODO: Add flap detection here */ + + DEBUG ("plugin_dispatch_notification: severity = %i; message = %s; " + "time = %u; host = %s;", + notif->severity, notif->message, + (unsigned int) notif->time, notif->host); + + /* Nobody cares for notifications */ + if (list_notification == NULL) + return (-1); + + le = llist_head (list_notification); + while (le != NULL) + { + callback = (int (*) (const notification_t *)) le->value; + (*callback) (notif); + + le = le->next; + } + + return (0); +} /* int plugin_dispatch_notification */ + void plugin_log (int level, const char *format, ...) { char msg[512];