}
}
+ self->creationtime = ast_tvnow();
+
return self;
}
static char *handle_bridge_show_all(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
-#define FORMAT_HDR "%-36s %5s %-15s %s\n"
-#define FORMAT_ROW "%-36s %5u %-15s %s\n"
+#define FORMAT_HDR "%-36s %5s %-15s %-15s %s\n"
+#define FORMAT_ROW "%-36s %5u %-15s %-15s %s\n"
RAII_VAR(struct ao2_container *, cached_bridges, NULL, ao2_cleanup);
struct ao2_iterator iter;
return CLI_SUCCESS;
}
- ast_cli(a->fd, FORMAT_HDR, "Bridge-ID", "Chans", "Type", "Technology");
+ ast_cli(a->fd, FORMAT_HDR, "Bridge-ID", "Chans", "Type", "Technology", "Duration");
iter = ao2_iterator_init(cached_bridges, 0);
for (; (msg = ao2_iterator_next(&iter)); ao2_ref(msg, -1)) {
struct ast_bridge_snapshot *snapshot = stasis_message_data(msg);
+ char print_time[32];
+
+ ast_format_duration_hh_mm_ss(ast_tvnow().tv_sec - snapshot->creationtime.tv_sec, print_time, sizeof(print_time));
ast_cli(a->fd, FORMAT_ROW,
snapshot->uniqueid,
snapshot->num_channels,
S_OR(snapshot->subclass, "<unknown>"),
- S_OR(snapshot->technology, "<unknown>"));
+ S_OR(snapshot->technology, "<unknown>"),
+ print_time);
}
ao2_iterator_destroy(&iter);
return CLI_SUCCESS;
{
RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
struct ast_bridge_snapshot *snapshot;
+ char print_time[32];
switch (cmd) {
case CLI_INIT:
}
snapshot = stasis_message_data(msg);
+ ast_format_duration_hh_mm_ss(ast_tvnow().tv_sec - snapshot->creationtime.tv_sec, print_time, sizeof(print_time));
+
ast_cli(a->fd, "Id: %s\n", snapshot->uniqueid);
ast_cli(a->fd, "Type: %s\n", S_OR(snapshot->subclass, "<unknown>"));
ast_cli(a->fd, "Technology: %s\n", S_OR(snapshot->technology, "<unknown>"));
+ ast_cli(a->fd, "Subclass: %s\n", snapshot->subclass);
+ ast_cli(a->fd, "Creator: %s\n", snapshot->creator);
+ ast_cli(a->fd, "Name: %s\n", snapshot->name);
+ ast_cli(a->fd, "Video-Source-Id: %s\n", snapshot->video_source_id);
ast_cli(a->fd, "Num-Channels: %u\n", snapshot->num_channels);
+ ast_cli(a->fd, "Num-Active: %u\n", snapshot->num_active);
+ ast_cli(a->fd, "Duration: %s\n", print_time);
ao2_callback(snapshot->channels, OBJ_NODATA, bridge_show_specific_print_channel, a);
return CLI_SUCCESS;
snapshot->capabilities = bridge->technology->capabilities;
snapshot->num_channels = bridge->num_channels;
snapshot->num_active = bridge->num_active;
+ snapshot->creationtime = bridge->creationtime;
snapshot->video_mode = bridge->softmix.video_mode.mode;
if (snapshot->video_mode == AST_BRIDGE_VIDEO_MODE_SINGLE_SRC
&& bridge->softmix.video_mode.mode_data.single_src_data.chan_vsrc) {
return NULL;
}
- json_bridge = ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: s, s: o, s: s}",
+ json_bridge = ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: s, s: o, s: o, s: s}",
"id", snapshot->uniqueid,
"technology", snapshot->technology,
"bridge_type", capability2str(snapshot->capabilities),
"creator", snapshot->creator,
"name", snapshot->name,
"channels", json_channels,
+ "creationtime", ast_json_timeval(snapshot->creationtime, NULL),
"video_mode", ast_bridge_video_mode_to_string(snapshot->video_mode));
if (!json_bridge) {
return NULL;
int has_bridge_class = 0;
int has_bridge_type = 0;
int has_channels = 0;
+ int has_creationtime = 0;
int has_creator = 0;
int has_id = 0;
int has_name = 0;
res = 0;
}
} else
+ if (strcmp("creationtime", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ has_creationtime = 1;
+ prop_is_valid = ast_ari_validate_date(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI Bridge field creationtime failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("creator", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_creator = 1;
res = 0;
}
+ if (!has_creationtime) {
+ ast_log(LOG_ERROR, "ARI Bridge missing required field creationtime\n");
+ res = 0;
+ }
+
if (!has_creator) {
ast_log(LOG_ERROR, "ARI Bridge missing required field creator\n");
res = 0;