From 207649b7b6952860381df8b6561f249d6a684967 Mon Sep 17 00:00:00 2001 From: Olaf Rempel Date: Sun, 1 Apr 2007 15:45:31 +0200 Subject: [PATCH] plugin cleanup --- include/plugins.h | 4 ++-- plugins.c | 37 ++++++++++++++++++++++++++----------- plugins/apache.c | 1 + plugins/ctstat.c | 1 + plugins/load.c | 1 + plugins/memory.c | 1 + plugins/mount.c | 6 ++++-- plugins/mysql.c | 1 + plugins/netdev.c | 1 + plugins/random.c | 1 + plugins/rtstat.c | 1 + plugins/stat.c | 1 + plugins/uptime.c | 1 + plugins/vmstat.c | 1 + 14 files changed, 43 insertions(+), 15 deletions(-) diff --git a/include/plugins.h b/include/plugins.h index 9e85463..57a430e 100644 --- a/include/plugins.h +++ b/include/plugins.h @@ -2,9 +2,7 @@ #define _PLUGINS_H_ #include - #include "list.h" -#include "logging.h" struct sammler_plugin { struct list_head list; @@ -25,6 +23,8 @@ struct sammler_plugin { }; int plugin_init(void); +int plugin_close(void); + struct sammler_plugin * plugin_lookup(const char *name); #endif /* _PLUGINS_H_ */ diff --git a/plugins.c b/plugins.c index d627378..27f14ef 100644 --- a/plugins.c +++ b/plugins.c @@ -34,22 +34,21 @@ #define FLAGS_ACTIVE 0x01 static LIST_HEAD(plugin_list); +static struct event_timeout *probe_event; static int plugin_init_cb(const char *filename, void *privdata) { - static const char *plugin_dir; - if (plugin_dir == NULL) - plugin_dir = config_get_string("global", "plugin_dir", "."); + const char *plugin_dir = (const char *)privdata; char *fullname = malloc(PATH_MAX); if (fullname == NULL) { - log_print(LOG_ERROR, "plugin_load: out of memory"); + log_print(LOG_ERROR, "plugin_init_cb(): out of memory"); return -1; } int len = snprintf(fullname, PATH_MAX, "%s/%s", plugin_dir, filename); if (len < 0 || len >= PATH_MAX) { - log_print(LOG_ERROR, "plugin_load: file name too long: %s/%s", plugin_dir, filename); + log_print(LOG_ERROR, "plugin_init_cb(): file name too long: %s/%s", plugin_dir, filename); free(fullname); return -1; } @@ -57,7 +56,7 @@ static int plugin_init_cb(const char *filename, void *privdata) dlerror(); void *dlhandle = dlopen(fullname, RTLD_NOW); if (dlhandle == NULL) { - log_print(LOG_ERROR, "plugin_load: dlopen: %s", dlerror()); + log_print(LOG_ERROR, "plugin_init_cb(): dlopen: %s", dlerror()); free(fullname); return -1; } @@ -66,13 +65,13 @@ static int plugin_init_cb(const char *filename, void *privdata) struct sammler_plugin *plugin = dlsym(dlhandle, "plugin"); if (plugin == NULL) { - log_print(LOG_ERROR, "plugin_load: failed to load '%s'", filename); + log_print(LOG_ERROR, "plugin_init_cb(): failed to load '%s'", filename); dlclose(dlhandle); return -1; } if (plugin->init != NULL && (plugin->init() != 0)) { - log_print(LOG_ERROR, "Plugin '%s': init failed", plugin->name); + log_print(LOG_ERROR, "plugin_init_cb(): Plugin '%s': init() failed", plugin->name); dlclose(dlhandle); return -1; } @@ -98,7 +97,7 @@ static int plugins_probe(void *privdata) if (plugin->lastprobe + plugin->interval <= now) { if (plugin->probe() != 0) { - log_print(LOG_ERROR, "plugin_probe(): plugin %s disabled", plugin->name); + log_print(LOG_ERROR, "plugin_probe(): plugin '%s' disabled", plugin->name); plugin->flags &= ~FLAGS_ACTIVE; } plugin->lastprobe = now; @@ -111,7 +110,8 @@ static int plugins_probe(void *privdata) int plugin_init(void) { - int cnt = config_get_strings("global", "plugin", plugin_init_cb, NULL); + const char *plugin_dir = config_get_string("global", "plugin_dir", "plugins"); + int cnt = config_get_strings("global", "plugin", plugin_init_cb, (void *)plugin_dir); if (cnt == 0) { log_print(LOG_ERROR, "plugin_init(): no working plugins"); return -1; @@ -120,11 +120,26 @@ int plugin_init(void) struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 0; - event_add_timeout(&tv, plugins_probe, NULL); + probe_event = event_add_timeout(&tv, plugins_probe, NULL); return 0; } +int plugin_close(void) +{ + struct sammler_plugin *plugin, *tmp; + list_for_each_entry_safe(plugin, tmp, &plugin_list, list) { + list_del(&plugin->list); + if (plugin->fini != NULL && plugin->fini() != 0) + log_print(LOG_ERROR, "plugin_close(): Plugin '%s': fini() failed", plugin->name); + + dlclose(plugin->dlhandle); + } + + event_remove_timeout(probe_event); + return 0; +} + struct sammler_plugin * plugin_lookup(const char *name) { struct sammler_plugin *plugin; diff --git a/plugins/apache.c b/plugins/apache.c index aa34569..a460586 100644 --- a/plugins/apache.c +++ b/plugins/apache.c @@ -27,6 +27,7 @@ #include "configfile.h" #include "helper.h" #include "list.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/ctstat.c b/plugins/ctstat.c index 4cc47ab..c802efd 100644 --- a/plugins/ctstat.c +++ b/plugins/ctstat.c @@ -22,6 +22,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/load.c b/plugins/load.c index 7298bc8..75a039f 100644 --- a/plugins/load.c +++ b/plugins/load.c @@ -21,6 +21,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/memory.c b/plugins/memory.c index b7497f4..d0166dc 100644 --- a/plugins/memory.c +++ b/plugins/memory.c @@ -21,6 +21,7 @@ #include #include +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/mount.c b/plugins/mount.c index a569d8b..1cf5509 100644 --- a/plugins/mount.c +++ b/plugins/mount.c @@ -19,10 +19,12 @@ ***************************************************************************/ #include #include -#include -#include #include +#include +#include + +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/mysql.c b/plugins/mysql.c index 87290c6..42c7ae5 100644 --- a/plugins/mysql.c +++ b/plugins/mysql.c @@ -24,6 +24,7 @@ #include "configfile.h" #include "helper.h" #include "list.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/netdev.c b/plugins/netdev.c index 3732bfd..f7fb8cf 100644 --- a/plugins/netdev.c +++ b/plugins/netdev.c @@ -22,6 +22,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/random.c b/plugins/random.c index a13f75b..4e3e667 100644 --- a/plugins/random.c +++ b/plugins/random.c @@ -21,6 +21,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/rtstat.c b/plugins/rtstat.c index fd83362..8941feb 100644 --- a/plugins/rtstat.c +++ b/plugins/rtstat.c @@ -22,6 +22,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/stat.c b/plugins/stat.c index 2077b43..bd0d2c6 100644 --- a/plugins/stat.c +++ b/plugins/stat.c @@ -22,6 +22,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/uptime.c b/plugins/uptime.c index 1d0538d..f15c718 100644 --- a/plugins/uptime.c +++ b/plugins/uptime.c @@ -21,6 +21,7 @@ #include #include "helper.h" +#include "logging.h" #include "plugins.h" #include "probe.h" diff --git a/plugins/vmstat.c b/plugins/vmstat.c index 08097ba..a739b45 100644 --- a/plugins/vmstat.c +++ b/plugins/vmstat.c @@ -21,6 +21,7 @@ #include #include +#include "logging.h" #include "plugins.h" #include "probe.h"