mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-05 20:20:07 +00:00
ari: expose channel driver's unique id to ARI channel resource
This change exposes the channel driver's unique id (i.e. the Call-ID for chan_sip/chan_pjsip based channels) to ARI channel resources as `protocol_id`. ASTERISK-30027 Reported by: Moritz Fain Tested by: Moritz Fain Change-Id: I7cc6e7a9d29efe74bc27811d788dac20fe559b87
This commit is contained in:
committed by
Friendly Automation
parent
91ab286086
commit
aaa14d3c7d
@@ -1273,7 +1273,7 @@ static const char *chan_pjsip_get_uniqueid(struct ast_channel *ast)
|
|||||||
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
|
struct ast_sip_channel_pvt *channel = ast_channel_tech_pvt(ast);
|
||||||
char *uniqueid = ast_threadstorage_get(&uniqueid_threadbuf, UNIQUEID_BUFSIZE);
|
char *uniqueid = ast_threadstorage_get(&uniqueid_threadbuf, UNIQUEID_BUFSIZE);
|
||||||
|
|
||||||
if (!uniqueid) {
|
if (!channel || !uniqueid) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -0,0 +1,7 @@
|
|||||||
|
Subject: ari
|
||||||
|
Subject: stasis_channels
|
||||||
|
|
||||||
|
Expose channel driver's unique id (which is the Call-ID for SIP/PJSIP)
|
||||||
|
to ARI channel resources as 'protocol_id'.
|
||||||
|
|
||||||
|
ASTERISK-30027
|
@@ -112,6 +112,7 @@ struct ast_channel_snapshot_base {
|
|||||||
);
|
);
|
||||||
struct timeval creationtime; /*!< The time of channel creation */
|
struct timeval creationtime; /*!< The time of channel creation */
|
||||||
int tech_properties; /*!< Properties of the channel's technology */
|
int tech_properties; /*!< Properties of the channel's technology */
|
||||||
|
AST_STRING_FIELD_EXTENDED(protocol_id); /*!< Channel driver protocol id (i.e. Call-ID for chan_sip/chan_pjsip) */
|
||||||
};
|
};
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@@ -587,6 +587,9 @@ void *ast_channel_tech_pvt(const struct ast_channel *chan)
|
|||||||
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
|
void ast_channel_tech_pvt_set(struct ast_channel *chan, void *value)
|
||||||
{
|
{
|
||||||
chan->tech_pvt = value;
|
chan->tech_pvt = value;
|
||||||
|
if (value != NULL) {
|
||||||
|
ast_channel_snapshot_invalidate_segment(chan, AST_CHANNEL_SNAPSHOT_INVALIDATE_BASE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void *ast_channel_timingdata(const struct ast_channel *chan)
|
void *ast_channel_timingdata(const struct ast_channel *chan)
|
||||||
{
|
{
|
||||||
|
@@ -273,7 +273,7 @@ static struct ast_channel_snapshot_base *channel_snapshot_base_create(struct ast
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ast_string_field_init(snapshot, 256)) {
|
if (ast_string_field_init(snapshot, 256) || ast_string_field_init_extended(snapshot, protocol_id)) {
|
||||||
ao2_ref(snapshot, -1);
|
ao2_ref(snapshot, -1);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -288,6 +288,10 @@ static struct ast_channel_snapshot_base *channel_snapshot_base_create(struct ast
|
|||||||
snapshot->creationtime = ast_channel_creationtime(chan);
|
snapshot->creationtime = ast_channel_creationtime(chan);
|
||||||
snapshot->tech_properties = ast_channel_tech(chan)->properties;
|
snapshot->tech_properties = ast_channel_tech(chan)->properties;
|
||||||
|
|
||||||
|
if (ast_channel_tech(chan)->get_pvt_uniqueid) {
|
||||||
|
ast_string_field_set(snapshot, protocol_id, ast_channel_tech(chan)->get_pvt_uniqueid(chan));
|
||||||
|
}
|
||||||
|
|
||||||
return snapshot;
|
return snapshot;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1266,14 +1270,15 @@ struct ast_json *ast_channel_snapshot_to_json(
|
|||||||
}
|
}
|
||||||
|
|
||||||
json_chan = ast_json_pack(
|
json_chan = ast_json_pack(
|
||||||
/* Broken up into groups of three for readability */
|
/* Broken up into groups for readability */
|
||||||
"{ s: s, s: s, s: s,"
|
"{ s: s, s: s, s: s, s: s,"
|
||||||
" s: o, s: o, s: s,"
|
" s: o, s: o, s: s,"
|
||||||
" s: o, s: o, s: s }",
|
" s: o, s: o, s: s }",
|
||||||
/* First line */
|
/* First line */
|
||||||
"id", snapshot->base->uniqueid,
|
"id", snapshot->base->uniqueid,
|
||||||
"name", snapshot->base->name,
|
"name", snapshot->base->name,
|
||||||
"state", ast_state2str(snapshot->state),
|
"state", ast_state2str(snapshot->state),
|
||||||
|
"protocol_id", snapshot->base->protocol_id,
|
||||||
/* Second line */
|
/* Second line */
|
||||||
"caller", ast_json_name_number(
|
"caller", ast_json_name_number(
|
||||||
snapshot->caller->name, snapshot->caller->number),
|
snapshot->caller->name, snapshot->caller->number),
|
||||||
|
@@ -1043,6 +1043,7 @@ int ast_ari_validate_channel(struct ast_json *json)
|
|||||||
int has_id = 0;
|
int has_id = 0;
|
||||||
int has_language = 0;
|
int has_language = 0;
|
||||||
int has_name = 0;
|
int has_name = 0;
|
||||||
|
int has_protocol_id = 0;
|
||||||
int has_state = 0;
|
int has_state = 0;
|
||||||
|
|
||||||
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
|
for (iter = ast_json_object_iter(json); iter; iter = ast_json_object_iter_next(json, iter)) {
|
||||||
@@ -1135,6 +1136,16 @@ int ast_ari_validate_channel(struct ast_json *json)
|
|||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
|
if (strcmp("protocol_id", ast_json_object_iter_key(iter)) == 0) {
|
||||||
|
int prop_is_valid;
|
||||||
|
has_protocol_id = 1;
|
||||||
|
prop_is_valid = ast_ari_validate_string(
|
||||||
|
ast_json_object_iter_value(iter));
|
||||||
|
if (!prop_is_valid) {
|
||||||
|
ast_log(LOG_ERROR, "ARI Channel field protocol_id failed validation\n");
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
} else
|
||||||
if (strcmp("state", ast_json_object_iter_key(iter)) == 0) {
|
if (strcmp("state", ast_json_object_iter_key(iter)) == 0) {
|
||||||
int prop_is_valid;
|
int prop_is_valid;
|
||||||
has_state = 1;
|
has_state = 1;
|
||||||
@@ -1193,6 +1204,11 @@ int ast_ari_validate_channel(struct ast_json *json)
|
|||||||
res = 0;
|
res = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!has_protocol_id) {
|
||||||
|
ast_log(LOG_ERROR, "ARI Channel missing required field protocol_id\n");
|
||||||
|
res = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!has_state) {
|
if (!has_state) {
|
||||||
ast_log(LOG_ERROR, "ARI Channel missing required field state\n");
|
ast_log(LOG_ERROR, "ARI Channel missing required field state\n");
|
||||||
res = 0;
|
res = 0;
|
||||||
|
@@ -1353,6 +1353,7 @@ ari_validator ast_ari_validate_application_fn(void);
|
|||||||
* - id: string (required)
|
* - id: string (required)
|
||||||
* - language: string (required)
|
* - language: string (required)
|
||||||
* - name: string (required)
|
* - name: string (required)
|
||||||
|
* - protocol_id: string (required)
|
||||||
* - state: string (required)
|
* - state: string (required)
|
||||||
* Dialed
|
* Dialed
|
||||||
* DialplanCEP
|
* DialplanCEP
|
||||||
|
@@ -2126,6 +2126,11 @@
|
|||||||
"type": "string",
|
"type": "string",
|
||||||
"description": "Unique identifier of the channel.\n\nThis is the same as the Uniqueid field in AMI."
|
"description": "Unique identifier of the channel.\n\nThis is the same as the Uniqueid field in AMI."
|
||||||
},
|
},
|
||||||
|
"protocol_id": {
|
||||||
|
"required": true,
|
||||||
|
"type": "string",
|
||||||
|
"description": "Protocol id from underlying channel driver (i.e. Call-ID for chan_sip/chan_pjsip; will be empty if not applicable or not implemented by driver)."
|
||||||
|
},
|
||||||
"name": {
|
"name": {
|
||||||
"required": true,
|
"required": true,
|
||||||
"type": "string",
|
"type": "string",
|
||||||
|
@@ -273,7 +273,7 @@ AST_TEST_DEFINE(channel_snapshot_json)
|
|||||||
ast_test_validate(test, NULL != snapshot);
|
ast_test_validate(test, NULL != snapshot);
|
||||||
|
|
||||||
actual = ast_channel_snapshot_to_json(snapshot, NULL);
|
actual = ast_channel_snapshot_to_json(snapshot, NULL);
|
||||||
expected = ast_json_pack("{ s: s, s: s, s: s, s: s,"
|
expected = ast_json_pack("{ s: s, s: s, s: s, s: s, s: s,"
|
||||||
" s: { s: s, s: s, s: i, s: s, s: s },"
|
" s: { s: s, s: s, s: i, s: s, s: s },"
|
||||||
" s: { s: s, s: s },"
|
" s: { s: s, s: s },"
|
||||||
" s: { s: s, s: s },"
|
" s: { s: s, s: s },"
|
||||||
@@ -284,6 +284,7 @@ AST_TEST_DEFINE(channel_snapshot_json)
|
|||||||
"state", "Down",
|
"state", "Down",
|
||||||
"accountcode", "acctcode",
|
"accountcode", "acctcode",
|
||||||
"id", ast_channel_uniqueid(chan),
|
"id", ast_channel_uniqueid(chan),
|
||||||
|
"protocol_id", "",
|
||||||
"dialplan",
|
"dialplan",
|
||||||
"context", "context",
|
"context", "context",
|
||||||
"exten", "exten",
|
"exten", "exten",
|
||||||
|
Reference in New Issue
Block a user