X-Git-Url: https://git.octo.it/?a=blobdiff_plain;ds=sidebyside;f=src%2Fperl.c;h=3be3762132f1a528ed517a6180f9ef3550255d16;hb=90885f2e932708b8596a71ec8861bcd5e1cf51a8;hp=294f69a29018207dd28c2f8b32b5026bd52c73a0;hpb=0a814175d5d4cebd2f2433603a7eba7cac496c0c;p=collectd.git diff --git a/src/perl.c b/src/perl.c index 294f69a2..3be37621 100644 --- a/src/perl.c +++ b/src/perl.c @@ -26,7 +26,6 @@ #include "collectd.h" #include "common.h" -#include "plugin.h" #include "configfile.h" @@ -35,6 +34,14 @@ #include +/* Some versions of Perl define their own version of DEBUG... :-/ */ +#ifdef DEBUG +# undef DEBUG +#endif /* DEBUG */ + +/* ... while we want the definition found in plugin.h. */ +#include "plugin.h" + #define PLUGIN_INIT 0 #define PLUGIN_READ 1 #define PLUGIN_WRITE 2 @@ -84,12 +91,15 @@ typedef struct { static const char *config_keys[] = { "LoadPlugin", - NULL + "BaseName", + "IncludeDir" }; -static int config_keys_num = 1; +static int config_keys_num = STATIC_ARRAY_SIZE (config_keys); static PerlInterpreter *perl = NULL; +static char base_name[DATA_MAX_NAME_LEN] = ""; + static char *plugin_types[] = { "init", "read", "write", "shutdown" }; static HV *plugins[PLUGIN_TYPES]; static HV *data_sets; @@ -315,6 +325,18 @@ static int value_list2hv (value_list_t *vl, data_set_t *ds, HV *hash) * Internal functions. */ +static char *get_module_name (char *buf, size_t buf_len, const char *module) { + int status = 0; + if (base_name[0] == '\0') + status = snprintf (buf, buf_len, "%s", module); + else + status = snprintf (buf, buf_len, "%s::%s", base_name, module); + if ((status < 0) || (status >= buf_len)) + return (NULL); + buf[buf_len] = '\0'; + return (buf); +} /* char *get_module_name */ + /* * Add a new plugin with the given name. */ @@ -508,6 +530,7 @@ static int pplugin_dispatch_values (char *name, HV *values) if (NULL != (tmp = Perl_hv_fetch (perl, values, "host", 4, 0))) { strncpy (list.host, SvPV_nolen (*tmp), DATA_MAX_NAME_LEN); + list.host[DATA_MAX_NAME_LEN - 1] = '\0'; } else { strcpy (list.host, hostname_g); @@ -617,8 +640,8 @@ static int pplugin_call (int type, char *name, SV *sub, va_list ap) /* prevent an endless loop */ if (PLUGIN_LOG != type) - log_debug ("pplugin_call: executing Collectd::plugin::%s->%s()", - name, plugin_types[type]); + log_debug ("pplugin_call: executing %s::%s->%s()", + base_name, name, plugin_types[type]); retvals = Perl_call_sv (perl, sub, G_SCALAR | xflags); @@ -626,8 +649,8 @@ static int pplugin_call (int type, char *name, SV *sub, va_list ap) if (1 > retvals) { if (PLUGIN_LOG != type) log_warn ("pplugin_call: " - "Collectd::plugin::%s->%s() returned void - assuming true", - name, plugin_types[type]); + "%s::%s->%s() returned void - assuming true", + base_name, name, plugin_types[type]); } else { SV *tmp = POPs; @@ -685,21 +708,20 @@ static int pplugin_call_all (int type, ...) if (p->wait_time > 86400) p->wait_time = 86400; - log_warn ("Collectd::plugin::%s->read() failed. " - "Will suspend it for %i seconds.", + log_warn ("%s->read() failed. Will suspend it for %i seconds.", plugin, p->wait_left); } else if (PLUGIN_INIT == type) { int i = 0; - log_err ("Collectd::plugin::%s->init() failed. " - "Plugin will be disabled.", plugin, status); + log_err ("%s->init() failed. Plugin will be disabled.", + plugin, status); for (i = 0; i < PLUGIN_TYPES; ++i) pplugin_unregister (i, plugin); } else if (PLUGIN_LOG != type) { - log_warn ("Collectd::plugin::%s->%s() failed with status %i.", + log_warn ("%s->%s() failed with status %i.", plugin, plugin_types[type], status); } @@ -940,12 +962,29 @@ static int perl_config (const char *key, const char *value) log_debug ("perl_config: key = \"%s\", value=\"%s\"", key, value); if (0 == strcasecmp (key, "LoadPlugin")) { - log_debug ("perl_config: loading perl plugin \"%s\"", value); + char module_name[DATA_MAX_NAME_LEN]; + + if (get_module_name (module_name, sizeof (module_name), value) + == NULL) { + log_err ("Invalid module name %s", value); + return (1); + } /* if (get_module_name == NULL) */ + log_debug ("perl_config: loading perl plugin \"%s\"", value); Perl_load_module (perl, PERL_LOADMOD_NOIMPORT, - Perl_newSVpvf (perl, "Collectd::plugin::%s", value), + Perl_newSVpv (perl, module_name, strlen (module_name)), Nullsv); } + else if (0 == strcasecmp (key, "BaseName")) { + log_debug ("perl_config: Setting plugin basename to \"%s\"", value); + strncpy (base_name, value, sizeof (base_name)); + base_name[sizeof (base_name) - 1] = '\0'; + } + else if (0 == strcasecmp (key, "IncludeDir")) { + Perl_av_unshift (perl, GvAVn (PL_incgv), 1); + Perl_av_store (perl, GvAVn (PL_incgv), + 0, Perl_newSVpv (perl, value, strlen (value))); + } else { return -1; } @@ -1070,7 +1109,9 @@ void module_register (void) plugin_register_log ("perl", perl_log); plugin_register_config ("perl", perl_config, config_keys, config_keys_num); plugin_register_init ("perl", perl_init); + plugin_register_read ("perl", perl_read); + plugin_register_write ("perl", perl_write); plugin_register_shutdown ("perl", perl_shutdown); return;