12e23e16482201600293884c5a0c692cc333541c
[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
26 /*!
27  \file
28  \brief The AMI - Asterisk Manager Interface - is a TCP protocol created to
29  manage Asterisk with third-party software.
30
31  Manager protocol packages are text fields of the form a: b.  There is
32  always exactly one space after the colon.
33
34 \verbatim
35
36  For Actions replies, the first line of the reply is a "Response:" header with
37  values "success", "error" or "follows". "Follows" implies that the
38  response is coming as separate events with the same ActionID. If the
39  Action request has no ActionID, it will be hard matching events
40  to the Action request in the manager client.
41
42  The first header type is the "Event" header.  Other headers vary from
43  event to event.  Headers end with standard \\r\\n termination.
44  The last line of the manager response or event is an empty line.
45  (\\r\\n)
46
47 \endverbatim
48
49  \note Please try to \b re-use \b existing \b headers to simplify manager message parsing in clients.
50     Don't re-use an existing header with a new meaning, please.
51     You can find a reference of standard headers in doc/manager.txt
52
53 - \ref manager.c Main manager code file
54  */
55
56 #define AMI_VERSION                     "1.1"
57 #define DEFAULT_MANAGER_PORT 5038       /* Default port for Asterisk management via TCP */
58
59 /*! \name Manager event classes */
60 /*@{ */
61 #define EVENT_FLAG_SYSTEM               (1 << 0) /* System events such as module load/unload */
62 #define EVENT_FLAG_CALL                 (1 << 1) /* Call event, such as state change, etc */
63 #define EVENT_FLAG_LOG                  (1 << 2) /* Log events */
64 #define EVENT_FLAG_VERBOSE              (1 << 3) /* Verbose messages */
65 #define EVENT_FLAG_COMMAND              (1 << 4) /* Ability to read/set commands */
66 #define EVENT_FLAG_AGENT                (1 << 5) /* Ability to read/set agent info */
67 #define EVENT_FLAG_USER                 (1 << 6) /* Ability to read/set user info */
68 #define EVENT_FLAG_CONFIG               (1 << 7) /* Ability to modify configurations */
69 #define EVENT_FLAG_DTMF                 (1 << 8) /* Ability to read DTMF events */
70 #define EVENT_FLAG_REPORTING            (1 << 9) /* Reporting events such as rtcp sent */
71 #define EVENT_FLAG_CDR                  (1 << 10) /* CDR events */
72 #define EVENT_FLAG_DIALPLAN             (1 << 11) /* Dialplan events (VarSet, NewExten) */
73 #define EVENT_FLAG_ORIGINATE    (1 << 12) /* Originate a call to an extension */
74 #define EVENT_FLAG_AGI                  (1 << 13) /* AGI events */
75 /*@} */
76
77 /*! \brief Export manager structures */
78 #define AST_MAX_MANHEADERS 128
79
80 /*! \brief Manager Helper Function */
81 typedef int (*manager_hook_t)(int, const char *, char *); 
82
83
84 struct manager_custom_hook {
85         /*! Identifier */
86         char *file;
87         /*! helper function */
88         manager_hook_t helper;
89         /*! Linked list information */
90         AST_RWLIST_ENTRY(manager_custom_hook) list;
91 };
92
93 /*! \brief Check if AMI is enabled */
94 int check_manager_enabled(void);
95
96 /*! \brief Check if AMI/HTTP is enabled */
97 int check_webmanager_enabled(void);
98
99 /*! Add a custom hook to be called when an event is fired 
100  \param hook struct manager_custom_hook object to add
101 */
102 void ast_manager_register_hook(struct manager_custom_hook *hook);
103
104 /*! Delete a custom hook to be called when an event is fired
105     \param hook struct manager_custom_hook object to delete
106 */
107 void ast_manager_unregister_hook(struct manager_custom_hook *hook);
108
109 struct mansession;
110
111 struct message {
112         unsigned int hdrcount;
113         const char *headers[AST_MAX_MANHEADERS];
114 };
115
116 struct manager_action {
117         /*! Name of the action */
118         const char *action;
119         /*! Short description of the action */
120         const char *synopsis;
121         /*! Detailed description of the action */
122         const char *description;
123         /*! Permission required for action.  EVENT_FLAG_* */
124         int authority;
125         /*! Function to be called */
126         int (*func)(struct mansession *s, const struct message *m);
127         /*! For easy linking */
128         AST_RWLIST_ENTRY(manager_action) list;
129 };
130
131 /*! \brief External routines may register/unregister manager callbacks this way 
132  * \note  Use ast_manager_register2() to register with help text for new manager commands */
133 #define ast_manager_register(a, b, c, d) ast_manager_register2(a, b, c, d, NULL)
134
135
136 /*! \brief Register a manager command with the manager interface 
137         \param action Name of the requested Action:
138         \param authority Required authority for this command
139         \param func Function to call for this command
140         \param synopsis Help text (one line, up to 30 chars) for CLI manager show commands
141         \param description Help text, several lines
142 */
143 int ast_manager_register2(
144         const char *action,
145         int authority,
146         int (*func)(struct mansession *s, const struct message *m),
147         const char *synopsis,
148         const char *description);
149
150 /*! \brief Unregister a registred manager command 
151         \param action Name of registred Action:
152 */
153 int ast_manager_unregister( char *action );
154
155 /*! 
156  * \brief Verify a session's read permissions against a permission mask.  
157  * \param ident session identity
158  * \param perm permission mask to verify
159  * \retval 1 if the session has the permission mask capabilities
160  * \retval 0 otherwise
161  */
162 int astman_verify_session_readpermissions(uint32_t ident, int perm);
163
164 /*!
165  * \brief Verify a session's write permissions against a permission mask.  
166  * \param ident session identity
167  * \param perm permission mask to verify
168  * \retval 1 if the session has the permission mask capabilities, otherwise 0
169  * \retval 0 otherwise
170  */
171 int astman_verify_session_writepermissions(uint32_t ident, int perm);
172
173 /*! \brief External routines may send asterisk manager events this way 
174  *      \param category Event category, matches manager authorization
175         \param event    Event name
176         \param contents Contents of event
177 */
178
179 /* XXX the parser in gcc 2.95 gets confused if you don't put a space
180  * between the last arg before VA_ARGS and the comma */
181 #define manager_event(category, event, contents , ...)  \
182         __manager_event(category, event, __FILE__, __LINE__, __PRETTY_FUNCTION__, contents , ## __VA_ARGS__)
183
184 int __attribute__ ((format(printf, 6, 7))) __manager_event(int category, const char *event,
185                                                            const char *file, int line, const char *func,
186                                                            const char *contents, ...);
187
188 /*! \brief Get header from mananger transaction */
189 const char *astman_get_header(const struct message *m, char *var);
190
191 /*! \brief Get a linked list of the Variable: headers */
192 struct ast_variable *astman_get_variables(const struct message *m);
193
194 /*! \brief Send error in manager transaction */
195 void astman_send_error(struct mansession *s, const struct message *m, char *error);
196
197 /*! \brief Send response in manager transaction */
198 void astman_send_response(struct mansession *s, const struct message *m, char *resp, char *msg);
199
200 /*! \brief Send ack in manager transaction */
201 void astman_send_ack(struct mansession *s, const struct message *m, char *msg);
202
203 /*! \brief Send ack in manager list transaction */
204 void astman_send_listack(struct mansession *s, const struct message *m, char *msg, char *listflag);
205
206 void __attribute__ ((format (printf, 2, 3))) astman_append(struct mansession *s, const char *fmt, ...);
207
208 /*! \brief Determinie if a manager session ident is authenticated */
209 int astman_is_authed(uint32_t ident);
210
211 /*! \brief Called by Asterisk initialization */
212 int init_manager(void);
213
214 /*! \brief Called by Asterisk module functions and the CLI command */
215 int reload_manager(void);
216
217 /*! 
218  * \brief Add a datastore to a session
219  *
220  * \retval 0 success
221  * \retval non-zero failure
222  */
223
224 int astman_datastore_add(struct mansession *s, struct ast_datastore *datastore);
225
226 /*! 
227  * \brief Remove a datastore from a session
228  *
229  * \retval 0 success
230  * \retval non-zero failure
231  */
232 int astman_datastore_remove(struct mansession *s, struct ast_datastore *datastore);
233
234 /*! 
235  * \brief Find a datastore on a session
236  *
237  * \retval pointer to the datastore if found
238  * \retval NULL if not found
239  */
240 struct ast_datastore *astman_datastore_find(struct mansession *s, const struct ast_datastore_info *info, const char *uid);
241
242 #endif /* _ASTERISK_MANAGER_H */