Asterisk - The Open Source Telephony Project GIT-master-0644429
stasis_system.c
Go to the documentation of this file.
1/*
2 * Asterisk -- An open source telephony toolkit.
3 *
4 * Copyright (C) 2013, Digium, Inc.
5 *
6 * Jason Parker <jparker@digium.com>
7 *
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
13 *
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
17 */
18
19/*! \file
20 *
21 * \brief Stasis Messages and Data Types for System events
22 *
23 * \author Jason Parker <jparker@digium.com>
24 */
25
26/*** MODULEINFO
27 <support_level>core</support_level>
28 ***/
29
30#include "asterisk.h"
31
32#include "asterisk/astobj2.h"
33#include "asterisk/stasis.h"
35
36/*** DOCUMENTATION
37 <managerEvent language="en_US" name="Registry">
38 <managerEventInstance class="EVENT_FLAG_SYSTEM">
39 <synopsis>Raised when an outbound registration completes.</synopsis>
40 <syntax>
41 <parameter name="ChannelType">
42 <para>The type of channel that was registered (or not).</para>
43 </parameter>
44 <parameter name="Username">
45 <para>The username portion of the registration.</para>
46 </parameter>
47 <parameter name="Domain">
48 <para>The address portion of the registration.</para>
49 </parameter>
50 <parameter name="Status">
51 <para>The status of the registration request.</para>
52 <enumlist>
53 <enum name="Registered"/>
54 <enum name="Unregistered"/>
55 <enum name="Rejected"/>
56 <enum name="Failed"/>
57 </enumlist>
58 </parameter>
59 <parameter name="Cause">
60 <para>What caused the rejection of the request, if available.</para>
61 </parameter>
62 </syntax>
63 </managerEventInstance>
64 </managerEvent>
65 ***/
66
67/*! \brief The \ref stasis topic for system level changes */
69
81
85 );
88 );
91 );
94 );
97 );
100 );
103 );
106 );
109 );
112 );
115 );
117
118void ast_system_publish_registry(const char *channeltype, const char *username, const char *domain, const char *status, const char *cause)
119{
120 struct ast_json *registry;
121 struct ast_json_payload *payload;
122 struct stasis_message *message;
123
125 return;
126 }
127
128 registry = ast_json_pack("{s: s, s: s, s: s, s: s, s: s, s: s}",
129 "type", "registry",
130 "channeltype", channeltype,
131 "username", username,
132 "domain", domain,
133 "status", status,
134 "cause", S_OR(cause, ""));
135
136 payload = ast_json_payload_create(registry);
137 ast_json_unref(registry);
138 if (!payload) {
139 return;
140 }
141
143 ao2_ref(payload, -1);
144 if (!message) {
145 return;
146 }
147
149 ao2_ref(message, -1);
150}
151
153{
155 const char *channeltype;
156 const char *username;
157 const char *domain;
158 const char *status;
159 const char *cause;
160 RAII_VAR(struct ast_str *, cause_string, ast_str_create(32), ast_free);
161
162 if (!cause_string) {
163 return NULL;
164 }
165
166 channeltype = ast_json_string_get(ast_json_object_get(payload->json, "channeltype"));
167 username = ast_json_string_get(ast_json_object_get(payload->json, "username"));
168 domain = ast_json_string_get(ast_json_object_get(payload->json, "domain"));
169 status = ast_json_string_get(ast_json_object_get(payload->json, "status"));
170 cause = ast_json_string_get(ast_json_object_get(payload->json, "cause"));
171
172 if (!ast_strlen_zero(cause)) {
173 ast_str_set(&cause_string, 0, "Cause: %s\r\n", cause);
174 }
175
177 "ChannelType: %s\r\n"
178 "Username: %s\r\n"
179 "Domain: %s\r\n"
180 "Status: %s\r\n"
181 "%s",
182 channeltype, username, domain, status, ast_str_buffer(cause_string));
183}
184
186{
188 int core_id;
189 const char *callee;
190 const char *service;
191
192 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
193 callee = ast_json_string_get(ast_json_object_get(payload->json, "callee"));
194 service = ast_json_string_get(ast_json_object_get(payload->json, "service"));
195
196 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCAvailable",
197 "CoreID: %d\r\n"
198 "Callee: %s\r\n"
199 "Service: %s\r\n",
200 core_id, callee, service);
201}
202
204{
206 int core_id;
207 const char *caller;
208 unsigned int expires;
209
210 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
211 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
212 expires = ast_json_integer_get(ast_json_object_get(payload->json, "expires"));
213
214 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCOfferTimerStart",
215 "CoreID: %d\r\n"
216 "Caller: %s\r\n"
217 "Expires: %u\r\n",
218 core_id, caller, expires);
219}
220
222{
224 int core_id;
225 const char *caller;
226 const char *callee;
227
228 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
229 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
230 callee = ast_json_string_get(ast_json_object_get(payload->json, "callee"));
231
232 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCRequested",
233 "CoreID: %d\r\n"
234 "Caller: %s\r\n"
235 "Callee: %s\r\n",
236 core_id, caller, callee);
237}
238
240{
242 int core_id;
243 const char *caller;
244
245 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
246 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
247
248 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCRequestAcknowledged",
249 "CoreID: %d\r\n"
250 "Caller: %s\r\n",
251 core_id, caller);
252}
253
255{
257 int core_id;
258 const char *caller;
259
260 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
261 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
262
263 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCCallerStopMonitoring",
264 "CoreID: %d\r\n"
265 "Caller: %s\r\n",
266 core_id, caller);
267}
268
270{
272 int core_id;
273 const char *caller;
274
275 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
276 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
277
278 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCCallerStartMonitoring",
279 "CoreID: %d\r\n"
280 "Caller: %s\r\n",
281 core_id, caller);
282}
283
285{
287 int core_id;
288 const char *caller;
289
290 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
291 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
292
293 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCCallerRecalling",
294 "CoreID: %d\r\n"
295 "Caller: %s\r\n",
296 core_id, caller);
297}
298
300{
302 int core_id;
303 const char *caller;
304
305 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
306 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
307
308 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCRecallComplete",
309 "CoreID: %d\r\n"
310 "Caller: %s\r\n",
311 core_id, caller);
312}
313
315{
317 int core_id;
318 const char *caller;
319 const char *reason;
320
321 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
322 caller = ast_json_string_get(ast_json_object_get(payload->json, "caller"));
323 reason = ast_json_string_get(ast_json_object_get(payload->json, "reason"));
324
326 "CoreID: %d\r\n"
327 "Caller: %s\r\n"
328 "Reason: %s\r\n",
329 core_id, caller, reason);
330}
331
333{
335 int core_id;
336 const char *callee;
337
338 core_id = ast_json_integer_get(ast_json_object_get(payload->json, "core_id"));
339 callee = ast_json_string_get(ast_json_object_get(payload->json, "callee"));
340
341 return ast_manager_event_blob_create(EVENT_FLAG_CC, "CCMonitorFailed",
342 "CoreID: %d\r\n"
343 "Callee: %s\r\n",
344 core_id, callee);
345}
346
348{
349 return system_topic;
350}
351
352/*! \brief Cleanup the \ref stasis system level items */
353static void stasis_system_cleanup(void)
354{
370}
371
372/*! \brief Initialize the system level items for \ref stasis */
374{
376
377 system_topic = stasis_topic_create("system:all");
378 if (!system_topic) {
379 return 1;
380 }
381
383 return -1;
384 }
385
387 return -1;
388 }
389
391 return -1;
392 }
393
395 return -1;
396 }
397
399 return -1;
400 }
401
403 return -1;
404 }
405
407 return -1;
408 }
409
411 return -1;
412 }
413
415 return -1;
416 }
417
419 return -1;
420 }
421
423 return -1;
424 }
425
427 return -1;
428 }
429
431 return -1;
432 }
433
434 return 0;
435}
jack_status_t status
Definition: app_jack.c:146
Asterisk main include file. File version handling, generic pbx functions.
int ast_register_cleanup(void(*func)(void))
Register a function to be executed before Asterisk gracefully exits.
Definition: clicompat.c:19
#define ast_free(a)
Definition: astmm.h:180
#define ao2_cleanup(obj)
Definition: astobj2.h:1934
#define ao2_ref(o, delta)
Reference/unreference an object and return the old refcount.
Definition: astobj2.h:459
enum ast_cc_service_type service
Definition: ccss.c:383
void ast_json_unref(struct ast_json *value)
Decrease refcount on value. If refcount reaches zero, value is freed.
Definition: json.c:73
struct ast_json_payload * ast_json_payload_create(struct ast_json *json)
Create an ao2 object to pass json blobs as data payloads for stasis.
Definition: json.c:756
struct ast_json * ast_json_pack(char const *format,...)
Helper for creating complex JSON values.
Definition: json.c:612
const char * ast_json_string_get(const struct ast_json *string)
Get the value of a JSON string.
Definition: json.c:283
struct ast_json * ast_json_object_get(struct ast_json *object, const char *key)
Get a field from a JSON object.
Definition: json.c:407
intmax_t ast_json_integer_get(const struct ast_json *integer)
Get the value from a JSON integer.
Definition: json.c:332
#define EVENT_FLAG_SYSTEM
Definition: manager.h:75
struct ast_manager_event_blob * ast_manager_event_blob_create(int event_flags, const char *manager_event, const char *extra_fields_fmt,...)
Construct a ast_manager_event_blob.
Definition: manager.c:10126
#define EVENT_FLAG_CC
Definition: manager.h:90
static void to_ami(struct ast_sip_subscription *sub, struct ast_str **buf)
#define NULL
Definition: resample.c:96
Stasis Message Bus API. See Stasis Message Bus API for detailed documentation.
#define STASIS_MESSAGE_TYPE_CLEANUP(name)
Boiler-plate messaging macro for cleaning up message types.
Definition: stasis.h:1515
struct stasis_topic * stasis_topic_create(const char *name)
Create a new topic.
Definition: stasis.c:618
#define STASIS_MESSAGE_TYPE_INIT(name)
Boiler-plate messaging macro for initializing message types.
Definition: stasis.h:1493
void * stasis_message_data(const struct stasis_message *msg)
Get the data contained in a message.
struct stasis_message * stasis_message_create(struct stasis_message_type *type, void *data)
Create a new message.
void stasis_publish(struct stasis_topic *topic, struct stasis_message *message)
Publish a message to a topic's subscribers.
Definition: stasis.c:1512
void ast_system_publish_registry(const char *channeltype, const char *username, const char *domain, const char *status, const char *cause)
Publish a channel driver outgoing registration message.
static struct ast_manager_event_blob * system_registry_to_ami(struct stasis_message *message)
struct stasis_topic * ast_system_topic(void)
A Stasis Message Bus API topic which publishes messages regarding system changes.
static struct ast_manager_event_blob * cc_offertimerstart_to_ami(struct stasis_message *message)
static struct ast_manager_event_blob * cc_callerrecalling_to_ami(struct stasis_message *message)
static struct ast_manager_event_blob * cc_requested_to_ami(struct stasis_message *message)
static struct stasis_topic * system_topic
The Stasis Message Bus API topic for system level changes.
Definition: stasis_system.c:68
static struct ast_manager_event_blob * cc_callerstopmonitoring_to_ami(struct stasis_message *message)
static struct ast_manager_event_blob * cc_monitorfailed_to_ami(struct stasis_message *message)
static struct ast_manager_event_blob * cc_callerstartmonitoring_to_ami(struct stasis_message *message)
static struct ast_manager_event_blob * cc_available_to_ami(struct stasis_message *message)
STASIS_MESSAGE_TYPE_DEFN(ast_network_change_type)
static struct ast_manager_event_blob * cc_failure_to_ami(struct stasis_message *message)
int ast_stasis_system_init(void)
Initialize the system level items for Stasis Message Bus API.
static struct ast_manager_event_blob * cc_requestacknowledged_to_ami(struct stasis_message *message)
static void stasis_system_cleanup(void)
Cleanup the Stasis Message Bus API system level items.
static struct ast_manager_event_blob * cc_recallcomplete_to_ami(struct stasis_message *message)
struct stasis_message_type * ast_cc_monitorfailed_type(void)
A stasis_message_type for CCSS Monitor Failed messages.
struct stasis_message_type * ast_cc_recallcomplete_type(void)
A stasis_message_type for CCSS Recall Complete messages.
struct stasis_message_type * ast_system_registry_type(void)
A stasis_message_type for outbound registration.
struct stasis_message_type * ast_cc_callerrecalling_type(void)
A stasis_message_type for CCSS Caller Recalling messages.
struct stasis_message_type * ast_cluster_discovery_type(void)
A stasis_message_type for Cluster discovery.
struct stasis_message_type * ast_cc_failure_type(void)
A stasis_message_type for CCSS Failure messages.
struct stasis_message_type * ast_cc_callerstopmonitoring_type(void)
A stasis_message_type for CCSS Caller Stop Monitoring messages.
struct stasis_message_type * ast_cc_available_type(void)
A stasis_message_type for CCSS Available messages.
struct stasis_message_type * ast_cc_requestacknowledged_type(void)
A stasis_message_type for CCSS Request Acknowledged messages.
struct stasis_message_type * ast_network_change_type(void)
A stasis_message_type for network changes.
struct stasis_message_type * ast_cc_callerstartmonitoring_type(void)
A stasis_message_type for CCSS Caller Start Monitoring messages.
struct stasis_message_type * ast_cc_offertimerstart_type(void)
A stasis_message_type for CCSS Offer Timer Start messages.
struct stasis_message_type * ast_cc_requested_type(void)
A stasis_message_type for CCSS Requested messages.
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:761
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one.
Definition: strings.h:80
static force_inline int attribute_pure ast_strlen_zero(const char *s)
Definition: strings.h:65
#define ast_str_create(init_len)
Create a malloc'ed dynamic length string.
Definition: strings.h:659
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1113
struct ast_json * json
Definition: json.h:1083
Abstract JSON element (object, array, string, int, ...).
Struct containing info for an AMI event to send out.
Definition: manager.h:502
Support for dynamic strings.
Definition: strings.h:623
#define RAII_VAR(vartype, varname, initval, dtor)
Declare a variable that will call a destructor function when it goes out of scope.
Definition: utils.h:941