978151ab1b62d3f91a00f4545872363a1001cdfa
[asterisk/asterisk.git] / include / asterisk / manager.h
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@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 #ifndef _ASTERISK_MANAGER_H
20 #define _ASTERISK_MANAGER_H
21
22 #include "asterisk/network.h"
23 #include "asterisk/lock.h"
24 #include "asterisk/datastore.h"
25 #include "asterisk/xmldoc.h"
26
27 /*!
28  \file
29  \brief The AMI - Asterisk Manager Interface - is a TCP protocol created to
30  manage Asterisk with third-party software.
31
32  Manager protocol packages are text fields of the form a: b.  There is
33  always exactly one space after the colon.
34
35 \verbatim
36
37  For Actions replies, the first line of the reply is a "Response:" header with
38  values "success", "error" or "follows". "Follows" implies that the
39  response is coming as separate events with the same ActionID. If the
40  Action request has no ActionID, it will be hard matching events
41  to the Action request in the manager client.
42
43  The first header type is the "Event" header.  Other headers vary from
44  event to event.  Headers end with standard \\r\\n termination.
45  The last line of the manager response or event is an empty line.
46  (\\r\\n)
47
48 \endverbatim
49
50  \note Please try to \b re-use \b existing \b headers to simplify manager message parsing in clients.
51     Don't re-use an existing header with a new meaning, please.
52     You can find a reference of standard headers in doc/manager.txt
53
54 - \ref manager.c Main manager code file
55  */
56
57 #define AMI_VERSION                     "2.3.0"
58 #define DEFAULT_MANAGER_PORT 5038       /* Default port for Asterisk management via TCP */
59 #define DEFAULT_MANAGER_TLS_PORT 5039   /* Default port for Asterisk management via TCP */
60
61 /*! \name Constant return values
62  *\note Currently, returning anything other than zero causes the session to terminate.
63  */
64 /*@{ */
65 #define AMI_SUCCESS     (0)
66 #define AMI_DESTROY     (-1)
67 /*@} */
68
69 /*! \name Manager event classes */
70 /*@{ */
71 #define EVENT_FLAG_SYSTEM           (1 << 0) /* System events such as module load/unload */
72 #define EVENT_FLAG_CALL             (1 << 1) /* Call event, such as state change, etc */
73 #define EVENT_FLAG_LOG              (1 << 2) /* Log events */
74 #define EVENT_FLAG_VERBOSE          (1 << 3) /* Verbose messages */
75 #define EVENT_FLAG_COMMAND          (1 << 4) /* Ability to read/set commands */
76 #define EVENT_FLAG_AGENT            (1 << 5) /* Ability to read/set agent info */
77 #define EVENT_FLAG_USER             (1 << 6) /* Ability to read/set user info */
78 #define EVENT_FLAG_CONFIG           (1 << 7) /* Ability to modify configurations */
79 #define EVENT_FLAG_DTMF             (1 << 8) /* Ability to read DTMF events */
80 #define EVENT_FLAG_REPORTING        (1 << 9) /* Reporting events such as rtcp sent */
81 #define EVENT_FLAG_CDR              (1 << 10) /* CDR events */
82 #define EVENT_FLAG_DIALPLAN         (1 << 11) /* Dialplan events (VarSet, NewExten) */
83 #define EVENT_FLAG_ORIGINATE        (1 << 12) /* Originate a call to an extension */
84 #define EVENT_FLAG_AGI              (1 << 13) /* AGI events */
85 #define EVENT_FLAG_HOOKRESPONSE     (1 << 14) /* Hook Response */
86 #define EVENT_FLAG_CC               (1 << 15) /* Call Completion events */
87 #define EVENT_FLAG_AOC              (1 << 16) /* Advice Of Charge events */
88 #define EVENT_FLAG_TEST             (1 << 17) /* Test event used to signal the Asterisk Test Suite */
89 #define EVENT_FLAG_SECURITY         (1 << 18) /* Security Message as AMI Event */
90 /*XXX Why shifted by 30? XXX */
91 #define EVENT_FLAG_MESSAGE          (1 << 30) /* MESSAGE events. */
92 /*@} */
93
94 /*! \brief Export manager structures */
95 #define AST_MAX_MANHEADERS 128
96
97 /*! \brief Manager Helper Function */
98 typedef int (*manager_hook_t)(int, const char *, char *);
99
100 struct manager_custom_hook {
101         /*! Identifier */
102         char *file;
103         /*! helper function */
104         manager_hook_t helper;
105         /*! Linked list information */
106         AST_RWLIST_ENTRY(manager_custom_hook) list;
107 };
108
109 /*! \brief Check if AMI is enabled */
110 int check_manager_enabled(void);
111
112 /*! \brief Check if AMI/HTTP is enabled */
113 int check_webmanager_enabled(void);
114
115 /*! Add a custom hook to be called when an event is fired 
116  \param hook struct manager_custom_hook object to add
117 */
118 void ast_manager_register_hook(struct manager_custom_hook *hook);
119
120 /*! Delete a custom hook to be called when an event is fired
121     \param hook struct manager_custom_hook object to delete
122 */
123 void ast_manager_unregister_hook(struct manager_custom_hook *hook);
124
125 /*! \brief Registered hooks can call this function to invoke actions and they will receive responses through registered callback
126  * \param hook the file identifier specified in manager_custom_hook struct when registering a hook
127  * \param msg ami action mesage string e.g. "Action: SipPeers\r\n"
128
129  * \retval 0 on Success
130  * \retval non-zero on Failure
131 */
132 int ast_hook_send_action(struct manager_custom_hook *hook, const char *msg);
133
134 struct mansession;
135
136 struct message {
137         unsigned int hdrcount;
138         const char *headers[AST_MAX_MANHEADERS];
139 };
140
141 struct manager_action {
142         /*! Name of the action */
143         const char *action;
144         AST_DECLARE_STRING_FIELDS(
145                 AST_STRING_FIELD(synopsis);     /*!< Synopsis text (short description). */
146                 AST_STRING_FIELD(description);  /*!< Description (help text) */
147                 AST_STRING_FIELD(syntax);       /*!< Syntax text */
148                 AST_STRING_FIELD(arguments);    /*!< Description of each argument. */
149                 AST_STRING_FIELD(seealso);      /*!< See also */
150         );
151         /*! Permission required for action.  EVENT_FLAG_* */
152         int authority;
153         /*! Function to be called */
154         int (*func)(struct mansession *s, const struct message *m);
155         struct ast_module *module;              /*!< Module this action belongs to */
156         /*! Where the documentation come from. */
157         enum ast_doc_src docsrc;
158         /*! For easy linking */
159         AST_RWLIST_ENTRY(manager_action) list;
160         /*!
161          * \brief TRUE if the AMI action is registered and the callback can be called.
162          *
163          * \note Needed to prevent a race between calling the callback
164          * function and unregestring the AMI action object.
165          */
166         unsigned int registered:1;
167 };
168
169 /*! \brief External routines may register/unregister manager callbacks this way 
170  * \note  Use ast_manager_register2() to register with help text for new manager commands */
171 #define ast_manager_register(action, authority, func, synopsis) ast_manager_register2(action, authority, func, ast_module_info->self, synopsis, NULL)
172
173 /*! \brief Register a manager callback using XML documentation to describe the manager. */
174 #define ast_manager_register_xml(action, authority, func) ast_manager_register2(action, authority, func, ast_module_info->self, NULL, NULL)
175
176 /*!
177  * \brief Register a manager callback using XML documentation to describe the manager.
178  *
179  * \note For Asterisk core modules that are not independently
180  * loadable.
181  *
182  * \warning If you use ast_manager_register_xml() instead when
183  * you need to use this function, Asterisk will crash on load.
184  */
185 #define ast_manager_register_xml_core(action, authority, func) ast_manager_register2(action, authority, func, NULL, NULL, NULL)
186
187 /*!
188  * \brief Register a manager command with the manager interface
189  * \param action Name of the requested Action:
190  * \param authority Required authority for this command
191  * \param func Function to call for this command
192  * \param module The module containing func.  (NULL if module is part of core and not loadable)
193  * \param synopsis Help text (one line, up to 30 chars) for CLI manager show commands
194  * \param description Help text, several lines
195  */
196 int ast_manager_register2(
197         const char *action,
198         int authority,
199         int (*func)(struct mansession *s, const struct message *m),
200         struct ast_module *module,
201         const char *synopsis,
202         const char *description);
203
204 /*!
205  * \brief Unregister a registered manager command
206  * \param action Name of registered Action:
207  */
208 int ast_manager_unregister(const char *action);
209
210 /*! 
211  * \brief Verify a session's read permissions against a permission mask.  
212  * \param ident session identity
213  * \param perm permission mask to verify
214  * \retval 1 if the session has the permission mask capabilities
215  * \retval 0 otherwise
216  */
217 int astman_verify_session_readpermissions(uint32_t ident, int perm);
218
219 /*!
220  * \brief Verify a session's write permissions against a permission mask.  
221  * \param ident session identity
222  * \param perm permission mask to verify
223  * \retval 1 if the session has the permission mask capabilities, otherwise 0
224  * \retval 0 otherwise
225  */
226 int astman_verify_session_writepermissions(uint32_t ident, int perm);
227
228 /*! \brief External routines may send asterisk manager events this way 
229  *      \param category Event category, matches manager authorization
230         \param event    Event name
231         \param contents Contents of event
232 */
233
234 /* XXX the parser in gcc 2.95 gets confused if you don't put a space
235  * between the last arg before VA_ARGS and the comma */
236 #define manager_event(category, event, contents , ...)  \
237         __ast_manager_event_multichan(category, event, 0, NULL, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__)
238 #define ast_manager_event(chan, category, event, contents , ...) \
239         do { \
240                 struct ast_channel *_chans[] = { chan, }; \
241                 __ast_manager_event_multichan(category, event, 1, _chans, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__); \
242         } while (0)
243 #define ast_manager_event_multichan(category, event, nchans, chans, contents , ...) \
244         __ast_manager_event_multichan(category, event, nchans, chans, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__);
245
246 /*! External routines may send asterisk manager events this way
247  * \param category Event category, matches manager authorization
248  * \param event Event name
249  * \param chancount Number of channels in chans parameter
250  * \param chans A pointer to an array of channels involved in the event
251  * \param file, line, func
252  * \param contents Format string describing event
253  * \param ...
254  * \since 1.8
255 */
256 int __ast_manager_event_multichan(int category, const char *event, int chancount,
257                 struct ast_channel **chans, const char *file, int line, const char *func,
258                 const char *contents, ...) __attribute__((format(printf, 8, 9)));
259
260 /*! \brief Get header from mananger transaction */
261 const char *astman_get_header(const struct message *m, char *var);
262
263 /*! \brief Get a linked list of the Variable: headers
264  *
265  *  \note Order of variables is reversed from the order they are specified in
266  *        the manager message
267  */
268 struct ast_variable *astman_get_variables(const struct message *m);
269
270 enum variable_orders {
271         ORDER_NATURAL,
272         ORDER_REVERSE
273 };
274
275 /*! \brief Get a linked list of the Variable: headers with order specified */
276 struct ast_variable *astman_get_variables_order(const struct message *m, enum variable_orders order);
277
278 /*! \brief Send error in manager transaction */
279 void astman_send_error(struct mansession *s, const struct message *m, char *error);
280
281 /*! \brief Send error in manager transaction (with va_args support) */
282 void __attribute__((format(printf, 3, 4))) astman_send_error_va(struct mansession *s, const struct message *m, const char *fmt, ...);
283
284 /*! \brief Send response in manager transaction */
285 void astman_send_response(struct mansession *s, const struct message *m, char *resp, char *msg);
286
287 /*! \brief Send ack in manager transaction */
288 void astman_send_ack(struct mansession *s, const struct message *m, char *msg);
289
290 /*! \brief Send ack in manager list transaction */
291 void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag);
292
293 void __attribute__((format(printf, 2, 3))) astman_append(struct mansession *s, const char *fmt, ...);
294
295 /*! \brief Determinie if a manager session ident is authenticated */
296 int astman_is_authed(uint32_t ident);
297
298 /*! \brief Called by Asterisk initialization */
299 int init_manager(void);
300
301 /*! \brief Called by Asterisk module functions and the CLI command */
302 int reload_manager(void);
303
304 /*! 
305  * \brief Add a datastore to a session
306  *
307  * \retval 0 success
308  * \retval non-zero failure
309  * \since 1.6.1
310  */
311
312 int astman_datastore_add(struct mansession *s, struct ast_datastore *datastore);
313
314 /*! 
315  * \brief Remove a datastore from a session
316  *
317  * \retval 0 success
318  * \retval non-zero failure
319  * \since 1.6.1
320  */
321 int astman_datastore_remove(struct mansession *s, struct ast_datastore *datastore);
322
323 /*! 
324  * \brief Find a datastore on a session
325  *
326  * \retval pointer to the datastore if found
327  * \retval NULL if not found
328  * \since 1.6.1
329  */
330 struct ast_datastore *astman_datastore_find(struct mansession *s, const struct ast_datastore_info *info, const char *uid);
331
332 /*!
333  * \brief append an event header to an ast string
334  * \since 12
335  *
336  * \param fields_string pointer to an ast_string pointer. It may be a pointer to a
337  *        NULL ast_str pointer, in which case the ast_str will be initialized.
338  * \param header The header being applied
339  * \param value the value of the header
340  *
341  * \retval 0 if successful
342  * \retval non-zero on failure
343  */
344 int ast_str_append_event_header(struct ast_str **fields_string,
345         const char *header, const char *value);
346
347 /*! \brief Struct representing a snapshot of channel state */
348 struct ast_channel_snapshot;
349
350 /*!
351  * \brief Generate the AMI message body from a channel snapshot
352  * \since 12
353  *
354  * \param snapshot the channel snapshot for which to generate an AMI message
355  *                 body
356  * \param prefix What to prepend to the channel fields
357  *
358  * \retval NULL on error
359  * \retval ast_str* on success (must be ast_freed by caller)
360  */
361 struct ast_str *ast_manager_build_channel_state_string_prefix(
362                 const struct ast_channel_snapshot *snapshot,
363                 const char *prefix);
364
365 /*!
366  * \brief Generate the AMI message body from a channel snapshot
367  * \since 12
368  *
369  * \param snapshot the channel snapshot for which to generate an AMI message
370  *                 body
371  *
372  * \retval NULL on error
373  * \retval ast_str* on success (must be ast_freed by caller)
374  */
375 struct ast_str *ast_manager_build_channel_state_string(
376                 const struct ast_channel_snapshot *snapshot);
377
378 /*! \brief Struct representing a snapshot of bridge state */
379 struct ast_bridge_snapshot;
380
381 /*!
382  * \since 12
383  * \brief Callback used to determine whether a key should be skipped when converting a
384  *  JSON object to a manager blob
385  * \param key Key from JSON blob to be evaluated
386  * \retval non-zero if the key should be excluded
387  * \retval zero if the key should not be excluded
388  */
389 typedef int (*key_exclusion_cb)(const char *key);
390
391 struct ast_json;
392
393 /*!
394  * \since 12
395  * \brief Convert a JSON object into an AMI compatible string
396  *
397  * \param blob The JSON blob containing key/value pairs to convert
398  * \param exclusion_cb A \ref key_exclusion_cb pointer to a function that will exclude
399  * keys from the final AMI string
400  *
401  * \retval A malloc'd \ref ast_str object. Callers of this function should free
402  * the returned \ref ast_str object
403  * \retval NULL on error
404  */
405 struct ast_str *ast_manager_str_from_json_object(struct ast_json *blob, key_exclusion_cb exclusion_cb);
406
407 /*!
408  * \brief Generate the AMI message body from a bridge snapshot
409  * \since 12
410  *
411  * \param snapshot the bridge snapshot for which to generate an AMI message
412  *                 body
413  * \param prefix What to prepend to the bridge fields
414  *
415  * \retval NULL on error
416  * \retval ast_str* on success (must be ast_freed by caller)
417  */
418 struct ast_str *ast_manager_build_bridge_state_string_prefix(
419         const struct ast_bridge_snapshot *snapshot,
420         const char *prefix);
421
422 /*!
423  * \brief Generate the AMI message body from a bridge snapshot
424  * \since 12
425  *
426  * \param snapshot the bridge snapshot for which to generate an AMI message
427  *                 body
428  *
429  * \retval NULL on error
430  * \retval ast_str* on success (must be ast_freed by caller)
431  */
432 struct ast_str *ast_manager_build_bridge_state_string(
433         const struct ast_bridge_snapshot *snapshot);
434
435 /*! \brief Struct containing info for an AMI event to send out. */
436 struct ast_manager_event_blob {
437         int event_flags;                /*!< Flags the event should be raised with. */
438         const char *manager_event;      /*!< The event to be raised, should be a string literal. */
439         AST_DECLARE_STRING_FIELDS(
440                 AST_STRING_FIELD(extra_fields); /*!< Extra fields to include in the event. */
441         );
442 };
443
444 /*!
445  * \since 12
446  * \brief Construct a \ref ast_manager_event_blob.
447  *
448  * The returned object is AO2 managed, so clean up with ao2_cleanup().
449  *
450  * \param event_flags Flags the event should be raised with.
451  * \param manager_event The event to be raised, should be a string literal.
452  * \param extra_fields_fmt Format string for extra fields to include.
453  *                         Or NO_EXTRA_FIELDS for no extra fields.
454  *
455  * \return New \ref ast_manager_snapshot_event object.
456  * \return \c NULL on error.
457  */
458 struct ast_manager_event_blob *
459 __attribute__((format(printf, 3, 4)))
460 ast_manager_event_blob_create(
461         int event_flags,
462         const char *manager_event,
463         const char *extra_fields_fmt,
464         ...);
465
466 /*! GCC warns about blank or NULL format strings. So, shenanigans! */
467 #define NO_EXTRA_FIELDS "%s", ""
468
469 /*!
470  * \since 12
471  * \brief Initialize support for AMI system events.
472  * \retval 0 on success
473  * \retval non-zero on error
474  */
475 int manager_system_init(void);
476
477 /*!
478  * \brief Initialize support for AMI channel events.
479  * \retval 0 on success.
480  * \retval non-zero on error.
481  * \since 12
482  */
483 int manager_channels_init(void);
484
485 /*!
486  * \since 12
487  * \brief Initialize support for AMI MWI events.
488  * \retval 0 on success
489  * \retval non-zero on error
490  */
491 int manager_mwi_init(void);
492
493 /*!
494  * \brief Initialize support for AMI channel events.
495  * \return 0 on success.
496  * \return non-zero on error.
497  * \since 12
498  */
499 int manager_bridging_init(void);
500
501 /*!
502  * \brief Initialize support for AMI endpoint events.
503  * \return 0 on success.
504  * \return non-zero on error.
505  * \since 12
506  */
507 int manager_endpoints_init(void);
508
509 /*!
510  * \since 12
511  * \brief Get the \ref stasis_message_type for generic messages
512  *
513  * A generic AMI message expects a JSON only payload. The payload must have the following
514  * structure:
515  * {type: s, class_type: i, event: [ {s: s}, ...] }
516  *
517  * - type is the AMI event type
518  * - class_type is the class authorization type for the event
519  * - event is a list of key/value tuples to be sent out in the message
520  *
521  * \retval A \ref stasis_message_type for AMI messages
522  */
523 struct stasis_message_type *ast_manager_get_generic_type(void);
524
525 /*!
526  * \since 12
527  * \brief Get the \ref stasis topic for AMI
528  *
529  * \retval The \ref stasis topic for AMI
530  * \retval NULL on error
531  */
532 struct stasis_topic *ast_manager_get_topic(void);
533
534 /*!
535  * \since 12
536  * \brief Publish an event to AMI
537  *
538  * \param type The type of AMI event to publish
539  * \param class_type The class on which to publish the event
540  * \param obj The event data to be published.
541  *
542  * Publishes a message to the \ref stasis message bus solely for the consumption of AMI.
543  * The message will be of the type provided by \ref ast_manager_get_type, and will be
544  * published to the topic provided by \ref ast_manager_get_topic. As such, the JSON must
545  * be constructed as defined by the \ref ast_manager_get_type message.
546  */
547 void ast_manager_publish_event(const char *type, int class_type, struct ast_json *obj);
548
549 /*!
550  * \since 12
551  * \brief Get the \ref stasis_message_router for AMI
552  *
553  * \retval The \ref stasis_message_router for AMI
554  * \retval NULL on error
555  */
556 struct stasis_message_router *ast_manager_get_message_router(void);
557
558 #endif /* _ASTERISK_MANAGER_H */