summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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));