summaryrefslogtreecommitdiff
path: root/res/res_ari_asterisk.c
diff options
context:
space:
mode:
authorBenjamin Ford <bford@digium.com>2015-07-14 13:12:32 -0500
committerBenjamin Ford <bford@digium.com>2015-07-14 13:15:39 -0500
commit1aafadf8148a7cf66f73beeb6fe711d98b678fc5 (patch)
treecf4d8e057b7c39fba6cc4706bd00c01cd62a5dad /res/res_ari_asterisk.c
parent9dcae23cfceedece83568d2194df00ca62f7d53c (diff)
ARI: Added new functionality to reload a single module.
An http request can be sent to reload an Asterisk module. If the module can not be reloaded or is not already loaded, an error response will be returned. The command "curl -v -u user:pass -X PUT 'http://localhost:8088 /ari/asterisk/modules/{moduleName}'" (or something similar, based on configuration) can be run in the terminal to access this new functionality. For more information, see: https://wiki.asterisk.org/wiki.display/~bford/Asterisk+ARI+Resource * Added new ARI functionality * Asterisk modules can be reloaded through http requests ASTERISK-25173 Change-Id: I289188bcae182b2083bdbd9ebfffd50b62f58ae1
Diffstat (limited to 'res/res_ari_asterisk.c')
-rw-r--r--res/res_ari_asterisk.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/res/res_ari_asterisk.c b/res/res_ari_asterisk.c
index 161c64322..ec8b05e52 100644
--- a/res/res_ari_asterisk.c
+++ b/res/res_ari_asterisk.c
@@ -439,6 +439,66 @@ static void ast_ari_asterisk_unload_module_cb(
fin: __attribute__((unused))
return;
}
+/*!
+ * \brief Parameter parsing callback for /asterisk/modules/{moduleName}.
+ * \param get_params GET parameters in the HTTP request.
+ * \param path_vars Path variables extracted from the request.
+ * \param headers HTTP headers.
+ * \param[out] response Response to the HTTP request.
+ */
+static void ast_ari_asterisk_reload_module_cb(
+ struct ast_tcptls_session_instance *ser,
+ struct ast_variable *get_params, struct ast_variable *path_vars,
+ struct ast_variable *headers, struct ast_ari_response *response)
+{
+ struct ast_ari_asterisk_reload_module_args args = {};
+ struct ast_variable *i;
+ RAII_VAR(struct ast_json *, body, NULL, ast_json_unref);
+#if defined(AST_DEVMODE)
+ int is_valid;
+ int code;
+#endif /* AST_DEVMODE */
+
+ for (i = path_vars; i; i = i->next) {
+ if (strcmp(i->name, "moduleName") == 0) {
+ args.module_name = (i->value);
+ } else
+ {}
+ }
+ ast_ari_asterisk_reload_module(headers, &args, response);
+#if defined(AST_DEVMODE)
+ code = response->response_code;
+
+ switch (code) {
+ case 0: /* Implementation is still a stub, or the code wasn't set */
+ is_valid = response->message == NULL;
+ break;
+ case 500: /* Internal Server Error */
+ case 501: /* Not Implemented */
+ case 404: /* Module not found in running modules. */
+ case 409: /* Module could not be reloaded. */
+ is_valid = 1;
+ break;
+ default:
+ if (200 <= code && code <= 299) {
+ is_valid = ast_ari_validate_void(
+ response->message);
+ } else {
+ ast_log(LOG_ERROR, "Invalid error response %d for /asterisk/modules/{moduleName}\n", code);
+ is_valid = 0;
+ }
+ }
+
+ if (!is_valid) {
+ ast_log(LOG_ERROR, "Response validation failed for /asterisk/modules/{moduleName}\n");
+ ast_ari_response_error(response, 500,
+ "Internal Server Error", "Response validation failed");
+ }
+#endif /* AST_DEVMODE */
+
+fin: __attribute__((unused))
+ return;
+}
int ast_ari_asterisk_get_global_var_parse_body(
struct ast_json *body,
struct ast_ari_asterisk_get_global_var_args *args)
@@ -646,6 +706,7 @@ static struct stasis_rest_handlers asterisk_modules_moduleName = {
[AST_HTTP_GET] = ast_ari_asterisk_get_module_cb,
[AST_HTTP_POST] = ast_ari_asterisk_load_module_cb,
[AST_HTTP_DELETE] = ast_ari_asterisk_unload_module_cb,
+ [AST_HTTP_PUT] = ast_ari_asterisk_reload_module_cb,
},
.num_children = 0,
.children = { }