summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Jordan <mjordan@digium.com>2016-10-15 20:05:05 -0500
committerGeorge Joseph <gjoseph@digium.com>2016-10-17 08:13:46 -0500
commit42cfdcd1b700af157746b897dc04362e853065c0 (patch)
tree4483bc91f3c3ce79b8f109bc4863b2e99a96e8e4
parentd1d446b23795baa73969f725a1231dff6e0b0538 (diff)
res/ari: Add the Asterisk EID field to outgoing events
This patch adds the Asterisk EID field to all outgoing ARI events. Because this field should be added to all events as they are transmitted, it is appended to the JSON message just prior to it being handed off to the application message handler. This makes it somewhat resilient to both new events being added to ARI, as well as other potential event transport mechanisms. ASTERISK-26470 #close Change-Id: Ieff0ecc24464e83f3f44e9c3e7bd9a5d70b87a1d
-rw-r--r--CHANGES7
-rw-r--r--res/ari/ari_model_validators.c342
-rw-r--r--res/ari/ari_model_validators.h38
-rw-r--r--res/stasis/app.c7
-rw-r--r--rest-api/api-docs/events.json5
-rw-r--r--tests/test_res_stasis.c6
6 files changed, 403 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index 11b357419..12bc4677c 100644
--- a/CHANGES
+++ b/CHANGES
@@ -89,6 +89,13 @@ app_dial
when another channel answers the call. The default of ANSWERED_ELSEWHERE
is unchanged.
+res_ari
+------------------
+ * ARI events will all now include a new field in the root of the JSON message,
+ 'asterisk_id'. This will be the unique ID for the Asterisk system
+ transmitting the event. The value can be overridden using the 'entityid'
+ setting in asterisk.conf.
+
------------------------------------------------------------------------------
--- Functionality changes from Asterisk 13.10.0 to Asterisk 13.11.0 ----------
------------------------------------------------------------------------------
diff --git a/res/ari/ari_model_validators.c b/res/ari/ari_model_validators.c
index 389f83b09..8874b2451 100644
--- a/res/ari/ari_model_validators.c
+++ b/res/ari/ari_model_validators.c
@@ -1932,6 +1932,15 @@ int ast_ari_validate_application_replaced(struct ast_json *json)
int has_application = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ApplicationReplaced field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2000,6 +2009,15 @@ int ast_ari_validate_bridge_attended_transfer(struct ast_json *json)
int has_transferer_second_leg = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI BridgeAttendedTransfer field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2242,6 +2260,15 @@ int ast_ari_validate_bridge_blind_transfer(struct ast_json *json)
int has_result = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI BridgeBlindTransfer field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2408,6 +2435,15 @@ int ast_ari_validate_bridge_created(struct ast_json *json)
int has_bridge = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI BridgeCreated field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2487,6 +2523,15 @@ int ast_ari_validate_bridge_destroyed(struct ast_json *json)
int has_bridge = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI BridgeDestroyed field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2567,6 +2612,15 @@ int ast_ari_validate_bridge_merged(struct ast_json *json)
int has_bridge_from = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI BridgeMerged field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2663,6 +2717,15 @@ int ast_ari_validate_channel_caller_id(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelCallerId field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2772,6 +2835,15 @@ int ast_ari_validate_channel_connected_line(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelConnectedLine field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2851,6 +2923,15 @@ int ast_ari_validate_channel_created(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelCreated field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -2932,6 +3013,15 @@ int ast_ari_validate_channel_destroyed(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelDestroyed field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3043,6 +3133,15 @@ int ast_ari_validate_channel_dialplan(struct ast_json *json)
int has_dialplan_app_data = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelDialplan field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3154,6 +3253,15 @@ int ast_ari_validate_channel_dtmf_received(struct ast_json *json)
int has_duration_ms = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelDtmfReceived field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3263,6 +3371,15 @@ int ast_ari_validate_channel_entered_bridge(struct ast_json *json)
int has_bridge = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelEnteredBridge field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3351,6 +3468,15 @@ int ast_ari_validate_channel_hangup_request(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelHangupRequest field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3448,6 +3574,15 @@ int ast_ari_validate_channel_hold(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelHold field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3537,6 +3672,15 @@ int ast_ari_validate_channel_left_bridge(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelLeftBridge field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3631,6 +3775,15 @@ int ast_ari_validate_channel_state_change(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelStateChange field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3711,6 +3864,15 @@ int ast_ari_validate_channel_talking_finished(struct ast_json *json)
int has_duration = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelTalkingFinished field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3805,6 +3967,15 @@ int ast_ari_validate_channel_talking_started(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelTalkingStarted field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3884,6 +4055,15 @@ int ast_ari_validate_channel_unhold(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelUnhold field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -3964,6 +4144,15 @@ int ast_ari_validate_channel_userevent(struct ast_json *json)
int has_userevent = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelUserevent field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4086,6 +4275,15 @@ int ast_ari_validate_channel_varset(struct ast_json *json)
int has_variable = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ChannelVarset field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4269,6 +4467,15 @@ int ast_ari_validate_contact_status_change(struct ast_json *json)
int has_endpoint = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI ContactStatusChange field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4363,6 +4570,15 @@ int ast_ari_validate_device_state_changed(struct ast_json *json)
int has_device_state = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI DeviceStateChanged field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4443,6 +4659,15 @@ int ast_ari_validate_dial(struct ast_json *json)
int has_peer = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI Dial field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4573,6 +4798,15 @@ int ast_ari_validate_endpoint_state_change(struct ast_json *json)
int has_endpoint = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI EndpointStateChange field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4772,6 +5006,15 @@ int ast_ari_validate_event(struct ast_json *json)
}
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI Event field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -4961,6 +5204,15 @@ int ast_ari_validate_message(struct ast_json *json)
}
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI Message field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5000,6 +5252,15 @@ int ast_ari_validate_missing_params(struct ast_json *json)
int has_params = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI MissingParams field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5131,6 +5392,15 @@ int ast_ari_validate_peer_status_change(struct ast_json *json)
int has_peer = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI PeerStatusChange field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5225,6 +5495,15 @@ int ast_ari_validate_playback_finished(struct ast_json *json)
int has_playback = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI PlaybackFinished field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5304,6 +5583,15 @@ int ast_ari_validate_playback_started(struct ast_json *json)
int has_playback = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI PlaybackStarted field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5383,6 +5671,15 @@ int ast_ari_validate_recording_failed(struct ast_json *json)
int has_recording = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI RecordingFailed field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5462,6 +5759,15 @@ int ast_ari_validate_recording_finished(struct ast_json *json)
int has_recording = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI RecordingFinished field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5541,6 +5847,15 @@ int ast_ari_validate_recording_started(struct ast_json *json)
int has_recording = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI RecordingStarted field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5620,6 +5935,15 @@ int ast_ari_validate_stasis_end(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI StasisEnd field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5700,6 +6024,15 @@ int ast_ari_validate_stasis_start(struct ast_json *json)
int has_channel = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI StasisStart field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
@@ -5804,6 +6137,15 @@ int ast_ari_validate_text_message_received(struct ast_json *json)
int has_message = 0;
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
+ if (strcmp("asterisk_id", ast_json_object_iter_key(iter)) == 0) {
+ int prop_is_valid;
+ prop_is_valid = ast_ari_validate_string(
+ ast_json_object_iter_value(iter));
+ if (!prop_is_valid) {
+ ast_log(LOG_ERROR, "ARI TextMessageReceived field asterisk_id failed validation\n");
+ res = 0;
+ }
+ } else
if (strcmp("type", ast_json_object_iter_key(iter)) == 0) {
int prop_is_valid;
has_type = 1;
diff --git a/res/ari/ari_model_validators.h b/res/ari/ari_model_validators.h
index 0bcdb0fa2..750518383 100644
--- a/res/ari/ari_model_validators.h
+++ b/res/ari/ari_model_validators.h
@@ -1467,10 +1467,12 @@ ari_validator ast_ari_validate_application_fn(void);
* - new_messages: int (required)
* - old_messages: int (required)
* ApplicationReplaced
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* BridgeAttendedTransfer
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1491,6 +1493,7 @@ ari_validator ast_ari_validate_application_fn(void);
* - transferer_second_leg: Channel (required)
* - transferer_second_leg_bridge: Bridge
* BridgeBlindTransfer
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1503,22 +1506,26 @@ ari_validator ast_ari_validate_application_fn(void);
* - result: string (required)
* - transferee: Channel
* BridgeCreated
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - bridge: Bridge (required)
* BridgeDestroyed
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - bridge: Bridge (required)
* BridgeMerged
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - bridge: Bridge (required)
* - bridge_from: Bridge (required)
* ChannelCallerId
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1526,16 +1533,19 @@ ari_validator ast_ari_validate_application_fn(void);
* - caller_presentation_txt: string (required)
* - channel: Channel (required)
* ChannelConnectedLine
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* ChannelCreated
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* ChannelDestroyed
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1543,6 +1553,7 @@ ari_validator ast_ari_validate_application_fn(void);
* - cause_txt: string (required)
* - channel: Channel (required)
* ChannelDialplan
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1550,6 +1561,7 @@ ari_validator ast_ari_validate_application_fn(void);
* - dialplan_app: string (required)
* - dialplan_app_data: string (required)
* ChannelDtmfReceived
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1557,12 +1569,14 @@ ari_validator ast_ari_validate_application_fn(void);
* - digit: string (required)
* - duration_ms: int (required)
* ChannelEnteredBridge
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - bridge: Bridge (required)
* - channel: Channel
* ChannelHangupRequest
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1570,39 +1584,46 @@ ari_validator ast_ari_validate_application_fn(void);
* - channel: Channel (required)
* - soft: boolean
* ChannelHold
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* - musicclass: string
* ChannelLeftBridge
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - bridge: Bridge (required)
* - channel: Channel (required)
* ChannelStateChange
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* ChannelTalkingFinished
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* - duration: int (required)
* ChannelTalkingStarted
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* ChannelUnhold
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* ChannelUserevent
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1612,6 +1633,7 @@ ari_validator ast_ari_validate_application_fn(void);
* - eventname: string (required)
* - userevent: object (required)
* ChannelVarset
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1624,17 +1646,20 @@ ari_validator ast_ari_validate_application_fn(void);
* - roundtrip_usec: string
* - uri: string (required)
* ContactStatusChange
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - contact_info: ContactInfo (required)
* - endpoint: Endpoint (required)
* DeviceStateChanged
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - device_state: DeviceState (required)
* Dial
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1645,17 +1670,21 @@ ari_validator ast_ari_validate_application_fn(void);
* - forwarded: Channel
* - peer: Channel (required)
* EndpointStateChange
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - endpoint: Endpoint (required)
* Event
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* Message
+ * - asterisk_id: string
* - type: string (required)
* MissingParams
+ * - asterisk_id: string
* - type: string (required)
* - params: List[string] (required)
* Peer
@@ -1665,42 +1694,50 @@ ari_validator ast_ari_validate_application_fn(void);
* - port: string
* - time: string
* PeerStatusChange
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - endpoint: Endpoint (required)
* - peer: Peer (required)
* PlaybackFinished
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - playback: Playback (required)
* PlaybackStarted
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - playback: Playback (required)
* RecordingFailed
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - recording: LiveRecording (required)
* RecordingFinished
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - recording: LiveRecording (required)
* RecordingStarted
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - recording: LiveRecording (required)
* StasisEnd
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
* - channel: Channel (required)
* StasisStart
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
@@ -1708,6 +1745,7 @@ ari_validator ast_ari_validate_application_fn(void);
* - channel: Channel (required)
* - replace_channel: Channel
* TextMessageReceived
+ * - asterisk_id: string
* - type: string (required)
* - application: string (required)
* - timestamp: Date
diff --git a/res/stasis/app.c b/res/stasis/app.c
index 957ed7f69..2689e5edf 100644
--- a/res/stasis/app.c
+++ b/res/stasis/app.c
@@ -930,8 +930,15 @@ struct stasis_topic *ast_app_get_topic(struct stasis_app *app)
void app_send(struct stasis_app *app, struct ast_json *message)
{
stasis_app_cb handler;
+ char eid[20];
RAII_VAR(void *, data, NULL, ao2_cleanup);
+ if (ast_json_object_set(message, "asterisk_id", ast_json_string_create(
+ ast_eid_to_str(eid, sizeof(eid), &ast_eid_default)))) {
+ ast_log(AST_LOG_WARNING, "Failed to append EID to outgoing event %s\n",
+ ast_json_string_get(ast_json_object_get(message, "type")));
+ }
+
/* Copy off mutable state with lock held */
{
SCOPED_AO2LOCK(lock, app);
diff --git a/rest-api/api-docs/events.json b/rest-api/api-docs/events.json
index 464e06faf..1fd65e5b9 100644
--- a/rest-api/api-docs/events.json
+++ b/rest-api/api-docs/events.json
@@ -110,6 +110,11 @@
"type": "string",
"required": true,
"description": "Indicates the type of this message."
+ },
+ "asterisk_id": {
+ "type": "string",
+ "required": false,
+ "description": "The unique ID for the Asterisk instance that raised this event."
}
},
"subTypes": [
diff --git a/tests/test_res_stasis.c b/tests/test_res_stasis.c
index 5865f0951..805634f26 100644
--- a/tests/test_res_stasis.c
+++ b/tests/test_res_stasis.c
@@ -137,6 +137,7 @@ AST_TEST_DEFINE(app_replaced)
RAII_VAR(struct ast_json *, expected_message1, NULL, ast_json_unref);
RAII_VAR(struct ast_json *, message, NULL, ast_json_unref);
RAII_VAR(struct ast_json *, expected_message2, NULL, ast_json_unref);
+ char eid[20];
int res;
switch (cmd) {
@@ -157,9 +158,10 @@ AST_TEST_DEFINE(app_replaced)
stasis_app_register(app_name, test_handler, app_data1);
stasis_app_register(app_name, test_handler, app_data2);
- expected_message1 = ast_json_pack("[{s: s, s: s}]",
+ expected_message1 = ast_json_pack("[{s: s, s: s, s: s}]",
"type", "ApplicationReplaced",
- "application", app_name);
+ "application", app_name,
+ "asterisk_id", ast_eid_to_str(eid, sizeof(eid), &ast_eid_default));
message = ast_json_pack("{ s: o }", "test-message", ast_json_null());
expected_message2 = ast_json_pack("[o]", ast_json_ref(message));