2c125188be416c0dbda5ce92b4d3fb4e3b6bc439
[asterisk/asterisk.git] / res / res_ari_asterisk.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2012 - 2013, Digium, Inc.
5  *
6  * David M. Lee, II <dlee@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 /*
20  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21  * !!!!!                               DO NOT EDIT                        !!!!!
22  * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23  * This file is generated by a mustache template. Please see the original
24  * template in rest-api-templates/res_ari_resource.c.mustache
25  */
26
27 /*! \file
28  *
29  * \brief Asterisk resources
30  *
31  * \author David M. Lee, II <dlee@digium.com>
32  */
33
34 /*** MODULEINFO
35         <depend type="module">res_ari</depend>
36         <depend type="module">res_stasis</depend>
37         <support_level>core</support_level>
38  ***/
39
40 #include "asterisk.h"
41
42 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
43
44 #include "asterisk/module.h"
45 #include "asterisk/stasis_app.h"
46 #include "ari/resource_asterisk.h"
47 #if defined(AST_DEVMODE)
48 #include "ari/ari_model_validators.h"
49 #endif
50
51 /*!
52  * \brief Parameter parsing callback for /asterisk/info.
53  * \param get_params GET parameters in the HTTP request.
54  * \param path_vars Path variables extracted from the request.
55  * \param headers HTTP headers.
56  * \param[out] response Response to the HTTP request.
57  */
58 static void ast_ari_get_asterisk_info_cb(
59         struct ast_variable *get_params, struct ast_variable *path_vars,
60         struct ast_variable *headers, struct ast_ari_response *response)
61 {
62 #if defined(AST_DEVMODE)
63         int is_valid;
64         int code;
65 #endif /* AST_DEVMODE */
66
67         struct ast_get_asterisk_info_args args = {};
68         struct ast_variable *i;
69
70         for (i = get_params; i; i = i->next) {
71                 if (strcmp(i->name, "only") == 0) {
72                         args.only = (i->value);
73                 } else
74                 {}
75         }
76         ast_ari_get_asterisk_info(headers, &args, response);
77 #if defined(AST_DEVMODE)
78         code = response->response_code;
79
80         switch (code) {
81         case 0: /* Implementation is still a stub, or the code wasn't set */
82                 is_valid = response->message == NULL;
83                 break;
84         case 500: /* Internal Server Error */
85         case 501: /* Not Implemented */
86                 is_valid = 1;
87                 break;
88         default:
89                 if (200 <= code && code <= 299) {
90                         is_valid = ast_ari_validate_asterisk_info(
91                                 response->message);
92                 } else {
93                         ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/info\n", code);
94                         is_valid = 0;
95                 }
96         }
97
98         if (!is_valid) {
99                 ast_log(LOG_ERROR, "Response validation failed for /asterisk/info\n");
100                 ast_ari_response_error(response, 500,
101                         "Internal Server Error", "Response validation failed");
102         }
103 #endif /* AST_DEVMODE */
104 }
105 /*!
106  * \brief Parameter parsing callback for /asterisk/variable.
107  * \param get_params GET parameters in the HTTP request.
108  * \param path_vars Path variables extracted from the request.
109  * \param headers HTTP headers.
110  * \param[out] response Response to the HTTP request.
111  */
112 static void ast_ari_get_global_var_cb(
113         struct ast_variable *get_params, struct ast_variable *path_vars,
114         struct ast_variable *headers, struct ast_ari_response *response)
115 {
116 #if defined(AST_DEVMODE)
117         int is_valid;
118         int code;
119 #endif /* AST_DEVMODE */
120
121         struct ast_get_global_var_args args = {};
122         struct ast_variable *i;
123
124         for (i = get_params; i; i = i->next) {
125                 if (strcmp(i->name, "variable") == 0) {
126                         args.variable = (i->value);
127                 } else
128                 {}
129         }
130         ast_ari_get_global_var(headers, &args, response);
131 #if defined(AST_DEVMODE)
132         code = response->response_code;
133
134         switch (code) {
135         case 0: /* Implementation is still a stub, or the code wasn't set */
136                 is_valid = response->message == NULL;
137                 break;
138         case 500: /* Internal Server Error */
139         case 501: /* Not Implemented */
140                 is_valid = 1;
141                 break;
142         default:
143                 if (200 <= code && code <= 299) {
144                         is_valid = ast_ari_validate_variable(
145                                 response->message);
146                 } else {
147                         ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code);
148                         is_valid = 0;
149                 }
150         }
151
152         if (!is_valid) {
153                 ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n");
154                 ast_ari_response_error(response, 500,
155                         "Internal Server Error", "Response validation failed");
156         }
157 #endif /* AST_DEVMODE */
158 }
159 /*!
160  * \brief Parameter parsing callback for /asterisk/variable.
161  * \param get_params GET parameters in the HTTP request.
162  * \param path_vars Path variables extracted from the request.
163  * \param headers HTTP headers.
164  * \param[out] response Response to the HTTP request.
165  */
166 static void ast_ari_set_global_var_cb(
167         struct ast_variable *get_params, struct ast_variable *path_vars,
168         struct ast_variable *headers, struct ast_ari_response *response)
169 {
170 #if defined(AST_DEVMODE)
171         int is_valid;
172         int code;
173 #endif /* AST_DEVMODE */
174
175         struct ast_set_global_var_args args = {};
176         struct ast_variable *i;
177
178         for (i = get_params; i; i = i->next) {
179                 if (strcmp(i->name, "variable") == 0) {
180                         args.variable = (i->value);
181                 } else
182                 if (strcmp(i->name, "value") == 0) {
183                         args.value = (i->value);
184                 } else
185                 {}
186         }
187         ast_ari_set_global_var(headers, &args, response);
188 #if defined(AST_DEVMODE)
189         code = response->response_code;
190
191         switch (code) {
192         case 0: /* Implementation is still a stub, or the code wasn't set */
193                 is_valid = response->message == NULL;
194                 break;
195         case 500: /* Internal Server Error */
196         case 501: /* Not Implemented */
197                 is_valid = 1;
198                 break;
199         default:
200                 if (200 <= code && code <= 299) {
201                         is_valid = ast_ari_validate_void(
202                                 response->message);
203                 } else {
204                         ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/variable\n", code);
205                         is_valid = 0;
206                 }
207         }
208
209         if (!is_valid) {
210                 ast_log(LOG_ERROR, "Response validation failed for /asterisk/variable\n");
211                 ast_ari_response_error(response, 500,
212                         "Internal Server Error", "Response validation failed");
213         }
214 #endif /* AST_DEVMODE */
215 }
216
217 /*! \brief REST handler for /api-docs/asterisk.{format} */
218 static struct stasis_rest_handlers asterisk_info = {
219         .path_segment = "info",
220         .callbacks = {
221                 [AST_HTTP_GET] = ast_ari_get_asterisk_info_cb,
222         },
223         .num_children = 0,
224         .children = {  }
225 };
226 /*! \brief REST handler for /api-docs/asterisk.{format} */
227 static struct stasis_rest_handlers asterisk_variable = {
228         .path_segment = "variable",
229         .callbacks = {
230                 [AST_HTTP_GET] = ast_ari_get_global_var_cb,
231                 [AST_HTTP_POST] = ast_ari_set_global_var_cb,
232         },
233         .num_children = 0,
234         .children = {  }
235 };
236 /*! \brief REST handler for /api-docs/asterisk.{format} */
237 static struct stasis_rest_handlers asterisk = {
238         .path_segment = "asterisk",
239         .callbacks = {
240         },
241         .num_children = 2,
242         .children = { &asterisk_info,&asterisk_variable, }
243 };
244
245 static int load_module(void)
246 {
247         int res = 0;
248         stasis_app_ref();
249         res |= ast_ari_add_handler(&asterisk);
250         return res;
251 }
252
253 static int unload_module(void)
254 {
255         ast_ari_remove_handler(&asterisk);
256         stasis_app_unref();
257         return 0;
258 }
259
260 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "RESTful API module - Asterisk resources",
261         .load = load_module,
262         .unload = unload_module,
263         .nonoptreq = "res_ari,res_stasis",
264         );