[prev in list] [next in list] [prev in thread] [next in thread] 

List:       asterisk-commits
Subject:    [asterisk-commits] =?utf-8?q?Bridging=3A_introduce_=22invisible?= =?utf-8?b?IiBicmlkZ2VzLiAoYXN0ZXJp
From:       SVN commits to the Asterisk project <asterisk-commits () lists ! digium ! com>
Date:       2016-05-25 10:32:57
Message-ID: mailman.1677.1464184227.1232.asterisk-commits () lists ! digium ! com
[Download RAW message or body]

Joshua Colp has submitted this change and it was merged.

Change subject: Bridging: introduce "invisible" bridges.
......................................................................


Bridging: introduce "invisible" bridges.

Invisible bridges function the same as normal bridges, but they have the
following restrictions:

* They never show up in CLI, AMI, or ARI queries.
* They do not have Stasis messages published about them.

Invisible bridges' main use is for when use of the bridging system is
desired, but the bridge should not be known to users of the Asterisk
system.

ASTERISK-25925

Change-Id: I804a209d3181d7c54e3d61a60eb462e7ce0e3670
---
M include/asterisk/bridge_features.h
M main/bridge.c
M main/manager_bridges.c
M main/stasis_bridges.c
M main/stasis_channels.c
5 files changed, 33 insertions(+), 12 deletions(-)

Approvals:
  George Joseph: Looks good to me, but someone else must approve
  Richard Mudgett: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, approved; Verified



diff --git a/include/asterisk/bridge_features.h b/include/asterisk/bridge_features.h
index df01a0d..7fcb85b 100644
--- a/include/asterisk/bridge_features.h
+++ b/include/asterisk/bridge_features.h
@@ -53,6 +53,8 @@
 	AST_BRIDGE_FLAG_TRANSFER_PROHIBITED = (1 << 8),
 	/*! Bridge transfers require transfer of entire bridge rather than individual channels */
 	AST_BRIDGE_FLAG_TRANSFER_BRIDGE_ONLY = (1 << 9),
+	/*! Bridge is invisible to AMI/CLI/ARI/etc. */
+	AST_BRIDGE_FLAG_INVISIBLE = (1 << 10),
 };
 
 /*! \brief Flags used for per bridge channel features */
diff --git a/main/bridge.c b/main/bridge.c
index ce6b960..68ac24b 100644
--- a/main/bridge.c
+++ b/main/bridge.c
@@ -759,11 +759,13 @@
 	ast_set_flag(&self->feature_flags, flags);
 	self->allowed_capabilities = capabilities;
 
-	if (bridge_topics_init(self) != 0) {
-		ast_log(LOG_WARNING, "Bridge %s: Could not initialize topics\n",
-			self->uniqueid);
-		ao2_ref(self, -1);
-		return NULL;
+	if (!(flags & AST_BRIDGE_FLAG_INVISIBLE)) {
+		if (bridge_topics_init(self) != 0) {
+			ast_log(LOG_WARNING, "Bridge %s: Could not initialize topics\n",
+				self->uniqueid);
+			ao2_ref(self, -1);
+			return NULL;
+		}
 	}
 
 	/* Use our helper function to find the "best" bridge technology. */
@@ -793,9 +795,11 @@
 		return NULL;
 	}
 
-	if (!ast_bridge_topic(self)) {
-		ao2_ref(self, -1);
-		return NULL;
+	if (!(flags & AST_BRIDGE_FLAG_INVISIBLE)) {
+		if (!ast_bridge_topic(self)) {
+			ao2_ref(self, -1);
+			return NULL;
+		}
 	}
 
 	return self;
@@ -4321,8 +4325,8 @@
 	bridge = ast_channel_get_bridge(chan);
 	ast_channel_unlock(chan);
 
-	if (bridge
-		&& ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_MASQUERADE_ONLY)) {
+	if (bridge && ast_test_flag(&bridge->feature_flags,
+			(AST_BRIDGE_FLAG_MASQUERADE_ONLY | AST_BRIDGE_FLAG_INVISIBLE))) {
 		ao2_ref(bridge, -1);
 		bridge = NULL;
 	}
diff --git a/main/manager_bridges.c b/main/manager_bridges.c
index dd3e98b..2069d50 100644
--- a/main/manager_bridges.c
+++ b/main/manager_bridges.c
@@ -572,7 +572,7 @@
 		}
 	} else {
 		bridge = ast_bridge_find_by_id(bridge_uniqueid);
-		if (!bridge) {
+		if (!bridge || ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
 			astman_send_error(s, m, "Bridge not found");
 			return 0;
 		}
diff --git a/main/stasis_bridges.c b/main/stasis_bridges.c
index d06ee14..0e46edb 100644
--- a/main/stasis_bridges.c
+++ b/main/stasis_bridges.c
@@ -232,6 +232,10 @@
 	RAII_VAR(struct ast_bridge_snapshot *, snapshot, NULL, ao2_cleanup);
 	struct ast_bridge_channel *bridge_channel;
 
+	if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+		return NULL;
+	}
+
 	snapshot = ao2_alloc_options(sizeof(*snapshot), bridge_snapshot_dtor,
 		AO2_ALLOC_OPT_LOCK_NOLOCK);
 	if (!snapshot || ast_string_field_init(snapshot, 128)) {
@@ -371,6 +375,8 @@
 
 	ast_assert(to != NULL);
 	ast_assert(from != NULL);
+	ast_assert(ast_test_flag(&to->feature_flags, AST_BRIDGE_FLAG_INVISIBLE) == 0);
+	ast_assert(ast_test_flag(&from->feature_flags, AST_BRIDGE_FLAG_INVISIBLE) == 0);
 
 	merge_msg = bridge_merge_message_create(to, from);
 	if (!merge_msg) {
@@ -447,6 +453,10 @@
 	RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
 	RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref);
 
+	if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+		return;
+	}
+
 	if (swap) {
 		blob = ast_json_pack("{s: s}", "swap", ast_channel_uniqueid(swap));
 		if (!blob) {
@@ -468,6 +478,9 @@
 {
 	RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
 
+	if (ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+		return;
+	}
 	msg = ast_bridge_blob_create(ast_channel_left_bridge_type(), bridge, chan, NULL);
 	if (!msg) {
 		return;
diff --git a/main/stasis_channels.c b/main/stasis_channels.c
index eb1f1bc..e56d1b9 100644
--- a/main/stasis_channels.c
+++ b/main/stasis_channels.c
@@ -256,7 +256,9 @@
 	ast_string_field_set(snapshot, language, ast_channel_language(chan));
 
 	if ((bridge = ast_channel_get_bridge(chan))) {
-		ast_string_field_set(snapshot, bridgeid, bridge->uniqueid);
+		if (!ast_test_flag(&bridge->feature_flags, AST_BRIDGE_FLAG_INVISIBLE)) {
+			ast_string_field_set(snapshot, bridgeid, bridge->uniqueid);
+		}
 		ao2_cleanup(bridge);
 	}
 

-- 
To view, visit https://gerrit.asterisk.org/2789
To unsubscribe, visit https://gerrit.asterisk.org/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I804a209d3181d7c54e3d61a60eb462e7ce0e3670
Gerrit-PatchSet: 3
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-Owner: Mark Michelson <mmichelson@digium.com>
Gerrit-Reviewer: Anonymous Coward #1000019
Gerrit-Reviewer: George Joseph <gjoseph@digium.com>
Gerrit-Reviewer: Joshua Colp <jcolp@digium.com>
Gerrit-Reviewer: Mark Michelson <mmichelson@digium.com>
Gerrit-Reviewer: Richard Mudgett <rmudgett@digium.com>

-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

asterisk-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/asterisk-commits
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic