mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 18:55:19 +00:00 
			
		
		
		
	Migrate a large number of AMI events over to Stasis-Core
This patch moves a number of AMI events over to the Stasis-Core message bus. This includes: * ChanSpyStart/Stop * MonitorStart/Stop * MusicOnHoldStart/Stop * FullyBooted/Reload * All Voicemail/MWI related events In addition, it adds some Stasis-Core and AMI support for generic AMI messages, refactors the message router in AMI to use a single router with topic forwarding for the topics that AMI cares about, and refactors MWI message types and topics to be more name compliant. Review: https://reviewboard.asterisk.org/r/2532 (closes issue ASTERISK-21462) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@389733 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -55,6 +55,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| #include "asterisk/lock.h" | ||||
| #include "asterisk/options.h" | ||||
| #include "asterisk/autochan.h" | ||||
| #include "asterisk/stasis_channels.h" | ||||
| #include "asterisk/json.h" | ||||
|  | ||||
| #define AST_NAME_STRLEN 256 | ||||
| #define NUM_SPYGROUPS 128 | ||||
| @@ -188,6 +190,8 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 		</description> | ||||
| 		<see-also> | ||||
| 			<ref type="application">ExtenSpy</ref> | ||||
| 			<ref type="managerEvent">ChanSpyStart</ref> | ||||
| 			<ref type="managerEvent">ChanSpyStop</ref> | ||||
| 		</see-also> | ||||
| 	</application> | ||||
| 	<application name="ExtenSpy" language="en_US"> | ||||
| @@ -322,9 +326,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 		</description> | ||||
| 		<see-also> | ||||
| 			<ref type="application">ChanSpy</ref> | ||||
| 			<ref type="managerEvent">ChanSpyStart</ref> | ||||
| 			<ref type="managerEvent">ChanSpyStop</ref> | ||||
| 		</see-also> | ||||
| 	</application> | ||||
| 	 | ||||
| 	<application name="DAHDIScan" language="en_US"> | ||||
| 		<synopsis> | ||||
| 			Scan DAHDI channels to monitor calls. | ||||
| @@ -338,6 +343,10 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") | ||||
| 			<para>Allows a call center manager to monitor DAHDI channels in a | ||||
| 			convenient way.  Use <literal>#</literal> to select the next channel and use <literal>*</literal> to exit.</para> | ||||
| 		</description> | ||||
| 		<see-also> | ||||
| 			<ref type="managerEvent">ChanSpyStart</ref> | ||||
| 			<ref type="managerEvent">ChanSpyStop</ref> | ||||
| 		</see-also> | ||||
| 	</application> | ||||
|  ***/ | ||||
|  | ||||
| @@ -512,6 +521,68 @@ static void change_spy_mode(const char digit, struct ast_flags *flags) | ||||
| 	} | ||||
| } | ||||
|  | ||||
| static int pack_channel_into_message(struct ast_channel *chan, const char *role, | ||||
| 									 struct ast_multi_channel_blob *payload) | ||||
| { | ||||
| 	RAII_VAR(struct ast_channel_snapshot *, snapshot, | ||||
| 			ast_channel_snapshot_get_latest(ast_channel_uniqueid(chan)), | ||||
| 			ao2_cleanup); | ||||
|  | ||||
| 	if (!snapshot) { | ||||
| 		return -1; | ||||
| 	} | ||||
| 	ast_multi_channel_blob_add_channel(payload, role, snapshot); | ||||
| 	return 0; | ||||
| } | ||||
|  | ||||
| /*! \internal | ||||
|  * \brief Publish the chanspy message over Stasis-Core | ||||
|  * \param spyer The channel doing the spying | ||||
|  * \param spyee Who is being spied upon | ||||
|  * \start start If non-zero, the spying is starting. Otherwise, the spyer is | ||||
|  * finishing | ||||
|  */ | ||||
| static void publish_chanspy_message(struct ast_channel *spyer, | ||||
| 									struct ast_channel *spyee, | ||||
| 									int start) | ||||
| { | ||||
| 	RAII_VAR(struct ast_json *, blob, NULL, ast_json_unref); | ||||
| 	RAII_VAR(struct ast_multi_channel_blob *, payload, NULL, ao2_cleanup); | ||||
| 	RAII_VAR(struct stasis_message *, message, NULL, ao2_cleanup); | ||||
|  | ||||
| 	if (!spyer) { | ||||
| 		ast_log(AST_LOG_WARNING, "Attempt to publish ChanSpy message for NULL spyer channel\n"); | ||||
| 		return; | ||||
| 	} | ||||
| 	blob = ast_json_null(); | ||||
| 	if (!blob) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	payload = ast_multi_channel_blob_create(blob); | ||||
| 	if (!payload) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if (pack_channel_into_message(spyer, "spyer_channel", payload)) { | ||||
| 		return; | ||||
| 	} | ||||
|  | ||||
| 	if (spyee) { | ||||
| 		if (pack_channel_into_message(spyee, "spyee_channel", payload)) { | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	message = stasis_message_create( | ||||
| 			start ? ast_channel_chanspy_start_type(): ast_channel_chanspy_stop_type(), | ||||
| 					payload); | ||||
| 	if (!message) { | ||||
| 		return; | ||||
| 	} | ||||
| 	stasis_publish(ast_channel_topic(spyer), message); | ||||
| } | ||||
|  | ||||
| static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_autochan, | ||||
| 	int *volfactor, int fd, struct spy_dtmf_options *user_options, struct ast_flags *flags, | ||||
| 	char *exitcontext) | ||||
| @@ -524,38 +595,22 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto | ||||
| 	struct ast_silence_generator *silgen = NULL; | ||||
| 	struct ast_autochan *spyee_bridge_autochan = NULL; | ||||
| 	const char *spyer_name; | ||||
| 	struct ast_channel *chans[] = { chan, spyee_autochan->chan }; | ||||
|  | ||||
| 	ast_channel_lock(chan); | ||||
| 	spyer_name = ast_strdupa(ast_channel_name(chan)); | ||||
| 	ast_channel_unlock(chan); | ||||
|  | ||||
| 	/* We now hold the channel lock on spyee */ | ||||
|  | ||||
| 	if (ast_check_hangup(chan) || ast_check_hangup(spyee_autochan->chan) || | ||||
| 			ast_test_flag(ast_channel_flags(spyee_autochan->chan), AST_FLAG_ZOMBIE)) { | ||||
| 		return 0; | ||||
| 	} | ||||
|  | ||||
| 	ast_channel_lock(chan); | ||||
| 	spyer_name = ast_strdupa(ast_channel_name(chan)); | ||||
| 	ast_channel_unlock(chan); | ||||
|  | ||||
| 	ast_channel_lock(spyee_autochan->chan); | ||||
| 	name = ast_strdupa(ast_channel_name(spyee_autochan->chan)); | ||||
| 	ast_channel_unlock(spyee_autochan->chan); | ||||
|  | ||||
| 	ast_verb(2, "Spying on channel %s\n", name); | ||||
| 	/*** DOCUMENTATION | ||||
| 		<managerEventInstance> | ||||
| 			<synopsis>Raised when a channel has started spying on another channel.</synopsis> | ||||
| 			<see-also> | ||||
| 				<ref type="application">ChanSpy</ref> | ||||
| 				<ref type="application">ExtenSpy</ref> | ||||
| 				<ref type="managerEvent">ChanSpyStop</ref> | ||||
| 			</see-also> | ||||
| 		</managerEventInstance> | ||||
| 	***/ | ||||
| 	ast_manager_event_multichan(EVENT_FLAG_CALL, "ChanSpyStart", 2, chans, | ||||
| 			"SpyerChannel: %s\r\n" | ||||
| 			"SpyeeChannel: %s\r\n", | ||||
| 			spyer_name, name); | ||||
| 	publish_chanspy_message(chan, spyee_autochan->chan, 1); | ||||
|  | ||||
| 	memset(&csth, 0, sizeof(csth)); | ||||
| 	ast_copy_flags(&csth.flags, flags, AST_FLAGS_ALL); | ||||
| @@ -740,15 +795,7 @@ static int channel_spy(struct ast_channel *chan, struct ast_autochan *spyee_auto | ||||
| 	} | ||||
|  | ||||
| 	ast_verb(2, "Done Spying on channel %s\n", name); | ||||
| 	/*** DOCUMENTATION | ||||
| 		<managerEventInstance> | ||||
| 			<synopsis>Raised when a channel has stopped spying on another channel.</synopsis> | ||||
| 			<see-also> | ||||
| 				<ref type="managerEvent">ChanSpyStart</ref> | ||||
| 			</see-also> | ||||
| 		</managerEventInstance> | ||||
| 	***/ | ||||
| 	ast_manager_event(chan, EVENT_FLAG_CALL, "ChanSpyStop", "SpyeeChannel: %s\r\n", name); | ||||
| 	publish_chanspy_message(chan, NULL, 0); | ||||
|  | ||||
| 	return running; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user