break;
}
default:
- assert(false);
+ abort();
}
}
print_cfg_print_lttng_live_sessions(cfg);
break;
default:
- assert(false);
+ abort();
}
}
plugin_path_value = bt_value_array_get(plugin_paths, i);
bt_value_string_get(plugin_path_value, &plugin_path);
assert(plugin_path);
+
+ /*
+ * Skip this if the directory does not exist because
+ * bt_plugin_create_all_from_dir() expects an existing
+ * directory.
+ */
+ if (!g_file_test(plugin_path, G_FILE_TEST_IS_DIR)) {
+ BT_LOGV("Skipping nonexistent directory path: "
+ "path=\"%s\"", plugin_path);
+ BT_PUT(plugin_path_value);
+ continue;
+ }
+
plugin_set = bt_plugin_create_all_from_dir(plugin_path, false);
if (!plugin_set) {
BT_LOGD("Unable to load dynamic plugins: path=\"%s\"",
static
int cmd_print_lttng_live_sessions(struct bt_config *cfg)
{
- printf("TODO\n");
- return -1;
+ int ret = 0;
+ struct bt_component_class *comp_cls = NULL;
+ struct bt_value *results = NULL;
+ struct bt_value *params = NULL;
+ struct bt_value *map = NULL;
+ struct bt_value *v = NULL;
+ static const char * const plugin_name = "ctf";
+ static const char * const comp_cls_name = "lttng-live";
+ static const enum bt_component_class_type comp_cls_type =
+ BT_COMPONENT_CLASS_TYPE_SOURCE;
+ int64_t array_size, i;
+
+ assert(cfg->cmd_data.print_lttng_live_sessions.url);
+ comp_cls = find_component_class(plugin_name, comp_cls_name,
+ comp_cls_type);
+ if (!comp_cls) {
+ BT_LOGE("Cannot find component class: plugin-name=\"%s\", "
+ "comp-cls-name=\"%s\", comp-cls-type=%d",
+ plugin_name, comp_cls_name,
+ BT_COMPONENT_CLASS_TYPE_SOURCE);
+ fprintf(stderr, "%s%sCannot find component class %s",
+ bt_common_color_bold(),
+ bt_common_color_fg_red(),
+ bt_common_color_reset());
+ print_plugin_comp_cls_opt(stderr, plugin_name,
+ comp_cls_name, comp_cls_type);
+ fprintf(stderr, "\n");
+ goto error;
+ }
+
+ params = bt_value_map_create();
+ if (!params) {
+ goto error;
+ }
+
+ ret = bt_value_map_insert_string(params, "url",
+ cfg->cmd_data.print_lttng_live_sessions.url->str);
+ if (ret) {
+ goto error;
+ }
+
+ results = bt_component_class_query(comp_cls, "sessions",
+ params);
+ if (!results) {
+ BT_LOGE_STR("Failed to query for sessions.");
+ fprintf(stderr, "%s%sFailed to request sessions%s\n",
+ bt_common_color_bold(),
+ bt_common_color_fg_red(),
+ bt_common_color_reset());
+ goto error;
+ }
+
+ if (!bt_value_is_array(results)) {
+ BT_LOGE_STR("Expecting an array for sessions query.");
+ fprintf(stderr, "%s%sUnexpected type returned by session query%s\n",
+ bt_common_color_bold(),
+ bt_common_color_fg_red(),
+ bt_common_color_reset());
+ goto error;
+ }
+
+ array_size = bt_value_array_size(results);
+ for (i = 0; i < array_size; i++) {
+ const char *url_text;
+ int64_t timer_us, streams, clients;
+
+ map = bt_value_array_get(results, i);
+ if (!map) {
+ BT_LOGE_STR("Unexpected empty array entry.");
+ goto error;
+ }
+ if (!bt_value_is_map(map)) {
+ BT_LOGE_STR("Unexpected entry type.");
+ goto error;
+ }
+
+ v = bt_value_map_get(map, "url");
+ if (!v) {
+ BT_LOGE_STR("Unexpected empty array \"url\" entry.");
+ goto error;
+ }
+ ret = bt_value_string_get(v, &url_text);
+ assert(ret == 0);
+ printf("%s", url_text);
+ BT_PUT(v);
+
+ v = bt_value_map_get(map, "timer-us");
+ if (!v) {
+ BT_LOGE_STR("Unexpected empty array \"timer-us\" entry.");
+ goto error;
+ }
+ ret = bt_value_integer_get(v, &timer_us);
+ assert(ret == 0);
+ printf(" (timer = %" PRIu64 ", ", timer_us);
+ BT_PUT(v);
+
+ v = bt_value_map_get(map, "stream-count");
+ if (!v) {
+ BT_LOGE_STR("Unexpected empty array \"stream-count\" entry.");
+ goto error;
+ }
+ ret = bt_value_integer_get(v, &streams);
+ assert(ret == 0);
+ printf("%" PRIu64 " stream(s), ", streams);
+ BT_PUT(v);
+
+ v = bt_value_map_get(map, "client-count");
+ if (!v) {
+ BT_LOGE_STR("Unexpected empty array \"client-count\" entry.");
+ goto error;
+ }
+ ret = bt_value_integer_get(v, &clients);
+ assert(ret == 0);
+ printf("%" PRIu64 " client(s) connected)\n", clients);
+ BT_PUT(v);
+
+ BT_PUT(map);
+ }
+end:
+ bt_put(v);
+ bt_put(map);
+ bt_put(results);
+ bt_put(params);
+ bt_put(comp_cls);
+ return 0;
+
+error:
+ ret = -1;
+ goto end;
}
static
*/
BT_LOGF("Invalid connection: downstream component is a source: "
"conn-arg=\"%s\"", cfg_conn->arg->str);
- assert(false);
+ abort();
}
downstream_port_count = port_count_fn(downstream_comp);
the_graph = ctx->graph;
ret = bt_graph_add_port_added_listener(ctx->graph,
graph_port_added_listener, ctx);
- if (ret) {
+ if (ret < 0) {
+ BT_LOGE_STR("Cannot add \"port added\" listener to graph.");
goto error;
}
ret = bt_graph_add_port_removed_listener(ctx->graph,
graph_port_removed_listener, ctx);
- if (ret) {
+ if (ret < 0) {
+ BT_LOGE_STR("Cannot add \"port removed\" listener to graph.");
goto error;
}
ret = bt_graph_add_ports_connected_listener(ctx->graph,
graph_ports_connected_listener, ctx);
- if (ret) {
+ if (ret < 0) {
+ BT_LOGE_STR("Cannot add \"ports connected\" listener to graph.");
goto error;
}
ret = bt_graph_add_ports_disconnected_listener(ctx->graph,
graph_ports_disconnected_listener, ctx);
- if (ret) {
+ if (ret < 0) {
+ BT_LOGE_STR("Cannot add \"ports disconnected\" listener to graph.");
goto error;
}
cfg_comp->instance_name->str, cfg_comp->params);
if (!comp) {
BT_LOGE("Cannot create component: plugin-name=\"%s\", "
- "comp-cls-name=\"%s\", comp-cls-type=%d",
+ "comp-cls-name=\"%s\", comp-cls-type=%d, "
"comp-name=\"%s\"",
cfg_comp->plugin_name->str,
cfg_comp->comp_cls_name->str,
goto error;
}
+ if (canceled) {
+ BT_LOGI_STR("Canceled by user before creating components.");
+ goto error;
+ }
+
+ BT_LOGI_STR("Creating components.");
+
/* Create the requested component instances */
if (cmd_run_ctx_create_components(&ctx)) {
BT_LOGE_STR("Cannot create components.");
goto error;
}
+ if (canceled) {
+ BT_LOGI_STR("Canceled by user before connecting components.");
+ goto error;
+ }
+
+ BT_LOGI_STR("Connecting components.");
+
/* Connect the initially visible component ports */
if (cmd_run_ctx_connect_ports(&ctx)) {
BT_LOGE_STR("Cannot connect initial component ports.");
}
if (canceled) {
- goto end;
+ BT_LOGI_STR("Canceled by user before running the graph.");
+ goto error;
}
BT_LOGI_STR("Running the graph.");
while (true) {
enum bt_graph_status graph_status = bt_graph_run(ctx.graph);
+ /*
+ * Reset console in case something messed with console
+ * codes during the graph's execution.
+ */
+ printf("%s", bt_common_color_reset());
+ fflush(stdout);
+ fprintf(stderr, "%s", bt_common_color_reset());
BT_LOGV("bt_graph_run() returned: status=%s",
bt_graph_status_str(graph_status));
static
void init_log_level(void)
{
- enum bt_logging_level log_level = BT_LOG_NONE;
- const char *log_level_env = getenv("BABELTRACE_CLI_LOG_LEVEL");
-
- if (!log_level_env) {
- goto set_level;
- }
-
- if (strcmp(log_level_env, "VERBOSE") == 0) {
- log_level = BT_LOGGING_LEVEL_VERBOSE;
- } else if (strcmp(log_level_env, "DEBUG") == 0) {
- log_level = BT_LOGGING_LEVEL_DEBUG;
- } else if (strcmp(log_level_env, "INFO") == 0) {
- log_level = BT_LOGGING_LEVEL_INFO;
- } else if (strcmp(log_level_env, "WARN") == 0) {
- log_level = BT_LOGGING_LEVEL_WARN;
- } else if (strcmp(log_level_env, "ERROR") == 0) {
- log_level = BT_LOGGING_LEVEL_ERROR;
- } else if (strcmp(log_level_env, "FATAL") == 0) {
- log_level = BT_LOGGING_LEVEL_FATAL;
- } else if (strcmp(log_level_env, "NONE") == 0) {
- log_level = BT_LOGGING_LEVEL_NONE;
- }
-
-set_level:
- bt_cli_log_level = log_level;
+ bt_cli_log_level = bt_log_get_level_from_env("BABELTRACE_CLI_LOG_LEVEL");
}
void set_sigint_handler(void)
ret = cmd_print_lttng_live_sessions(cfg);
break;
default:
- BT_LOGF("Invalid command: cmd=%d", cfg->command);
- assert(false);
+ BT_LOGF("Invalid/unknown command: cmd=%d", cfg->command);
+ abort();
}
BT_LOGI("Command completed: cmd=%d, command-name=\"%s\", ret=%d",