From 5a3ee633fdd379e8acf7535f0ba91fb05234a36a Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Wed, 8 Feb 2017 22:04:45 -0500 Subject: [PATCH] Cleanup babeltrace-cfg, use BABELTRACE_PLUGIN_PATH MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This commit changes a few things at once: * Cleanups the help message (orders long options alphabetically, adds metavars where missing, etc.). * Removes is_setuid_setgid() to use the common bt_is_setuid_setgid(). * Makes the CLI load plugins *non-recursively*, which is more in line with typical lists of paths such as PATH, LD_LIBRARY_PATH, PYTHONPATH, etc., from the following directories, in this order: 1. BABELTRACE_PLUGIN_PATH environment variable 2. --plugin-path option 3. ~/.local/lib/babeltrace/plugins 4. System path (/usr/lib/babeltrace/plugins) For the in-tree version (conveter/babeltrace), Makefile.am passes all the in-tree plugin paths so that it can find everything that is known within the tree. Signed-off-by: Philippe Proulx Signed-off-by: Jérémie Galarneau --- converter/Makefile.am | 4 +- converter/babeltrace-cfg.c | 87 +++++++++++++++++++++++--------------- converter/babeltrace-cfg.h | 3 ++ converter/babeltrace.c | 2 +- converter/default-cfg.c | 5 ++- 5 files changed, 62 insertions(+), 39 deletions(-) diff --git a/converter/Makefile.am b/converter/Makefile.am index 35c64ec5..eb3b8043 100644 --- a/converter/Makefile.am +++ b/converter/Makefile.am @@ -1,6 +1,6 @@ +PLUGINS_PATH = $(abs_top_builddir)/plugins AM_CFLAGS = $(PACKAGE_CFLAGS) -I$(top_srcdir)/include \ - -DINSTALL_LIBDIR=\"$(libdir)\" \ - -DCONFIG_IN_TREE_PLUGIN_DIR=\"$(abs_top_builddir)/plugins/\" + -DCONFIG_IN_TREE_PLUGIN_PATH=\"$(PLUGINS_PATH)/ctf:$(PLUGINS_PATH)/text:$(PLUGINS_PATH)/muxer:$(PLUGINS_PATH)/trimmer:$(PLUGINS_PATH)/writer\" AM_LDFLAGS = -lpopt bin_PROGRAMS = babeltrace.bin babeltrace-log diff --git a/converter/babeltrace-cfg.c b/converter/babeltrace-cfg.c index 608b6548..f045bf94 100644 --- a/converter/babeltrace-cfg.c +++ b/converter/babeltrace-cfg.c @@ -764,16 +764,23 @@ void print_usage(FILE *fp) fprintf(fp, " of the following source and sink component\n"); fprintf(fp, " instances (see the exact format of PARAMS\n"); fprintf(fp, " below)\n"); + fprintf(fp, " --begin=BEGIN Set beginning time to BEGIN\n"); + fprintf(fp, " (format: [YYYY-MM-DD [hh:mm:]]ss[.nnnnnnnnn])\n"); fprintf(fp, " -d, --debug Enable debug mode\n"); + fprintf(fp, " --end=END Set end time to END\n"); + fprintf(fp, " (format: [YYYY-MM-DD [hh:mm:]]ss[.nnnnnnnnn])\n"); fprintf(fp, " -l, --list List available plugins and their components\n"); - fprintf(fp, " -P, --path=PATH Set the `path` parameter of the latest source\n"); - fprintf(fp, " or sink component to PATH\n"); + fprintf(fp, " --omit-home-plugin-path Omit home plugins from plugin search path\n"); + fprintf(fp, " (~/.local/lib/babeltrace/plugins)\n"); + fprintf(fp, " --omit-system-plugin-path Omit system plugins from plugin search path\n"); fprintf(fp, " -p, --params=PARAMS Set the parameters of the latest source or\n"); fprintf(fp, " sink component instance (in command-line \n"); fprintf(fp, " order) to PARAMS (see the exact format of\n"); fprintf(fp, " PARAMS below)\n"); - fprintf(fp, " --plugin-path=PATH[:PATH]... Set paths from which dynamic plugins can be\n"); - fprintf(fp, " loaded to PATH\n"); + fprintf(fp, " -P, --path=PATH Set the `path` parameter of the latest source\n"); + fprintf(fp, " or sink component to PATH\n"); + fprintf(fp, " --plugin-path=PATH[:PATH]... Add PATH to the list of paths from which dynamic\n"); + fprintf(fp, " plugins can be loaded\n"); fprintf(fp, " -r, --reset-base-params Reset the current base parameters of the\n"); fprintf(fp, " following source and sink component\n"); fprintf(fp, " instances to an empty map\n"); @@ -783,11 +790,8 @@ void print_usage(FILE *fp) fprintf(fp, " -i, --source=PLUGIN.COMPCLS Instantiate a source component from plugin\n"); fprintf(fp, " PLUGIN and component class COMPCLS (may be\n"); fprintf(fp, " repeated)\n"); - fprintf(fp, " --begin Start time: [YYYY-MM-DD [hh:mm:]]ss[.nnnnnnnnn]\n"); - fprintf(fp, " --end End time: [YYYY-MM-DD [hh:mm:]]ss[.nnnnnnnnn]\n"); - fprintf(fp, " --timerange Time range: begin,end or [begin,end] (where [] are actual brackets)\n"); - fprintf(fp, " --omit-system-plugin-path Omit system plugins from plugin search path\n"); - fprintf(fp, " --omit-home-plugin-path Omit home plugins from plugin search path\n"); + fprintf(fp, " --timerange=TIMERANGE Set time range to TIMERANGE: BEGIN,END or\n"); + fprintf(fp, " [BEGIN,END] (where [ and ] are actual brackets)\n"); fprintf(fp, " -h --help Show this help\n"); fprintf(fp, " --help-legacy Show Babeltrace 1.x legacy options\n"); fprintf(fp, " -v, --verbose Enable verbose output\n"); @@ -962,12 +966,6 @@ end: return; } -static -bool is_setuid_setgid(void) -{ - return (geteuid() != getuid() || getegid() != getgid()); -} - static void destroy_gstring(void *data) { g_string_free(data, TRUE); @@ -975,15 +973,10 @@ static void destroy_gstring(void *data) /* * Extracts the various paths from the string arg, delimited by ':', - * and converts them to an array value object. - * - * Returned array value object is empty if arg is empty. - * - * Return value is owned by the caller. + * and appends them to the array value object plugin_paths. */ -static -enum bt_value_status plugin_paths_from_arg(struct bt_value *plugin_paths, - const char *arg) +enum bt_value_status bt_config_append_plugin_paths( + struct bt_value *plugin_paths, const char *arg) { enum bt_value_status status = BT_VALUE_STATUS_OK; GPtrArray *dirs = g_ptr_array_new_with_free_func(destroy_gstring); @@ -2242,19 +2235,40 @@ not_found: return -1; } -static int add_internal_plugin_paths(struct bt_config *cfg) +static int add_env_var_plugin_paths(struct bt_config *cfg) +{ + int ret = 0; + const char *envvar; + + if (bt_common_is_setuid_setgid()) { + printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); + goto end; + } + + envvar = getenv("BABELTRACE_PLUGIN_PATH"); + if (!envvar) { + goto end; + } + + ret = bt_config_append_plugin_paths(cfg->plugin_paths, envvar); + +end: + return ret; +} + +static int append_home_and_system_plugin_paths(struct bt_config *cfg) { int ret; if (!cfg->omit_home_plugin_path) { if (bt_common_is_setuid_setgid()) { - printf_debug("Skipping non-system plugin paths for setuid/setgid binary."); + printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); } else { char *home_plugin_dir = bt_common_get_home_plugin_path(); if (home_plugin_dir) { - ret = plugin_paths_from_arg(cfg->plugin_paths, + ret = bt_config_append_plugin_paths(cfg->plugin_paths, home_plugin_dir); free(home_plugin_dir); @@ -2267,7 +2281,7 @@ static int add_internal_plugin_paths(struct bt_config *cfg) } if (!cfg->omit_system_plugin_path) { - if (plugin_paths_from_arg(cfg->plugin_paths, + if (bt_config_append_plugin_paths(cfg->plugin_paths, bt_common_get_system_plugin_path())) { printf_err("Invalid system plugin path\n"); goto error; @@ -2339,9 +2353,8 @@ error: } /* - * Returns a Babeltrace configuration, out of command-line arguments, - * containing everything that is needed to instanciate specific - * components with given parameters. + * Initializes a created Babeltrace config object according to the + * command-line arguments found in argv. * * Return value is set to the appropriate exit code to use. */ @@ -2397,6 +2410,12 @@ int bt_config_init_from_args(struct bt_config *cfg, int argc, const char *argv[] goto error; } + ret = add_env_var_plugin_paths(cfg); + if (ret) { + printf_err("Cannot append plugin paths from BABELTRACE_PLUGIN_PATH\n"); + goto error; + } + /* Note: implicit source never gets positional base params. */ implicit_source_comp = bt_config_component_from_arg(DEFAULT_SOURCE_COMPONENT_NAME); if (implicit_source_comp) { @@ -2422,10 +2441,10 @@ int bt_config_init_from_args(struct bt_config *cfg, int argc, const char *argv[] switch (opt) { case OPT_PLUGIN_PATH: - if (is_setuid_setgid()) { - printf_debug("Skipping non-system plugin paths for setuid/setgid binary."); + if (bt_common_is_setuid_setgid()) { + printf_debug("Skipping non-system plugin paths for setuid/setgid binary\n"); } else { - if (plugin_paths_from_arg(cfg->plugin_paths, arg)) { + if (bt_config_append_plugin_paths(cfg->plugin_paths, arg)) { printf_err("Invalid --plugin-path option's argument\n"); goto error; } @@ -2841,7 +2860,7 @@ int bt_config_init_from_args(struct bt_config *cfg, int argc, const char *argv[] } } - if (add_internal_plugin_paths(cfg)) { + if (append_home_and_system_plugin_paths(cfg)) { goto error; } diff --git a/converter/babeltrace-cfg.h b/converter/babeltrace-cfg.h index fe385a20..f32bf07a 100644 --- a/converter/babeltrace-cfg.h +++ b/converter/babeltrace-cfg.h @@ -70,4 +70,7 @@ struct bt_config *bt_config_create(void); int bt_config_init_from_args(struct bt_config *cfg, int argc, const char *argv[]); +enum bt_value_status bt_config_append_plugin_paths( + struct bt_value *plugin_paths, const char *arg); + #endif /* BABELTRACE_CONVERTER_CFG_H */ diff --git a/converter/babeltrace.c b/converter/babeltrace.c index 131a3c04..9a5af9fb 100644 --- a/converter/babeltrace.c +++ b/converter/babeltrace.c @@ -497,7 +497,7 @@ int load_dynamic_plugins(struct bt_config *cfg) continue; } - plugins = bt_plugin_create_all_from_dir(plugin_path, true); + plugins = bt_plugin_create_all_from_dir(plugin_path, false); if (!plugins) { printf_debug("Unable to dynamically load plugins from path %s.\n", plugin_path); diff --git a/converter/default-cfg.c b/converter/default-cfg.c index b4cd7051..5368c7a0 100644 --- a/converter/default-cfg.c +++ b/converter/default-cfg.c @@ -27,6 +27,7 @@ */ #include +#include "babeltrace-cfg.h" #include "default-cfg.h" #include "config.h" @@ -38,8 +39,8 @@ int set_default_config(struct bt_config *cfg) cfg->omit_system_plugin_path = true; cfg->omit_home_plugin_path = true; - ret = bt_value_array_append_string(cfg->plugin_paths, - CONFIG_IN_TREE_PLUGIN_DIR); + ret = bt_config_append_plugin_paths(cfg->plugin_paths, + CONFIG_IN_TREE_PLUGIN_PATH); return ret; } -- 2.34.1