Asterisk - The Open Source Telephony Project GIT-master-8f1982c
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Macros Modules Pages
Data Structures | Typedefs | Functions | Variables
manager_bridges.c File Reference

The Asterisk Management Interface - AMI (bridge event handling) More...

#include "asterisk.h"
#include "asterisk/stasis_bridges.h"
#include "asterisk/stasis_channels.h"
#include "asterisk/manager.h"
#include "asterisk/stasis_message_router.h"
Include dependency graph for manager_bridges.c:

Go to the source code of this file.

Data Structures

struct  bridge_list_data
 

Typedefs

typedef struct ast_manager_event_blob *(* bridge_snapshot_monitor) (struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
 Typedef for callbacks that get called on channel snapshot updates. More...
 

Functions

struct ast_strast_manager_build_bridge_state_string (const struct ast_bridge_snapshot *snapshot)
 Generate the AMI message body from a bridge snapshot. More...
 
struct ast_strast_manager_build_bridge_state_string_prefix (const struct ast_bridge_snapshot *snapshot, const char *prefix)
 Generate the AMI message body from a bridge snapshot. More...
 
static struct ast_manager_event_blobbridge_create (struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
 Handle bridge creation. More...
 
static struct ast_manager_event_blobbridge_destroy (struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
 Handle bridge destruction. More...
 
static void bridge_merge_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static void bridge_snapshot_update (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static struct ast_manager_event_blobbridge_video_update (struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
 Handle video source updates. More...
 
static void channel_enter_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static void channel_leave_cb (void *data, struct stasis_subscription *sub, struct stasis_message *message)
 
static int manager_bridge_destroy (struct mansession *s, const struct message *m)
 
static int manager_bridge_info (struct mansession *s, const struct message *m)
 
static int manager_bridge_kick (struct mansession *s, const struct message *m)
 
static int manager_bridges_list (struct mansession *s, const struct message *m)
 
static void manager_bridging_cleanup (void)
 
int manager_bridging_init (void)
 Initialize support for AMI channel events. More...
 
static int send_bridge_info_item_cb (void *obj, void *arg, void *data, int flags)
 
static int send_bridge_list_item_cb (void *obj, void *arg, void *data, int flags)
 

Variables

bridge_snapshot_monitor bridge_monitors []
 
static struct stasis_message_routerbridge_state_router
 Message router for cached bridge state snapshot updates. More...
 
static struct stasis_forwardtopic_forwarder
 The Stasis Message Bus API subscription returned by the forwarding of the channel topic to the manager topic. More...
 

Detailed Description

The Asterisk Management Interface - AMI (bridge event handling)

Author
Kinsey Moore kmoor.nosp@m.e@di.nosp@m.gium..nosp@m.com

Definition in file manager_bridges.c.

Typedef Documentation

◆ bridge_snapshot_monitor

typedef struct ast_manager_event_blob *(* bridge_snapshot_monitor) (struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)

Typedef for callbacks that get called on channel snapshot updates.

Definition at line 301 of file manager_bridges.c.

Function Documentation

◆ ast_manager_build_bridge_state_string()

struct ast_str * ast_manager_build_bridge_state_string ( const struct ast_bridge_snapshot snapshot)

Generate the AMI message body from a bridge snapshot.

Since
12
Parameters
snapshotthe bridge snapshot for which to generate an AMI message body
Return values
NULLon error
Returns
ast_str* on success (must be ast_freed by caller)

Definition at line 301 of file manager_bridges.c.

303{
305}
struct ast_str * ast_manager_build_bridge_state_string_prefix(const struct ast_bridge_snapshot *snapshot, const char *prefix)
Generate the AMI message body from a bridge snapshot.

References ast_manager_build_bridge_state_string_prefix().

Referenced by blind_transfer_to_ami(), bridge_snapshot_update(), channel_enter_cb(), channel_leave_cb(), confbridge_publish_manager_event(), manager_bridge_info(), and send_bridge_list_item_cb().

◆ ast_manager_build_bridge_state_string_prefix()

struct ast_str * ast_manager_build_bridge_state_string_prefix ( const struct ast_bridge_snapshot snapshot,
const char *  prefix 
)

Generate the AMI message body from a bridge snapshot.

Since
12
Parameters
snapshotthe bridge snapshot for which to generate an AMI message body
prefixWhat to prepend to the bridge fields
Return values
NULLon error
Returns
ast_str* on success (must be ast_freed by caller)

Definition at line 257 of file manager_bridges.c.

260{
261 struct ast_str *out = ast_str_create(128);
262 int res;
263
264 if (!out) {
265 return NULL;
266 }
267
268 res = ast_str_set(&out, 0,
269 "%sBridgeUniqueid: %s\r\n"
270 "%sBridgeType: %s\r\n"
271 "%sBridgeTechnology: %s\r\n"
272 "%sBridgeCreator: %s\r\n"
273 "%sBridgeName: %s\r\n"
274 "%sBridgeNumChannels: %u\r\n"
275 "%sBridgeVideoSourceMode: %s\r\n",
276 prefix, snapshot->uniqueid,
277 prefix, snapshot->subclass,
278 prefix, snapshot->technology,
279 prefix, ast_strlen_zero(snapshot->creator) ? "<unknown>": snapshot->creator,
280 prefix, ast_strlen_zero(snapshot->name) ? "<unknown>": snapshot->name,
281 prefix, snapshot->num_channels,
283 if (!res) {
284 ast_free(out);
285 return NULL;
286 }
287
289 && !ast_strlen_zero(snapshot->video_source_id)) {
290 res = ast_str_append(&out, 0, "%sBridgeVideoSource: %s\r\n",
291 prefix, snapshot->video_source_id);
292 if (!res) {
293 ast_free(out);
294 return NULL;
295 }
296 }
297
298 return out;
299}
#define ast_free(a)
Definition: astmm.h:180
const char * ast_bridge_video_mode_to_string(enum ast_bridge_video_mode_type video_mode)
Converts an enum representation of a bridge video mode to string.
Definition: bridge.c:4020
@ AST_BRIDGE_VIDEO_MODE_NONE
Definition: bridge.h:104
static char prefix[MAX_PREFIX]
Definition: http.c:144
#define NULL
Definition: resample.c:96
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1139
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1113
enum ast_bridge_video_mode_type video_mode
Definition: bridge.h:345
const ast_string_field video_source_id
Definition: bridge.h:332
const ast_string_field creator
Definition: bridge.h:332
const ast_string_field uniqueid
Definition: bridge.h:332
unsigned int num_channels
Definition: bridge.h:341
const ast_string_field technology
Definition: bridge.h:332
const ast_string_field name
Definition: bridge.h:332
const ast_string_field subclass
Definition: bridge.h:332
Support for dynamic strings.
Definition: strings.h:623
FILE * out
Definition: utils/frame.c:33

References AST_BRIDGE_VIDEO_MODE_NONE, ast_bridge_video_mode_to_string(), ast_free, ast_str_append(), ast_str_create, ast_str_set(), ast_strlen_zero(), ast_bridge_snapshot::creator, ast_bridge_snapshot::name, NULL, ast_bridge_snapshot::num_channels, out, prefix, ast_bridge_snapshot::subclass, ast_bridge_snapshot::technology, ast_bridge_snapshot::uniqueid, ast_bridge_snapshot::video_mode, and ast_bridge_snapshot::video_source_id.

Referenced by ast_manager_build_bridge_state_string(), attended_transfer_to_ami(), bridge_merge_cb(), and multi_object_blob_to_ami().

◆ bridge_create()

static struct ast_manager_event_blob * bridge_create ( struct ast_bridge_snapshot old_snapshot,
struct ast_bridge_snapshot new_snapshot 
)
static

Handle bridge creation.

Definition at line 313 of file manager_bridges.c.

316{
317 if (!new_snapshot || old_snapshot) {
318 return NULL;
319 }
320
322 EVENT_FLAG_CALL, "BridgeCreate", NO_EXTRA_FIELDS);
323}
#define NO_EXTRA_FIELDS
Definition: manager.h:534
struct ast_manager_event_blob * ast_manager_event_blob_create(int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
Construct a ast_manager_event_blob.
Definition: manager.c:10237
#define EVENT_FLAG_CALL
Definition: manager.h:76

References ast_manager_event_blob_create(), EVENT_FLAG_CALL, NO_EXTRA_FIELDS, and NULL.

◆ bridge_destroy()

static struct ast_manager_event_blob * bridge_destroy ( struct ast_bridge_snapshot old_snapshot,
struct ast_bridge_snapshot new_snapshot 
)
static

Handle bridge destruction.

Definition at line 345 of file manager_bridges.c.

348{
349 if (new_snapshot || !old_snapshot) {
350 return NULL;
351 }
352
354 EVENT_FLAG_CALL, "BridgeDestroy", NO_EXTRA_FIELDS);
355}

References ast_manager_event_blob_create(), EVENT_FLAG_CALL, NO_EXTRA_FIELDS, and NULL.

◆ bridge_merge_cb()

static void bridge_merge_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 396 of file manager_bridges.c.

398{
400 RAII_VAR(struct ast_str *, to_text, NULL, ast_free);
401 RAII_VAR(struct ast_str *, from_text, NULL, ast_free);
402
403 ast_assert(merge_msg->to != NULL);
404 ast_assert(merge_msg->from != NULL);
405
406 to_text = ast_manager_build_bridge_state_string_prefix(merge_msg->to, "To");
407 from_text = ast_manager_build_bridge_state_string_prefix(merge_msg->from, "From");
408 if (!to_text || !from_text) {
409 return;
410 }
411
412 /*** DOCUMENTATION
413 <managerEvent language="en_US" name="BridgeMerge">
414 <managerEventInstance class="EVENT_FLAG_CALL">
415 <since>
416 <version>16.24.0</version>
417 <version>18.10.0</version>
418 <version>19.2.0</version>
419 </since>
420 <synopsis>Raised when two bridges are merged.</synopsis>
421 <syntax>
422 <bridge_snapshot prefix="To"/>
423 <bridge_snapshot prefix="From"/>
424 </syntax>
425 </managerEventInstance>
426 </managerEvent>
427 ***/
428 manager_event(EVENT_FLAG_CALL, "BridgeMerge",
429 "%s"
430 "%s",
431 ast_str_buffer(to_text),
432 ast_str_buffer(from_text));
433}
#define manager_event(category, event, contents,...)
External routines may send asterisk manager events this way.
Definition: manager.h:254
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
Message representing the merge of two bridges.
struct ast_bridge_snapshot * from
struct ast_bridge_snapshot * to
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941
#define ast_assert(a)
Definition: utils.h:739

References ast_assert, ast_free, ast_manager_build_bridge_state_string_prefix(), ast_str_buffer(), EVENT_FLAG_CALL, ast_bridge_merge_message::from, manager_event, NULL, RAII_VAR, stasis_message_data(), and ast_bridge_merge_message::to.

Referenced by manager_bridging_init().

◆ bridge_snapshot_update()

static void bridge_snapshot_update ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 363 of file manager_bridges.c.

365{
366 RAII_VAR(struct ast_str *, bridge_event_string, NULL, ast_free);
368 size_t i;
369
371
372 for (i = 0; i < ARRAY_LEN(bridge_monitors); ++i) {
374
375 event = bridge_monitors[i](update->old_snapshot, update->new_snapshot);
376 if (!event) {
377 continue;
378 }
379
380 /* If we haven't already, build the channel event string */
381 if (!bridge_event_string) {
382 bridge_event_string =
384 update->new_snapshot ? update->new_snapshot : update->old_snapshot);
385 if (!bridge_event_string) {
386 return;
387 }
388 }
389
390 manager_event(event->event_flags, event->manager_event, "%s%s",
391 ast_str_buffer(bridge_event_string),
392 event->extra_fields);
393 }
394}
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
static void update(int code_size, int y, int wi, int fi, int dq, int sr, int dqsez, struct g726_state *state_ptr)
Definition: codec_g726.c:367
bridge_snapshot_monitor bridge_monitors[]
struct ast_str * ast_manager_build_bridge_state_string(const struct ast_bridge_snapshot *snapshot)
Generate the AMI message body from a bridge snapshot.
Struct containing info for an AMI event to send out.
Definition: manager.h:503
Definition: astman.c:222
#define ARRAY_LEN(a)
Definition: utils.h:666

References ao2_cleanup, ARRAY_LEN, ast_free, ast_manager_build_bridge_state_string(), ast_str_buffer(), bridge_monitors, manager_event, NULL, RAII_VAR, stasis_message_data(), and update().

Referenced by manager_bridging_init().

◆ bridge_video_update()

static struct ast_manager_event_blob * bridge_video_update ( struct ast_bridge_snapshot old_snapshot,
struct ast_bridge_snapshot new_snapshot 
)
static

Handle video source updates.

Definition at line 326 of file manager_bridges.c.

329{
330 if (!new_snapshot || !old_snapshot) {
331 return NULL;
332 }
333
334 if (!strcmp(old_snapshot->video_source_id, new_snapshot->video_source_id)) {
335 return NULL;
336 }
337
339 EVENT_FLAG_CALL, "BridgeVideoSourceUpdate",
340 "BridgePreviousVideoSource: %s\r\n",
341 old_snapshot->video_source_id);
342}

References ast_manager_event_blob_create(), EVENT_FLAG_CALL, NULL, and ast_bridge_snapshot::video_source_id.

◆ channel_enter_cb()

static void channel_enter_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 435 of file manager_bridges.c.

437{
438 static const char *swap_name = "SwapUniqueid: ";
440 RAII_VAR(struct ast_str *, bridge_text, NULL, ast_free);
441 RAII_VAR(struct ast_str *, channel_text, NULL, ast_free);
442 const char *swap_id;
443
444 bridge_text = ast_manager_build_bridge_state_string(blob->bridge);
445 channel_text = ast_manager_build_channel_state_string(blob->channel);
446 if (!bridge_text || !channel_text) {
447 return;
448 }
449
450 swap_id = ast_json_string_get(ast_json_object_get(blob->blob, "swap"));
451
452 manager_event(EVENT_FLAG_CALL, "BridgeEnter",
453 "%s"
454 "%s"
455 "%s%s%s",
456 ast_str_buffer(bridge_text),
457 ast_str_buffer(channel_text),
458 swap_id ? swap_name : "",
459 S_OR(swap_id, ""),
460 swap_id ? "\r\n" : "");
461}
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:283
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:407
struct ast_str * ast_manager_build_channel_state_string(const struct ast_channel_snapshot *snapshot)
Generate the AMI message body from a channel snapshot.
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
Blob of data associated with a bridge.
struct ast_json * blob

References ast_free, ast_json_object_get(), ast_json_string_get(), ast_manager_build_bridge_state_string(), ast_manager_build_channel_state_string(), ast_str_buffer(), ast_bridge_blob::blob, EVENT_FLAG_CALL, manager_event, NULL, RAII_VAR, S_OR, and stasis_message_data().

Referenced by manager_bridging_init().

◆ channel_leave_cb()

static void channel_leave_cb ( void *  data,
struct stasis_subscription sub,
struct stasis_message message 
)
static

Definition at line 463 of file manager_bridges.c.

465{
467 RAII_VAR(struct ast_str *, bridge_text, NULL, ast_free);
468 RAII_VAR(struct ast_str *, channel_text, NULL, ast_free);
469
470 bridge_text = ast_manager_build_bridge_state_string(blob->bridge);
471 channel_text = ast_manager_build_channel_state_string(blob->channel);
472 if (!bridge_text || !channel_text) {
473 return;
474 }
475
476 manager_event(EVENT_FLAG_CALL, "BridgeLeave",
477 "%s"
478 "%s",
479 ast_str_buffer(bridge_text),
480 ast_str_buffer(channel_text));
481}

References ast_free, ast_manager_build_bridge_state_string(), ast_manager_build_channel_state_string(), ast_str_buffer(), ast_bridge_blob::blob, EVENT_FLAG_CALL, manager_event, NULL, RAII_VAR, and stasis_message_data().

Referenced by manager_bridging_init().

◆ manager_bridge_destroy()

static int manager_bridge_destroy ( struct mansession s,
const struct message m 
)
static

Definition at line 645 of file manager_bridges.c.

646{
647 const char *bridge_uniqueid = astman_get_header(m, "BridgeUniqueid");
648 struct ast_bridge *bridge;
649
650 if (ast_strlen_zero(bridge_uniqueid)) {
651 astman_send_error(s, m, "BridgeUniqueid must be provided");
652 return 0;
653 }
654
655 bridge = ast_bridge_find_by_id(bridge_uniqueid);
656 if (!bridge) {
657 astman_send_error(s, m, "Specified BridgeUniqueid not found");
658 return 0;
659 }
660 ast_bridge_destroy(bridge, 0);
661
662 astman_send_ack(s, m, "Bridge has been destroyed");
663
664 return 0;
665}
int ast_bridge_destroy(struct ast_bridge *bridge, int cause)
Destroy a bridge.
Definition: bridge.c:1009
struct ast_bridge * ast_bridge_find_by_id(const char *bridge_id)
Find bridge by id.
Definition: bridge.c:5081
void astman_send_error(struct mansession *s, const struct message *m, char *error)
Send error in manager transaction.
Definition: manager.c:1986
void astman_send_ack(struct mansession *s, const struct message *m, char *msg)
Send ack in manager transaction.
Definition: manager.c:2018
const char * astman_get_header(const struct message *m, char *var)
Get header from manager transaction.
Definition: manager.c:1647
Structure that contains information about a bridge.
Definition: bridge.h:353

References ast_bridge_destroy(), ast_bridge_find_by_id(), ast_strlen_zero(), astman_get_header(), astman_send_ack(), and astman_send_error().

Referenced by manager_bridging_init().

◆ manager_bridge_info()

static int manager_bridge_info ( struct mansession s,
const struct message m 
)
static

Definition at line 596 of file manager_bridges.c.

597{
598 const char *id = astman_get_header(m, "ActionID");
599 const char *bridge_uniqueid = astman_get_header(m, "BridgeUniqueid");
600 RAII_VAR(struct ast_str *, bridge_info, NULL, ast_free);
601 RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
602 struct bridge_list_data list_data = { 0 };
603
604 if (ast_strlen_zero(bridge_uniqueid)) {
605 astman_send_error(s, m, "BridgeUniqueid must be provided");
606 return 0;
607 }
608
609 snapshot = ast_bridge_get_snapshot_by_uniqueid(bridge_uniqueid);
610 if (!snapshot) {
611 astman_send_error(s, m, "Specified BridgeUniqueid not found");
612 return 0;
613 }
614
615 bridge_info = ast_manager_build_bridge_state_string(snapshot);
616 if (!bridge_info) {
617 astman_send_error(s, m, "Internal error");
618 return -1;
619 }
620
621 list_data.id_text = ast_str_create(128);
622 if (!list_data.id_text) {
623 astman_send_error(s, m, "Internal error");
624 return -1;
625 }
626
627 if (!ast_strlen_zero(id)) {
628 ast_str_set(&list_data.id_text, 0, "ActionID: %s\r\n", id);
629 }
630
631 astman_send_listack(s, m, "Bridge channel listing will follow", "start");
632
633 ao2_callback_data(snapshot->channels, OBJ_NODATA, send_bridge_info_item_cb, s, &list_data);
634
635 astman_send_list_complete_start(s, m, "BridgeInfoComplete", list_data.count);
636 if (!ast_strlen_zero(ast_str_buffer(bridge_info))) {
637 astman_append(s, "%s", ast_str_buffer(bridge_info));
638 }
640 ast_free(list_data.id_text);
641
642 return 0;
643}
#define ao2_callback_data(container, flags, cb_fn, arg, data)
Definition: astobj2.h:1723
@ OBJ_NODATA
Definition: astobj2.h:1044
void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag)
Send ack in manager transaction to begin a list.
Definition: manager.c:2028
void astman_send_list_complete_start(struct mansession *s, const struct message *m, const char *event_name, int count)
Start the list complete event.
Definition: manager.c:2064
void astman_send_list_complete_end(struct mansession *s)
End the list complete event.
Definition: manager.c:2072
void astman_append(struct mansession *s, const char *fmt,...)
Definition: manager.c:1907
static int send_bridge_info_item_cb(void *obj, void *arg, void *data, int flags)
struct ast_bridge_snapshot * ast_bridge_get_snapshot_by_uniqueid(const char *bridge_id)
Returns the current snapshot for the bridge.
Structure that contains a snapshot of information about a bridge.
Definition: bridge.h:318
struct ast_str * id_text

References ao2_callback_data, ao2_cleanup, ast_bridge_get_snapshot_by_uniqueid(), ast_free, ast_manager_build_bridge_state_string(), ast_str_buffer(), ast_str_create, ast_str_set(), ast_strlen_zero(), astman_append(), astman_get_header(), astman_send_error(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), bridge_list_data::count, bridge_list_data::id_text, NULL, OBJ_NODATA, RAII_VAR, and send_bridge_info_item_cb().

Referenced by manager_bridging_init().

◆ manager_bridge_kick()

static int manager_bridge_kick ( struct mansession s,
const struct message m 
)
static

Definition at line 667 of file manager_bridges.c.

668{
669 const char *bridge_uniqueid = astman_get_header(m, "BridgeUniqueid");
670 const char *channel_name = astman_get_header(m, "Channel");
671 RAII_VAR(struct ast_bridge *, bridge, NULL, ao2_cleanup);
672 RAII_VAR(struct ast_channel *, channel, NULL, ao2_cleanup);
673
674 if (ast_strlen_zero(channel_name)) {
675 astman_send_error(s, m, "Channel must be provided");
676 return 0;
677 }
678
679 channel = ast_channel_get_by_name(channel_name);
680 if (!channel) {
681 astman_send_error(s, m, "Channel does not exist");
682 return 0;
683 }
684
685 if (ast_strlen_zero(bridge_uniqueid)) {
686 /* get the bridge from the channel */
687 ast_channel_lock(channel);
688 bridge = ast_channel_get_bridge(channel);
689 ast_channel_unlock(channel);
690 if (!bridge) {
691 astman_send_error(s, m, "Channel is not in a bridge");
692 return 0;
693 }
694 } else {
695 bridge = ast_bridge_find_by_id(bridge_uniqueid);
696 if (!bridge || ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
697 astman_send_error(s, m, "Bridge not found");
698 return 0;
699 }
700 }
701
702 if (ast_bridge_kick(bridge, channel)) {
703 astman_send_error(s, m, "Channel kick from bridge failed");
704 return 0;
705 }
706
707 astman_send_ack(s, m, "Channel has been kicked");
708 return 0;
709}
int ast_bridge_kick(struct ast_bridge *bridge, struct ast_channel *chan)
Kick a channel from a bridge.
Definition: bridge.c:2048
@ AST_BRIDGE_FLAG_INVISIBLE
#define ast_channel_lock(chan)
Definition: channel.h:2972
struct ast_channel * ast_channel_get_by_name(const char *search)
Find a channel by name or uniqueid.
Definition: channel.c:1397
struct ast_bridge * ast_channel_get_bridge(const struct ast_channel *chan)
Get the bridge associated with a channel.
Definition: channel.c:10539
#define ast_channel_unlock(chan)
Definition: channel.h:2973
Main Channel structure associated with a channel.
#define ast_test_flag(p, flag)
Definition: utils.h:63

References ao2_cleanup, ast_bridge_find_by_id(), AST_BRIDGE_FLAG_INVISIBLE, ast_bridge_kick(), ast_channel_get_bridge(), ast_channel_get_by_name(), ast_channel_lock, ast_channel_unlock, ast_strlen_zero(), ast_test_flag, astman_get_header(), astman_send_ack(), astman_send_error(), NULL, and RAII_VAR.

Referenced by manager_bridging_init().

◆ manager_bridges_list()

static int manager_bridges_list ( struct mansession s,
const struct message m 
)
static

Definition at line 525 of file manager_bridges.c.

526{
527 const char *id = astman_get_header(m, "ActionID");
528 const char *type_filter = astman_get_header(m, "BridgeType");
529 struct ao2_container *bridges;
530 struct bridge_list_data list_data = { 0 };
531
533 if (!bridges) {
534 astman_send_error(s, m, "Internal error");
535 return -1;
536 }
537
538 list_data.id_text = ast_str_create(128);
539 if (!list_data.id_text) {
540 ao2_ref(bridges, -1);
541 astman_send_error(s, m, "Internal error");
542 return -1;
543 }
544
545 if (!ast_strlen_zero(id)) {
546 ast_str_set(&list_data.id_text, 0, "ActionID: %s\r\n", id);
547 }
548 list_data.type_filter = type_filter;
549
550 astman_send_listack(s, m, "Bridge listing will follow", "start");
551
553
554 astman_send_list_complete_start(s, m, "BridgeListComplete", list_data.count);
556
557 ast_free(list_data.id_text);
558 ao2_ref(bridges, -1);
559
560 return 0;
561}
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
static struct ao2_container * bridges
Definition: bridge.c:132
struct ao2_container * ast_bridges(void)
Returns the global bridges container.
Definition: bridge.c:185
static int send_bridge_list_item_cb(void *obj, void *arg, void *data, int flags)
Generic container type.
const char * type_filter

References ao2_callback_data, ao2_ref, ast_bridges(), ast_free, ast_str_create, ast_str_set(), ast_strlen_zero(), astman_get_header(), astman_send_error(), astman_send_list_complete_end(), astman_send_list_complete_start(), astman_send_listack(), bridges, bridge_list_data::count, bridge_list_data::id_text, OBJ_NODATA, send_bridge_list_item_cb(), and bridge_list_data::type_filter.

Referenced by manager_bridging_init().

◆ manager_bridging_cleanup()

static void manager_bridging_cleanup ( void  )
static

Definition at line 711 of file manager_bridges.c.

712{
715
716 ast_manager_unregister("BridgeList");
717 ast_manager_unregister("BridgeInfo");
718 ast_manager_unregister("BridgeDestroy");
719 ast_manager_unregister("BridgeKick");
720}
int ast_manager_unregister(const char *action)
Unregister a registered manager command.
Definition: manager.c:7697
static struct stasis_forward * topic_forwarder
The Stasis Message Bus API subscription returned by the forwarding of the channel topic to the manage...
struct stasis_forward * stasis_forward_cancel(struct stasis_forward *forward)
Definition: stasis.c:1575

References ast_manager_unregister(), NULL, stasis_forward_cancel(), and topic_forwarder.

Referenced by manager_bridging_init().

◆ manager_bridging_init()

int manager_bridging_init ( void  )

Initialize support for AMI channel events.

Return values
0on success.
non-zeroon error.
Since
12

Definition at line 722 of file manager_bridges.c.

723{
724 int ret = 0;
726 struct stasis_topic *bridge_topic;
727
729 /* Already initialized */
730 return 0;
731 }
732
734
736 if (!manager_topic) {
737 return -1;
738 }
739
740 bridge_topic = ast_bridge_topic_all();
741 if (!bridge_topic) {
742 return -1;
743 }
744
746 if (!topic_forwarder) {
747 return -1;
748 }
749
751 if (!bridge_state_router) {
752 return -1;
753 }
754
757
760
763
766
768 ret |= ast_manager_register_xml_core("BridgeInfo", 0, manager_bridge_info);
769 ret |= ast_manager_register_xml_core("BridgeDestroy", 0, manager_bridge_destroy);
770 ret |= ast_manager_register_xml_core("BridgeKick", 0, manager_bridge_kick);
771
772 /* If somehow we failed to add any routes, just shut down the whole
773 * thing and fail it.
774 */
775 if (ret) {
777 return -1;
778 }
779
780 return 0;
781}
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
struct stasis_message_router * ast_manager_get_message_router(void)
Get the stasis_message_router for AMI.
Definition: manager.c:459
struct stasis_topic * ast_manager_get_topic(void)
Get the Stasis Message Bus API topic for AMI.
Definition: manager.c:454
static struct stasis_topic * manager_topic
A stasis_topic that all topics AMI cares about will be forwarded to.
Definition: manager.c:186
#define ast_manager_register_xml_core(action, authority, func)
Register a manager callback using XML documentation to describe the manager.
Definition: manager.h:203
static void bridge_merge_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static struct stasis_message_router * bridge_state_router
Message router for cached bridge state snapshot updates.
static void channel_leave_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static int manager_bridge_kick(struct mansession *s, const struct message *m)
static int manager_bridges_list(struct mansession *s, const struct message *m)
static void manager_bridging_cleanup(void)
static int manager_bridge_destroy(struct mansession *s, const struct message *m)
static int manager_bridge_info(struct mansession *s, const struct message *m)
static void bridge_snapshot_update(void *data, struct stasis_subscription *sub, struct stasis_message *message)
static void channel_enter_cb(void *data, struct stasis_subscription *sub, struct stasis_message *message)
struct stasis_forward * stasis_forward_all(struct stasis_topic *from_topic, struct stasis_topic *to_topic)
Create a subscription which forwards all messages from one topic to another.
Definition: stasis.c:1605
struct stasis_message_type * ast_bridge_snapshot_type(void)
Message type for ast_bridge_snapshot.
struct stasis_message_type * ast_channel_entered_bridge_type(void)
Message type for ast_channel enter bridge blob messages.
struct stasis_message_type * ast_bridge_merge_message_type(void)
Message type for ast_bridge_merge_message.
struct stasis_topic * ast_bridge_topic_all(void)
A topic which publishes the events for all bridges.
struct stasis_message_type * ast_channel_left_bridge_type(void)
Message type for ast_channel leave bridge blob messages.
int stasis_message_router_add(struct stasis_message_router *router, struct stasis_message_type *message_type, stasis_subscription_cb callback, void *data)
Add a route to a message router.

References ast_bridge_merge_message_type(), ast_bridge_snapshot_type(), ast_bridge_topic_all(), ast_channel_entered_bridge_type(), ast_channel_left_bridge_type(), ast_manager_get_message_router(), ast_manager_get_topic(), ast_manager_register_xml_core, ast_register_cleanup(), bridge_merge_cb(), bridge_snapshot_update(), bridge_state_router, channel_enter_cb(), channel_leave_cb(), manager_bridge_destroy(), manager_bridge_info(), manager_bridge_kick(), manager_bridges_list(), manager_bridging_cleanup(), manager_topic, NULL, stasis_forward_all(), stasis_message_router_add(), and topic_forwarder.

Referenced by subscribe_all().

◆ send_bridge_info_item_cb()

static int send_bridge_info_item_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 563 of file manager_bridges.c.

564{
565 char *uniqueid = obj;
566 struct mansession *s = arg;
567 struct bridge_list_data *list_data = data;
568 RAII_VAR(struct ast_channel_snapshot *, snapshot, NULL, ao2_cleanup);
569 RAII_VAR(struct ast_str *, channel_text, NULL, ast_free);
570
571 snapshot = ast_channel_snapshot_get_latest(uniqueid);
572 if (!snapshot) {
573 return 0;
574 }
575
576 if (snapshot->base->tech_properties & AST_CHAN_TP_INTERNAL) {
577 return 0;
578 }
579
580 channel_text = ast_manager_build_channel_state_string(snapshot);
581 if (!channel_text) {
582 return 0;
583 }
584
586 "Event: BridgeInfoChannel\r\n"
587 "%s"
588 "%s"
589 "\r\n",
590 ast_str_buffer(list_data->id_text),
591 ast_str_buffer(channel_text));
592 ++list_data->count;
593 return 0;
594}
@ AST_CHAN_TP_INTERNAL
Channels with this particular technology are an implementation detail of Asterisk and should generall...
Definition: channel.h:991
struct ast_channel_snapshot * ast_channel_snapshot_get_latest(const char *uniqueid)
Obtain the latest ast_channel_snapshot from the Stasis Message Bus API cache. This is an ao2 object,...
Structure representing a snapshot of channel state.
In case you didn't read that giant block of text above the mansession_session struct,...
Definition: manager.c:327

References ao2_cleanup, AST_CHAN_TP_INTERNAL, ast_channel_snapshot_get_latest(), ast_free, ast_manager_build_channel_state_string(), ast_str_buffer(), astman_append(), bridge_list_data::count, bridge_list_data::id_text, NULL, and RAII_VAR.

Referenced by manager_bridge_info().

◆ send_bridge_list_item_cb()

static int send_bridge_list_item_cb ( void *  obj,
void *  arg,
void *  data,
int  flags 
)
static

Definition at line 489 of file manager_bridges.c.

490{
491 struct ast_bridge *bridge = obj;
493 struct mansession *s = arg;
494 struct bridge_list_data *list_data = data;
495 struct ast_str * bridge_info;
496
497 if (!snapshot) {
498 return 0;
499 }
500
501 if (!ast_strlen_zero(list_data->type_filter)
502 && strcmp(list_data->type_filter, snapshot->technology)) {
503 return 0;
504 }
505
506 bridge_info = ast_manager_build_bridge_state_string(snapshot);
507 if (!bridge_info) {
508 return 0;
509 }
510
512 "Event: BridgeListItem\r\n"
513 "%s"
514 "%s"
515 "\r\n",
516 ast_str_buffer(list_data->id_text),
517 ast_str_buffer(bridge_info));
518 ++list_data->count;
519
520 ast_free(bridge_info);
521
522 return 0;
523}
struct ast_bridge_snapshot * ast_bridge_get_snapshot(struct ast_bridge *bridge)
Returns the current snapshot for the bridge.

References ao2_cleanup, ast_bridge_get_snapshot(), ast_free, ast_manager_build_bridge_state_string(), ast_str_buffer(), ast_strlen_zero(), astman_append(), bridge_list_data::count, bridge_list_data::id_text, RAII_VAR, and bridge_list_data::type_filter.

Referenced by manager_bridges_list().

Variable Documentation

◆ bridge_monitors

bridge_snapshot_monitor bridge_monitors[]
Initial value:
= {
}
static struct ast_manager_event_blob * bridge_create(struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
Handle bridge creation.
static struct ast_manager_event_blob * bridge_destroy(struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
Handle bridge destruction.
static struct ast_manager_event_blob * bridge_video_update(struct ast_bridge_snapshot *old_snapshot, struct ast_bridge_snapshot *new_snapshot)
Handle video source updates.

Definition at line 357 of file manager_bridges.c.

Referenced by bridge_snapshot_update().

◆ bridge_state_router

struct stasis_message_router* bridge_state_router
static

Message router for cached bridge state snapshot updates.

Definition at line 34 of file manager_bridges.c.

Referenced by manager_bridging_init().

◆ topic_forwarder

struct stasis_forward* topic_forwarder
static

The Stasis Message Bus API subscription returned by the forwarding of the channel topic to the manager topic.

Definition at line 255 of file manager_bridges.c.

Referenced by manager_bridging_cleanup(), and manager_bridging_init().