2006-04-04 22:03:59 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
2009-02-13 23:37:37 +00:00
* Copyright ( C ) 2005 - 2009 , Anthony Minessale II < anthm @ freeswitch . org >
2006-04-04 22:03:59 +00:00
*
* Version : MPL 1.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 ( the " License " ) ; you may not use this file except in compliance with
* the License . You may obtain a copy of the License at
* http : //www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an " AS IS " basis ,
* WITHOUT WARRANTY OF ANY KIND , either express or implied . See the License
* for the specific language governing rights and limitations under the
* License .
*
* The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
*
* The Initial Developer of the Original Code is
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2006-04-04 22:03:59 +00:00
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
2009-02-04 21:20:54 +00:00
* Anthony Minessale II < anthm @ freeswitch . org >
2006-06-15 06:02:08 +00:00
* Michael Jerris < mike @ jerris . com >
* Johny Kadarisman < jkr888 @ gmail . com >
2006-11-28 19:33:54 +00:00
* Paul Tinsley < jackhammer @ gmail . com >
2007-04-08 03:53:35 +00:00
* Marcel Barbulescu < marcelbarbulescu @ gmail . com >
2007-10-29 06:42:13 +00:00
* Bret McDanel < trixter AT 0xdecafbad . com >
2008-07-16 19:11:45 +00:00
* Cesar Cepeda < cesar @ auronix . com >
2008-09-29 17:17:26 +00:00
* Massimo Cetra < devel @ navynet . it >
2006-04-04 22:03:59 +00:00
*
2006-04-07 03:57:03 +00:00
*
* mod_commands . c - - Misc . Command Module
2006-04-04 22:03:59 +00:00
*
*/
# include <switch.h>
2006-11-28 19:33:54 +00:00
# include <switch_version.h>
2006-04-04 22:03:59 +00:00
2007-06-13 16:00:14 +00:00
SWITCH_MODULE_LOAD_FUNCTION ( mod_commands_load ) ;
2009-02-20 01:10:59 +00:00
SWITCH_MODULE_SHUTDOWN_FUNCTION ( mod_commands_shutdown ) ;
SWITCH_MODULE_DEFINITION ( mod_commands , mod_commands_load , mod_commands_shutdown , NULL ) ;
2007-03-03 01:01:37 +00:00
2008-11-12 13:55:22 +00:00
SWITCH_STANDARD_API ( time_test_function )
{
switch_time_t now , then ;
int x ;
2008-11-12 16:05:48 +00:00
long mss ;
2008-11-12 13:55:22 +00:00
uint32_t total = 0 ;
int diff ;
int max = 10 ;
char * p ;
2008-11-12 16:05:48 +00:00
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " parameter missing \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-02-09 16:40:37 +00:00
2008-11-12 16:05:48 +00:00
mss = atol ( cmd ) ;
2009-02-09 16:40:37 +00:00
if ( mss > 10000 ) {
mss = 10000 ;
}
2008-11-12 13:55:22 +00:00
if ( ( p = strchr ( cmd , ' ' ) ) ) {
max = atoi ( p + 1 ) ;
if ( max < 0 ) {
2009-02-09 16:40:37 +00:00
max = 1 ;
} else if ( max > 100 ) {
max = 100 ;
2008-11-12 13:55:22 +00:00
}
}
for ( x = 0 ; x < max ; x + + ) {
then = switch_time_now ( ) ;
switch_yield ( mss ) ;
now = switch_time_now ( ) ;
2008-11-12 16:05:48 +00:00
diff = ( int ) ( now - then ) ;
2008-11-12 13:55:22 +00:00
stream - > write_function ( stream , " test %d sleep %ld %d \n " , x + 1 , mss , diff ) ;
total + = diff ;
}
stream - > write_function ( stream , " avg %d \n " , total / x ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-12-23 17:36:50 +00:00
SWITCH_STANDARD_API ( group_call_function )
{
char * domain ;
char * group_name = NULL ;
char * flags ;
int ok = 0 ;
switch_channel_t * channel = NULL ;
char * fp = NULL ;
const char * call_delim = " , " ;
if ( switch_strlen_zero ( cmd ) ) {
goto end ;
}
if ( session ) {
channel = switch_core_session_get_channel ( session ) ;
}
group_name = strdup ( cmd ) ;
switch_assert ( group_name ) ;
if ( ( flags = strchr ( group_name , ' + ' ) ) ) {
* flags + + = ' \0 ' ;
for ( fp = flags ; fp & & * fp ; fp + + ) {
switch ( * fp ) {
case ' F ' :
call_delim = " | " ;
break ;
case ' A ' :
call_delim = " , " ;
break ;
default :
break ;
}
}
}
domain = strchr ( group_name , ' @ ' ) ;
if ( domain ) {
* domain + + = ' \0 ' ;
} else {
domain = switch_core_get_variable ( " domain " ) ;
}
if ( ! switch_strlen_zero ( domain ) ) {
switch_xml_t xml , x_domain , x_group ;
switch_event_t * params ;
switch_stream_handle_t dstream = { 0 } ;
SWITCH_STANDARD_STREAM ( dstream ) ;
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " group " , group_name ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " domain " , domain ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " action " , " group_call " ) ;
if ( switch_xml_locate_group ( group_name , domain , & xml , & x_domain , & x_group , params ) = = SWITCH_STATUS_SUCCESS ) {
switch_xml_t x_user , x_users , x_param , x_params ;
if ( ( x_users = switch_xml_child ( x_group , " users " ) ) ) {
ok + + ;
for ( x_user = switch_xml_child ( x_users , " user " ) ; x_user ; x_user = x_user - > next ) {
const char * id = switch_xml_attr_soft ( x_user , " id " ) ;
const char * dest = NULL ;
char * d_dest = NULL ;
if ( ( x_params = switch_xml_child ( x_domain , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
const char * var = switch_xml_attr ( x_param , " name " ) ;
const char * val = switch_xml_attr ( x_param , " value " ) ;
if ( ! strcasecmp ( var , " group-dial-string " ) ) {
dest = val ;
break ;
}
if ( ! strcasecmp ( var , " dial-string " ) ) {
dest = val ;
}
}
}
if ( ( x_params = switch_xml_child ( x_group , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
const char * var = switch_xml_attr ( x_param , " name " ) ;
const char * val = switch_xml_attr ( x_param , " value " ) ;
if ( ! strcasecmp ( var , " group-dial-string " ) ) {
dest = val ;
break ;
}
if ( ! strcasecmp ( var , " dial-string " ) ) {
dest = val ;
}
}
}
if ( ( x_params = switch_xml_child ( x_user , " params " ) ) ) {
for ( x_param = switch_xml_child ( x_params , " param " ) ; x_param ; x_param = x_param - > next ) {
const char * var = switch_xml_attr ( x_param , " name " ) ;
const char * val = switch_xml_attr ( x_param , " value " ) ;
if ( ! strcasecmp ( var , " group-dial-string " ) ) {
dest = val ;
break ;
}
if ( ! strcasecmp ( var , " dial-string " ) ) {
dest = val ;
}
}
}
if ( dest ) {
if ( channel ) {
switch_channel_set_variable ( channel , " dialed_group " , group_name ) ;
switch_channel_set_variable ( channel , " dialed_user " , id ) ;
switch_channel_set_variable ( channel , " dialed_domain " , domain ) ;
d_dest = switch_channel_expand_variables ( channel , dest ) ;
} else {
switch_event_del_header ( params , " dialed_user " ) ;
switch_event_del_header ( params , " dialed_group " ) ;
switch_event_del_header ( params , " dialed_domain " ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " dialed_user " , id ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " dialed_group " , group_name ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " dialed_domain " , domain ) ;
d_dest = switch_event_expand_headers ( params , dest ) ;
}
} else {
d_dest = switch_mprintf ( " user/%s@%s " , id , domain ) ;
}
if ( d_dest ) {
if ( ! switch_stristr ( " error/ " , d_dest ) ) {
dstream . write_function ( & dstream , " %s%s " , d_dest , call_delim ) ;
}
if ( d_dest ! = dest ) {
free ( d_dest ) ;
}
}
}
if ( ok & & dstream . data ) {
char * data = ( char * ) dstream . data ;
char c = end_of ( data ) ;
char * p ;
if ( c = = ' , ' | | c = = ' | ' ) {
end_of ( data ) = ' \0 ' ;
}
for ( p = data ; p & & * p ; p + + ) {
if ( * p = = ' { ' ) {
* p = ' [ ' ;
} else if ( * p = = ' } ' ) {
* p = ' ] ' ;
}
}
stream - > write_function ( stream , " %s " , data ) ;
free ( dstream . data ) ;
} else {
ok = 0 ;
}
}
}
2009-02-09 16:18:21 +00:00
switch_xml_free ( xml ) ;
2008-12-23 17:36:50 +00:00
switch_event_destroy ( & params ) ;
}
end :
switch_safe_free ( group_name ) ;
if ( ! ok ) {
stream - > write_function ( stream , " error/NO_ROUTE_DESTINATION " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_API ( in_group_function )
{
switch_xml_t x_domain , xml = NULL , x_user = NULL , x_group ;
int argc ;
char * mydata = NULL , * argv [ 2 ] , * user , * domain ;
char delim = ' , ' ;
switch_event_t * params = NULL ;
const char * rval = " false " ;
char * group ;
if ( switch_strlen_zero ( cmd ) | | ! ( mydata = strdup ( cmd ) ) ) {
goto end ;
}
if ( ( argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 2 ) {
goto end ;
}
user = argv [ 0 ] ;
group = argv [ 1 ] ;
if ( ( domain = strchr ( user , ' @ ' ) ) ) {
* domain + + = ' \0 ' ;
} else {
domain = switch_core_get_variable ( " domain " ) ;
}
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " user " , user ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " domain " , domain ) ;
if ( switch_xml_locate_group ( group , domain , & xml , & x_domain , & x_group , params ) = = SWITCH_STATUS_SUCCESS ) {
switch_xml_t x_users ;
if ( ( x_users = switch_xml_child ( x_group , " users " ) ) ) {
if ( ( x_user = switch_xml_find_child ( x_users , " user " , " id " , user ) ) ) {
rval = " true " ;
}
}
}
end :
stream - > write_function ( stream , " %s " , rval ) ;
switch_xml_free ( xml ) ;
free ( mydata ) ;
switch_event_destroy ( & params ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-12-04 19:39:14 +00:00
SWITCH_STANDARD_API ( user_data_function )
{
2008-05-27 04:54:52 +00:00
switch_xml_t x_domain , xml = NULL , x_user = NULL , x_param , x_params ;
2007-12-04 19:39:14 +00:00
int argc ;
2008-01-29 17:24:18 +00:00
char * mydata = NULL , * argv [ 3 ] , * key = NULL , * type = NULL , * user , * domain ;
2007-12-04 19:39:14 +00:00
char delim = ' ' ;
const char * container = " params " , * elem = " param " ;
2008-01-23 20:59:25 +00:00
switch_event_t * params = NULL ;
2007-12-04 19:39:14 +00:00
2008-01-29 17:24:18 +00:00
if ( switch_strlen_zero ( cmd ) | | ! ( mydata = strdup ( cmd ) ) ) {
goto end ;
}
2007-12-04 19:39:14 +00:00
2008-01-29 17:24:18 +00:00
if ( ( argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 3 ) {
goto end ;
}
2007-12-04 19:39:14 +00:00
user = argv [ 0 ] ;
type = argv [ 1 ] ;
key = argv [ 2 ] ;
if ( ( domain = strchr ( user , ' @ ' ) ) ) {
* domain + + = ' \0 ' ;
} else {
2009-02-13 00:08:12 +00:00
if ( ! ( domain = switch_core_get_variable ( " domain " ) ) ) {
domain = " cluecon.com " ;
}
2007-12-04 19:39:14 +00:00
}
2009-02-13 00:08:12 +00:00
2008-10-02 17:10:05 +00:00
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
2008-01-23 20:59:25 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " user " , user ) ;
2008-10-06 21:20:13 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " mailbox " , user ) ;
2008-01-23 20:59:25 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " domain " , domain ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " type " , type ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " key " , key ) ;
2008-12-23 17:36:50 +00:00
if ( key & & type & & switch_xml_locate_user ( " id " , user , domain , NULL , & xml , & x_domain , & x_user , NULL , params ) = = SWITCH_STATUS_SUCCESS ) {
2008-11-13 22:42:49 +00:00
if ( ! strcmp ( type , " attr " ) ) {
const char * attr = switch_xml_attr_soft ( x_user , key ) ;
stream - > write_function ( stream , " %s " , attr ) ;
goto end ;
}
2008-01-29 17:24:18 +00:00
if ( ! strcmp ( type , " var " ) ) {
container = " variables " ;
elem = " variable " ;
}
2007-12-04 19:39:14 +00:00
2008-01-29 17:24:18 +00:00
if ( ( x_params = switch_xml_child ( x_user , container ) ) ) {
for ( x_param = switch_xml_child ( x_params , elem ) ; x_param ; x_param = x_param - > next ) {
const char * var = switch_xml_attr ( x_param , " name " ) ;
const char * val = switch_xml_attr ( x_param , " value " ) ;
2007-12-04 19:39:14 +00:00
2008-01-29 17:24:18 +00:00
if ( var & & val & & ! strcasecmp ( var , key ) ) {
stream - > write_function ( stream , " %s " , val ) ;
2008-10-13 22:20:24 +00:00
goto end ;
2007-12-04 19:39:14 +00:00
}
2008-01-29 17:24:18 +00:00
2007-12-04 19:39:14 +00:00
}
}
2008-10-13 22:20:24 +00:00
if ( ( x_params = switch_xml_child ( x_domain , container ) ) ) {
for ( x_param = switch_xml_child ( x_params , elem ) ; x_param ; x_param = x_param - > next ) {
const char * var = switch_xml_attr ( x_param , " name " ) ;
const char * val = switch_xml_attr ( x_param , " value " ) ;
if ( var & & val & & ! strcasecmp ( var , key ) ) {
stream - > write_function ( stream , " %s " , val ) ;
goto end ;
}
}
}
2007-12-04 19:39:14 +00:00
}
2008-05-27 04:54:52 +00:00
end :
2008-01-29 17:24:18 +00:00
switch_xml_free ( xml ) ;
2007-12-04 19:39:14 +00:00
free ( mydata ) ;
2008-01-29 17:24:18 +00:00
switch_event_destroy ( & params ) ;
2007-12-04 19:39:14 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-12-14 17:13:20 +00:00
static switch_status_t _find_user ( const char * cmd , switch_core_session_t * session , switch_stream_handle_t * stream , switch_bool_t tf )
2007-11-29 02:48:44 +00:00
{
2007-11-29 03:00:18 +00:00
switch_xml_t x_domain = NULL , x_user = NULL , xml = NULL ;
2007-11-29 02:48:44 +00:00
int argc ;
2008-01-29 18:01:19 +00:00
char * mydata = NULL , * argv [ 3 ] ;
2007-11-29 02:48:44 +00:00
char * key , * user , * domain ;
2007-11-30 23:45:27 +00:00
char * xmlstr ;
2007-12-04 18:52:13 +00:00
char * path_info = NULL ;
char delim = ' ' ;
char * host = NULL ;
const char * err = NULL ;
2008-01-29 18:01:19 +00:00
2008-05-24 03:46:19 +00:00
if ( stream - > param_event & & ( host = switch_event_get_header ( stream - > param_event , " http-host " ) ) ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " Content-Type: text/xml \r \n \r \n " ) ;
2008-05-24 03:46:19 +00:00
if ( ( path_info = switch_event_get_header ( stream - > param_event , " http-path-info " ) ) ) {
2007-12-04 18:52:13 +00:00
cmd = path_info ;
delim = ' / ' ;
}
2007-12-04 18:17:33 +00:00
}
2008-01-29 18:01:19 +00:00
if ( ! cmd ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2008-01-29 18:01:19 +00:00
goto end ;
}
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
2007-11-29 02:48:44 +00:00
2008-01-29 18:01:19 +00:00
argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-11-29 02:48:44 +00:00
2008-01-29 18:01:19 +00:00
if ( argc < 3 ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2008-01-29 18:01:19 +00:00
goto end ;
}
2007-11-29 02:48:44 +00:00
key = argv [ 0 ] ;
user = argv [ 1 ] ;
domain = argv [ 2 ] ;
2008-01-29 18:01:19 +00:00
if ( ! ( key & & user & & domain ) ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2008-01-29 18:01:19 +00:00
goto end ;
}
2007-11-29 02:48:44 +00:00
2008-12-23 17:36:50 +00:00
if ( switch_xml_locate_user ( key , user , domain , NULL , & xml , & x_domain , & x_user , NULL , NULL ) ! = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:52:13 +00:00
err = " can't find user " ;
2007-11-29 02:48:44 +00:00
goto end ;
}
2008-05-27 04:54:52 +00:00
end :
2007-12-14 17:13:20 +00:00
if ( session | | tf ) {
stream - > write_function ( stream , err ? " false " : " true " ) ;
} else {
if ( err ) {
if ( host ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " <error>%s</error> \n " , err ) ;
2007-12-14 17:13:20 +00:00
} else {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " -Error %s \n " , err ) ;
2007-12-14 17:13:20 +00:00
}
2007-12-04 18:52:13 +00:00
}
2009-02-13 00:08:12 +00:00
if ( x_user ) {
2007-12-14 17:13:20 +00:00
xmlstr = switch_xml_toxml ( x_user , SWITCH_FALSE ) ;
switch_assert ( xmlstr ) ;
2008-01-29 18:01:19 +00:00
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " %s " , xmlstr ) ;
2007-12-14 17:13:20 +00:00
free ( xmlstr ) ;
}
2007-11-29 02:48:44 +00:00
}
2009-02-13 00:08:12 +00:00
switch_xml_free ( xml ) ;
2007-11-29 02:48:44 +00:00
free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-10-20 23:27:29 +00:00
SWITCH_STANDARD_API ( md5_function )
{
char digest [ SWITCH_MD5_DIGEST_STRING_SIZE ] = { 0 } ;
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " %s " , " !err! " ) ;
} else {
switch_md5_string ( digest , ( void * ) cmd , strlen ( cmd ) ) ;
stream - > write_function ( stream , " %s " , digest ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-06-27 15:07:28 +00:00
SWITCH_STANDARD_API ( url_decode_function )
{
char * reply = " " ;
char * data = NULL ;
if ( ! switch_strlen_zero ( cmd ) ) {
data = strdup ( cmd ) ;
switch_url_decode ( data ) ;
reply = data ;
}
stream - > write_function ( stream , " %s " , reply ) ;
switch_safe_free ( data ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-08-15 15:05:48 +00:00
SWITCH_STANDARD_API ( eval_function )
{
char * expanded ;
switch_event_t * event ;
char uuid [ 80 ] = " " ;
const char * p , * input = cmd ;
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " %s " , " " ) ;
return SWITCH_STATUS_SUCCESS ;
}
if ( ! strncasecmp ( cmd , " uuid: " , 5 ) ) {
p = cmd + 5 ;
if ( ( input = strchr ( p , ' ' ) ) & & * input + + ) {
switch_copy_string ( uuid , p , input - p ) ;
}
}
if ( switch_strlen_zero ( input ) ) {
stream - > write_function ( stream , " %s " , " " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-10-02 17:10:05 +00:00
switch_event_create ( & event , SWITCH_EVENT_CHANNEL_DATA ) ;
2008-08-15 15:05:48 +00:00
if ( * uuid ) {
if ( ( session = switch_core_session_locate ( uuid ) ) ) {
switch_channel_event_set_data ( switch_core_session_get_channel ( session ) , event ) ;
switch_core_session_rwunlock ( session ) ;
}
}
2008-10-08 01:25:42 +00:00
2008-08-15 15:05:48 +00:00
expanded = switch_event_expand_headers ( event , input ) ;
stream - > write_function ( stream , " %s " , expanded ) ;
if ( expanded ! = input ) {
free ( expanded ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-07-10 14:41:31 +00:00
SWITCH_STANDARD_API ( module_exists_function )
{
if ( ! switch_strlen_zero ( cmd ) ) {
2008-10-06 19:21:59 +00:00
if ( switch_loadable_module_exists ( cmd ) = = SWITCH_STATUS_SUCCESS ) {
2008-07-10 14:41:31 +00:00
stream - > write_function ( stream , " true " ) ;
} else {
stream - > write_function ( stream , " false " ) ;
}
}
return SWITCH_STATUS_SUCCESS ;
}
2008-10-11 21:59:48 +00:00
SWITCH_STANDARD_API ( domain_exists_function )
{
2008-10-11 22:16:23 +00:00
switch_xml_t root = NULL , domain = NULL ;
2008-10-11 21:59:48 +00:00
if ( ! switch_strlen_zero ( cmd ) ) {
if ( switch_xml_locate_domain ( cmd , NULL , & root , & domain ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " true " ) ;
2008-10-11 22:16:23 +00:00
switch_xml_free ( root ) ;
2008-10-11 21:59:48 +00:00
} else {
stream - > write_function ( stream , " false " ) ;
}
}
return SWITCH_STATUS_SUCCESS ;
}
2008-06-27 15:07:28 +00:00
SWITCH_STANDARD_API ( url_encode_function )
{
char * reply = " " ;
char * data = NULL ;
int len = 0 ;
if ( ! switch_strlen_zero ( cmd ) ) {
len = ( strlen ( cmd ) * 3 ) + 1 ;
switch_zmalloc ( data , len ) ;
switch_url_encode ( cmd , data , len ) ;
reply = data ;
}
stream - > write_function ( stream , " %s " , reply ) ;
switch_safe_free ( data ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-12-14 17:13:20 +00:00
SWITCH_STANDARD_API ( user_exists_function )
{
return _find_user ( cmd , session , stream , SWITCH_TRUE ) ;
}
SWITCH_STANDARD_API ( find_user_function )
{
return _find_user ( cmd , session , stream , SWITCH_FALSE ) ;
}
2007-12-01 00:01:56 +00:00
SWITCH_STANDARD_API ( xml_locate_function )
{
switch_xml_t xml = NULL , obj = NULL ;
int argc ;
2008-01-29 18:01:19 +00:00
char * mydata = NULL , * argv [ 4 ] ;
2008-01-23 20:59:25 +00:00
char * section , * tag , * tag_attr_name , * tag_attr_val ;
switch_event_t * params = NULL ;
2007-12-01 00:01:56 +00:00
char * xmlstr ;
2007-12-04 18:52:13 +00:00
char * path_info , delim = ' ' ;
char * host = NULL ;
const char * err = NULL ;
2008-05-24 03:46:19 +00:00
if ( stream - > param_event & & ( host = switch_event_get_header ( stream - > param_event , " http-host " ) ) ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " Content-Type: text/xml \r \n \r \n " ) ;
2008-05-24 03:46:19 +00:00
if ( ( path_info = switch_event_get_header ( stream - > param_event , " http-path-info " ) ) ) {
2007-12-04 18:52:13 +00:00
cmd = path_info ;
delim = ' / ' ;
}
}
2007-12-01 00:01:56 +00:00
2008-01-29 18:01:19 +00:00
if ( ! cmd ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2008-01-29 18:01:19 +00:00
goto end ;
}
2007-12-01 00:01:56 +00:00
2008-01-29 17:48:10 +00:00
mydata = strdup ( cmd ) ;
2008-01-29 18:01:19 +00:00
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-12-01 00:01:56 +00:00
2008-01-29 18:01:19 +00:00
if ( argc = = 1 & & ! strcasecmp ( argv [ 0 ] , " root " ) ) {
2007-12-11 21:43:30 +00:00
const char * error ;
xml = switch_xml_open_root ( 0 , & error ) ;
2007-12-01 00:01:56 +00:00
obj = xml ;
2008-01-29 18:01:19 +00:00
goto end ;
}
2007-12-01 00:01:56 +00:00
2008-01-29 18:01:19 +00:00
if ( argc < 4 ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2008-01-29 18:01:19 +00:00
goto end ;
}
2007-12-01 00:01:56 +00:00
section = argv [ 0 ] ;
tag = argv [ 1 ] ;
tag_attr_name = argv [ 2 ] ;
tag_attr_val = argv [ 3 ] ;
2008-01-29 18:01:19 +00:00
2008-10-02 17:10:05 +00:00
switch_event_create ( & params , SWITCH_EVENT_REQUEST_PARAMS ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( params ) ;
2008-01-23 20:59:25 +00:00
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " section " , section ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag " , tag ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag_attr_name " , tag_attr_name ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag_attr_val " , tag_attr_val ) ;
2009-02-12 00:27:07 +00:00
if ( switch_xml_locate ( section , tag , tag_attr_name , tag_attr_val , & xml , & obj , params , SWITCH_FALSE ) ! = SWITCH_STATUS_SUCCESS ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " can't find anything \n " ) ;
2007-12-01 00:01:56 +00:00
goto end ;
}
2008-05-27 04:54:52 +00:00
end :
2007-12-04 18:52:13 +00:00
if ( err ) {
if ( host ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " <error>%s</error> \n " , err ) ;
2007-12-04 18:52:13 +00:00
} else {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " -Error %s \n " , err ) ;
2007-12-04 18:52:13 +00:00
}
}
2009-02-13 00:08:12 +00:00
if ( obj ) {
2007-12-01 00:01:56 +00:00
xmlstr = switch_xml_toxml ( obj , SWITCH_FALSE ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( xmlstr ) ;
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " %s " , xmlstr ) ;
2007-12-01 00:01:56 +00:00
free ( xmlstr ) ;
}
2009-02-13 00:08:12 +00:00
switch_xml_free ( xml ) ;
2008-01-29 18:01:19 +00:00
switch_event_destroy ( & params ) ;
2007-12-01 00:01:56 +00:00
free ( mydata ) ;
2009-02-13 00:08:12 +00:00
2007-12-01 00:01:56 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-03-26 22:14:09 +00:00
SWITCH_STANDARD_API ( reload_acl_function )
{
const char * err ;
2008-05-27 04:54:52 +00:00
switch_xml_t xml_root ;
2008-03-26 22:14:09 +00:00
if ( cmd & & ! strcmp ( cmd , " reloadxml " ) ) {
if ( ( xml_root = switch_xml_open_root ( 1 , & err ) ) ) {
switch_xml_free ( xml_root ) ;
}
}
switch_load_network_lists ( SWITCH_TRUE ) ;
stream - > write_function ( stream , " +OK acl reloaded \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_API ( acl_function )
{
int argc ;
char * mydata = NULL , * argv [ 3 ] ;
if ( ! cmd ) {
goto error ;
}
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 2 ) {
goto error ;
}
if ( switch_check_network_list_ip ( argv [ 0 ] , argv [ 1 ] ) ) {
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " true " ) ;
2008-03-26 22:14:09 +00:00
goto ok ;
}
2008-05-27 04:54:52 +00:00
error :
2008-03-26 22:14:09 +00:00
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " false " ) ;
2008-03-26 22:14:09 +00:00
2008-05-27 04:54:52 +00:00
ok :
2008-03-26 22:14:09 +00:00
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-09 15:26:32 +00:00
SWITCH_STANDARD_API ( regex_function )
{
switch_regex_t * re = NULL ;
int ovector [ 30 ] ;
int argc ;
2008-01-29 18:01:19 +00:00
char * mydata = NULL , * argv [ 3 ] ;
2007-11-09 15:26:32 +00:00
size_t len = 0 ;
char * substituted = NULL ;
int proceed = 0 ;
2008-01-29 18:01:19 +00:00
if ( ! cmd ) {
goto error ;
}
2007-11-09 15:26:32 +00:00
2008-01-29 18:01:19 +00:00
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
2007-11-09 15:26:32 +00:00
2008-01-29 18:01:19 +00:00
argc = switch_separate_string ( mydata , ' | ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 2 ) {
goto error ;
}
2007-11-09 15:26:32 +00:00
if ( ( proceed = switch_regex_perform ( argv [ 0 ] , argv [ 1 ] , & re , ovector , sizeof ( ovector ) / sizeof ( ovector [ 0 ] ) ) ) ) {
if ( argc > 2 ) {
2009-03-06 14:12:32 +00:00
len = ( strlen ( argv [ 0 ] ) + strlen ( argv [ 2 ] ) + 10 ) * proceed ;
2007-11-09 15:26:32 +00:00
substituted = malloc ( len ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( substituted ) ;
2007-11-09 15:26:32 +00:00
memset ( substituted , 0 , len ) ;
2008-05-27 04:54:52 +00:00
switch_replace_char ( argv [ 2 ] , ' % ' , ' $ ' , SWITCH_FALSE ) ;
2007-11-09 15:26:32 +00:00
switch_perform_substitution ( re , proceed , argv [ 2 ] , argv [ 0 ] , substituted , len , ovector ) ;
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " %s " , substituted ) ;
2007-11-09 15:26:32 +00:00
free ( substituted ) ;
} else {
stream - > write_function ( stream , " true " ) ;
}
} else {
stream - > write_function ( stream , " false " ) ;
}
goto ok ;
2008-05-27 04:54:52 +00:00
error :
stream - > write_function ( stream , " -ERR " ) ;
ok :
2007-11-09 15:26:32 +00:00
switch_regex_safe_free ( re ) ;
2008-01-29 18:01:19 +00:00
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
2007-11-09 15:26:32 +00:00
}
2007-11-08 23:46:26 +00:00
typedef enum {
2008-01-29 18:01:19 +00:00
O_NONE ,
O_EQ ,
O_NE ,
O_GT ,
O_GE ,
O_LT ,
O_LE
2007-11-08 23:46:26 +00:00
} o_t ;
2007-11-13 00:33:31 +00:00
SWITCH_STANDARD_API ( cond_function )
2007-11-08 23:46:26 +00:00
{
2008-01-29 18:01:19 +00:00
int argc ;
2007-11-08 23:46:26 +00:00
char * mydata = NULL , * argv [ 3 ] ;
2008-01-29 18:01:19 +00:00
char * expr ;
char * a , * b ;
double a_f = 0.0 , b_f = 0.0 ;
o_t o = O_NONE ;
int is_true = 0 ;
char * p ;
if ( ! cmd ) {
goto error ;
}
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
if ( ( p = strchr ( mydata , ' ? ' ) ) ) {
* p = ' : ' ;
} else {
goto error ;
}
argc = switch_separate_string ( mydata , ' : ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc ! = 3 ) {
goto error ;
}
a = argv [ 0 ] ;
if ( ( expr = strchr ( a , ' ! ' ) ) ) {
* expr + + = ' \0 ' ;
if ( * expr = = ' = ' ) {
o = O_NE ;
}
} else if ( ( expr = strchr ( a , ' > ' ) ) ) {
2008-05-27 04:54:52 +00:00
if ( * ( expr + 1 ) = = ' = ' ) {
2008-01-29 18:01:19 +00:00
* expr + + = ' \0 ' ;
o = O_GE ;
} else {
o = O_GT ;
}
} else if ( ( expr = strchr ( a , ' < ' ) ) ) {
2008-05-27 04:54:52 +00:00
if ( * ( expr + 1 ) = = ' = ' ) {
2008-01-29 18:01:19 +00:00
* expr + + = ' \0 ' ;
o = O_LE ;
} else {
o = O_LT ;
}
} else if ( ( expr = strchr ( a , ' = ' ) ) ) {
* expr + + = ' \0 ' ;
if ( * expr = = ' = ' ) {
o = O_EQ ;
}
}
if ( o ) {
char * s_a = NULL , * s_b = NULL ;
int a_is_num , b_is_num ;
* expr + + = ' \0 ' ;
b = expr ;
s_a = switch_strip_spaces ( a ) ;
s_b = switch_strip_spaces ( b ) ;
a_is_num = switch_is_number ( s_a ) ;
b_is_num = switch_is_number ( s_b ) ;
a_f = a_is_num ? atof ( s_a ) : ( float ) strlen ( s_a ) ;
b_f = b_is_num ? atof ( s_b ) : ( float ) strlen ( s_b ) ;
switch ( o ) {
case O_EQ :
if ( ! a_is_num & & ! b_is_num ) {
is_true = ! strcmp ( s_a , s_b ) ;
} else {
is_true = a_f = = b_f ;
}
break ;
case O_NE :
if ( ! a_is_num & & ! b_is_num ) {
is_true = strcmp ( s_a , s_b ) ;
} else {
is_true = a_f ! = b_f ;
}
break ;
case O_GT :
is_true = a_f > b_f ;
break ;
case O_GE :
is_true = a_f > = b_f ;
break ;
case O_LT :
is_true = a_f < b_f ;
break ;
case O_LE :
is_true = a_f < = b_f ;
break ;
default :
break ;
}
switch_safe_free ( s_a ) ;
switch_safe_free ( s_b ) ;
stream - > write_function ( stream , " %s " , is_true ? argv [ 1 ] : argv [ 2 ] ) ;
goto ok ;
2008-05-27 04:54:52 +00:00
}
2007-11-08 23:46:26 +00:00
2008-05-27 04:54:52 +00:00
error :
stream - > write_function ( stream , " -ERR " ) ;
ok :
2008-01-29 18:01:19 +00:00
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-08 23:46:26 +00:00
SWITCH_STANDARD_API ( lan_addr_function )
{
2008-03-27 20:34:49 +00:00
stream - > write_function ( stream , " %s " , switch_is_lan_addr ( cmd ) ? " true " : " false " ) ;
2007-11-08 23:46:26 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( status_function )
2006-05-10 15:47:54 +00:00
{
2006-05-10 18:04:17 +00:00
uint8_t html = 0 ;
2008-05-27 04:54:52 +00:00
switch_core_time_duration_t duration = { 0 } ;
2006-09-19 22:57:25 +00:00
char * http = NULL ;
2007-10-06 23:44:39 +00:00
int sps = 0 , last_sps = 0 ;
2008-08-01 15:06:56 +00:00
const char * var ;
2008-01-29 18:01:19 +00:00
2006-05-10 15:47:54 +00:00
switch_core_measure_time ( switch_core_uptime ( ) , & duration ) ;
2006-04-04 22:03:59 +00:00
2008-05-24 03:46:19 +00:00
if ( stream - > param_event ) {
http = switch_event_get_header ( stream - > param_event , " http-host " ) ;
2008-12-11 17:56:51 +00:00
if ( ( var = switch_event_get_header ( stream - > param_event , " content-type " ) ) ) {
if ( ! strcasecmp ( var , " text/plain " ) ) {
http = NULL ;
}
}
2006-10-31 05:04:47 +00:00
}
2006-09-18 22:22:25 +00:00
2008-12-11 17:56:51 +00:00
if ( http ) {
2008-08-01 15:06:56 +00:00
stream - > write_function ( stream , " %s " , " Content-Type: text/html \n \n " ) ;
}
2006-09-18 22:22:25 +00:00
if ( http | | ( cmd & & strstr ( cmd , " html " ) ) ) {
2006-05-10 16:47:02 +00:00
html = 1 ;
stream - > write_function ( stream , " <h1>FreeSWITCH Status</h1> \n <b> " ) ;
}
2007-03-29 22:31:56 +00:00
stream - > write_function ( stream ,
2008-05-27 04:54:52 +00:00
" UP %u year%s, %u day%s, %u hour%s, %u minute%s, %u second%s, %u millisecond%s, %u microsecond%s \n " ,
duration . yr , duration . yr = = 1 ? " " : " s " , duration . day , duration . day = = 1 ? " " : " s " ,
duration . hr , duration . hr = = 1 ? " " : " s " , duration . min , duration . min = = 1 ? " " : " s " ,
duration . sec , duration . sec = = 1 ? " " : " s " , duration . ms , duration . ms = = 1 ? " " : " s " , duration . mms ,
duration . mms = = 1 ? " " : " s " ) ;
2006-05-10 16:35:42 +00:00
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " % " SWITCH_SIZE_T_FMT " session(s) since startup \n " , switch_core_session_id ( ) - 1 ) ;
2007-10-04 21:35:50 +00:00
switch_core_session_ctl ( SCSC_LAST_SPS , & last_sps ) ;
switch_core_session_ctl ( SCSC_SPS , & sps ) ;
stream - > write_function ( stream , " %d session(s) %d/%d \n " , switch_core_session_count ( ) , last_sps , sps ) ;
2007-03-29 22:31:56 +00:00
2006-05-10 16:47:02 +00:00
if ( html ) {
stream - > write_function ( stream , " </b> \n " ) ;
}
2006-05-10 16:35:42 +00:00
if ( cmd & & strstr ( cmd , " refresh= " ) ) {
char * refresh = strchr ( cmd , ' = ' ) ;
if ( refresh ) {
int r ;
refresh + + ;
r = atoi ( refresh ) ;
2007-03-29 22:31:56 +00:00
if ( r > 0 ) {
2007-03-30 00:13:31 +00:00
stream - > write_function ( stream , " <META HTTP-EQUIV=REFRESH CONTENT= \" %d; URL=/api/status?refresh=%d%s \" > \n " , r , r , html ? " html=1 " : " " ) ;
2006-05-10 16:35:42 +00:00
}
}
}
2006-05-10 15:47:54 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-10-21 19:05:25 +00:00
# define CTL_SYNTAX "[send_sighup|hupall|pause|resume|shutdown [cancel|elegant|asap|restart]|sps|sync_clock|reclaim_mem|max_sessions|max_dtmf_duration [num]|loglevel [level]]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( ctl_function )
2006-09-20 20:25:26 +00:00
{
int argc ;
char * mydata , * argv [ 5 ] ;
2007-10-03 23:43:01 +00:00
int32_t arg = 0 ;
2006-09-20 20:25:26 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , CTL_SYNTAX ) ;
2006-09-20 20:25:26 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
if ( ( mydata = strdup ( cmd ) ) ) {
2006-09-20 20:25:26 +00:00
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-03-29 22:31:56 +00:00
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " hupall " ) ) {
2006-09-20 20:25:26 +00:00
arg = 1 ;
switch_core_session_ctl ( SCSC_HUPALL , & arg ) ;
2008-09-29 23:52:25 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " pause " ) ) {
2006-09-20 20:25:26 +00:00
arg = 1 ;
switch_core_session_ctl ( SCSC_PAUSE_INBOUND , & arg ) ;
2008-09-29 23:52:25 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2008-10-21 19:05:25 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " send_sighup " ) ) {
arg = 1 ;
switch_core_session_ctl ( SCSC_SEND_SIGHUP , & arg ) ;
stream - > write_function ( stream , " +OK \n " ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " resume " ) ) {
2006-09-20 20:25:26 +00:00
arg = 0 ;
switch_core_session_ctl ( SCSC_PAUSE_INBOUND , & arg ) ;
2008-09-29 23:52:25 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " shutdown " ) ) {
2008-10-05 06:27:45 +00:00
switch_session_ctl_t command = SCSC_SHUTDOWN ;
2008-10-02 16:46:20 +00:00
int x = 0 ;
2006-09-20 20:25:26 +00:00
arg = 0 ;
2008-10-02 16:46:20 +00:00
for ( x = 1 ; x < 5 ; x + + ) {
if ( argv [ x ] ) {
2008-10-03 14:58:36 +00:00
if ( ! strcasecmp ( argv [ x ] , " cancel " ) ) {
arg = 0 ;
2008-10-05 06:27:45 +00:00
command = SCSC_CANCEL_SHUTDOWN ;
2008-10-03 14:58:36 +00:00
break ;
} else if ( ! strcasecmp ( argv [ x ] , " elegant " ) ) {
2008-10-05 06:27:45 +00:00
command = SCSC_SHUTDOWN_ELEGANT ;
2008-10-21 19:05:25 +00:00
} else if ( ! strcasecmp ( argv [ x ] , " asap " ) ) {
command = SCSC_SHUTDOWN_ASAP ;
2008-10-02 16:46:20 +00:00
} else if ( ! strcasecmp ( argv [ x ] , " restart " ) ) {
arg = 1 ;
}
} else {
break ;
}
}
2008-10-05 06:27:45 +00:00
switch_core_session_ctl ( command , & arg ) ;
2008-09-29 23:52:25 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-10-04 17:25:06 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " reclaim_mem " ) ) {
switch_core_session_ctl ( SCSC_RECLAIM , & arg ) ;
2008-09-29 23:52:25 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-10-05 13:42:11 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " max_sessions " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_MAX_SESSIONS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK max sessions: %d \n " , arg ) ;
2008-04-18 17:03:34 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " max_dtmf_duration " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_MAX_DTMF_DURATION , & arg ) ;
stream - > write_function ( stream , " +OK max dtmf duration: %d \n " , arg ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " default_dtmf_duration " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_DEFAULT_DTMF_DURATION , & arg ) ;
stream - > write_function ( stream , " +OK default dtmf duration: %d \n " , arg ) ;
2007-10-03 23:43:01 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " loglevel " ) ) {
if ( argc > 1 ) {
if ( * argv [ 1 ] > 47 & & * argv [ 1 ] < 58 ) {
arg = atoi ( argv [ 1 ] ) ;
} else {
arg = switch_log_str2level ( argv [ 1 ] ) ;
}
} else {
arg = - 1 ;
}
2007-12-10 19:16:50 +00:00
2008-09-29 23:52:25 +00:00
if ( arg = = SWITCH_LOG_INVALID ) {
2007-12-10 19:16:50 +00:00
stream - > write_function ( stream , " -ERR syntax error, log level not set! \n " ) ;
} else {
switch_core_session_ctl ( SCSC_LOGLEVEL , & arg ) ;
stream - > write_function ( stream , " +OK log level: %s [%d] \n " , switch_log_level2str ( arg ) , arg ) ;
}
2007-10-04 21:35:50 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " last_sps " ) ) {
switch_core_session_ctl ( SCSC_LAST_SPS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK last sessions per second: %d \n " , arg ) ;
2007-10-04 14:19:51 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " sps " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
} else {
arg = 0 ;
}
switch_core_session_ctl ( SCSC_SPS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK sessions per second: %d \n " , arg ) ;
2008-01-11 00:43:49 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " sync_clock " ) ) {
arg = 0 ;
switch_core_session_ctl ( SCSC_SYNC_CLOCK , & arg ) ;
2008-10-06 23:10:50 +00:00
stream - > write_function ( stream , " +OK clock synchronized \n " ) ;
2006-09-20 20:25:26 +00:00
} else {
2008-01-06 23:03:12 +00:00
stream - > write_function ( stream , " -ERR INVALID COMMAND \n USAGE: fsctl %s " , CTL_SYNTAX ) ;
2006-09-20 20:25:26 +00:00
goto end ;
2008-05-27 04:54:52 +00:00
}
2008-01-29 17:48:10 +00:00
2008-05-27 04:54:52 +00:00
end :
2006-09-20 20:25:26 +00:00
free ( mydata ) ;
} else {
2008-10-11 06:19:56 +00:00
stream - > write_function ( stream , " -ERR Memory Error \n " ) ;
2006-09-20 20:25:26 +00:00
}
2007-03-29 22:31:56 +00:00
return SWITCH_STATUS_SUCCESS ;
2006-09-20 20:25:26 +00:00
}
2007-06-20 03:26:52 +00:00
# define LOAD_SYNTAX "<mod_name>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( load_function )
2006-04-20 00:58:06 +00:00
{
2007-05-03 16:28:23 +00:00
const char * err ;
2006-07-26 20:12:49 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , LOAD_SYNTAX ) ;
2006-10-08 04:40:15 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-10-31 05:04:47 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_loadable_module_load_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , SWITCH_TRUE , & err ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-03-17 19:51:08 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR [%s] \n " , err ) ;
2007-05-03 16:28:23 +00:00
}
return SWITCH_STATUS_SUCCESS ;
}
2008-11-12 17:10:20 +00:00
# define UNLOAD_SYNTAX "[-f] <mod_name>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( unload_function )
2007-05-03 16:28:23 +00:00
{
const char * err ;
2008-11-12 17:10:20 +00:00
switch_bool_t force = SWITCH_FALSE ;
const char * p = cmd ;
2007-05-03 16:28:23 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2008-11-12 17:10:20 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UNLOAD_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
if ( * p = = ' - ' ) {
p + + ;
while ( p & & * p ) {
switch ( * p ) {
case ' ' :
cmd = p + 1 ;
goto end ;
case ' f ' :
force = SWITCH_TRUE ;
break ;
default :
break ;
}
p + + ;
}
}
end :
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , UNLOAD_SYNTAX ) ;
2007-05-03 16:28:23 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-11-12 17:10:20 +00:00
if ( switch_loadable_module_unload_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , force , & err ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-05-03 16:28:23 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR [%s] \n " , err ) ;
2007-03-17 19:51:08 +00:00
}
2006-10-31 05:04:47 +00:00
2006-04-20 00:58:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( reload_function )
2008-10-07 17:56:30 +00:00
{
const char * err ;
2008-11-12 17:10:20 +00:00
switch_bool_t force = SWITCH_FALSE ;
const char * p = cmd ;
2008-10-07 17:56:30 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2008-11-12 17:10:20 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UNLOAD_SYNTAX ) ;
2008-10-07 17:56:30 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-11-12 17:10:20 +00:00
if ( * p = = ' - ' ) {
p + + ;
while ( p & & * p ) {
switch ( * p ) {
case ' ' :
cmd = p + 1 ;
goto end ;
case ' f ' :
force = SWITCH_TRUE ;
break ;
default :
break ;
}
p + + ;
}
}
end :
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , UNLOAD_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
if ( switch_loadable_module_unload_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , force , & err ) = = SWITCH_STATUS_SUCCESS ) {
2008-10-07 17:56:30 +00:00
stream - > write_function ( stream , " +OK module unloaded \n " ) ;
} else {
stream - > write_function ( stream , " -ERR unloading module [%s] \n " , err ) ;
2008-11-12 17:10:20 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-10-07 17:56:30 +00:00
}
if ( switch_loadable_module_load_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , SWITCH_TRUE , & err ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK module loaded \n " ) ;
} else {
stream - > write_function ( stream , " -ERR loading module [%s] \n " , err ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_API ( reload_xml_function )
2006-05-26 17:27:09 +00:00
{
const char * err ;
switch_xml_t xml_root ;
if ( ( xml_root = switch_xml_open_root ( 1 , & err ) ) ) {
switch_xml_free ( xml_root ) ;
}
2007-03-29 22:31:56 +00:00
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK [%s] \n " , err ) ;
2006-10-31 05:04:47 +00:00
2006-05-26 17:27:09 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-11-12 11:46:44 +00:00
# define KILL_SYNTAX "<uuid> [cause]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( kill_function )
2006-04-04 22:03:59 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * ksession = NULL ;
2008-11-12 11:46:44 +00:00
char * mycmd = NULL , * kcause = NULL ;
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
2006-04-04 22:03:59 +00:00
2008-11-12 11:46:44 +00:00
if ( switch_strlen_zero ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , KILL_SYNTAX ) ;
2008-11-12 11:46:44 +00:00
return SWITCH_STATUS_SUCCESS ;
}
if ( ( kcause = strchr ( mycmd , ' ' ) ) ) {
* kcause + + = ' \0 ' ;
}
if ( switch_strlen_zero ( mycmd ) | | ! ( ksession = switch_core_session_locate ( mycmd ) ) ) {
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
} else {
2007-05-12 21:36:15 +00:00
switch_channel_t * channel = switch_core_session_get_channel ( ksession ) ;
2008-11-12 11:46:44 +00:00
if ( ! switch_strlen_zero ( kcause ) ) {
cause = switch_channel_str2cause ( kcause ) ;
}
switch_channel_hangup ( channel , cause ) ;
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( ksession ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2006-04-04 22:03:59 +00:00
}
2008-11-12 11:46:44 +00:00
switch_safe_free ( mycmd ) ;
2006-04-04 22:03:59 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-12-13 22:17:20 +00:00
# define PARK_SYNTAX "<uuid>"
SWITCH_STANDARD_API ( park_function )
{
switch_core_session_t * ksession = NULL ;
if ( ! cmd ) {
stream - > write_function ( stream , " -USAGE: %s \n " , PARK_SYNTAX ) ;
} else if ( ( ksession = switch_core_session_locate ( cmd ) ) ) {
switch_ivr_park_session ( ksession ) ;
switch_core_session_rwunlock ( ksession ) ;
stream - > write_function ( stream , " +OK \n " ) ;
} else {
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2007-10-01 14:57:15 +00:00
# define TRANSFER_SYNTAX "<uuid> [-bleg|-both] <dest-exten> [<dialplan>] [<context>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( transfer_function )
2006-04-28 19:46:57 +00:00
{
2007-10-01 14:57:15 +00:00
switch_core_session_t * tsession = NULL , * other_session = NULL ;
char * mycmd = NULL , * argv [ 5 ] = { 0 } ;
2006-04-28 19:46:57 +00:00
int argc = 0 ;
2008-02-08 15:17:52 +00:00
char * tuuid , * dest , * dp , * context , * arg = NULL ;
2006-07-26 20:12:49 +00:00
2008-01-29 17:48:10 +00:00
if ( switch_strlen_zero ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , TRANSFER_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-10-01 14:57:15 +00:00
2008-01-29 17:48:10 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 2 | | argc > 5 ) {
stream - > write_function ( stream , " -USAGE: %s \n " , TRANSFER_SYNTAX ) ;
goto done ;
}
2007-05-12 14:48:14 +00:00
2008-02-08 15:17:52 +00:00
tuuid = argv [ 0 ] ;
dest = argv [ 1 ] ;
dp = argv [ 2 ] ;
context = argv [ 3 ] ;
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( tuuid ) | | ! ( tsession = switch_core_session_locate ( tuuid ) ) ) {
2008-01-29 17:48:10 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
goto done ;
}
if ( * dest = = ' - ' ) {
arg = dest ;
dest = argv [ 2 ] ;
dp = argv [ 3 ] ;
context = argv [ 4 ] ;
}
if ( arg ) {
switch_channel_t * channel = switch_core_session_get_channel ( tsession ) ;
const char * uuid = switch_channel_get_variable ( channel , SWITCH_BRIDGE_VARIABLE ) ;
arg + + ;
if ( ! strcasecmp ( arg , " bleg " ) ) {
if ( uuid & & ( other_session = switch_core_session_locate ( uuid ) ) ) {
switch_core_session_t * tmp = tsession ;
tsession = other_session ;
other_session = NULL ;
switch_core_session_rwunlock ( tmp ) ;
}
} else if ( ! strcasecmp ( arg , " both " ) ) {
if ( uuid & & ( other_session = switch_core_session_locate ( uuid ) ) ) {
2008-08-12 15:16:33 +00:00
switch_channel_t * other_channel = switch_core_session_get_channel ( other_session ) ;
2008-11-25 17:53:35 +00:00
switch_channel_set_flag ( other_channel , CF_REDIRECT ) ;
switch_channel_set_flag ( channel , CF_REDIRECT ) ;
2008-01-29 17:48:10 +00:00
switch_ivr_session_transfer ( other_session , dest , dp , context ) ;
switch_core_session_rwunlock ( other_session ) ;
2006-04-28 19:46:57 +00:00
}
}
}
2008-01-29 17:48:10 +00:00
if ( switch_ivr_session_transfer ( tsession , dest , dp , context ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK \n " ) ;
} else {
stream - > write_function ( stream , " -ERR \n " ) ;
}
switch_core_session_rwunlock ( tsession ) ;
2007-05-12 14:48:14 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-04-28 19:46:57 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-11-18 02:05:11 +00:00
# define TONE_DETECT_SYNTAX "<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args> <hits>]"
2007-06-16 02:25:40 +00:00
SWITCH_STANDARD_API ( tone_detect_session_function )
{
2008-11-18 02:05:11 +00:00
char * argv [ 8 ] = { 0 } ;
2007-06-16 02:25:40 +00:00
int argc ;
char * mydata = NULL ;
time_t to = 0 ;
switch_core_session_t * rsession ;
2008-11-18 02:05:11 +00:00
int hits = 1 ;
2007-12-04 18:52:13 +00:00
2007-10-20 06:01:41 +00:00
if ( ! cmd ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , TONE_DETECT_SYNTAX ) ;
2007-10-20 06:01:41 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-16 03:43:13 +00:00
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ! = NULL ) ;
2007-06-16 03:43:13 +00:00
2007-12-22 01:00:10 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) < 3 | | ! argv [ 0 ] ) {
2007-12-04 18:23:41 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " -ERR INVALID ARGS! \n " ) ;
2007-12-22 01:00:10 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-06-16 02:25:40 +00:00
}
if ( ! ( rsession = switch_core_session_locate ( argv [ 0 ] ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Error Cannot locate session! \n " ) ;
2007-06-16 02:25:40 +00:00
return SWITCH_STATUS_SUCCESS ;
}
if ( argv [ 4 ] ) {
uint32_t mto ;
2007-06-16 03:43:13 +00:00
if ( * argv [ 4 ] = = ' + ' ) {
2008-05-27 04:54:52 +00:00
if ( ( mto = atoi ( argv [ 4 ] + 1 ) ) > 0 ) {
2009-01-25 21:23:07 +00:00
to = switch_epoch_time_now ( NULL ) + mto ;
2007-06-16 02:25:40 +00:00
} else {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
goto done ;
}
} else {
2009-01-25 21:23:07 +00:00
if ( ( to = atoi ( argv [ 4 ] ) ) < switch_epoch_time_now ( NULL ) ) {
2007-06-16 02:25:40 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
to = 0 ;
goto done ;
}
}
}
2008-11-18 02:05:11 +00:00
if ( argv [ 7 ] ) {
hits = atoi ( argv [ 7 ] ) ;
if ( hits < 0 ) {
hits = 1 ;
}
}
2009-01-19 16:10:54 +00:00
switch_ivr_tone_detect_session ( rsession , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] , to , hits , argv [ 5 ] , argv [ 6 ] , NULL ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Enabling tone detection '%s' '%s' '%s' \n " , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] ) ;
2007-06-16 02:25:40 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-06-16 02:25:40 +00:00
2007-06-16 03:43:13 +00:00
free ( mydata ) ;
2007-06-16 02:25:40 +00:00
switch_core_session_rwunlock ( rsession ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-03-28 23:37:12 +00:00
2007-07-05 17:03:14 +00:00
SWITCH_STANDARD_API ( uuid_function )
{
switch_uuid_t uuid ;
char uuid_str [ SWITCH_UUID_FORMATTED_LENGTH + 1 ] ;
switch_uuid_get ( & uuid ) ;
2008-01-29 18:01:19 +00:00
switch_uuid_format ( uuid_str , & uuid ) ;
2007-07-05 17:03:14 +00:00
stream - > write_function ( stream , " %s " , uuid_str ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-16 20:20:43 +00:00
# define UUID_CHAT_SYNTAX "<uuid> <text>"
SWITCH_STANDARD_API ( uuid_chat )
{
switch_core_session_t * tsession = NULL ;
char * uuid = NULL , * text = NULL ;
if ( ! switch_strlen_zero ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( text ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_CHAT_SYNTAX ) ;
2007-11-16 20:20:43 +00:00
} else {
if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
switch_event_t * event ;
2008-10-02 17:10:05 +00:00
if ( switch_event_create ( & event , SWITCH_EVENT_COMMAND ) = = SWITCH_STATUS_SUCCESS ) {
2007-11-16 20:20:43 +00:00
switch_event_add_body ( event , " %s " , text ) ;
if ( switch_core_session_receive_event ( tsession , & event ) ! = SWITCH_STATUS_SUCCESS ) {
switch_event_destroy ( & event ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Send Failed \n " ) ;
2007-11-16 20:20:43 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-11-16 20:20:43 +00:00
}
}
switch_core_session_rwunlock ( tsession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel %s! \n " , uuid ) ;
2007-11-16 20:20:43 +00:00
}
}
switch_safe_free ( uuid ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-11-20 02:07:59 +00:00
# define UUID_DEFLECT_SYNTAX "<uuid> <uri>"
SWITCH_STANDARD_API ( uuid_deflect )
{
switch_core_session_t * tsession = NULL ;
char * uuid = NULL , * text = NULL ;
if ( ! switch_strlen_zero ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( text ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_DEFLECT_SYNTAX ) ;
} else {
if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
switch_core_session_message_t msg = { 0 } ;
/* Tell the channel to deflect the call */
msg . from = __FILE__ ;
msg . string_arg = text ;
msg . message_id = SWITCH_MESSAGE_INDICATE_DEFLECT ;
switch_core_session_receive_message ( tsession , & msg ) ;
stream - > write_function ( stream , " +OK:%s \n " , msg . string_reply ) ;
switch_core_session_rwunlock ( tsession ) ;
} else {
stream - > write_function ( stream , " -ERR No Such Channel %s! \n " , uuid ) ;
}
}
switch_safe_free ( uuid ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SCHED_TRANSFER_SYNTAX "[+]<time> <uuid> <extension> [<dialplan>] [<context>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_transfer_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * tsession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 6 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 | | argc > 5 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SCHED_TRANSFER_SYNTAX ) ;
2007-03-28 23:37:12 +00:00
} else {
char * uuid = argv [ 1 ] ;
char * dest = argv [ 2 ] ;
char * dp = argv [ 3 ] ;
char * context = argv [ 4 ] ;
time_t when ;
2007-03-29 22:31:56 +00:00
2007-03-28 23:37:12 +00:00
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
2007-05-12 21:36:15 +00:00
if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
2007-03-28 23:37:12 +00:00
switch_ivr_schedule_transfer ( when , uuid , dest , dp , context ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( tsession ) ;
2007-03-28 23:37:12 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SCHED_HANGUP_SYNTAX "[+]<time> <uuid> [<cause>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_hangup_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * hsession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SCHED_HANGUP_SYNTAX ) ;
2007-03-28 23:37:12 +00:00
} else {
char * uuid = argv [ 1 ] ;
char * cause_str = argv [ 2 ] ;
time_t when ;
switch_call_cause_t cause = SWITCH_CAUSE_ALLOTTED_TIMEOUT ;
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
if ( cause_str ) {
cause = switch_channel_str2cause ( cause_str ) ;
}
2007-05-12 21:36:15 +00:00
if ( ( hsession = switch_core_session_locate ( uuid ) ) ) {
2007-03-28 23:37:12 +00:00
switch_ivr_schedule_hangup ( when , uuid , cause , SWITCH_FALSE ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( hsession ) ;
2007-03-28 23:37:12 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-07-16 17:37:51 +00:00
# define MEDIA_SYNTAX "[off] <uuid>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_media_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , MEDIA_SYNTAX ) ;
2006-10-31 21:38:06 +00:00
} else {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " off " ) ) {
2006-10-31 21:38:06 +00:00
status = switch_ivr_nomedia ( argv [ 1 ] , SMF_REBRIDGE ) ;
} else {
status = switch_ivr_media ( argv [ 0 ] , SMF_REBRIDGE ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define BROADCAST_SYNTAX "<uuid> <path> [aleg|bleg|both]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_broadcast_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , BROADCAST_SYNTAX ) ;
2006-10-31 21:38:06 +00:00
} else {
switch_media_flag_t flags = SMF_NONE ;
2006-11-10 08:13:01 +00:00
if ( argv [ 2 ] ) {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 2 ] , " both " ) ) {
2006-11-10 08:13:01 +00:00
flags | = ( SMF_ECHO_ALEG | SMF_ECHO_BLEG ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 2 ] , " aleg " ) ) {
2006-11-10 08:13:01 +00:00
flags | = SMF_ECHO_ALEG ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 2 ] , " bleg " ) ) {
2006-11-10 08:13:01 +00:00
flags | = SMF_ECHO_BLEG ;
}
} else {
flags | = SMF_ECHO_ALEG ;
2006-10-31 21:38:06 +00:00
}
2007-03-29 22:31:56 +00:00
2006-10-31 21:38:06 +00:00
status = switch_ivr_broadcast ( argv [ 0 ] , argv [ 1 ] , flags ) ;
stream - > write_function ( stream , " +OK Message Sent \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SCHED_BROADCAST_SYNTAX "[+]<time> <uuid> <path> [aleg|bleg|both]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_broadcast_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 3 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SCHED_BROADCAST_SYNTAX ) ;
2007-03-28 23:37:12 +00:00
} else {
switch_media_flag_t flags = SMF_NONE ;
time_t when ;
if ( * argv [ 0 ] = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
if ( argv [ 3 ] ) {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 3 ] , " both " ) ) {
2007-03-28 23:37:12 +00:00
flags | = ( SMF_ECHO_ALEG | SMF_ECHO_BLEG ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 3 ] , " aleg " ) ) {
2007-03-28 23:37:12 +00:00
flags | = SMF_ECHO_ALEG ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 3 ] , " bleg " ) ) {
2007-03-28 23:37:12 +00:00
flags | = SMF_ECHO_BLEG ;
}
} else {
flags | = SMF_ECHO_ALEG ;
}
2007-03-29 22:31:56 +00:00
2007-03-28 23:37:12 +00:00
status = switch_ivr_schedule_broadcast ( when , argv [ 1 ] , argv [ 2 ] , flags ) ;
stream - > write_function ( stream , " +OK Message Scheduled \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-03-11 03:45:16 +00:00
# define HOLD_SYNTAX "<uuid> [<display>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_hold_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , HOLD_SYNTAX ) ;
2006-10-31 21:38:06 +00:00
} else {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " off " ) ) {
2006-10-31 21:38:06 +00:00
status = switch_ivr_unhold_uuid ( argv [ 1 ] ) ;
} else {
2008-05-01 16:41:46 +00:00
status = switch_ivr_hold_uuid ( argv [ 0 ] , argv [ 1 ] , 1 ) ;
2008-03-11 03:45:16 +00:00
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
# define DISPLAY_SYNTAX "<uuid> <display>"
SWITCH_STANDARD_API ( uuid_display_function )
{
char * mycmd = NULL , * argv [ 2 ] = { 0 } ;
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
if ( switch_strlen_zero ( cmd ) | | argc < 2 | | switch_strlen_zero ( argv [ 0 ] ) | | switch_strlen_zero ( argv [ 1 ] ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , HOLD_SYNTAX ) ;
} else {
switch_core_session_message_t msg = { 0 } ;
switch_core_session_t * lsession = NULL ;
msg . message_id = SWITCH_MESSAGE_INDICATE_DISPLAY ;
msg . string_arg = argv [ 1 ] ;
msg . from = __FILE__ ;
if ( ( lsession = switch_core_session_locate ( argv [ 0 ] ) ) ) {
status = switch_core_session_receive_message ( lsession , & msg ) ;
switch_core_session_rwunlock ( lsession ) ;
2006-10-31 21:38:06 +00:00
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define UUID_SYNTAX "<uuid> <other_uuid>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_bridge_function )
2006-09-19 02:18:24 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-09-19 02:18:24 +00:00
int argc = 0 ;
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-09-19 02:18:24 +00:00
2008-03-13 01:08:42 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_SYNTAX ) ;
2006-09-19 02:18:24 +00:00
} else {
2008-03-13 01:08:42 +00:00
switch_status_t status ;
char * who = NULL ;
2008-05-27 04:54:52 +00:00
2008-03-13 01:08:42 +00:00
if ( ( status = switch_ivr_uuid_bridge ( argv [ 0 ] , argv [ 1 ] ) ) ! = SWITCH_STATUS_SUCCESS ) {
if ( argv [ 2 ] ) {
if ( ( status = switch_ivr_uuid_bridge ( argv [ 0 ] , argv [ 2 ] ) ) = = SWITCH_STATUS_SUCCESS ) {
who = argv [ 2 ] ;
}
2008-05-27 04:54:52 +00:00
}
2008-03-13 01:08:42 +00:00
} else {
who = argv [ 1 ] ;
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK %s \n " , who ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Invalid uuid \n " ) ;
2006-10-08 04:40:15 +00:00
}
2006-09-19 02:18:24 +00:00
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-09-19 02:18:24 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SESS_REC_SYNTAX "<uuid> [start|stop] <path> [<limit>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( session_record_function )
2007-01-12 16:05:49 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * rsession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2007-03-29 22:31:56 +00:00
char * uuid = NULL , * action = NULL , * path = NULL ;
2007-01-12 16:05:49 +00:00
int argc = 0 ;
2007-05-31 14:42:23 +00:00
uint32_t limit = 0 ;
2007-01-12 16:05:49 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-03-29 22:31:56 +00:00
goto usage ;
}
2007-01-12 16:05:49 +00:00
2007-05-12 14:48:14 +00:00
if ( ! ( mycmd = strdup ( cmd ) ) ) {
goto usage ;
}
2007-06-15 01:47:48 +00:00
if ( ( argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 3 ) {
2007-03-29 22:31:56 +00:00
goto usage ;
}
uuid = argv [ 0 ] ;
action = argv [ 1 ] ;
path = argv [ 2 ] ;
2007-05-31 14:42:23 +00:00
limit = argv [ 3 ] ? atoi ( argv [ 3 ] ) : 0 ;
2008-01-29 18:01:19 +00:00
2007-12-22 01:00:10 +00:00
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( action ) | | switch_strlen_zero ( path ) ) {
goto usage ;
}
2007-05-12 21:36:15 +00:00
if ( ! ( rsession = switch_core_session_locate ( uuid ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Cannot locate session! \n " ) ;
2007-03-29 22:31:56 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-01-29 18:01:19 +00:00
2007-03-29 22:31:56 +00:00
if ( ! strcasecmp ( action , " start " ) ) {
2008-09-27 18:49:21 +00:00
if ( switch_ivr_record_session ( rsession , path , limit , NULL ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR Cannot record session! \n " ) ;
} else {
stream - > write_function ( stream , " +OK Success \n " ) ;
}
2007-03-29 22:31:56 +00:00
} else if ( ! strcasecmp ( action , " stop " ) ) {
2008-09-27 18:49:21 +00:00
if ( switch_ivr_stop_record_session ( rsession , path ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR Cannot stop record session! \n " ) ;
} else {
stream - > write_function ( stream , " +OK Success \n " ) ;
}
2007-03-29 22:31:56 +00:00
} else {
goto usage ;
}
2007-01-12 16:05:49 +00:00
2007-03-29 22:31:56 +00:00
goto done ;
2007-01-12 16:05:49 +00:00
2008-05-27 04:54:52 +00:00
usage :
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SESS_REC_SYNTAX ) ;
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-05-15 02:21:53 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-05-15 02:21:53 +00:00
if ( rsession ) {
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( rsession ) ;
2007-03-29 22:31:56 +00:00
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-03-29 22:31:56 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-01-12 16:05:49 +00:00
}
2008-01-29 18:01:19 +00:00
# define DISPLACE_SYNTAX "<uuid> [start|stop] <path> [<limit>] [mux]"
2007-06-15 01:47:48 +00:00
SWITCH_STANDARD_API ( session_displace_function )
{
switch_core_session_t * rsession = NULL ;
char * mycmd = NULL , * argv [ 5 ] = { 0 } ;
char * uuid = NULL , * action = NULL , * path = NULL ;
int argc = 0 ;
uint32_t limit = 0 ;
char * flags = NULL ;
2008-01-29 18:01:19 +00:00
if ( switch_strlen_zero ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
2007-06-15 01:47:48 +00:00
goto usage ;
}
if ( ( argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 3 ) {
goto usage ;
}
uuid = argv [ 0 ] ;
action = argv [ 1 ] ;
path = argv [ 2 ] ;
limit = argv [ 3 ] ? atoi ( argv [ 3 ] ) : 0 ;
flags = argv [ 4 ] ;
2007-12-22 01:00:10 +00:00
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( action ) | | switch_strlen_zero ( path ) ) {
goto usage ;
}
2007-06-15 01:47:48 +00:00
if ( ! ( rsession = switch_core_session_locate ( uuid ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Cannot locate session! \n " ) ;
2007-06-15 01:47:48 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-01-29 18:01:19 +00:00
2007-06-15 01:47:48 +00:00
if ( ! strcasecmp ( action , " start " ) ) {
2008-09-27 18:49:21 +00:00
if ( switch_ivr_displace_session ( rsession , path , limit , flags ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR Cannot displace session! \n " ) ;
} else {
stream - > write_function ( stream , " +OK Success \n " ) ;
}
2007-06-15 01:47:48 +00:00
} else if ( ! strcasecmp ( action , " stop " ) ) {
2008-09-27 18:49:21 +00:00
if ( switch_ivr_stop_displace_session ( rsession , path ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR Cannot stop displace session! \n " ) ;
} else {
stream - > write_function ( stream , " +OK Success \n " ) ;
}
2007-06-15 01:47:48 +00:00
} else {
goto usage ;
}
goto done ;
2008-05-27 04:54:52 +00:00
usage :
2008-01-29 18:01:19 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , DISPLACE_SYNTAX ) ;
2007-06-15 01:47:48 +00:00
switch_safe_free ( mycmd ) ;
2008-05-27 04:54:52 +00:00
done :
2007-06-15 01:47:48 +00:00
if ( rsession ) {
switch_core_session_rwunlock ( rsession ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-10-21 17:41:55 +00:00
# define BREAK_SYNTAX "<uuid> [all]"
2007-06-25 18:37:40 +00:00
SWITCH_STANDARD_API ( break_function )
{
switch_core_session_t * psession = NULL ;
2008-10-21 17:41:55 +00:00
char * mycmd , * flag ;
2008-11-26 19:48:36 +00:00
switch_channel_t * channel = NULL ;
2007-06-25 18:37:40 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , BREAK_SYNTAX ) ;
2008-01-29 18:28:32 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-06-25 18:37:40 +00:00
}
2008-10-21 17:41:55 +00:00
mycmd = strdup ( cmd ) ;
switch_assert ( mycmd ) ;
if ( ( flag = strchr ( mycmd , ' ' ) ) ) {
* flag + + = ' \0 ' ;
}
if ( ! ( psession = switch_core_session_locate ( mycmd ) ) ) {
2008-01-29 18:28:32 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-10-21 17:41:55 +00:00
if ( flag & & ! strcasecmp ( flag , " all " ) ) {
2008-10-22 13:14:41 +00:00
switch_core_session_flush_private_events ( psession ) ;
2008-10-21 17:41:55 +00:00
}
2008-11-26 19:48:36 +00:00
channel = switch_core_session_get_channel ( psession ) ;
2009-01-29 21:52:38 +00:00
if ( switch_channel_test_flag ( channel , CF_BROADCAST ) ) {
switch_channel_stop_broadcast ( channel ) ;
} else {
switch_channel_set_flag ( channel , CF_BREAK ) ;
}
2008-01-29 18:28:32 +00:00
switch_core_session_rwunlock ( psession ) ;
2007-06-25 18:37:40 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define PAUSE_SYNTAX "<uuid> <on|off>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( pause_function )
2006-04-28 19:46:57 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * psession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-04-28 19:46:57 +00:00
int argc = 0 ;
2006-07-26 20:12:49 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-04-28 19:46:57 +00:00
2008-02-09 05:16:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 | | switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , PAUSE_SYNTAX ) ;
2006-04-28 19:46:57 +00:00
} else {
char * uuid = argv [ 0 ] ;
char * dest = argv [ 1 ] ;
2007-03-29 22:31:56 +00:00
2007-05-12 21:36:15 +00:00
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel = switch_core_session_get_channel ( psession ) ;
2006-04-28 19:46:57 +00:00
if ( ! strcasecmp ( dest , " on " ) ) {
switch_channel_set_flag ( channel , CF_HOLD ) ;
} else {
switch_channel_clear_flag ( channel , CF_HOLD ) ;
}
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( psession ) ;
2006-04-28 19:46:57 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2006-04-28 19:46:57 +00:00
}
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-04-28 19:46:57 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define ORIGINATE_SYNTAX "<call url> <exten>|&<application_name>(<app_args>) [<dialplan>] [<context>] [<cid_name>] [<cid_num>] [<timeout_sec>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( originate_function )
2006-08-17 00:53:09 +00:00
{
switch_channel_t * caller_channel ;
2007-04-13 22:15:58 +00:00
switch_core_session_t * caller_session = NULL ;
2007-09-29 01:06:08 +00:00
char * mycmd = NULL , * argv [ 10 ] = { 0 } ;
2006-11-09 05:39:04 +00:00
int i = 0 , x , argc = 0 ;
2006-08-17 00:53:09 +00:00
char * aleg , * exten , * dp , * context , * cid_name , * cid_num ;
uint32_t timeout = 60 ;
2006-09-12 01:32:04 +00:00
switch_call_cause_t cause = SWITCH_CAUSE_NORMAL_CLEARING ;
2006-11-09 05:39:04 +00:00
uint8_t machine = 1 ;
2007-09-29 01:06:08 +00:00
switch_status_t status = SWITCH_STATUS_SUCCESS ;
2008-01-29 18:01:19 +00:00
2007-09-29 01:06:08 +00:00
if ( session | | switch_strlen_zero ( cmd ) ) {
2008-02-03 04:23:08 +00:00
stream - > write_function ( stream , " -USAGE %s \n " , ORIGINATE_SYNTAX ) ;
2006-08-17 00:53:09 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-09-29 01:06:08 +00:00
mycmd = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mycmd ) ;
2007-09-29 01:06:08 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-01-29 18:01:19 +00:00
2007-09-29 01:06:08 +00:00
if ( argc < 2 | | argc > 7 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , ORIGINATE_SYNTAX ) ;
2007-09-29 01:06:08 +00:00
goto done ;
2006-08-17 00:53:09 +00:00
}
2007-12-11 21:43:30 +00:00
for ( x = 0 ; x < argc & & argv [ x ] ; x + + ) {
2006-08-17 00:53:09 +00:00
if ( ! strcasecmp ( argv [ x ] , " undef " ) ) {
argv [ x ] = NULL ;
}
}
2007-03-29 22:31:56 +00:00
2007-12-11 21:43:30 +00:00
if ( argv [ 0 ] & & ! strcasecmp ( argv [ 0 ] , " machine " ) ) {
2006-11-09 05:39:04 +00:00
machine = 1 ;
i + + ;
}
2006-08-17 00:53:09 +00:00
2006-11-09 05:39:04 +00:00
aleg = argv [ i + + ] ;
exten = argv [ i + + ] ;
dp = argv [ i + + ] ;
context = argv [ i + + ] ;
cid_name = argv [ i + + ] ;
cid_num = argv [ i + + ] ;
2007-03-29 22:31:56 +00:00
2006-08-17 00:53:09 +00:00
if ( ! dp ) {
dp = " XML " ;
}
if ( ! context ) {
context = " default " ;
}
if ( argv [ 6 ] ) {
timeout = atoi ( argv [ 6 ] ) ;
}
2008-12-05 14:59:24 +00:00
if ( switch_ivr_originate ( NULL , & caller_session , & cause , aleg , timeout , NULL , cid_name , cid_num , NULL , NULL , SOF_NONE ) ! = SWITCH_STATUS_SUCCESS
2008-05-27 04:54:52 +00:00
| | ! caller_session ) {
2006-11-09 05:39:04 +00:00
if ( machine ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR %s \n " , switch_channel_cause2str ( cause ) ) ;
2006-11-09 05:39:04 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Cannot Create Outgoing Channel! [%s] cause: %s \n " , aleg , switch_channel_cause2str ( cause ) ) ;
2006-11-09 05:39:04 +00:00
}
2007-09-29 01:06:08 +00:00
goto done ;
2007-03-29 22:31:56 +00:00
}
2006-08-17 00:53:09 +00:00
caller_channel = switch_core_session_get_channel ( caller_session ) ;
switch_channel_clear_state_handler ( caller_channel , NULL ) ;
2008-01-29 18:01:19 +00:00
2007-03-29 22:31:56 +00:00
if ( * exten = = ' & ' & & * ( exten + 1 ) ) {
2006-09-07 03:58:01 +00:00
switch_caller_extension_t * extension = NULL ;
char * app_name = switch_core_session_strdup ( caller_session , ( exten + 1 ) ) ;
2007-02-23 21:00:20 +00:00
char * arg = NULL , * e ;
2006-09-07 03:58:01 +00:00
if ( ( e = strchr ( app_name , ' ) ' ) ) ) {
* e = ' \0 ' ;
}
if ( ( arg = strchr ( app_name , ' ( ' ) ) ) {
* arg + + = ' \0 ' ;
}
if ( ( extension = switch_caller_extension_new ( caller_session , app_name , arg ) ) = = 0 ) {
2008-10-11 06:19:56 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CRIT , " Memory Error! \n " ) ;
2007-09-29 01:06:08 +00:00
abort ( ) ;
2006-09-07 03:58:01 +00:00
}
switch_caller_extension_add_application ( caller_session , extension , app_name , arg ) ;
switch_channel_set_caller_extension ( caller_channel , extension ) ;
switch_channel_set_state ( caller_channel , CS_EXECUTE ) ;
} else {
switch_ivr_session_transfer ( caller_session , exten , dp , context ) ;
}
2006-11-09 05:39:04 +00:00
if ( machine ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK %s \n " , switch_core_session_get_uuid ( caller_session ) ) ;
2006-11-09 05:39:04 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Created Session: %s \n " , switch_core_session_get_uuid ( caller_session ) ) ;
2006-11-09 05:39:04 +00:00
}
2007-04-13 22:15:58 +00:00
2008-05-19 21:44:11 +00:00
switch_core_session_rwunlock ( caller_session ) ;
2006-11-09 05:39:04 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-09-29 01:06:08 +00:00
return status ;
2006-08-17 00:53:09 +00:00
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_del_function )
2007-03-30 14:57:06 +00:00
{
uint32_t cnt = 0 ;
2007-10-20 06:01:41 +00:00
if ( ! cmd ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Invalid syntax \n " ) ;
2007-10-20 06:01:41 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-01-29 18:01:19 +00:00
2007-03-30 14:57:06 +00:00
if ( switch_is_digit_string ( cmd ) ) {
int64_t tmp ;
tmp = ( uint32_t ) atoi ( cmd ) ;
if ( tmp > 0 ) {
2008-05-27 04:54:52 +00:00
cnt = switch_scheduler_del_task_id ( ( uint32_t ) tmp ) ;
2007-03-30 14:57:06 +00:00
}
} else {
cnt = switch_scheduler_del_task_group ( cmd ) ;
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Deleted: %u \n " , cnt ) ;
2007-03-30 14:57:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( xml_wrap_api_function )
2007-04-07 20:30:28 +00:00
{
char * dcommand , * edata = NULL , * send = NULL , * command , * arg = NULL ;
switch_stream_handle_t mystream = { 0 } ;
int encoded = 0 , elen = 0 ;
2007-10-20 06:01:41 +00:00
if ( ! cmd ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Invalid syntax \n " ) ;
2007-10-20 06:01:41 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-01-29 18:01:19 +00:00
2007-04-07 20:30:28 +00:00
if ( ( dcommand = strdup ( cmd ) ) ) {
if ( ! strncasecmp ( dcommand , " encoded " , 8 ) ) {
encoded + + ;
command = dcommand + 8 ;
} else {
command = dcommand ;
}
if ( ( arg = strchr ( command , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
SWITCH_STANDARD_STREAM ( mystream ) ;
switch_api_execute ( command , arg , NULL , & mystream ) ;
if ( mystream . data ) {
if ( encoded ) {
elen = ( int ) strlen ( mystream . data ) * 3 ;
edata = malloc ( elen ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( edata ! = NULL ) ;
2007-04-07 20:30:28 +00:00
memset ( edata , 0 , elen ) ;
switch_url_encode ( mystream . data , edata , elen ) ;
send = edata ;
} else {
send = mystream . data ;
}
}
2008-05-27 04:54:52 +00:00
stream - > write_function ( stream , " <result> \n " " <row id= \" 1 \" > \n " " <data>%s</data> \n " " </row> \n " " </result> \n " , send ? send : " ERROR " ) ;
2007-04-07 20:30:28 +00:00
switch_safe_free ( mystream . data ) ;
switch_safe_free ( edata ) ;
free ( dcommand ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-10-21 19:05:25 +00:00
struct api_task {
uint32_t recur ;
char cmd [ ] ;
} ;
static void sch_api_callback ( switch_scheduler_task_t * task )
{
char * cmd , * arg = NULL ;
switch_stream_handle_t stream = { 0 } ;
struct api_task * api_task = ( struct api_task * ) task - > cmd_arg ;
switch_assert ( task ) ;
cmd = strdup ( api_task - > cmd ) ;
switch_assert ( cmd ) ;
if ( ( arg = strchr ( cmd , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
SWITCH_STANDARD_STREAM ( stream ) ;
switch_api_execute ( cmd , arg , NULL , & stream ) ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_DEBUG , " Command %s(%s): \n %s \n " , cmd , switch_str_nil ( arg ) , switch_str_nil ( ( char * ) stream . data ) ) ;
switch_safe_free ( stream . data ) ;
switch_safe_free ( cmd ) ;
if ( api_task - > recur ) {
2009-01-25 21:23:07 +00:00
task - > runtime = switch_epoch_time_now ( NULL ) + api_task - > recur ;
2008-10-21 19:05:25 +00:00
}
}
# define UNSCHED_SYNTAX "<task_id>"
SWITCH_STANDARD_API ( unsched_api_function )
{
uint32_t id ;
if ( ! cmd ) {
stream - > write_function ( stream , " -ERR Invalid syntax. USAGE: %s \n " , UNSCHED_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
if ( ( id = ( uint32_t ) atol ( cmd ) ) ) {
stream - > write_function ( stream , " %s \n " , switch_scheduler_del_task_id ( id ) ? " +OK " : " -ERR no such id " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
# define SCHED_SYNTAX "[+@]<time> <group_name> <command_string>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_api_function )
2007-03-30 00:10:33 +00:00
{
2007-03-30 00:36:02 +00:00
char * tm = NULL , * dcmd , * group ;
2007-03-30 00:10:33 +00:00
time_t when ;
2008-10-21 19:05:25 +00:00
struct api_task * api_task = NULL ;
uint32_t recur = 0 ;
2007-10-20 06:01:41 +00:00
if ( ! cmd ) {
2008-10-21 19:05:25 +00:00
goto bad ;
2007-10-20 06:01:41 +00:00
}
2007-03-30 00:10:33 +00:00
tm = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( tm ! = NULL ) ;
2007-03-30 00:13:31 +00:00
2007-03-30 00:36:02 +00:00
if ( ( group = strchr ( tm , ' ' ) ) ) {
2007-03-30 00:10:33 +00:00
uint32_t id ;
2007-03-30 00:36:02 +00:00
* group + + = ' \0 ' ;
2007-03-30 00:10:33 +00:00
2007-03-30 00:36:02 +00:00
if ( ( dcmd = strchr ( group , ' ' ) ) ) {
* dcmd + + = ' \0 ' ;
2008-10-21 19:05:25 +00:00
2007-03-30 00:36:02 +00:00
if ( * tm = = ' + ' ) {
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + atol ( tm + 1 ) ;
2008-10-21 19:05:25 +00:00
} else if ( * tm = = ' @ ' ) {
recur = ( uint32_t ) atol ( tm + 1 ) ;
2009-01-25 21:23:07 +00:00
when = switch_epoch_time_now ( NULL ) + recur ;
2007-03-30 00:36:02 +00:00
} else {
when = atol ( tm ) ;
}
2008-01-29 18:01:19 +00:00
2008-10-21 19:05:25 +00:00
switch_zmalloc ( api_task , sizeof ( * api_task ) + strlen ( dcmd ) + 1 ) ;
2008-12-13 04:57:27 +00:00
switch_copy_string ( api_task - > cmd , dcmd , strlen ( dcmd ) + 1 ) ;
2008-10-21 19:05:25 +00:00
api_task - > recur = recur ;
id = switch_scheduler_add_task ( when , sch_api_callback , ( char * ) __SWITCH_FUNC__ , group , 0 , api_task , SSHF_FREE_ARG ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Added: %u \n " , id ) ;
2007-03-30 00:36:02 +00:00
goto good ;
2008-05-27 04:54:52 +00:00
}
2007-03-30 00:13:31 +00:00
}
2007-03-30 00:10:33 +00:00
2008-10-21 19:05:25 +00:00
bad :
stream - > write_function ( stream , " -ERR Invalid syntax. USAGE: %s \n " , SCHED_SYNTAX ) ;
2007-03-30 00:36:02 +00:00
2008-05-27 04:54:52 +00:00
good :
2008-10-21 19:05:25 +00:00
2007-03-30 00:10:33 +00:00
switch_safe_free ( tm ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-02-20 01:10:59 +00:00
static switch_thread_rwlock_t * bgapi_rwlock = NULL ;
2008-01-15 00:44:23 +00:00
struct bg_job {
char * cmd ;
char * arg ;
2008-05-27 04:54:52 +00:00
char uuid_str [ SWITCH_UUID_FORMATTED_LENGTH + 1 ] ;
2008-01-15 00:44:23 +00:00
switch_memory_pool_t * pool ;
} ;
static void * SWITCH_THREAD_FUNC bgapi_exec ( switch_thread_t * thread , void * obj )
{
struct bg_job * job = ( struct bg_job * ) obj ;
switch_stream_handle_t stream = { 0 } ;
switch_status_t status ;
char * reply , * freply = NULL ;
switch_event_t * event ;
char * arg ;
2008-05-19 21:44:11 +00:00
switch_memory_pool_t * pool ;
2008-05-27 04:54:52 +00:00
if ( ! job )
return NULL ;
2008-05-19 21:44:11 +00:00
2009-02-20 01:10:59 +00:00
switch_thread_rwlock_rdlock ( bgapi_rwlock ) ;
2008-05-19 21:44:11 +00:00
pool = job - > pool ;
2008-01-29 18:01:19 +00:00
2008-01-15 00:44:23 +00:00
SWITCH_STANDARD_STREAM ( stream ) ;
if ( ( arg = strchr ( job - > cmd , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
if ( ( status = switch_api_execute ( job - > cmd , arg , NULL , & stream ) ) = = SWITCH_STATUS_SUCCESS ) {
reply = stream . data ;
} else {
freply = switch_mprintf ( " %s: Command not found! \n " , job - > cmd ) ;
reply = freply ;
}
if ( ! reply ) {
reply = " Command returned no output! " ;
}
if ( switch_event_create ( & event , SWITCH_EVENT_BACKGROUND_JOB ) = = SWITCH_STATUS_SUCCESS ) {
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Job-UUID " , job - > uuid_str ) ;
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Job-Command " , job - > cmd ) ;
2008-01-18 15:43:57 +00:00
if ( arg ) {
2008-08-16 02:19:43 +00:00
switch_event_add_header_string ( event , SWITCH_STACK_BOTTOM , " Job-Command-Arg " , arg ) ;
2008-01-18 15:43:57 +00:00
}
2008-01-15 00:44:23 +00:00
switch_event_add_body ( event , " %s " , reply ) ;
switch_event_fire ( & event ) ;
}
switch_safe_free ( stream . data ) ;
switch_safe_free ( freply ) ;
2008-05-19 21:44:11 +00:00
job = NULL ;
switch_core_destroy_memory_pool ( & pool ) ;
pool = NULL ;
2009-02-20 01:10:59 +00:00
switch_thread_rwlock_unlock ( bgapi_rwlock ) ;
2008-01-15 00:44:23 +00:00
return NULL ;
}
SWITCH_STANDARD_API ( bgapi_function )
{
struct bg_job * job ;
switch_uuid_t uuid ;
switch_memory_pool_t * pool ;
switch_thread_t * thread ;
switch_threadattr_t * thd_attr = NULL ;
2008-01-29 18:01:19 +00:00
2008-01-15 00:44:23 +00:00
if ( ! cmd ) {
stream - > write_function ( stream , " -ERR Invalid syntax \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
switch_core_new_memory_pool ( & pool ) ;
job = switch_core_alloc ( pool , sizeof ( * job ) ) ;
job - > cmd = switch_core_strdup ( pool , cmd ) ;
job - > pool = pool ;
switch_uuid_get ( & uuid ) ;
switch_uuid_format ( job - > uuid_str , & uuid ) ;
switch_threadattr_create ( & thd_attr , job - > pool ) ;
switch_threadattr_detach_set ( thd_attr , 1 ) ;
switch_threadattr_stacksize_set ( thd_attr , SWITCH_THREAD_STACKSIZE ) ;
2008-01-18 15:43:57 +00:00
stream - > write_function ( stream , " +OK Job-UUID: %s \n " , job - > uuid_str ) ;
2008-01-15 00:44:23 +00:00
switch_thread_create ( & thread , thd_attr , bgapi_exec , job , job - > pool ) ;
return SWITCH_STATUS_SUCCESS ;
}
2006-07-19 19:16:42 +00:00
struct holder {
switch_stream_handle_t * stream ;
2006-07-20 03:55:07 +00:00
char * http ;
2007-04-24 01:15:27 +00:00
char * delim ;
2006-07-19 19:16:42 +00:00
uint32_t count ;
2006-10-08 08:09:57 +00:00
int print_title ;
2007-04-07 20:30:28 +00:00
switch_xml_t xml ;
int rows ;
2008-06-23 15:43:27 +00:00
int justcount ;
2006-07-19 19:16:42 +00:00
} ;
2007-04-07 20:30:28 +00:00
static int show_as_xml_callback ( void * pArg , int argc , char * * argv , char * * columnNames )
{
struct holder * holder = ( struct holder * ) pArg ;
switch_xml_t row , field ;
int x , f_off = 0 ;
char id [ 50 ] ;
if ( holder - > count = = 0 ) {
if ( ! ( holder - > xml = switch_xml_new ( " result " ) ) ) {
return - 1 ;
}
}
2008-06-23 15:43:27 +00:00
if ( holder - > justcount ) {
holder - > count + + ;
return 0 ;
}
2007-04-07 20:30:28 +00:00
if ( ! ( row = switch_xml_add_child_d ( holder - > xml , " row " , holder - > rows + + ) ) ) {
return - 1 ;
}
2007-12-12 21:53:32 +00:00
switch_snprintf ( id , sizeof ( id ) , " %d " , holder - > rows ) ;
2009-03-20 21:31:04 +00:00
switch_xml_set_attr ( switch_xml_set_flag ( row , SWITCH_XML_DUP ) , strdup ( " row_id " ) , strdup ( id ) ) ;
2007-04-07 20:30:28 +00:00
2008-05-27 04:54:52 +00:00
for ( x = 0 ; x < argc ; x + + ) {
2007-04-26 15:02:46 +00:00
char * name = columnNames [ x ] ;
char * val = switch_str_nil ( argv [ x ] ) ;
if ( ! name ) {
name = " undefined " ;
}
if ( ( field = switch_xml_add_child_d ( row , name , f_off + + ) ) ) {
switch_xml_set_txt_d ( field , val ) ;
2007-04-07 20:30:28 +00:00
} else {
return - 1 ;
}
}
holder - > count + + ;
return 0 ;
}
2007-03-29 22:31:56 +00:00
static int show_callback ( void * pArg , int argc , char * * argv , char * * columnNames )
{
2006-07-19 19:16:42 +00:00
struct holder * holder = ( struct holder * ) pArg ;
2006-07-20 03:55:07 +00:00
int x ;
2008-06-23 15:43:27 +00:00
if ( holder - > justcount ) {
holder - > count + + ;
return 0 ;
}
2006-10-08 08:09:57 +00:00
if ( holder - > print_title & & holder - > count = = 0 ) {
2006-07-20 03:55:07 +00:00
if ( holder - > http ) {
holder - > stream - > write_function ( holder - > stream , " \n <tr> " ) ;
}
2007-03-29 22:31:56 +00:00
for ( x = 0 ; x < argc ; x + + ) {
2007-04-26 15:02:46 +00:00
char * name = columnNames [ x ] ;
if ( ! name ) {
name = " undefined " ;
}
2006-07-20 03:55:07 +00:00
if ( holder - > http ) {
holder - > stream - > write_function ( holder - > stream , " <td> " ) ;
2007-04-26 15:02:46 +00:00
holder - > stream - > write_function ( holder - > stream , " <b>%s</b>%s " , name , x = = ( argc - 1 ) ? " </td></tr> \n " : " </td><td> " ) ;
2006-07-20 03:55:07 +00:00
} else {
2007-04-26 15:02:46 +00:00
holder - > stream - > write_function ( holder - > stream , " %s%s " , name , x = = ( argc - 1 ) ? " \n " : holder - > delim ) ;
2006-07-20 03:55:07 +00:00
}
}
2007-03-29 22:31:56 +00:00
}
2006-07-20 03:55:07 +00:00
if ( holder - > http ) {
holder - > stream - > write_function ( holder - > stream , " <tr bgcolor=%s> " , holder - > count % 2 = = 0 ? " eeeeee " : " ffffff " ) ;
}
2007-03-29 22:31:56 +00:00
for ( x = 0 ; x < argc ; x + + ) {
2007-04-26 15:02:46 +00:00
char * val = switch_str_nil ( argv [ x ] ) ;
2007-12-04 16:22:02 +00:00
2006-07-20 03:55:07 +00:00
if ( holder - > http ) {
2007-12-04 16:22:02 +00:00
char aval [ 512 ] ;
2008-01-29 20:58:30 +00:00
switch_amp_encode ( val , aval , sizeof ( aval ) ) ;
2006-07-20 03:55:07 +00:00
holder - > stream - > write_function ( holder - > stream , " <td> " ) ;
2007-12-04 16:22:02 +00:00
holder - > stream - > write_function ( holder - > stream , " %s%s " , aval , x = = ( argc - 1 ) ? " </td></tr> \n " : " </td><td> " ) ;
2006-07-20 03:55:07 +00:00
} else {
2007-04-26 15:02:46 +00:00
holder - > stream - > write_function ( holder - > stream , " %s%s " , val , x = = ( argc - 1 ) ? " \n " : holder - > delim ) ;
2006-07-20 03:55:07 +00:00
}
}
2006-05-04 16:04:04 +00:00
2006-07-19 19:16:42 +00:00
holder - > count + + ;
2006-05-04 16:04:04 +00:00
return 0 ;
}
2008-04-23 17:38:13 +00:00
# define COMPLETE_SYNTAX "add <word>|del [<word>|*]"
2008-04-22 20:49:39 +00:00
SWITCH_STANDARD_API ( complete_function )
{
2008-04-23 16:46:24 +00:00
switch_status_t status ;
2008-04-22 20:49:39 +00:00
2008-04-23 16:46:24 +00:00
if ( ( status = switch_console_set_complete ( cmd ) ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK \n " ) ;
} else {
2008-04-22 20:49:39 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , COMPLETE_SYNTAX ) ;
}
2008-05-27 04:54:52 +00:00
2008-04-22 20:49:39 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-04-23 17:38:13 +00:00
# define ALIAS_SYNTAX "add <alias> <command> | del [<alias>|*]"
SWITCH_STANDARD_API ( alias_function )
{
switch_status_t status ;
if ( ( status = switch_console_set_alias ( cmd ) ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK \n " ) ;
} else {
stream - > write_function ( stream , " -USAGE: %s \n " , ALIAS_SYNTAX ) ;
}
2008-05-27 04:54:52 +00:00
2008-04-23 17:38:13 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-07-22 17:19:26 +00:00
# define SHOW_SYNTAX "codec|application|api|dialplan|file|timer|calls [count]|channels [count]|aliases|complete|chat|endpoint|management|say|interfaces|interface_types"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( show_function )
2006-05-04 16:04:04 +00:00
{
char sql [ 1024 ] ;
char * errmsg ;
2008-05-16 18:50:14 +00:00
switch_core_db_t * db ;
2007-03-29 22:31:56 +00:00
struct holder holder = { 0 } ;
2006-10-08 08:09:57 +00:00
int help = 0 ;
2008-05-27 04:54:52 +00:00
char * mydata = NULL , * argv [ 6 ] = { 0 } ;
2007-04-07 20:30:28 +00:00
int argc ;
2007-05-12 21:36:15 +00:00
char * command = NULL , * as = NULL ;
2007-09-29 01:06:08 +00:00
switch_core_flag_t cflags = switch_core_flags ( ) ;
2008-08-22 17:00:16 +00:00
switch_status_t status = SWITCH_STATUS_SUCCESS ;
2006-07-20 03:55:07 +00:00
2008-05-16 18:50:14 +00:00
db = switch_core_db_handle ( ) ;
2008-06-23 15:43:27 +00:00
holder . justcount = 0 ;
2007-05-12 21:36:15 +00:00
if ( cmd & & ( mydata = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-05-12 21:36:15 +00:00
command = argv [ 0 ] ;
2007-04-08 03:53:35 +00:00
if ( argv [ 2 ] & & ! strcasecmp ( argv [ 1 ] , " as " ) ) {
as = argv [ 2 ] ;
}
2008-06-23 15:43:27 +00:00
2007-04-07 20:30:28 +00:00
}
2008-01-29 18:01:19 +00:00
2008-05-24 03:46:19 +00:00
if ( stream - > param_event ) {
2008-08-01 15:06:56 +00:00
const char * var ;
2008-05-24 03:46:19 +00:00
holder . http = switch_event_get_header ( stream - > param_event , " http-host " ) ;
2008-08-01 15:06:56 +00:00
if ( ( var = switch_event_get_header ( stream - > param_event , " content-type " ) ) ) {
if ( ! strcasecmp ( var , " text/plain " ) ) {
holder . http = NULL ;
}
2008-08-11 23:58:42 +00:00
} else if ( holder . http ) {
2008-08-01 15:06:56 +00:00
stream - > write_function ( stream , " %s " , " Content-Type: text/html \n \n " ) ;
}
2007-03-29 22:31:56 +00:00
}
2006-07-20 03:55:07 +00:00
2006-10-08 08:09:57 +00:00
holder . print_title = 1 ;
2007-12-11 21:43:30 +00:00
if ( ! ( cflags & SCF_USE_SQL ) & & command & & ! strcasecmp ( command , " channels " ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR SQL DISABLED NO CHANNEL DATA AVAILABLE! \n " ) ;
2008-08-22 17:00:16 +00:00
goto end ;
2007-09-29 01:06:08 +00:00
}
2008-01-29 19:58:28 +00:00
/* If you change the field qty or order of any of these select */
2008-10-06 23:05:55 +00:00
/* statements, you must also change show_callback and friends to match! */
2007-05-12 21:36:15 +00:00
if ( ! command ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SHOW_SYNTAX ) ;
2008-08-22 17:00:16 +00:00
goto end ;
2008-07-22 17:19:26 +00:00
} else if ( ! strncasecmp ( command , " codec " , 5 ) | |
! strncasecmp ( command , " dialplan " , 8 ) | |
! strncasecmp ( command , " file " , 4 ) | |
! strncasecmp ( command , " timer " , 5 ) | |
! strncasecmp ( command , " chat " , 4 ) | |
! strncasecmp ( command , " say " , 3 ) | |
! strncasecmp ( command , " management " , 10 ) | |
! strncasecmp ( command , " endpoint " , 8 ) ) {
if ( end_of ( command ) = = ' s ' ) {
end_of ( command ) = ' \0 ' ;
}
2008-04-22 20:49:39 +00:00
sprintf ( sql , " select type, name from interfaces where type = '%s' order by type,name " , command ) ;
2008-07-22 17:19:26 +00:00
} else if ( ! strcasecmp ( command , " interfaces " ) ) {
sprintf ( sql , " select type, name from interfaces order by type,name " ) ;
} else if ( ! strcasecmp ( command , " interface_types " ) ) {
sprintf ( sql , " select type,count(type) as total from interfaces group by type order by type " ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " tasks " ) ) {
2007-05-12 21:36:15 +00:00
sprintf ( sql , " select * from %s " , command ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " application " ) | | ! strcasecmp ( command , " api " ) ) {
2009-02-26 17:08:41 +00:00
if ( argv [ 1 ] ) {
sprintf ( sql , " select name, description, syntax from interfaces where type = '%s' and description != '' and name = '%s' order by type,name " , command , argv [ 1 ] ) ;
} else {
sprintf ( sql , " select name, description, syntax from interfaces where type = '%s' and description != '' order by type,name " , command ) ;
}
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " calls " ) ) {
2008-04-22 20:49:39 +00:00
sprintf ( sql , " select * from calls order by created_epoch " ) ;
2008-06-23 15:43:27 +00:00
if ( argv [ 1 ] & & ! strcasecmp ( argv [ 1 ] , " count " ) ) {
holder . justcount = 1 ;
if ( argv [ 3 ] & & ! strcasecmp ( argv [ 2 ] , " as " ) ) {
as = argv [ 3 ] ;
}
}
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " channels " ) ) {
2008-04-22 20:49:39 +00:00
sprintf ( sql , " select * from channels order by created_epoch " ) ;
2008-06-23 15:43:27 +00:00
if ( argv [ 1 ] & & ! strcasecmp ( argv [ 1 ] , " count " ) ) {
holder . justcount = 1 ;
if ( argv [ 3 ] & & ! strcasecmp ( argv [ 2 ] , " as " ) ) {
as = argv [ 3 ] ;
}
}
2008-04-23 17:38:13 +00:00
} else if ( ! strcasecmp ( command , " aliases " ) ) {
sprintf ( sql , " select * from aliases order by alias " ) ;
} else if ( ! strcasecmp ( command , " complete " ) ) {
sprintf ( sql , " select * from complete order by a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 " ) ;
2007-05-12 21:36:15 +00:00
} else if ( ! strncasecmp ( command , " help " , 4 ) ) {
2006-10-08 08:09:57 +00:00
char * cmdname = NULL ;
2006-10-31 05:04:47 +00:00
2006-10-08 08:09:57 +00:00
help = 1 ;
holder . print_title = 0 ;
2007-05-12 21:36:15 +00:00
if ( ( cmdname = strchr ( command , ' ' ) ) ! = 0 ) {
2006-10-08 08:09:57 +00:00
* cmdname + + = ' \0 ' ;
2008-05-27 04:54:52 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 , " select name, syntax, description from interfaces where type = 'api' and name = '%s' order by name " ,
cmdname ) ;
2006-10-08 08:09:57 +00:00
} else {
2008-04-22 20:49:39 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 , " select name, syntax, description from interfaces where type = 'api' order by name " ) ;
2006-10-08 08:09:57 +00:00
}
2006-10-31 05:04:47 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SHOW_SYNTAX ) ;
2008-08-22 17:00:16 +00:00
goto end ;
2006-10-31 05:04:47 +00:00
}
2007-03-29 22:31:56 +00:00
2006-07-19 19:16:42 +00:00
holder . stream = stream ;
holder . count = 0 ;
2006-07-20 03:55:07 +00:00
if ( holder . http ) {
holder . stream - > write_function ( holder . stream , " <table cellpadding=1 cellspacing=4 border=1> \n " ) ;
}
2007-04-07 20:30:28 +00:00
if ( ! as ) {
2007-04-24 01:15:27 +00:00
as = " delim " ;
holder . delim = " , " ;
2006-07-20 03:55:07 +00:00
}
2007-04-24 01:15:27 +00:00
if ( ! strcasecmp ( as , " delim " ) | | ! strcasecmp ( as , " csv " ) ) {
if ( switch_strlen_zero ( holder . delim ) ) {
if ( ! ( holder . delim = argv [ 3 ] ) ) {
holder . delim = " , " ;
}
}
2007-04-07 20:30:28 +00:00
switch_core_db_exec ( db , sql , show_callback , & holder , & errmsg ) ;
if ( holder . http ) {
holder . stream - > write_function ( holder . stream , " </table> " ) ;
}
if ( errmsg ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR SQL Error [%s] \n " , errmsg ) ;
2007-04-07 20:30:28 +00:00
switch_core_db_free ( errmsg ) ;
errmsg = NULL ;
} else if ( help ) {
if ( holder . count = = 0 )
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No such command. \n " ) ;
2007-04-07 20:30:28 +00:00
} else {
stream - > write_function ( stream , " \n %u total. \n " , holder . count ) ;
}
} else if ( ! strcasecmp ( as , " xml " ) ) {
switch_core_db_exec ( db , sql , show_as_xml_callback , & holder , & errmsg ) ;
2007-04-26 15:02:46 +00:00
2008-05-16 18:54:43 +00:00
if ( errmsg ) {
stream - > write_function ( stream , " -ERR SQL Error [%s] \n " , errmsg ) ;
switch_core_db_free ( errmsg ) ;
errmsg = NULL ;
}
2007-04-07 20:30:28 +00:00
if ( holder . xml ) {
2007-04-14 01:52:42 +00:00
char count [ 50 ] ;
2007-04-15 01:06:29 +00:00
char * xmlstr ;
2007-12-12 21:53:32 +00:00
switch_snprintf ( count , sizeof ( count ) , " %d " , holder . count ) ;
2007-08-03 21:29:01 +00:00
2009-03-20 21:31:04 +00:00
switch_xml_set_attr ( switch_xml_set_flag ( holder . xml , SWITCH_XML_DUP ) , strdup ( " row_count " ) , strdup ( count ) ) ;
2007-11-30 23:45:27 +00:00
xmlstr = switch_xml_toxml ( holder . xml , SWITCH_FALSE ) ;
2007-04-14 01:52:42 +00:00
2007-04-07 20:30:28 +00:00
if ( xmlstr ) {
holder . stream - > write_function ( holder . stream , " %s " , xmlstr ) ;
free ( xmlstr ) ;
} else {
2007-04-14 01:52:42 +00:00
holder . stream - > write_function ( holder . stream , " <result row_count= \" 0 \" /> \n " ) ;
2007-04-07 20:30:28 +00:00
}
} else {
2007-04-14 01:52:42 +00:00
holder . stream - > write_function ( holder . stream , " <result row_count= \" 0 \" /> \n " ) ;
2007-04-07 20:30:28 +00:00
}
2006-07-19 19:16:42 +00:00
} else {
2007-12-04 18:23:41 +00:00
holder . stream - > write_function ( holder . stream , " -ERR Cannot find format %s \n " , as ) ;
2006-05-04 16:04:04 +00:00
}
2008-08-22 17:00:16 +00:00
end :
2007-04-07 20:30:28 +00:00
switch_safe_free ( mydata ) ;
2008-08-22 17:00:16 +00:00
if ( db ) {
switch_core_db_close ( db ) ;
}
return status ;
2006-05-04 16:04:04 +00:00
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( version_function )
2006-11-28 19:33:54 +00:00
{
char version_string [ 1024 ] ;
2009-02-14 18:52:55 +00:00
switch_snprintf ( version_string , sizeof ( version_string ) - 1 , " FreeSWITCH Version %s \n " , SWITCH_VERSION_FULL ) ;
2006-11-28 19:33:54 +00:00
stream - > write_function ( stream , version_string ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( help_function )
2006-10-08 08:09:57 +00:00
{
char showcmd [ 1024 ] ;
int all = 0 ;
if ( switch_strlen_zero ( cmd ) ) {
2007-03-29 22:31:56 +00:00
sprintf ( showcmd , " help " ) ;
2006-10-08 08:09:57 +00:00
all = 1 ;
} else {
2007-12-12 21:53:32 +00:00
switch_snprintf ( showcmd , sizeof ( showcmd ) - 1 , " help %s " , cmd ) ;
2006-10-08 08:09:57 +00:00
}
2006-10-31 05:04:47 +00:00
if ( all ) {
2006-10-08 08:09:57 +00:00
stream - > write_function ( stream , " \n Valid Commands: \n \n " ) ;
2006-10-31 05:04:47 +00:00
}
2006-10-08 08:09:57 +00:00
show_function ( showcmd , session , stream ) ;
2006-10-31 05:04:47 +00:00
2006-10-08 08:09:57 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-05-04 16:04:04 +00:00
2009-03-06 20:16:48 +00:00
# define HEARTBEAT_SYNTAX "<uuid> [sched] [0|<seconds>]"
2008-10-07 21:42:31 +00:00
SWITCH_STANDARD_API ( uuid_session_heartbeat_function )
{
2008-10-21 16:22:38 +00:00
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
2008-10-07 21:42:31 +00:00
uint32_t seconds = 60 ;
int argc , tmp ;
switch_core_session_t * l_session = NULL ;
2008-10-21 16:22:38 +00:00
int x = 0 , sched = 0 ;
2008-10-07 21:42:31 +00:00
if ( switch_strlen_zero ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
goto error ;
}
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-10-21 16:22:38 +00:00
if ( argc < 2 | | ! argv [ 0 ] ) {
2008-10-07 21:42:31 +00:00
goto error ;
}
2008-10-21 16:22:38 +00:00
2008-10-07 21:42:31 +00:00
if ( ! ( l_session = switch_core_session_locate ( argv [ 0 ] ) ) ) {
stream - > write_function ( stream , " -ERR Usage: cannot locate session. \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-10-21 16:22:38 +00:00
if ( ! strcasecmp ( argv [ 1 ] , " sched " ) ) {
x = 2 ;
sched + + ;
} else {
x = 1 ;
}
2008-10-07 21:42:31 +00:00
2008-10-21 16:22:38 +00:00
if ( switch_is_number ( argv [ x ] ) ) {
tmp = atoi ( argv [ x ] ) ;
2008-10-07 21:42:31 +00:00
if ( tmp > 0 ) {
seconds = tmp ;
}
2008-10-21 16:22:38 +00:00
} else if ( ! switch_true ( argv [ x ] ) ) {
2008-10-07 21:42:31 +00:00
seconds = 0 ;
}
if ( seconds ) {
2008-10-21 16:22:38 +00:00
if ( sched ) {
switch_core_session_sched_heartbeat ( l_session , seconds ) ;
} else {
switch_core_session_enable_heartbeat ( l_session , seconds ) ;
}
2008-10-07 21:42:31 +00:00
} else {
switch_core_session_disable_heartbeat ( l_session ) ;
}
switch_core_session_rwunlock ( l_session ) ;
switch_safe_free ( mycmd ) ;
stream - > write_function ( stream , " +OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
error :
switch_safe_free ( mycmd ) ;
stream - > write_function ( stream , " -ERR Usage: uuid_session_heartbeat %s " , HEARTBEAT_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-11-05 17:25:54 +00:00
SWITCH_STANDARD_API ( uuid_flush_dtmf_function )
{
switch_core_session_t * fsession ;
if ( ! switch_strlen_zero ( cmd ) & & ( fsession = switch_core_session_locate ( cmd ) ) ) {
switch_channel_flush_dtmf ( switch_core_session_get_channel ( fsession ) ) ;
switch_core_session_rwunlock ( fsession ) ;
stream - > write_function ( stream , " +OK \n " ) ;
} else {
stream - > write_function ( stream , " -ERR no such session \n " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-11-13 20:26:15 +00:00
# define SETVAR_SYNTAX "<uuid> <var> [value]"
2007-08-19 00:18:34 +00:00
SWITCH_STANDARD_API ( uuid_setvar_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
int argc = 0 ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-11-13 20:26:15 +00:00
if ( ( argc = = 2 | | argc = = 3 ) & & ! switch_strlen_zero ( argv [ 0 ] ) ) {
2007-08-19 00:18:34 +00:00
char * uuid = argv [ 0 ] ;
char * var_name = argv [ 1 ] ;
2008-11-13 20:26:15 +00:00
char * var_value = NULL ;
if ( argc = = 3 ) {
var_value = argv [ 2 ] ;
}
2007-08-19 00:18:34 +00:00
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel ;
channel = switch_core_session_get_channel ( psession ) ;
if ( switch_strlen_zero ( var_name ) ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No variable specified \n " ) ;
2007-08-19 00:18:34 +00:00
} else {
switch_channel_set_variable ( channel , var_name , var_value ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-08-19 00:18:34 +00:00
}
switch_core_session_rwunlock ( psession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-08-19 00:18:34 +00:00
}
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SETVAR_SYNTAX ) ;
2007-08-19 00:18:34 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-08-19 00:18:34 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
2008-05-27 04:54:52 +00:00
}
2007-08-04 06:03:33 +00:00
2008-11-13 16:36:22 +00:00
# define SETVAR_MULTI_SYNTAX "<uuid> <var>=<value>;<var>=<value>..."
SWITCH_STANDARD_API ( uuid_setvar_multi_function )
{
switch_core_session_t * psession = NULL ;
2008-12-02 16:15:12 +00:00
char * mycmd = NULL , * vars , * argv [ 64 ] = { 0 } ;
2008-11-13 16:36:22 +00:00
int argc = 0 ;
2008-12-16 13:15:42 +00:00
char * var_name , * var_value = NULL ;
2008-11-13 16:36:22 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
char * uuid = mycmd ;
if ( ! ( vars = strchr ( uuid , ' ' ) ) ) {
goto done ;
}
* vars + + = ' \0 ' ;
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel = switch_core_session_get_channel ( psession ) ;
2008-11-13 18:03:36 +00:00
int x , y = 0 ;
2008-11-13 16:36:22 +00:00
argc = switch_separate_string ( vars , ' ; ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
for ( x = 0 ; x < argc ; x + + ) {
var_name = argv [ x ] ;
2008-11-13 21:05:01 +00:00
if ( var_name & & ( var_value = strchr ( var_name , ' = ' ) ) ) {
2008-11-13 16:36:22 +00:00
* var_value + + = ' \0 ' ;
}
if ( switch_strlen_zero ( var_name ) ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
stream - > write_function ( stream , " -ERR No variable specified \n " ) ;
} else {
switch_channel_set_variable ( channel , var_name , var_value ) ;
y + + ;
}
}
switch_core_session_rwunlock ( psession ) ;
if ( y ) {
stream - > write_function ( stream , " +OK \n " ) ;
goto done ;
}
} else {
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
}
}
2008-12-02 16:15:12 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SETVAR_MULTI_SYNTAX ) ;
2008-11-13 16:36:22 +00:00
done :
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-02 22:09:28 +00:00
# define GETVAR_SYNTAX "<uuid> <var>"
SWITCH_STANDARD_API ( uuid_getvar_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
int argc = 0 ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-02-09 05:16:58 +00:00
if ( argc > = 2 & & ! switch_strlen_zero ( argv [ 0 ] ) ) {
2007-11-02 22:09:28 +00:00
char * uuid = argv [ 0 ] ;
char * var_name = argv [ 1 ] ;
const char * var_value = NULL ;
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel ;
channel = switch_core_session_get_channel ( psession ) ;
if ( switch_strlen_zero ( var_name ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No variable name specified! \n " ) ;
2007-11-02 22:09:28 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
} else {
var_value = switch_channel_get_variable ( channel , var_name ) ;
if ( var_value ! = NULL ) {
stream - > write_function ( stream , " %s " , var_value ) ;
} else {
stream - > write_function ( stream , " _undef_ " ) ;
}
}
switch_core_session_rwunlock ( psession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-11-02 22:09:28 +00:00
}
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , GETVAR_SYNTAX ) ;
2007-11-02 22:09:28 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-11-02 22:09:28 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-09 16:12:11 +00:00
2008-07-16 19:11:45 +00:00
# define UUID_SEND_DTMF_SYNTAX "<uuid> <dtmf_data>"
SWITCH_STANDARD_API ( uuid_send_dtmf_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 2 ] = { 0 } ;
char * uuid = NULL , * dtmf_data = NULL ;
int argc = 0 ;
if ( switch_strlen_zero ( cmd ) ) {
goto usage ;
}
if ( ! ( mycmd = strdup ( cmd ) ) ) {
goto usage ;
}
if ( ( argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 2 ) {
goto usage ;
}
uuid = argv [ 0 ] ;
dtmf_data = argv [ 1 ] ;
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( dtmf_data ) ) {
goto usage ;
}
if ( ! ( psession = switch_core_session_locate ( uuid ) ) ) {
stream - > write_function ( stream , " -ERR Cannot locate session! \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
switch_core_session_send_dtmf_string ( psession , ( const char * ) dtmf_data ) ;
goto done ;
usage :
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_SEND_DTMF_SYNTAX ) ;
switch_safe_free ( mycmd ) ;
done :
if ( psession ) {
switch_core_session_rwunlock ( psession ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-12-14 23:11:14 +00:00
# define DUMP_SYNTAX "<uuid> [format]"
SWITCH_STANDARD_API ( uuid_dump_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
int argc = 0 ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-02-09 05:16:58 +00:00
if ( argc > = 0 & & ! switch_strlen_zero ( argv [ 0 ] ) ) {
2007-12-14 23:11:14 +00:00
char * uuid = argv [ 0 ] ;
char * format = argv [ 1 ] ;
2008-01-29 18:01:19 +00:00
2008-09-19 19:03:50 +00:00
if ( ! format ) {
format = " txt " ;
}
2007-12-14 23:11:14 +00:00
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel ;
switch_event_t * event ;
char * buf ;
channel = switch_core_session_get_channel ( psession ) ;
2008-10-02 17:10:05 +00:00
if ( switch_event_create ( & event , SWITCH_EVENT_CHANNEL_DATA ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-28 21:14:44 +00:00
switch_xml_t xml ;
2007-12-14 23:11:14 +00:00
switch_channel_event_set_data ( channel , event ) ;
2008-09-19 19:03:50 +00:00
if ( ! strcasecmp ( format , " xml " ) ) {
2007-12-14 23:11:14 +00:00
if ( ( xml = switch_event_xmlize ( event , " %s " , " " ) ) ) {
2008-01-29 18:01:19 +00:00
buf = switch_xml_toxml ( xml , SWITCH_FALSE ) ;
switch_xml_free ( xml ) ;
2007-12-28 21:14:44 +00:00
} else {
stream - > write_function ( stream , " -ERR Unable to create xml! \n " ) ;
2008-05-19 21:44:11 +00:00
switch_event_destroy ( & event ) ;
2007-12-28 21:14:44 +00:00
switch_core_session_rwunlock ( psession ) ;
goto done ;
2007-12-14 23:11:14 +00:00
}
} else {
2008-09-19 19:03:50 +00:00
switch_event_serialize ( event , & buf , strcasecmp ( format , " plain " ) ) ;
2007-12-14 23:11:14 +00:00
}
2008-01-29 18:01:19 +00:00
2007-12-14 23:11:14 +00:00
switch_assert ( buf ) ;
2008-05-27 04:54:52 +00:00
stream - > raw_write_function ( stream , ( unsigned char * ) buf , strlen ( buf ) ) ;
2007-12-14 23:11:14 +00:00
switch_event_destroy ( & event ) ;
free ( buf ) ;
} else {
2008-05-19 21:44:11 +00:00
stream - > write_function ( stream , " -ERR Allocation error \n " ) ;
2007-12-14 23:11:14 +00:00
}
switch_core_session_rwunlock ( psession ) ;
} else {
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
}
goto done ;
}
}
stream - > write_function ( stream , " -USAGE: %s \n " , DUMP_SYNTAX ) ;
2008-05-27 04:54:52 +00:00
done :
2007-12-14 23:11:14 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-09 16:12:11 +00:00
# define GLOBAL_SETVAR_SYNTAX "<var> <value>"
SWITCH_STANDARD_API ( global_setvar_function )
{
2008-05-30 21:02:04 +00:00
char * mycmd = NULL , * argv [ 2 ] = { 0 } ;
2007-11-09 16:12:11 +00:00
int argc = 0 ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' = ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-02-09 05:16:58 +00:00
if ( argc > 0 & & ! switch_strlen_zero ( argv [ 0 ] ) ) {
2007-11-09 16:12:11 +00:00
char * var_name = argv [ 0 ] ;
char * var_value = argv [ 1 ] ;
if ( switch_strlen_zero ( var_value ) ) {
var_value = NULL ;
}
switch_core_set_variable ( var_name , var_value ) ;
stream - > write_function ( stream , " +OK " ) ;
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , GLOBAL_SETVAR_SYNTAX ) ;
2007-11-09 16:12:11 +00:00
2008-05-27 04:54:52 +00:00
done :
2007-11-09 16:12:11 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
2008-05-27 04:54:52 +00:00
}
2007-11-09 16:12:11 +00:00
# define GLOBAL_GETVAR_SYNTAX "<var>"
SWITCH_STANDARD_API ( global_getvar_function )
{
2008-07-22 17:19:26 +00:00
if ( switch_strlen_zero ( cmd ) ) {
switch_core_dump_variables ( stream ) ;
} else {
2007-11-09 16:12:11 +00:00
stream - > write_function ( stream , " %s " , switch_str_nil ( switch_core_get_variable ( cmd ) ) ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-01-29 18:01:19 +00:00
2008-09-05 04:09:50 +00:00
# define SYSTEM_SYNTAX "<command>"
SWITCH_STANDARD_API ( system_function )
{
if ( switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , SYSTEM_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_NOTICE , " Executing command: %s \n " , cmd ) ;
2008-09-26 15:50:12 +00:00
if ( switch_system ( cmd , SWITCH_TRUE ) < 0 ) {
2008-09-05 04:09:50 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_NOTICE , " Failed to execute command: %s \n " , cmd ) ;
}
stream - > write_function ( stream , " +OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2008-09-29 17:17:26 +00:00
SWITCH_STANDARD_API ( strftime_tz_api_function )
{
char * format = NULL ;
const char * tz_name = NULL ;
char date [ 80 ] = " " ;
if ( ! switch_strlen_zero ( cmd ) ) {
format = strchr ( cmd , ' ' ) ;
tz_name = cmd ;
if ( format ) {
* format + + = ' \0 ' ;
}
}
2008-10-31 20:24:06 +00:00
if ( switch_strftime_tz ( tz_name , format , date , sizeof ( date ) , 0 ) = = SWITCH_STATUS_SUCCESS ) { /* The lookup of the zone may fail. */
2008-09-29 17:17:26 +00:00
stream - > write_function ( stream , " %s " , date ) ;
} else {
stream - > write_function ( stream , " -ERR Invalid Timezone \n " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2008-09-05 04:09:50 +00:00
2008-10-01 18:26:19 +00:00
SWITCH_STANDARD_API ( hupall_api_function )
{
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
int argc = 0 ;
char * var = NULL ;
char * val = NULL ;
switch_call_cause_t cause = SWITCH_CAUSE_MANAGER_REQUEST ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-10-05 06:27:45 +00:00
switch_assert ( argv [ 0 ] ) ;
2008-10-01 18:26:19 +00:00
if ( ( cause = switch_channel_str2cause ( argv [ 0 ] ) ) = = SWITCH_CAUSE_NONE ) {
cause = SWITCH_CAUSE_MANAGER_REQUEST ;
}
var = argv [ 1 ] ;
val = argv [ 2 ] ;
}
if ( ! val ) {
var = NULL ;
}
if ( switch_strlen_zero ( var ) ) {
switch_core_session_hupall ( cause ) ;
} else {
switch_core_session_hupall_matching_var ( var , val , cause ) ;
}
if ( switch_strlen_zero ( var ) ) {
stream - > write_function ( stream , " +OK hangup all channels with cause %s \n " , switch_channel_cause2str ( cause ) ) ;
} else {
stream - > write_function ( stream , " +OK hangup all channels matching [%s]=[%s] with cause: %s \n " , var , val , switch_channel_cause2str ( cause ) ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-02-20 01:10:59 +00:00
SWITCH_MODULE_SHUTDOWN_FUNCTION ( mod_commands_shutdown )
{
int x ;
for ( x = 30 ; x > 0 ; x - - ) {
if ( switch_thread_rwlock_trywrlock ( bgapi_rwlock ) = = SWITCH_STATUS_SUCCESS ) {
switch_thread_rwlock_unlock ( bgapi_rwlock ) ;
break ;
}
if ( x = = 30 ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_DEBUG , " Waiting for bgapi threads. \n " ) ;
}
switch_yield ( 1000000 ) ;
}
if ( ! x ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CRIT , " Giving up waiting for bgapi threads. \n " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2007-06-13 16:00:14 +00:00
SWITCH_MODULE_LOAD_FUNCTION ( mod_commands_load )
2006-04-04 22:03:59 +00:00
{
2007-06-20 03:26:52 +00:00
switch_api_interface_t * commands_api_interface ;
* module_interface = switch_loadable_module_create_module_interface ( pool , modname ) ;
2009-02-20 01:10:59 +00:00
switch_thread_rwlock_create ( & bgapi_rwlock , pool ) ;
2008-12-23 17:36:50 +00:00
SWITCH_ADD_API ( commands_api_interface , " group_call " , " Generate a dial string to call a group " , group_call_function , " <group>[@<domain>] " ) ;
SWITCH_ADD_API ( commands_api_interface , " in_group " , " determine if a user is in a group " , in_group_function , " <user>[@<domain>] <group_name> " ) ;
2008-11-05 17:25:54 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_flush_dtmf " , " Flush dtmf on a given uuid " , uuid_flush_dtmf_function , " <uuid> " ) ;
2008-10-20 23:27:29 +00:00
SWITCH_ADD_API ( commands_api_interface , " md5 " , " md5 " , md5_function , " <data> " ) ;
2008-10-01 18:26:19 +00:00
SWITCH_ADD_API ( commands_api_interface , " hupall " , " hupall " , hupall_api_function , " <cause> [<var> <value>] " ) ;
2008-09-29 17:26:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " strftime_tz " , " strftime_tz " , strftime_tz_api_function , " <Timezone_name> [format string] " ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " originate " , " Originate a Call " , originate_function , ORIGINATE_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " tone_detect " , " Start Tone Detection on a channel " , tone_detect_session_function , TONE_DETECT_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_kill " , " Kill Channel " , kill_function , KILL_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_park " , " Park Channel " , park_function , PARK_SYNTAX ) ;
2008-03-26 22:14:09 +00:00
SWITCH_ADD_API ( commands_api_interface , " reloadacl " , " Reload ACL " , reload_acl_function , " [reloadxml] " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add reloadacl reloadxml " ) ;
2008-10-07 17:56:30 +00:00
SWITCH_ADD_API ( commands_api_interface , " reloadxml " , " Reload XML " , reload_xml_function , " " ) ;
2008-11-12 17:10:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " unload " , " Unload Module " , unload_function , UNLOAD_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " reload " , " Reload Module " , reload_function , UNLOAD_SYNTAX ) ;
2007-06-20 08:44:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " load " , " Load Module " , load_function , LOAD_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_transfer " , " Transfer a session " , transfer_function , TRANSFER_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " pause " , " Pause " , pause_function , PAUSE_SYNTAX ) ;
2007-06-25 18:37:40 +00:00
SWITCH_ADD_API ( commands_api_interface , " break " , " Break " , break_function , BREAK_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " show " , " Show " , show_function , SHOW_SYNTAX ) ;
2008-05-28 20:53:23 +00:00
switch_console_set_complete ( " add show channels " ) ;
switch_console_set_complete ( " add show codec " ) ;
switch_console_set_complete ( " add show application " ) ;
switch_console_set_complete ( " add show api " ) ;
switch_console_set_complete ( " add show dialplan " ) ;
switch_console_set_complete ( " add show file " ) ;
switch_console_set_complete ( " add show timer " ) ;
switch_console_set_complete ( " add show calls " ) ;
switch_console_set_complete ( " add show channels " ) ;
switch_console_set_complete ( " add show aliases " ) ;
switch_console_set_complete ( " add show complete " ) ;
2008-04-22 20:49:39 +00:00
SWITCH_ADD_API ( commands_api_interface , " complete " , " Complete " , complete_function , COMPLETE_SYNTAX ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add complete add " ) ;
switch_console_set_complete ( " add complete del " ) ;
2008-04-23 17:38:13 +00:00
SWITCH_ADD_API ( commands_api_interface , " alias " , " Alias " , alias_function , ALIAS_SYNTAX ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add alias add " ) ;
switch_console_set_complete ( " add alias del " ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " status " , " status " , status_function , " " ) ;
2008-10-07 21:42:31 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_session_heartbeat " , " uuid_session_heartbeat " , uuid_session_heartbeat_function , HEARTBEAT_SYNTAX ) ;
2007-07-05 17:03:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_bridge " , " uuid_bridge " , uuid_bridge_function , " " ) ;
2007-08-04 06:03:33 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_setvar " , " uuid_setvar " , uuid_setvar_function , SETVAR_SYNTAX ) ;
2008-11-13 16:36:22 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_setvar_multi " , " uuid_setvar_multi " , uuid_setvar_multi_function , SETVAR_MULTI_SYNTAX ) ;
2007-11-02 22:09:28 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_getvar " , " uuid_getvar " , uuid_getvar_function , GETVAR_SYNTAX ) ;
2007-12-14 23:11:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_dump " , " uuid_dump " , uuid_dump_function , DUMP_SYNTAX ) ;
2007-11-09 16:12:11 +00:00
SWITCH_ADD_API ( commands_api_interface , " global_setvar " , " global_setvar " , global_setvar_function , GLOBAL_SETVAR_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " global_getvar " , " global_getvar " , global_getvar_function , GLOBAL_GETVAR_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_displace " , " session displace " , session_displace_function , " <uuid> [start|stop] <path> [<limit>] [mux] " ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_record " , " session record " , session_record_function , SESS_REC_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_broadcast " , " broadcast " , uuid_broadcast_function , BROADCAST_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_hold " , " hold " , uuid_hold_function , HOLD_SYNTAX ) ;
2008-03-11 03:45:16 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_display " , " change display " , uuid_display_function , DISPLAY_SYNTAX ) ;
2008-03-06 17:31:55 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_media " , " media " , uuid_media_function , MEDIA_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " fsctl " , " control messages " , ctl_function , CTL_SYNTAX ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl hupall " ) ;
switch_console_set_complete ( " add fsctl pause " ) ;
switch_console_set_complete ( " add fsctl resume " ) ;
switch_console_set_complete ( " add fsctl shutdown " ) ;
2008-10-02 16:46:20 +00:00
switch_console_set_complete ( " add fsctl shutdown restart " ) ;
switch_console_set_complete ( " add fsctl shutdown elegant " ) ;
2008-10-21 19:19:49 +00:00
switch_console_set_complete ( " add fsctl shutdown asap " ) ;
2008-10-02 16:46:20 +00:00
switch_console_set_complete ( " add fsctl shutdown elegant restart " ) ;
2008-10-02 17:18:48 +00:00
switch_console_set_complete ( " add fsctl shutdown restart elegant " ) ;
2008-10-21 19:19:49 +00:00
switch_console_set_complete ( " add fsctl shutdown asap restart " ) ;
switch_console_set_complete ( " add fsctl shutdown restart asap " ) ;
2008-10-03 14:58:36 +00:00
switch_console_set_complete ( " add fsctl shutdown cancel " ) ;
2008-06-11 03:27:36 +00:00
switch_console_set_complete ( " add fsctl sps " ) ;
switch_console_set_complete ( " add fsctl sync_clock " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl reclaim_mem " ) ;
switch_console_set_complete ( " add fsctl max_sessions " ) ;
switch_console_set_complete ( " add fsctl max_dtmf_duration " ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " help " , " Show help for all the api commands " , help_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " version " , " Show version of the switch " , version_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_hangup " , " Schedule a running call to hangup " , sched_hangup_function , SCHED_HANGUP_SYNTAX ) ;
2008-05-27 04:54:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_broadcast " , " Schedule a broadcast event to a running call " , sched_broadcast_function ,
SCHED_BROADCAST_SYNTAX ) ;
2009-01-19 20:19:01 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_transfer " , " Schedule a transfer for a running call " , sched_transfer_function ,
2008-05-27 04:54:52 +00:00
SCHED_TRANSFER_SYNTAX ) ;
2007-07-05 17:03:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " create_uuid " , " Create a uuid " , uuid_function , UUID_SYNTAX ) ;
2008-10-21 19:05:25 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_api " , " Schedule an api command " , sched_api_function , SCHED_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " unsched_api " , " Unschedule an api command " , unsched_api_function , UNSCHED_SYNTAX ) ;
2008-01-15 00:44:23 +00:00
SWITCH_ADD_API ( commands_api_interface , " bgapi " , " Execute an api command in a thread " , bgapi_function , " <command>[ <arg>] " ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_del " , " Delete a Scheduled task " , sched_del_function , " <task_id>|<group_id> " ) ;
SWITCH_ADD_API ( commands_api_interface , " xml_wrap " , " Wrap another api command in xml " , xml_wrap_api_function , " <command> <args> " ) ;
2007-11-08 23:46:26 +00:00
SWITCH_ADD_API ( commands_api_interface , " is_lan_addr " , " see if an ip is a lan addr " , lan_addr_function , " <ip> " ) ;
2007-11-13 00:33:31 +00:00
SWITCH_ADD_API ( commands_api_interface , " cond " , " Eval a conditional " , cond_function , " <expr> ? <true val> : <false val> " ) ;
2007-11-09 15:26:32 +00:00
SWITCH_ADD_API ( commands_api_interface , " regex " , " Eval a regex " , regex_function , " <data>|<pattern>[|<subst string>] " ) ;
2008-04-02 18:55:30 +00:00
SWITCH_ADD_API ( commands_api_interface , " acl " , " compare an ip to an acl list " , acl_function , " <ip> <list_name> " ) ;
2007-11-16 20:20:43 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_chat " , " Send a chat message " , uuid_chat , UUID_CHAT_SYNTAX ) ;
2008-11-20 02:07:59 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_deflect " , " Send a deflect " , uuid_deflect , UUID_DEFLECT_SYNTAX ) ;
2008-01-14 16:59:03 +00:00
SWITCH_ADD_API ( commands_api_interface , " find_user_xml " , " find a user " , find_user_function , " <key> <user> <domain> " ) ;
2007-12-18 15:28:28 +00:00
SWITCH_ADD_API ( commands_api_interface , " user_exists " , " find a user " , user_exists_function , " <key> <user> <domain> " ) ;
2007-12-01 00:01:56 +00:00
SWITCH_ADD_API ( commands_api_interface , " xml_locate " , " find some xml " , xml_locate_function , " [root | <section> <tag> <tag_attr_name> <tag_attr_val>] " ) ;
2008-11-13 22:42:49 +00:00
SWITCH_ADD_API ( commands_api_interface , " user_data " , " find user data " , user_data_function , " <user>@<domain> [var|param|attr] <name> " ) ;
2008-06-27 15:07:28 +00:00
SWITCH_ADD_API ( commands_api_interface , " url_encode " , " url encode a string " , url_encode_function , " <string> " ) ;
SWITCH_ADD_API ( commands_api_interface , " url_decode " , " url decode a string " , url_decode_function , " <string> " ) ;
2008-07-10 14:41:31 +00:00
SWITCH_ADD_API ( commands_api_interface , " module_exists " , " check if module exists " , module_exists_function , " <module> " ) ;
2008-10-15 17:18:56 +00:00
SWITCH_ADD_API ( commands_api_interface , " domain_exists " , " check if a domain exists " , domain_exists_function , " <domain> " ) ;
2008-07-16 19:11:45 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_send_dtmf " , " send dtmf digits " , uuid_send_dtmf_function , UUID_SEND_DTMF_SYNTAX ) ;
2008-08-15 15:05:48 +00:00
SWITCH_ADD_API ( commands_api_interface , " eval " , " eval (noop) " , eval_function , " <expression> " ) ;
2008-09-05 04:09:50 +00:00
SWITCH_ADD_API ( commands_api_interface , " system " , " Execute a system command " , system_function , SYSTEM_SYNTAX ) ;
2008-11-12 13:55:22 +00:00
SWITCH_ADD_API ( commands_api_interface , " time_test " , " time_test " , time_test_function , " <mss> " ) ;
2006-04-04 22:03:59 +00:00
/* indicate that the module should continue to be loaded */
2007-05-03 16:28:23 +00:00
return SWITCH_STATUS_NOUNLOAD ;
2006-04-04 22:03:59 +00:00
}
2006-11-27 22:30:48 +00:00
/* For Emacs:
* Local Variables :
* mode : c
2008-02-03 22:14:57 +00:00
* indent - tabs - mode : t
2006-11-27 22:30:48 +00:00
* tab - width : 4
* c - basic - offset : 4
* End :
* For VIM :
2008-07-03 19:12:26 +00:00
* vim : set softtabstop = 4 shiftwidth = 4 tabstop = 4 :
2006-11-27 22:30:48 +00:00
*/