Merge "ARI: Added new functionality to unload a single module."

changes/59/859/3
Mark Michelson 10 years ago committed by Gerrit Code Review
commit 3ebe5cd766

@ -193,7 +193,8 @@ ARI
------------------
* A new feature has been added that enables the retrieval of modules and
module information through an HTTP request. Information on a single module
can be also be retrieved. Individual modules can be loaded to Asterisk.
can be also be retrieved. Individual modules can be loaded to Asterisk, as
well as unloaded.
res_pjsip
------------------

@ -295,6 +295,34 @@ void ast_ari_asterisk_load_module(struct ast_variable *headers,
ast_ari_response_no_content(response);
}
void ast_ari_asterisk_unload_module(struct ast_variable *headers,
struct ast_ari_asterisk_unload_module_args *args,
struct ast_ari_response *response)
{
int unload_result;
enum ast_module_unload_mode unload_mode = AST_FORCE_FIRM;
ast_assert(response != NULL);
if (!ast_module_check(args->module_name)) {
ast_ari_response_error(
response, 404, "Not Found",
"Module not found in running modules");
return;
}
unload_result = ast_unload_resource(args->module_name, unload_mode);
if (unload_result != 0) {
ast_ari_response_error(
response, 409, "Conflict",
"Module could not be unloaded");
return;
}
ast_ari_response_no_content(response);
}
void ast_ari_asterisk_get_global_var(struct ast_variable *headers,
struct ast_ari_asterisk_get_global_var_args *args,
struct ast_ari_response *response)

@ -104,6 +104,19 @@ struct ast_ari_asterisk_load_module_args {
* \param[out] response HTTP response
*/
void ast_ari_asterisk_load_module(struct ast_variable *headers, struct ast_ari_asterisk_load_module_args *args, struct ast_ari_response *response);
/*! Argument struct for ast_ari_asterisk_unload_module() */
struct ast_ari_asterisk_unload_module_args {
/*! Module's name */
const char *module_name;
};
/*!
* \brief Unload an Asterisk module.
*
* \param headers HTTP headers
* \param args Swagger parameters
* \param[out] response HTTP response
*/
void ast_ari_asterisk_unload_module(struct ast_variable *headers, struct ast_ari_asterisk_unload_module_args *args, struct ast_ari_response *response);
/*! Argument struct for ast_ari_asterisk_get_global_var() */
struct ast_ari_asterisk_get_global_var_args {
/*! The variable to get */

@ -376,6 +376,66 @@ static void ast_ari_asterisk_load_module_cb(
}
#endif /* AST_DEVMODE */
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_unload_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_unload_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_unload_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 unloaded. */
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;
}
@ -585,6 +645,7 @@ static struct stasis_rest_handlers asterisk_modules_moduleName = {
.callbacks = {
[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,
},
.num_children = 0,
.children = { }

@ -101,6 +101,32 @@
"reason": "Module could not be loaded."
}
]
},
{
"httpMethod": "DELETE",
"summary": "Unload an Asterisk module.",
"nickname": "unloadModule",
"responseClass": "void",
"parameters": [
{
"name": "moduleName",
"description": "Module's name",
"paramType": "path",
"required": true,
"allowMultiple": false,
"dataType": "string"
}
],
"errorResponses": [
{
"code": 404,
"reason": "Module not found in running modules."
},
{
"code": 409,
"reason": "Module could not be unloaded."
}
]
}
]
},

Loading…
Cancel
Save