@ -22,8 +22,10 @@
*
* \ author David Brooks < dbrooks @ digium . com > based off of code written by Russell Bryant < russell @ digium . com >
*
* This is simply an example or test module illustrating the ability for a custom module
* to hook into AMI . Registration for AMI events and sending of AMI actions is shown .
* This started , and continues to serves , as an example illustrating the ability
* for a custom module to hook into AMI . Registration for AMI events and sending
* of AMI actions is shown . A test has also been created that utilizes the original
* example in order to make sure the ami event hook gets raised .
*/
/*** MODULEINFO
@ -37,11 +39,66 @@
# include "asterisk/cli.h"
# include "asterisk/utils.h"
# include "asterisk/manager.h"
# include "asterisk/test.h"
# define CATEGORY " / main / amihooks / "
AST_MUTEX_DEFINE_STATIC ( hook_lock ) ;
ast_cond_t hook_cond ;
int done ;
static int wait_for_hook ( struct ast_test * test )
{
struct timeval start = ast_tvnow ( ) ;
struct timespec timeout = {
. tv_sec = start . tv_sec + 2 ,
. tv_nsec = start . tv_usec * 1000
} ;
int res = 0 ;
ast_mutex_lock ( & hook_lock ) ;
while ( ! done ) {
if ( ast_cond_timedwait ( & hook_cond , & hook_lock , & timeout ) = = ETIMEDOUT ) {
ast_test_status_update ( test , " Test timed out while waiting for hook event \n " ) ;
res = - 1 ;
break ;
}
}
ast_mutex_unlock ( & hook_lock ) ;
return res ;
}
AST_TEST_DEFINE ( amihook_cli_send )
{
switch ( cmd ) {
case TEST_INIT :
info - > name = __func__ ;
info - > category = CATEGORY ;
info - > summary = " Execute an action using an AMI hook " ;
info - > description = info - > summary ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
break ;
}
done = 0 ;
if ( ast_cli_command ( - 1 , " amihook send " ) ) {
return AST_TEST_FAIL ;
}
return wait_for_hook ( test ) ? AST_TEST_FAIL : AST_TEST_PASS ;
}
/* The helper function is required by struct manager_custom_hook. See __manager_event for details */
static int amihook_helper ( int category , const char * event , char * content )
{
ast_log ( LOG_NOTICE , " AMI Event: \n Category: %d Event: %s \n %s \n " , category , event , content ) ;
ast_mutex_lock ( & hook_lock ) ;
done = 1 ;
ast_cond_signal ( & hook_cond ) ;
ast_mutex_unlock ( & hook_lock ) ;
return 0 ;
}
@ -141,6 +198,7 @@ static struct ast_cli_entry cli_amihook_evt[] = {
static int unload_module ( void )
{
AST_TEST_UNREGISTER ( amihook_cli_send ) ;
ast_manager_unregister_hook ( & test_hook ) ;
return ast_cli_unregister_multiple ( cli_amihook_evt , ARRAY_LEN ( cli_amihook_evt ) ) ;
}
@ -151,6 +209,8 @@ static int load_module(void)
res = ast_cli_register_multiple ( cli_amihook_evt , ARRAY_LEN ( cli_amihook_evt ) ) ;
AST_TEST_REGISTER ( amihook_cli_send ) ;
return res ? AST_MODULE_LOAD_DECLINE : AST_MODULE_LOAD_SUCCESS ;
}