2006-04-04 22:03:59 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
2010-02-06 03:38:24 +00:00
* Copyright ( C ) 2005 - 2010 , 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 >
2009-06-30 18:59:05 +00:00
* Rupa Schomaker < rupa @ rupa . com >
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>
2009-04-23 23:07:46 +00:00
# include <switch_stun.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 ) ;
2010-01-22 02:42:05 +00:00
SWITCH_STANDARD_API ( banner_function )
{
stream - > write_function ( stream , " %s " , switch_core_banner ( ) ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-10-24 17:11:03 +00:00
SWITCH_STANDARD_API ( hostname_api_function )
{
2010-02-06 03:38:24 +00:00
char hostname [ 256 ] = " " ;
2009-10-24 17:11:03 +00:00
gethostname ( hostname , sizeof ( hostname ) ) ;
2010-01-22 02:42:05 +00:00
stream - > write_function ( stream , " %s " , hostname ) ;
2009-10-24 17:11:03 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2010-01-20 17:45:53 +00:00
SWITCH_STANDARD_API ( shutdown_function )
{
switch_session_ctl_t command = SCSC_SHUTDOWN ;
int arg = 0 ;
2010-01-20 18:44:35 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2010-01-20 17:45:53 +00:00
switch_core_session_ctl ( command , & arg ) ;
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_API ( version_function )
{
stream - > write_function ( stream , " FreeSWITCH Version %s \n " , SWITCH_VERSION_FULL ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-02-06 03:38:24 +00:00
SWITCH_STANDARD_API ( db_cache_function )
{
2009-11-27 16:47:08 +00:00
int argc ;
char * mydata = NULL , * argv [ 2 ] ;
if ( zstr ( cmd ) ) {
goto error ;
}
2010-02-06 03:38:24 +00:00
2009-11-27 16:47:08 +00:00
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 1 ) {
goto error ;
}
if ( argv [ 0 ] & & switch_stristr ( " status " , argv [ 0 ] ) ) {
switch_cache_db_status ( stream ) ;
goto ok ;
} else {
goto error ;
}
2010-02-06 03:38:24 +00:00
error :
stream - > write_function ( stream , " %s " , " parameter missing \n " ) ;
ok :
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
2009-11-27 16:47:08 +00:00
}
2009-10-24 17:11:03 +00:00
2009-08-28 20:30:03 +00:00
SWITCH_STANDARD_API ( host_lookup_function )
{
char host [ 256 ] = " " ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2009-08-28 20:30:03 +00:00
stream - > write_function ( stream , " %s " , " parameter missing \n " ) ;
} else {
if ( switch_resolve_host ( cmd , host , sizeof ( host ) ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " %s " , host ) ;
} else {
stream - > write_function ( stream , " %s " , " !err! " ) ;
}
}
return SWITCH_STATUS_SUCCESS ;
}
2009-06-01 18:24:54 +00:00
SWITCH_STANDARD_API ( nat_map_function )
{
int argc ;
2009-06-30 18:59:05 +00:00
char * mydata = NULL , * argv [ 5 ] ;
2009-06-01 18:24:54 +00:00
switch_nat_ip_proto_t proto = SWITCH_NAT_UDP ;
2009-06-05 02:30:44 +00:00
switch_port_t external_port = 0 ;
2009-06-30 18:59:05 +00:00
char * tmp = NULL ;
switch_bool_t sticky = SWITCH_FALSE ;
2009-06-01 18:24:54 +00:00
if ( ! cmd ) {
goto error ;
}
2010-02-06 03:38:24 +00:00
2010-01-12 00:40:43 +00:00
if ( ! switch_nat_is_initialized ( ) ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " nat_map API called while NAT not initialized \n " ) ;
goto error ;
}
2009-06-01 18:24:54 +00:00
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2009-06-30 18:59:05 +00:00
if ( argc < 1 ) {
goto error ;
}
if ( argv [ 0 ] & & switch_stristr ( " status " , argv [ 0 ] ) ) {
tmp = switch_nat_status ( ) ;
stream - > write_function ( stream , tmp ) ;
switch_safe_free ( tmp ) ;
goto ok ;
} else if ( argv [ 0 ] & & switch_stristr ( " republish " , argv [ 0 ] ) ) {
switch_nat_republish ( ) ;
stream - > write_function ( stream , " true " ) ;
goto ok ;
} else if ( argv [ 0 ] & & switch_stristr ( " reinit " , argv [ 0 ] ) ) {
switch_nat_reinit ( ) ;
tmp = switch_nat_status ( ) ;
stream - > write_function ( stream , tmp ) ;
switch_safe_free ( tmp ) ;
goto ok ;
}
2010-02-06 03:38:24 +00:00
2009-06-01 18:24:54 +00:00
if ( argc < 3 ) {
goto error ;
}
if ( argv [ 2 ] & & switch_stristr ( " tcp " , argv [ 2 ] ) ) {
proto = SWITCH_NAT_TCP ;
} else if ( argv [ 2 ] & & switch_stristr ( " udp " , argv [ 2 ] ) ) {
proto = SWITCH_NAT_UDP ;
}
2010-02-06 03:38:24 +00:00
2009-06-30 18:59:05 +00:00
if ( argv [ 3 ] & & switch_stristr ( " sticky " , argv [ 3 ] ) ) {
sticky = SWITCH_TRUE ;
}
2009-06-01 18:24:54 +00:00
if ( argv [ 0 ] & & switch_stristr ( " add " , argv [ 0 ] ) ) {
2010-02-06 03:38:24 +00:00
if ( switch_nat_add_mapping ( ( switch_port_t ) atoi ( argv [ 1 ] ) , proto , & external_port , sticky ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " true " ) ; /* still return true */
2009-06-01 18:24:54 +00:00
goto ok ;
}
} else if ( argv [ 0 ] & & switch_stristr ( " del " , argv [ 0 ] ) ) {
2010-02-06 03:38:24 +00:00
if ( switch_nat_del_mapping ( ( switch_port_t ) atoi ( argv [ 1 ] ) , proto ) = = SWITCH_STATUS_SUCCESS ) {
2009-06-01 18:24:54 +00:00
stream - > write_function ( stream , " true " ) ;
goto ok ;
}
}
error :
stream - > write_function ( stream , " false " ) ;
ok :
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
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 ;
2009-11-19 16:12:54 +00:00
int max = 10 , a = 0 ;
2008-11-12 13:55:22 +00:00
char * p ;
2010-02-06 03:38:24 +00:00
if ( zstr ( cmd ) ) {
2008-11-12 16:05:48 +00:00
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-11-19 16:12:54 +00:00
if ( mss > 1000000 ) {
mss = 1000000 ;
2009-02-09 16:40:37 +00:00
}
2008-11-12 13:55:22 +00:00
if ( ( p = strchr ( cmd , ' ' ) ) ) {
2010-02-06 03:38:24 +00:00
if ( ( a = atoi ( p + 1 ) ) > 0 ) {
2009-11-19 16:12:54 +00:00
max = a ;
if ( max > 100 ) {
max = 100 ;
}
2008-11-12 13:55:22 +00:00
}
}
2009-11-19 16:12:54 +00:00
for ( x = 1 ; x < = max ; x + + ) {
2008-11-12 13:55:22 +00:00
then = switch_time_now ( ) ;
switch_yield ( mss ) ;
now = switch_time_now ( ) ;
2008-11-12 16:05:48 +00:00
diff = ( int ) ( now - then ) ;
2009-11-19 16:12:54 +00:00
stream - > write_function ( stream , " test %d sleep %ld %d \n " , x , mss , diff ) ;
2008-11-12 13:55:22 +00:00
total + = diff ;
}
2009-11-19 16:12:54 +00:00
stream - > write_function ( stream , " avg %d \n " , total / ( x > 1 ? x - 1 : 1 ) ) ;
2008-11-12 13:55:22 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2009-12-29 18:54:49 +00:00
# define TIMER_TEST_SYNTAX "<10|20|40|60|120> [<1..200>] [<timer_name>]"
SWITCH_STANDARD_API ( timer_test_function )
{
switch_time_t now , then , start , end ;
int x ;
int mss = 20 ;
uint32_t total = 0 ;
int diff ;
int max = 50 ;
switch_timer_t timer = { 0 } ;
int argc = 0 ;
char * argv [ 5 ] = { 0 } ;
const char * timer_name = " soft " ;
switch_memory_pool_t * pool ;
char * mycmd = NULL ;
2010-02-06 03:38:24 +00:00
2009-12-29 18:54:49 +00:00
switch_core_new_memory_pool ( & pool ) ;
if ( zstr ( cmd ) ) {
mycmd = " " ;
} else {
mycmd = switch_core_strdup ( pool , cmd ) ;
}
argc = switch_split ( mycmd , ' ' , argv ) ;
2010-02-06 03:38:24 +00:00
2009-12-29 18:54:49 +00:00
if ( argc > 0 ) {
mss = atoi ( argv [ 0 ] ) ;
}
if ( argc > 1 ) {
int tmp = atoi ( argv [ 1 ] ) ;
if ( tmp > 0 & & tmp < = 400 ) {
max = tmp ;
}
}
if ( argc > 2 ) {
timer_name = argv [ 2 ] ;
}
if ( mss ! = 10 & & mss ! = 20 & & mss ! = 30 & & mss ! = 40 & & mss ! = 60 & & mss ! = 120 ) {
stream - > write_function ( stream , " parameter missing: %s \n " , TIMER_TEST_SYNTAX ) ;
goto end ;
}
2010-02-06 03:38:24 +00:00
if ( switch_core_timer_init ( & timer , timer_name , mss , 1 , pool ) ! = SWITCH_STATUS_SUCCESS ) {
2009-12-29 18:54:49 +00:00
stream - > write_function ( stream , " Timer Error! \n " ) ;
goto end ;
}
2010-02-06 03:38:24 +00:00
2009-12-29 18:54:49 +00:00
start = switch_time_now ( ) ;
for ( x = 1 ; x < = max ; x + + ) {
then = switch_time_now ( ) ;
switch_core_timer_next ( & timer ) ;
now = switch_time_now ( ) ;
diff = ( int ) ( now - then ) ;
//stream->write_function(stream, "test %d sleep %ld %d\n", x, mss, diff);
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CONSOLE , " Timer Test: %d sleep %d %d \n " , x , mss , diff ) ;
total + = diff ;
}
end = switch_time_now ( ) ;
2010-02-06 03:38:24 +00:00
2009-12-29 18:54:49 +00:00
switch_yield ( 250000 ) ;
2010-02-06 03:38:24 +00:00
stream - > write_function ( stream , " Avg: %0.3fms Total Time: %0.3fms \n " , ( float ) ( ( float ) ( total / ( x > 1 ? x - 1 : 1 ) ) / 1000 ) ,
( float ) ( ( float ) ( end - start ) / 1000 ) ) ;
end :
2009-12-29 18:54:49 +00:00
switch_core_destroy_memory_pool ( & pool ) ;
2010-02-06 03:38:24 +00:00
2009-12-29 18:54:49 +00:00
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 = " , " ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-12-23 17:36:50 +00:00
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 + + ) {
2010-02-06 03:38:24 +00:00
switch ( * fp ) {
2008-12-23 17:36:50 +00:00
case ' F ' :
call_delim = " | " ;
break ;
case ' A ' :
call_delim = " , " ;
2009-12-17 14:57:39 +00:00
break ;
2009-11-18 20:25:49 +00:00
case ' E ' :
call_delim = SWITCH_ENT_ORIGINATE_DELIM ;
2008-12-23 17:36:50 +00:00
break ;
default :
break ;
}
}
}
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
domain = strchr ( group_name , ' @ ' ) ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
if ( domain ) {
* domain + + = ' \0 ' ;
} else {
domain = switch_core_get_variable ( " domain " ) ;
}
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( ! zstr ( domain ) ) {
2008-12-23 17:36:50 +00:00
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 " ) ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
if ( switch_xml_locate_group ( group_name , domain , & xml , & x_domain , & x_group , params ) = = SWITCH_STATUS_SUCCESS ) {
2009-12-23 01:24:36 +00:00
switch_xml_t x_user , x_users , x_param , x_params , my_x_user ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
if ( ( x_users = switch_xml_child ( x_group , " users " ) ) ) {
ok + + ;
2010-02-06 03:38:24 +00:00
for ( x_user = switch_xml_child ( x_users , " user " ) ; x_user ; x_user = x_user - > next ) {
2008-12-23 17:36:50 +00:00
const char * id = switch_xml_attr_soft ( x_user , " id " ) ;
2009-12-23 01:24:36 +00:00
const char * x_user_type = switch_xml_attr_soft ( x_user , " type " ) ;
2008-12-23 17:36:50 +00:00
const char * dest = NULL ;
char * d_dest = NULL ;
2009-12-24 04:29:16 +00:00
switch_xml_t xml_for_pointer = NULL , x_domain_for_pointer = NULL , x_group_for_pointer = NULL , x_user_for_pointer = NULL ;
2009-12-23 01:24:36 +00:00
my_x_user = x_user ;
2010-02-06 03:38:24 +00:00
if ( ! strcmp ( x_user_type , " pointer " ) ) {
2009-12-23 01:24:36 +00:00
if ( switch_xml_locate_user ( " id " , id , domain , NULL ,
& xml_for_pointer , & x_domain_for_pointer ,
2010-02-06 03:38:24 +00:00
& x_user_for_pointer , & x_group_for_pointer , params ) ! = SWITCH_STATUS_SUCCESS ) {
2009-12-23 01:24:36 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_WARNING , " Can't find user [%s@%s] \n " , id , domain ) ;
goto done_x_user ;
}
my_x_user = x_user_for_pointer ;
}
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
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 ;
}
}
}
2009-12-23 01:24:36 +00:00
if ( ( x_params = switch_xml_child ( my_x_user , " params " ) ) ) {
2008-12-23 17:36:50 +00:00
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 " ) ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
if ( ! strcasecmp ( var , " group-dial-string " ) ) {
dest = val ;
break ;
}
if ( ! strcasecmp ( var , " dial-string " ) ) {
dest = val ;
}
}
}
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
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 ) ;
}
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
if ( d_dest ) {
2009-11-18 20:25:49 +00:00
dstream . write_function ( & dstream , " %s%s " , d_dest , call_delim ) ;
2008-12-23 17:36:50 +00:00
if ( d_dest ! = dest ) {
free ( d_dest ) ;
}
}
2009-12-23 01:24:36 +00:00
2010-02-06 03:38:24 +00:00
done_x_user :
2009-12-24 04:29:16 +00:00
if ( xml_for_pointer ) {
2010-02-06 03:38:24 +00:00
switch_xml_free ( xml_for_pointer ) ;
2009-12-24 04:29:16 +00:00
xml_for_pointer = NULL ;
}
2008-12-23 17:36:50 +00:00
}
if ( ok & & dstream . data ) {
char * data = ( char * ) dstream . data ;
char * p ;
2009-11-18 20:25:49 +00:00
if ( ( p = strstr ( end_of_p ( data ) - 3 , call_delim ) ) ) {
* p = ' \0 ' ;
2008-12-23 17:36:50 +00:00
}
2009-11-18 20:25:49 +00:00
2008-12-23 17:36:50 +00:00
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 ;
}
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
}
}
2009-02-09 16:18:21 +00:00
switch_xml_free ( xml ) ;
2008-12-23 17:36:50 +00:00
switch_event_destroy ( & params ) ;
}
2010-02-06 03:38:24 +00:00
end :
2008-12-23 17:36:50 +00:00
switch_safe_free ( group_name ) ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
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 ;
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | ! ( mydata = strdup ( cmd ) ) ) {
2008-12-23 17:36:50 +00:00
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 :
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
stream - > write_function ( stream , " %s " , rval ) ;
2010-02-06 03:38:24 +00:00
2008-12-23 17:36:50 +00:00
switch_xml_free ( xml ) ;
2009-12-22 06:55:55 +00:00
switch_safe_free ( mydata ) ;
2008-12-23 17:36:50 +00:00
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
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | ! ( mydata = strdup ( cmd ) ) ) {
2008-01-29 17:24:18 +00:00
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
}
2010-02-06 03:38:24 +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 ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " domain " , domain ) ;
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " type " , type ) ;
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
}
}
2010-02-06 03:38:24 +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 ) ;
2009-12-22 06:55:55 +00:00
switch_safe_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
}
2010-02-06 03:38:24 +00:00
2009-02-13 00:08:12 +00:00
switch_xml_free ( xml ) ;
2010-02-06 03:38:24 +00:00
2009-12-22 06:55:55 +00:00
switch_safe_free ( mydata ) ;
2007-11-29 02:48:44 +00:00
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 } ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-10-20 23:27:29 +00:00
stream - > write_function ( stream , " %s " , " !err! " ) ;
} else {
switch_md5_string ( digest , ( void * ) cmd , strlen ( cmd ) ) ;
stream - > write_function ( stream , " %s " , digest ) ;
}
2010-02-06 03:38:24 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-10-20 23:27:29 +00:00
}
2008-06-27 15:07:28 +00:00
SWITCH_STANDARD_API ( url_decode_function )
{
char * reply = " " ;
char * data = NULL ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) ) {
2008-06-27 15:07:28 +00:00
data = strdup ( cmd ) ;
switch_url_decode ( data ) ;
reply = data ;
}
2010-02-06 03:38:24 +00:00
2008-06-27 15:07:28 +00:00
stream - > write_function ( stream , " %s " , reply ) ;
switch_safe_free ( data ) ;
2010-02-06 03:38:24 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-06-27 15:07:28 +00:00
}
2009-04-21 14:57:43 +00:00
SWITCH_STANDARD_API ( echo_function )
{
stream - > write_function ( stream , " %s " , cmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-04-23 23:07:46 +00:00
SWITCH_STANDARD_API ( stun_function )
{
char * stun_ip = NULL ;
2010-02-06 03:38:24 +00:00
switch_port_t stun_port = ( switch_port_t ) SWITCH_STUN_DEFAULT_PORT ;
2009-04-23 23:07:46 +00:00
char * p ;
2009-04-24 15:08:31 +00:00
char ip_buf [ 256 ] = " " ;
2009-04-23 23:07:46 +00:00
char * ip = NULL ;
char * pip = NULL ;
switch_port_t port = 0 ;
switch_memory_pool_t * pool = NULL ;
char * error = " " ;
ip = ip_buf ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2009-04-23 23:07:46 +00:00
stream - > write_function ( stream , " %s " , " -STUN Failed! NO STUN SERVER \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
stun_ip = strdup ( cmd ) ;
2009-05-27 02:38:39 +00:00
switch_assert ( stun_ip ) ;
2009-04-23 23:07:46 +00:00
if ( ( p = strchr ( stun_ip , ' : ' ) ) ) {
int iport ;
* p + + = ' \0 ' ;
iport = atoi ( p ) ;
if ( iport > 0 & & iport < 0xFFFF ) {
stun_port = ( switch_port_t ) iport ;
}
} else {
p = stun_ip ;
}
if ( p & & ( pip = strchr ( p , ' ' ) ) ) {
* pip + + = ' \0 ' ;
}
if ( pip ) {
switch_copy_string ( ip_buf , pip , sizeof ( ip_buf ) ) ;
2009-04-24 15:08:31 +00:00
} else {
2009-06-02 16:55:10 +00:00
switch_find_local_ip ( ip_buf , sizeof ( ip_buf ) , NULL , AF_INET ) ;
2009-04-23 23:07:46 +00:00
}
switch_core_new_memory_pool ( & pool ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( stun_ip ) ) {
2009-04-23 23:07:46 +00:00
stream - > write_function ( stream , " %s " , " -STUN Failed! NO STUN SERVER \n " ) ;
} else {
if ( ( switch_stun_lookup ( & ip , & port , stun_ip , stun_port , & error , pool ) ) = = SWITCH_STATUS_SUCCESS & & ip & & port ) {
stream - > write_function ( stream , " %s:%u \n " , ip , port ) ;
} else {
stream - > write_function ( stream , " -STUN Failed! [%s] \n " , error ) ;
}
}
switch_core_destroy_memory_pool ( & pool ) ;
free ( stun_ip ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-04-21 14:57:43 +00:00
SWITCH_STANDARD_API ( expand_function )
{
char * expanded ;
char * dup ;
char * arg ;
char * mycmd ;
switch_status_t status ;
const char * p ;
switch_core_session_t * xsession ;
char uuid [ 80 ] = " " ;
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2009-04-21 17:41:54 +00:00
stream - > write_function ( stream , " -ERR, no input \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-04-21 14:57:43 +00:00
dup = strdup ( cmd ) ;
mycmd = dup ;
if ( ! strncasecmp ( mycmd , " uuid: " , 5 ) ) {
p = cmd + 5 ;
if ( ( mycmd = strchr ( p , ' ' ) ) & & * mycmd + + ) {
switch_copy_string ( uuid , p , mycmd - p ) ;
}
}
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( mycmd ) ) {
2009-04-21 14:57:43 +00:00
stream - > write_function ( stream , " -ERR, no input \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
if ( * uuid ) {
if ( ( xsession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_event_set_data ( switch_core_session_get_channel ( xsession ) , stream - > param_event ) ;
switch_core_session_rwunlock ( xsession ) ;
}
}
if ( ( arg = strchr ( mycmd , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
2009-04-21 17:41:54 +00:00
expanded = arg ? switch_event_expand_headers ( stream - > param_event , arg ) : arg ;
if ( ( status = switch_api_execute ( mycmd , expanded , session , stream ) ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR, error executing command \n " ) ;
}
2009-04-21 14:57:43 +00:00
if ( expanded ! = arg ) {
free ( expanded ) ;
expanded = NULL ;
}
free ( dup ) ;
dup = NULL ;
2009-04-21 17:41:54 +00:00
return SWITCH_STATUS_SUCCESS ;
2009-04-21 14:57:43 +00:00
}
2009-12-15 00:19:30 +00:00
SWITCH_STANDARD_API ( console_complete_function )
{
const char * p , * cursor = NULL ;
int c ;
if ( zstr ( cmd ) ) {
cmd = " " ;
}
2010-02-06 03:38:24 +00:00
2009-12-15 00:19:30 +00:00
if ( ( p = strstr ( cmd , " c= " ) ) ) {
p + = 2 ;
c = atoi ( p ) ;
if ( ( p = strchr ( p , ' ; ' ) ) ) {
cmd = p + 1 ;
cursor = cmd + c ;
}
}
2009-12-15 18:26:06 +00:00
switch_console_complete ( cmd , cursor , NULL , stream , NULL ) ;
2009-12-15 00:19:30 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2009-12-15 18:26:06 +00:00
SWITCH_STANDARD_API ( console_complete_xml_function )
{
const char * p , * cursor = NULL ;
int c ;
switch_xml_t xml = switch_xml_new ( " complete " ) ;
char * sxml ;
if ( zstr ( cmd ) ) {
cmd = " " ;
}
2010-02-06 03:38:24 +00:00
2009-12-15 18:26:06 +00:00
if ( ( p = strstr ( cmd , " c= " ) ) ) {
p + = 2 ;
c = atoi ( p ) ;
if ( ( p = strchr ( p , ' ; ' ) ) ) {
cmd = p + 1 ;
cursor = cmd + c ;
}
}
switch_console_complete ( cmd , cursor , NULL , NULL , xml ) ;
2010-02-06 03:38:24 +00:00
2009-12-15 18:26:06 +00:00
sxml = switch_xml_toxml ( xml , SWITCH_TRUE ) ;
stream - > write_function ( stream , " %s " , sxml ) ;
free ( sxml ) ;
2010-02-06 03:38:24 +00:00
2009-12-15 18:26:06 +00:00
switch_xml_free ( xml ) ;
2010-02-06 03:38:24 +00:00
2009-12-15 18:26:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2009-04-21 14:57:43 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-08-15 15:05:48 +00:00
stream - > write_function ( stream , " %s " , " " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-02-06 03:38:24 +00:00
2008-08-15 15:05:48 +00:00
if ( ! strncasecmp ( cmd , " uuid: " , 5 ) ) {
p = cmd + 5 ;
if ( ( input = strchr ( p , ' ' ) ) & & * input + + ) {
switch_copy_string ( uuid , p , input - p ) ;
}
}
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( input ) ) {
2008-08-15 15:05:48 +00:00
stream - > write_function ( stream , " %s " , " " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-02-06 03:38:24 +00:00
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 ) ;
2010-02-06 03:38:24 +00:00
2008-08-15 15:05:48 +00:00
stream - > write_function ( stream , " %s " , expanded ) ;
if ( expanded ! = input ) {
free ( expanded ) ;
}
2010-02-06 03:38:24 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-08-15 15:05:48 +00:00
}
2008-07-10 14:41:31 +00:00
SWITCH_STANDARD_API ( module_exists_function )
{
2009-10-23 16:03:42 +00:00
if ( ! zstr ( 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 " ) ;
2010-02-06 03:38:24 +00:00
}
2008-07-10 14:41:31 +00:00
}
2010-02-06 03:38:24 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-07-10 14:41:31 +00:00
}
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 ;
2010-02-06 03:38:24 +00:00
if ( ! zstr ( cmd ) ) {
2008-10-11 21:59:48 +00:00
if ( switch_xml_locate_domain ( cmd , NULL , & root , & domain ) = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " true " ) ;
2010-02-06 03:38:24 +00:00
switch_xml_free ( root ) ;
2008-10-11 21:59:48 +00:00
} else {
stream - > write_function ( stream , " false " ) ;
}
}
2010-02-06 03:38:24 +00:00
2008-10-11 21:59:48 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-06-27 15:07:28 +00:00
SWITCH_STANDARD_API ( url_encode_function )
{
char * reply = " " ;
char * data = NULL ;
2010-02-06 03:38:24 +00:00
int len = 0 ;
2008-06-27 15:07:28 +00:00
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) ) {
2008-06-27 15:07:28 +00:00
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 ) ;
2010-02-06 03:38:24 +00:00
return SWITCH_STATUS_SUCCESS ;
2008-06-27 15:07:28 +00:00
}
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
2009-07-22 16:17:57 +00:00
if ( argc ! = 1 & & 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 ) ;
2009-07-22 16:17:57 +00:00
if ( tag ) {
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag " , tag ) ;
}
if ( tag_attr_name ) {
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag_attr_name " , tag_attr_name ) ;
}
if ( tag_attr_val ) {
switch_event_add_header_string ( params , SWITCH_STACK_BOTTOM , " tag_attr_val " , tag_attr_val ) ;
}
2008-01-23 20:59:25 +00:00
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 ;
}
2010-06-18 17:46:07 -05:00
SWITCH_STANDARD_API ( replace_function )
{
char delim = ' | ' ;
char * mydata = NULL , * argv [ 3 ] , * d , * replace ;
int argc = 0 ;
if ( ! cmd ) {
goto error ;
}
mydata = strdup ( cmd ) ;
d = mydata ;
if ( * d = = ' m ' & & * ( d + 1 ) = = ' : ' & & * ( d + 2 ) ) {
char t = * ( d + 2 ) ;
switch ( t ) {
case ' | ' :
case ' ~ ' :
case ' / ' :
d + = 3 ;
delim = t ;
break ;
default :
break ;
}
}
argc = switch_separate_string ( d , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 3 ) {
goto error ;
}
replace = switch_string_replace ( argv [ 0 ] , argv [ 1 ] , argv [ 2 ] ) ;
stream - > write_function ( stream , " %s " , replace ) ;
free ( replace ) ;
goto ok ;
error :
stream - > write_function ( stream , " -ERR " ) ;
ok :
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 ;
2009-09-01 22:15:06 +00:00
char * d ;
char delim = ' | ' ;
2007-11-09 15:26:32 +00:00
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 ) ;
2010-02-06 03:38:24 +00:00
2009-09-01 22:15:06 +00:00
d = mydata ;
if ( * d = = ' m ' & & * ( d + 1 ) = = ' : ' & & * ( d + 2 ) ) {
char t = * ( d + 2 ) ;
switch ( t ) {
case ' | ' :
case ' ~ ' :
case ' / ' :
d + = 3 ;
delim = t ;
break ;
default :
break ;
}
}
2010-02-06 03:38:24 +00:00
2007-11-09 15:26:32 +00:00
2009-09-01 22:15:06 +00:00
argc = switch_separate_string ( d , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2008-01-29 18:01:19 +00:00
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 {
2009-09-01 22:15:06 +00:00
if ( argc > 2 ) {
stream - > write_function ( stream , " %s " , argv [ 0 ] ) ;
} else {
stream - > write_function ( stream , " false " ) ;
}
2007-11-09 15:26:32 +00:00
}
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 ) ;
2009-05-18 14:09:49 +00:00
stream - > write_function ( stream , " %d session(s) max \n " , switch_core_session_limit ( 0 ) ) ;
2010-03-10 20:21:34 +00:00
stream - > write_function ( stream , " min idle cpu %0.2f/%0.2f \n " , switch_core_min_idle_cpu ( - 1.0 ) , switch_core_idle_cpu ( ) ) ;
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 ;
}
2010-03-16 19:07:06 +00:00
# define CTL_SYNTAX "[send_sighup|hupall|pause|resume|shutdown [cancel|elegant|asap|now|restart]|sps|sync_clock|reclaim_mem|max_sessions|min_dtmf_duration [num]|max_dtmf_duration [num]|default_dtmf_duration [num]|min_idle_cpu|loglevel [level]|debug_level [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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 " ) ;
2009-12-17 00:03:17 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " flush_db_handles " ) ) {
switch_core_session_ctl ( SCSC_FLUSH_DB_HANDLES , NULL ) ;
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 " ) ;
2010-01-14 16:02:46 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " calibrate_clock " ) ) {
switch_core_session_ctl ( SCSC_CALIBRATE_CLOCK , NULL ) ;
2010-01-14 21:00:32 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " crash " ) ) {
switch_core_session_ctl ( SCSC_CRASH , NULL ) ;
stream - > write_function ( stream , " +OK \n " ) ;
2010-04-27 16:52:29 -05:00
} else if ( ! strcasecmp ( argv [ 0 ] , " verbose_events " ) ) {
arg = - 1 ;
if ( argv [ 1 ] ) {
arg = switch_true ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_VERBOSE_EVENTS , & arg ) ;
stream - > write_function ( stream , " +OK verbose_events is %s \n " , arg ? " on " : " off " ) ;
2010-01-14 21:00:32 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " save_history " ) ) {
switch_core_session_ctl ( SCSC_SAVE_HISTORY , NULL ) ;
stream - > write_function ( stream , " +OK \n " ) ;
2010-06-29 23:00:24 -04:00
} else if ( ! strcasecmp ( argv [ 0 ] , " shutdown_check " ) ) {
switch_core_session_ctl ( SCSC_SHUTDOWN_CHECK , & arg ) ;
stream - > write_function ( stream , arg ? " true " : " false " ) ;
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 ;
2010-01-08 22:10:03 +00:00
} else if ( ! strcasecmp ( argv [ x ] , " now " ) ) {
command = SCSC_SHUTDOWN_NOW ;
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 ) ;
2010-03-10 20:21:34 +00:00
stream - > write_function ( stream , " +OK max sessions: %f \n " , arg ) ;
} else if ( ! strcasecmp ( argv [ 0 ] , " min_idle_cpu " ) ) {
double d = - 1 ;
if ( argc > 1 ) {
d = atof ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_MIN_IDLE_CPU , & d ) ;
if ( d ) {
stream - > write_function ( stream , " +OK min idle cpu: %0.2f% \n " , d ) ;
} else {
stream - > write_function ( stream , " +OK min idle cpu: DISABLED \n " , d ) ;
}
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 ) ;
2009-09-16 21:24:22 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " min_dtmf_duration " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_MIN_DTMF_DURATION , & arg ) ;
stream - > write_function ( stream , " +OK min dtmf duration: %d \n " , arg ) ;
2008-04-18 17:03:34 +00:00
} 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 ) ;
}
2009-11-20 23:12:07 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " debug_level " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
} else {
arg = - 1 ;
}
switch_core_session_ctl ( SCSC_DEBUG_LEVEL , & arg ) ;
stream - > write_function ( stream , " +OK DEBUG level: %d \n " , 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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 + + ;
2010-02-06 03:38:24 +00:00
while ( p & & * p ) {
2008-11-12 17:10:20 +00:00
switch ( * p ) {
case ' ' :
2010-02-06 03:38:24 +00:00
cmd = p + 1 ;
2008-11-12 17:10:20 +00:00
goto end ;
case ' f ' :
force = SWITCH_TRUE ;
break ;
default :
break ;
}
p + + ;
}
}
2010-02-06 03:38:24 +00:00
end :
2008-11-12 17:10:20 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-11-12 17:10:20 +00:00
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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 + + ;
2010-02-06 03:38:24 +00:00
while ( p & & * p ) {
2008-11-12 17:10:20 +00:00
switch ( * p ) {
case ' ' :
2010-02-06 03:38:24 +00:00
cmd = p + 1 ;
2008-11-12 17:10:20 +00:00
goto end ;
case ' f ' :
force = SWITCH_TRUE ;
break ;
default :
break ;
}
p + + ;
}
}
2010-02-06 03:38:24 +00:00
end :
2008-11-12 17:10:20 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-11-12 17:10:20 +00:00
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 ) ;
}
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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ' ;
}
2009-10-23 16:03:42 +00:00
if ( zstr ( mycmd ) | | ! ( ksession = switch_core_session_locate ( mycmd ) ) ) {
2008-11-12 11:46:44 +00:00
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 ) ;
2010-02-06 03:38:24 +00:00
if ( ! zstr ( kcause ) ) {
2008-11-12 11:46:44 +00:00
cause = switch_channel_str2cause ( kcause ) ;
2010-02-06 03:38:24 +00:00
}
2008-11-12 11:46:44 +00:00
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 ;
}
2009-09-23 22:39:00 +00:00
# define PREPROCESS_SYNTAX "<>"
SWITCH_STANDARD_API ( preprocess_function )
{
switch_core_session_t * ksession = NULL ;
2009-09-23 23:59:35 +00:00
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
int argc = 0 ;
2009-09-23 22:39:00 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
2009-09-23 23:59:35 +00:00
goto usage ;
2009-09-23 22:39:00 +00:00
}
2009-09-23 23:59:35 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 2 ) {
goto usage ;
}
if ( ! ( ksession = switch_core_session_locate ( argv [ 0 ] ) ) ) {
2009-09-23 22:39:00 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2009-09-23 23:59:35 +00:00
goto done ;
2009-09-23 22:39:00 +00:00
} else {
2010-02-06 03:38:24 +00:00
switch_ivr_preprocess_session ( ksession , ( char * ) argv [ 1 ] ) ;
2009-09-23 22:39:00 +00:00
switch_core_session_rwunlock ( ksession ) ;
stream - > write_function ( stream , " +OK \n " ) ;
2009-09-23 23:59:35 +00:00
goto done ;
2009-09-23 22:39:00 +00:00
}
2010-02-06 03:38:24 +00:00
usage :
2009-09-23 23:59:35 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , PREPROCESS_SYNTAX ) ;
2010-02-06 03:38:24 +00:00
done :
2009-09-23 22:39:00 +00:00
switch_safe_free ( mycmd ) ;
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
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
2008-01-29 17:48:10 +00:00
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 ] ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ] ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , 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 {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
2007-06-16 02:25:40 +00:00
goto done ;
}
} else {
2009-01-25 21:23:07 +00:00
if ( ( to = atoi ( argv [ 4 ] ) ) < switch_epoch_time_now ( NULL ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
2007-06-16 02:25:40 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
2007-11-16 20:20:43 +00:00
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
2009-10-23 16:03:42 +00:00
if ( zstr ( uuid ) | | zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
2008-11-20 02:07:59 +00:00
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
2009-10-23 16:03:42 +00:00
if ( zstr ( uuid ) | | zstr ( text ) ) {
2008-11-20 02:07:59 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 2 | | argc > 5 | | zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 1 | | zstr ( 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 1 | | zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 3 | | zstr ( 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 ;
}
2009-07-06 23:27:48 +00:00
# define HOLD_SYNTAX "[off] <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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 1 | | zstr ( 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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2008-03-11 03:45:16 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 2 | | zstr ( argv [ 0 ] ) | | zstr ( argv [ 1 ] ) ) {
2009-07-08 00:01:57 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , DISPLAY_SYNTAX ) ;
2010-05-12 22:18:48 -05:00
goto end ;
2008-03-11 03:45:16 +00:00
} 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 " ) ;
}
2010-05-12 22:18:48 -05:00
end :
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2010-01-20 19:20:11 +00:00
# define SIMPLIFY_SYNTAX "<uuid>"
SWITCH_STANDARD_API ( uuid_simplify_function )
2009-10-23 23:02:14 +00:00
{
2010-04-16 10:01:00 -05:00
switch_status_t status = SWITCH_STATUS_FALSE ;
2010-01-20 19:09:57 +00:00
2010-01-20 19:20:11 +00:00
if ( zstr ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , SIMPLIFY_SYNTAX ) ;
2009-10-23 23:02:14 +00:00
} else {
switch_core_session_message_t msg = { 0 } ;
switch_core_session_t * lsession = NULL ;
2010-01-20 19:20:11 +00:00
msg . message_id = SWITCH_MESSAGE_INDICATE_SIMPLIFY ;
msg . string_arg = cmd ;
2009-10-23 23:02:14 +00:00
msg . from = __FILE__ ;
2010-01-20 19:20:11 +00:00
if ( ( lsession = switch_core_session_locate ( cmd ) ) ) {
2009-10-23 23:02:14 +00:00
status = switch_core_session_receive_message ( lsession , & msg ) ;
switch_core_session_rwunlock ( lsession ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2009-10-29 17:29:05 +00:00
2010-04-16 10:01:00 -05:00
# define PHONE_EVENT_SYNTAX "<uuid>"
SWITCH_STANDARD_API ( uuid_phone_event_function )
2010-04-16 09:35:41 -05:00
{
2010-04-16 10:01:00 -05:00
switch_status_t status = SWITCH_STATUS_FALSE ;
char * mycmd = NULL , * argv [ 2 ] = { 0 } ;
int argc = 0 ;
2010-04-16 09:35:41 -05:00
2010-04-16 10:01:00 -05:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
if ( argc < 1 ) {
stream - > write_function ( stream , " -USAGE: %s \n " , PHONE_EVENT_SYNTAX ) ;
2010-04-16 09:35:41 -05:00
} else {
switch_core_session_message_t msg = { 0 } ;
switch_core_session_t * lsession = NULL ;
2010-04-16 10:01:00 -05:00
msg . message_id = SWITCH_MESSAGE_INDICATE_PHONE_EVENT ;
msg . string_arg = argv [ 1 ] ;
2010-04-16 09:35:41 -05:00
msg . from = __FILE__ ;
2010-04-16 10:01:00 -05:00
if ( ( lsession = switch_core_session_locate ( argv [ 0 ] ) ) ) {
2010-04-16 09:35:41 -05:00
status = switch_core_session_receive_message ( lsession , & msg ) ;
switch_core_session_rwunlock ( lsession ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2010-04-16 10:01:00 -05:00
switch_safe_free ( mycmd ) ;
2010-04-16 09:35:41 -05:00
return SWITCH_STATUS_SUCCESS ;
}
2009-10-29 17:52:52 +00:00
# define DEBUG_AUDIO_SYNTAX "<uuid> <read|write|both> <on|off>"
2009-10-29 17:29:05 +00:00
SWITCH_STANDARD_API ( uuid_debug_audio_function )
{
2009-10-29 17:52:52 +00:00
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
2009-10-29 17:29:05 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2009-10-29 17:52:52 +00:00
if ( zstr ( cmd ) | | argc < 3 | | zstr ( argv [ 0 ] ) | | zstr ( argv [ 1 ] ) | | zstr ( argv [ 2 ] ) ) {
2009-10-29 17:29:05 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , DEBUG_AUDIO_SYNTAX ) ;
2009-11-20 23:09:53 +00:00
goto done ;
2009-10-29 17:29:05 +00:00
} else {
switch_core_session_message_t msg = { 0 } ;
switch_core_session_t * lsession = NULL ;
2010-02-06 03:38:24 +00:00
2009-10-29 17:29:05 +00:00
msg . message_id = SWITCH_MESSAGE_INDICATE_DEBUG_AUDIO ;
2009-10-29 17:52:52 +00:00
msg . string_array_arg [ 0 ] = argv [ 1 ] ;
msg . string_array_arg [ 1 ] = argv [ 2 ] ;
2009-10-29 17:29:05 +00:00
msg . from = __FILE__ ;
if ( ( lsession = switch_core_session_locate ( argv [ 0 ] ) ) ) {
status = switch_core_session_receive_message ( lsession , & msg ) ;
switch_core_session_rwunlock ( lsession ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2010-02-06 03:38:24 +00:00
done :
2009-10-29 17:29:05 +00:00
switch_safe_free ( mycmd ) ;
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-09-19 02:18:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
2009-10-23 16:03:42 +00:00
if ( zstr ( uuid ) | | zstr ( action ) | | zstr ( path ) ) {
2007-12-22 01:00:10 +00:00
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 " ) ) {
2010-02-06 03:38:24 +00:00
if ( switch_ivr_record_session ( rsession , path , limit , NULL ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " -ERR Cannot record session! \n " ) ;
2008-09-27 18:49:21 +00:00
} 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-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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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 ] ;
2009-10-23 16:03:42 +00:00
if ( zstr ( uuid ) | | zstr ( action ) | | zstr ( path ) ) {
2007-12-22 01:00:10 +00:00
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 {
2010-02-06 03:38:24 +00:00
stream - > write_function ( stream , " +OK Success \n " ) ;
2008-09-27 18:49:21 +00:00
}
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
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 ;
}
2009-12-17 20:46:49 +00:00
# define AUDIO_SYNTAX "<uuid> [start [read|write] [mute|level <level>]|stop]"
SWITCH_STANDARD_API ( session_audio_function )
{
switch_core_session_t * u_session = NULL ;
char * mycmd = NULL ;
int fail = 0 ;
int argc = 0 ;
char * argv [ 5 ] = { 0 } ;
int level ;
if ( zstr ( cmd ) ) {
2010-02-06 03:38:24 +00:00
fail + + ;
goto done ;
2009-12-17 20:46:49 +00:00
}
mycmd = strdup ( cmd ) ;
argc = switch_split ( mycmd , ' ' , argv ) ;
2010-02-06 03:38:24 +00:00
2009-12-17 20:46:49 +00:00
if ( argc < 2 ) {
2010-02-06 03:38:24 +00:00
fail + + ;
goto done ;
2009-12-17 20:46:49 +00:00
}
2010-02-06 03:38:24 +00:00
2009-12-17 20:46:49 +00:00
if ( ! ( u_session = switch_core_session_locate ( argv [ 0 ] ) ) ) {
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
goto done ;
}
2010-02-06 03:38:24 +00:00
2009-12-17 20:46:49 +00:00
if ( ! strcasecmp ( argv [ 1 ] , " stop " ) ) {
switch_ivr_stop_session_audio ( u_session ) ;
goto done ;
2010-02-06 03:38:24 +00:00
}
2009-12-17 20:46:49 +00:00
if ( strcasecmp ( argv [ 1 ] , " start " ) | | argc < 5 | | ( strcasecmp ( argv [ 2 ] , " read " ) & & strcasecmp ( argv [ 2 ] , " write " ) ) ) {
2010-02-06 03:38:24 +00:00
fail + + ;
goto done ;
2009-12-17 20:46:49 +00:00
}
level = atoi ( argv [ 4 ] ) ;
2010-02-06 03:38:24 +00:00
2009-12-17 20:46:49 +00:00
if ( ! strcasecmp ( argv [ 3 ] , " mute " ) ) {
switch_ivr_session_audio ( u_session , " mute " , argv [ 2 ] , level ) ;
} else if ( ! strcasecmp ( argv [ 3 ] , " level " ) ) {
switch_ivr_session_audio ( u_session , " level " , argv [ 2 ] , level ) ;
} else {
fail + + ;
}
2010-02-06 03:38:24 +00:00
done :
2009-12-17 20:46:49 +00:00
if ( u_session ) {
switch_core_session_rwunlock ( u_session ) ;
}
switch_safe_free ( mycmd ) ;
if ( fail ) {
stream - > write_function ( stream , " -USAGE: %s \n " , AUDIO_SYNTAX ) ;
} else {
stream - > write_function ( stream , " +OK \n " ) ;
}
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 )
{
2010-04-14 12:49:02 -05:00
switch_core_session_t * psession = NULL , * qsession = NULL ;
2009-05-27 02:51:15 +00:00
char * mycmd = NULL , * flag ;
2010-04-14 12:49:02 -05:00
switch_channel_t * channel = NULL , * qchannel = NULL ;
2009-05-27 02:51:15 +00:00
switch_status_t status = SWITCH_STATUS_SUCCESS ;
2010-04-14 12:49:02 -05:00
int all = 0 ;
int both = 0 ;
2008-11-26 19:48:36 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , BREAK_SYNTAX ) ;
2009-05-27 02:51:15 +00:00
goto done ;
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 " ) ;
2009-05-27 02:51:15 +00:00
goto done ;
2008-01-29 18:28:32 +00:00
}
2010-04-14 12:49:02 -05:00
if ( flag ) {
if ( strstr ( flag , " all " ) ) {
all + + ;
}
if ( strstr ( flag , " both " ) ) {
both + + ;
}
2008-10-21 17:41:55 +00:00
}
2008-11-26 19:48:36 +00:00
channel = switch_core_session_get_channel ( psession ) ;
2010-04-14 12:49:02 -05:00
if ( both ) {
const char * quuid = switch_channel_get_variable ( channel , SWITCH_SIGNAL_BOND_VARIABLE ) ;
if ( quuid ) {
qsession = switch_core_session_locate ( quuid ) ;
qchannel = switch_core_session_get_channel ( qsession ) ;
}
}
if ( all ) {
switch_core_session_flush_private_events ( psession ) ;
if ( qsession ) {
switch_core_session_flush_private_events ( qsession ) ;
}
}
2009-01-29 21:52:38 +00:00
if ( switch_channel_test_flag ( channel , CF_BROADCAST ) ) {
switch_channel_stop_broadcast ( channel ) ;
} else {
2010-06-04 10:15:04 -05:00
switch_channel_set_flag_value ( channel , CF_BREAK , all ? 2 : 1 ) ;
2009-01-29 21:52:38 +00:00
}
2008-01-29 18:28:32 +00:00
2010-04-14 12:49:02 -05:00
if ( qchannel ) {
if ( switch_channel_test_flag ( qchannel , CF_BROADCAST ) ) {
switch_channel_stop_broadcast ( qchannel ) ;
} else {
2010-06-04 10:15:04 -05:00
switch_channel_set_flag_value ( qchannel , CF_BREAK , all ? 2 : 1 ) ;
2010-04-14 12:49:02 -05:00
}
}
2010-02-06 03:38:24 +00:00
done :
2010-04-14 12:49:02 -05:00
2009-05-27 02:51:15 +00:00
if ( psession ) {
switch_core_session_rwunlock ( psession ) ;
}
2010-04-14 12:49:02 -05:00
if ( qsession ) {
switch_core_session_rwunlock ( qsession ) ;
}
2009-05-27 02:51:15 +00:00
switch_safe_free ( mycmd ) ;
return status ;
2007-06-25 18:37:40 +00:00
}
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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-05-12 14:48:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-04-28 19:46:57 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | argc < 2 | | zstr ( 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
2009-10-23 16:03:42 +00:00
if ( session | | zstr ( 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 ] ) ;
}
2009-11-20 02:17:08 +00:00
if ( switch_ivr_originate ( NULL , & caller_session , & cause , aleg , timeout , NULL , cid_name , cid_num , NULL , NULL , SOF_NONE , NULL ) ! = 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 ) ;
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 ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , 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 ;
2010-02-06 03:38:24 +00:00
2008-10-21 19:05:25 +00:00
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 ;
}
2009-09-04 15:48:00 +00:00
# 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 ;
2009-09-04 15:48:00 +00:00
int flags = SSHF_FREE_ARG ;
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 ' ;
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 ;
2009-09-04 15:48:00 +00:00
if ( end_of ( api_task - > cmd ) = = ' & ' ) {
end_of ( api_task - > cmd ) = ' \0 ' ;
flags | = SSHF_OWN_THREAD ;
}
2008-10-21 19:05:25 +00:00
2009-09-04 15:48:00 +00:00
id = switch_scheduler_add_task ( when , sch_api_callback , ( char * ) __SWITCH_FUNC__ , group , 0 , api_task , flags ) ;
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
2010-02-06 03:38:24 +00:00
bad :
2008-10-21 19:05:25 +00:00
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 ;
2009-05-27 02:51:15 +00:00
if ( ! job ) {
2008-05-27 04:54:52 +00:00
return NULL ;
2009-05-27 02:51:15 +00:00
}
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 ;
}
}
2010-02-06 03:38:24 +00:00
2008-06-23 15:43:27 +00:00
if ( holder - > justcount ) {
2010-02-06 03:38:24 +00:00
holder - > count + + ;
return 0 ;
2008-06-23 15:43:27 +00:00
}
2010-02-06 03:38:24 +00:00
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 ;
2010-02-06 03:38:24 +00:00
2008-06-23 15:43:27 +00:00
if ( holder - > justcount ) {
2010-02-06 03:38:24 +00:00
holder - > count + + ;
return 0 ;
2008-06-23 15:43:27 +00:00
}
2010-02-06 03:38:24 +00:00
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 ;
}
2010-04-30 16:00:47 -04:00
# define ALIAS_SYNTAX "[add|stickyadd] <alias> <command> | del [<alias>|*]"
2008-04-23 17:38:13 +00:00
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 ;
}
2010-04-01 21:31:14 -05:00
# define SHOW_SYNTAX "codec|endpoint|application|api|dialplan|file|timer|calls [count]|channels [count|like <match string>]|distinct_channels|aliases|complete|chat|management|modules|nat_map|say|interfaces|interface_types|tasks|limits"
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 ;
2009-11-17 00:12:54 +00:00
switch_cache_db_handle_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 ;
2010-04-07 01:46:00 -05:00
char hostname [ 256 ] = " " ;
gethostname ( hostname , sizeof ( hostname ) ) ;
2006-07-20 03:55:07 +00:00
2010-03-30 03:13:49 +00:00
if ( switch_core_db_handle ( & db ) ! = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " %s " , " -ERR Databse Error! \n " ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-02-06 03:38:24 +00:00
2008-06-23 15:43:27 +00:00
holder . justcount = 0 ;
2010-02-06 03:38:24 +00:00
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 ] ;
}
2010-02-06 03:38:24 +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 " ) ;
2010-02-06 03:38:24 +00:00
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 ;
2010-02-06 03:38:24 +00:00
} else if ( ! strncasecmp ( command , " codec " , 5 ) | |
! strncasecmp ( command , " dialplan " , 8 ) | |
! strncasecmp ( command , " file " , 4 ) | |
! strncasecmp ( command , " timer " , 5 ) | |
! strncasecmp ( command , " chat " , 4 ) | |
2010-04-01 21:31:14 -05:00
! strncasecmp ( command , " limit " , 5 ) | |
2010-02-06 03:38:24 +00:00
! strncasecmp ( command , " say " , 3 ) | | ! strncasecmp ( command , " management " , 10 ) | | ! strncasecmp ( command , " endpoint " , 8 ) ) {
2008-07-22 17:19:26 +00:00
if ( end_of ( command ) = = ' s ' ) {
end_of ( command ) = ' \0 ' ;
}
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select type, name, ikey from interfaces where hostname='%s' and type = '%s' order by type,name " , hostname , command ) ;
2009-03-27 17:49:10 +00:00
} else if ( ! strncasecmp ( command , " module " , 6 ) ) {
if ( argv [ 1 ] ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select distinct type, name, ikey, filename from interfaces where hostname='%s' and ikey = '%s' order by type,name " ,
hostname , argv [ 1 ] ) ;
2009-03-27 17:49:10 +00:00
} else {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select distinct type, name, ikey, filename from interfaces where hostname='%s' order by type,name " , hostname ) ;
2009-03-27 17:49:10 +00:00
}
2008-07-22 17:19:26 +00:00
} else if ( ! strcasecmp ( command , " interfaces " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select type, name, ikey from interfaces where hostname='%s' order by type,name " , hostname ) ;
2008-07-22 17:19:26 +00:00
} else if ( ! strcasecmp ( command , " interface_types " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select type,count(type) as total from interfaces where hostname='%s' group by type order by type " , hostname ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " tasks " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from %s where hostname='%s' " , command , hostname ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " application " ) | | ! strcasecmp ( command , " api " ) ) {
2009-03-24 22:22:05 +00:00
if ( argv [ 1 ] & & strcasecmp ( argv [ 1 ] , " as " ) ) {
2010-02-06 03:38:24 +00:00
sprintf ( sql ,
2010-04-07 01:46:00 -05:00
" select name, description, syntax, ikey from interfaces where hostname='%s' and type = '%s' and description != '' and name = '%s' order by type,name " ,
hostname , command , argv [ 1 ] ) ;
2009-02-26 17:08:41 +00:00
} else {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select name, description, syntax, ikey from interfaces where hostname='%s' and type = '%s' and description != '' order by type,name " , hostname , command ) ;
2009-02-26 17:08:41 +00:00
}
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " calls " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from calls where hostname='%s' order by call_created_epoch " , hostname ) ;
2010-02-06 03:38:24 +00:00
if ( argv [ 1 ] & & ! strcasecmp ( argv [ 1 ] , " count " ) ) {
holder . justcount = 1 ;
if ( argv [ 3 ] & & ! strcasecmp ( argv [ 2 ] , " as " ) ) {
as = argv [ 3 ] ;
}
2008-06-23 15:43:27 +00:00
}
2009-04-29 17:35:49 +00:00
} else if ( ! strcasecmp ( command , " channels " ) & & argv [ 1 ] & & ! strcasecmp ( argv [ 1 ] , " like " ) ) {
if ( argv [ 2 ] ) {
char * p ;
for ( p = argv [ 2 ] ; p & & * p ; p + + ) {
if ( * p = = ' \' ' | | * p = = ' ; ' ) {
* p = ' ' ;
}
}
if ( strchr ( argv [ 2 ] , ' % ' ) ) {
2010-02-06 03:38:24 +00:00
sprintf ( sql ,
2010-04-07 01:46:00 -05:00
" select * from channels where hostname='%s' and uuid like '%s' or name like '%s' or cid_name like '%s' or cid_num like '%s' order by created_epoch " ,
hostname , argv [ 2 ] , argv [ 2 ] , argv [ 2 ] , argv [ 2 ] ) ;
2009-04-29 17:35:49 +00:00
} else {
2010-02-06 03:38:24 +00:00
sprintf ( sql ,
2010-04-07 01:46:00 -05:00
" select * from channels where hostname='%s' and uuid like '%%%s%%' or name like '%%%s%%' or cid_name like '%%%s%%' or cid_num like '%%%s%%' order by created_epoch " ,
hostname , argv [ 2 ] , argv [ 2 ] , argv [ 2 ] , argv [ 2 ] ) ;
2009-04-29 17:35:49 +00:00
}
2010-02-06 03:38:24 +00:00
if ( argv [ 4 ] & & ! strcasecmp ( argv [ 3 ] , " as " ) ) {
2009-04-29 17:35:49 +00:00
as = argv [ 4 ] ;
2010-02-06 03:38:24 +00:00
}
2009-04-29 17:35:49 +00:00
} else {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from channels where hostname='%s' order by created_epoch " , hostname ) ;
2009-04-29 17:35:49 +00:00
}
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " channels " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from channels where hostname='%s' order by created_epoch " , hostname ) ;
2010-02-06 03:38:24 +00:00
if ( argv [ 1 ] & & ! strcasecmp ( argv [ 1 ] , " count " ) ) {
holder . justcount = 1 ;
if ( argv [ 3 ] & & ! strcasecmp ( argv [ 2 ] , " as " ) ) {
2009-04-29 17:35:49 +00:00
as = argv [ 3 ] ;
2010-02-06 03:38:24 +00:00
}
2008-06-23 15:43:27 +00:00
}
2009-06-25 00:03:41 +00:00
} else if ( ! strcasecmp ( command , " distinct_channels " ) ) {
2009-06-25 14:53:08 +00:00
sprintf ( sql , " select * from channels left join calls on "
2010-04-07 19:09:16 -05:00
" channels.uuid=calls.caller_uuid where channels.hostname='%s' and channels.uuid not in (select callee_uuid from calls where hostname='%s') order by created_epoch " , hostname , hostname ) ;
2009-06-25 00:03:41 +00:00
if ( argv [ 2 ] & & ! strcasecmp ( argv [ 1 ] , " as " ) ) {
as = argv [ 2 ] ;
}
2008-04-23 17:38:13 +00:00
} else if ( ! strcasecmp ( command , " aliases " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from aliases where hostname='%s' order by alias " , hostname ) ;
2008-04-23 17:38:13 +00:00
} else if ( ! strcasecmp ( command , " complete " ) ) {
2010-04-07 01:46:00 -05:00
sprintf ( sql , " select * from complete where hostname='%s' order by a1,a2,a3,a4,a5,a6,a7,a8,a9,a10 " , hostname ) ;
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 ;
2009-03-24 22:22:05 +00:00
if ( ( cmdname = strchr ( command , ' ' ) ) & & strcasecmp ( cmdname , " as " ) ) {
2006-10-08 08:09:57 +00:00
* cmdname + + = ' \0 ' ;
2010-02-06 03:38:24 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 ,
2010-04-07 01:46:00 -05:00
" select name, syntax, description, ikey from interfaces where hostname='%s' and type = 'api' and name = '%s' order by name " ,
hostname , cmdname ) ;
2006-10-08 08:09:57 +00:00
} else {
2010-04-07 01:46:00 -05:00
switch_snprintf ( sql , sizeof ( sql ) - 1 , " select name, syntax, description, ikey from interfaces where hostname='%s' and type = 'api' order by name " , hostname ) ;
2006-10-08 08:09:57 +00:00
}
2009-06-30 18:59:05 +00:00
} else if ( ! strcasecmp ( command , " nat_map " ) ) {
2010-02-06 03:38:24 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 ,
" SELECT port, "
" CASE proto "
" WHEN 0 THEN 'udp' "
" WHEN 1 THEN 'tcp' "
2010-04-07 01:46:00 -05:00
" ELSE 'unknown' " " END AS proto, " " proto AS proto_num, " " sticky " " FROM nat where hostname='%s' ORDER BY port, proto " , hostname ) ;
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
}
2009-08-13 21:24:51 +00:00
/* switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(session), SWITCH_LOG_DEBUG, "SQL: %s.\n", sql); */
2010-02-06 03:38:24 +00:00
2007-04-24 01:15:27 +00:00
if ( ! strcasecmp ( as , " delim " ) | | ! strcasecmp ( as , " csv " ) ) {
2009-10-23 16:03:42 +00:00
if ( zstr ( holder . delim ) ) {
2007-04-24 01:15:27 +00:00
if ( ! ( holder . delim = argv [ 3 ] ) ) {
holder . delim = " , " ;
}
}
2009-11-17 00:12:54 +00:00
switch_cache_db_execute_sql_callback ( db , sql , show_callback , & holder , & errmsg ) ;
2007-04-07 20:30:28 +00:00
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 ) ;
2010-06-07 16:47:35 -05:00
free ( errmsg ) ;
2007-04-07 20:30:28 +00:00
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 " ) ) {
2009-11-17 00:12:54 +00:00
switch_cache_db_execute_sql_callback ( 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 ) ;
2010-06-07 16:47:35 -05:00
free ( errmsg ) ;
2008-05-16 18:54:43 +00:00
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 ) ;
2009-06-30 18:59:05 +00:00
switch_xml_free ( holder . xml ) ;
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
}
2010-02-06 03:38:24 +00:00
end :
2008-08-22 17:00:16 +00:00
2007-04-07 20:30:28 +00:00
switch_safe_free ( mydata ) ;
2008-08-22 17:00:16 +00:00
if ( db ) {
2009-11-17 00:12:54 +00:00
switch_cache_db_release_db_handle ( & db ) ;
2008-08-22 17:00:16 +00:00
}
return status ;
2006-05-04 16:04:04 +00:00
}
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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( 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
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) | | ! ( mycmd = strdup ( cmd ) ) ) {
2008-10-07 21:42:31 +00:00
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 ;
}
2010-02-06 03:38:24 +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 ;
}
2010-02-06 03:38:24 +00:00
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 ;
}
2010-02-06 03:38:24 +00:00
2008-10-07 21:42:31 +00:00
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 ) ;
}
2010-02-06 03:38:24 +00:00
2008-10-07 21:42:31 +00:00
switch_core_session_rwunlock ( l_session ) ;
2010-02-06 03:38:24 +00:00
switch_safe_free ( mycmd ) ;
2008-10-07 21:42:31 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
2010-02-06 03:38:24 +00:00
error :
2008-10-07 21:42:31 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( fsession = switch_core_session_locate ( cmd ) ) ) {
2008-11-05 17:25:54 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-08-19 00:18:34 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2009-10-23 16:03:42 +00:00
if ( ( argc = = 2 | | argc = = 3 ) & & ! zstr ( 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 ) {
2010-02-06 03:38:24 +00:00
var_value = argv [ 2 ] ;
2008-11-13 20:26:15 +00:00
}
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 ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( var_name ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , 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
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2008-11-13 16:36:22 +00:00
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 ) ;
2010-02-06 03:38:24 +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 ] ) ) ) ;
2010-02-06 03:38:24 +00:00
for ( x = 0 ; x < argc ; x + + ) {
2008-11-13 16:36:22 +00:00
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 ' ;
}
2009-10-23 16:03:42 +00:00
if ( zstr ( var_name ) ) {
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2008-11-13 16:36:22 +00:00
stream - > write_function ( stream , " -ERR No variable specified \n " ) ;
} else {
switch_channel_set_variable ( channel , var_name , var_value ) ;
y + + ;
}
}
2010-02-06 03:38:24 +00:00
2008-11-13 16:36:22 +00:00
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 " ) ;
}
}
2010-02-06 03:38:24 +00:00
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 ;
}
2009-10-08 18:09:06 +00:00
# define EXISTS_SYNTAX "<uuid>"
2009-08-28 21:48:13 +00:00
SWITCH_STANDARD_API ( uuid_exists_function )
{
2009-10-08 18:09:06 +00:00
switch_bool_t exists = SWITCH_FALSE ;
if ( cmd ) {
exists = switch_ivr_uuid_exists ( cmd ) ;
}
2009-08-28 21:48:13 +00:00
stream - > write_function ( stream , " %s " , exists ? " true " : " false " ) ;
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-11-02 22:09:28 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2009-10-23 16:03:42 +00:00
if ( argc > = 2 & & ! zstr ( 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 ) ;
2009-10-23 16:03:42 +00:00
if ( zstr ( var_name ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No variable name specified! \n " ) ;
2009-08-13 21:24:51 +00:00
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-11-02 22:09:28 +00:00
} 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 ;
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-07-16 19:11:45 +00:00
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 ] ;
2009-10-23 16:03:42 +00:00
if ( zstr ( uuid ) | | zstr ( dtmf_data ) ) {
2008-07-16 19:11:45 +00:00
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 ;
2010-02-06 03:38:24 +00:00
usage :
2008-07-16 19:11:45 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_SEND_DTMF_SYNTAX ) ;
2010-02-06 03:38:24 +00:00
done :
2008-07-16 19:11:45 +00:00
if ( psession ) {
switch_core_session_rwunlock ( psession ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-12-08 01:47:54 +00:00
# define UUID_RECV_DTMF_SYNTAX "<uuid> <dtmf_data>"
SWITCH_STANDARD_API ( uuid_recv_dtmf_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 2 ] = { 0 } ;
char * uuid = NULL , * dtmf_data = NULL ;
int argc = 0 ;
if ( zstr ( 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 ( zstr ( uuid ) | | zstr ( 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_channel_queue_dtmf_string ( switch_core_session_get_channel ( psession ) , dtmf_data ) ;
goto done ;
2010-02-06 03:38:24 +00:00
usage :
2009-12-08 01:47:54 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_RECV_DTMF_SYNTAX ) ;
2010-02-06 03:38:24 +00:00
done :
2009-12-08 01:47:54 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-12-14 23:11:14 +00:00
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2009-10-23 16:03:42 +00:00
if ( argc > = 0 & & ! zstr ( 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 ;
}
2010-05-25 16:54:13 -05:00
# define GLOBAL_SETVAR_SYNTAX "<var> <value> [<value2>]"
2007-11-09 16:12:11 +00:00
SWITCH_STANDARD_API ( global_setvar_function )
{
2010-05-25 16:54:13 -05:00
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
2007-11-09 16:12:11 +00:00
int argc = 0 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2007-11-09 16:12:11 +00:00
argc = switch_separate_string ( mycmd , ' = ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2009-10-23 16:03:42 +00:00
if ( argc > 0 & & ! zstr ( argv [ 0 ] ) ) {
2007-11-09 16:12:11 +00:00
char * var_name = argv [ 0 ] ;
char * var_value = argv [ 1 ] ;
2010-05-25 16:54:13 -05:00
char * var_value2 = argv [ 2 ] ;
2007-11-09 16:12:11 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( var_value ) ) {
2007-11-09 16:12:11 +00:00
var_value = NULL ;
}
2010-05-25 16:54:13 -05:00
if ( zstr ( var_value2 ) ) {
var_value2 = NULL ;
}
if ( var_value2 ) {
switch_core_set_var_conditional ( var_name , var_value , var_value2 ) ;
} else {
switch_core_set_variable ( var_name , var_value ) ;
}
2007-11-09 16:12:11 +00:00
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 )
{
2009-10-23 16:03:42 +00:00
if ( zstr ( cmd ) ) {
2008-07-22 17:19:26 +00:00
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 )
{
2010-02-06 03:38:24 +00:00
if ( zstr ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , SYSTEM_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Executing command: %s \n " , cmd ) ;
if ( switch_system ( cmd , SWITCH_TRUE ) < 0 ) {
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Failed to execute command: %s \n " , cmd ) ;
}
stream - > write_function ( stream , " +OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
2008-09-05 04:09:50 +00:00
}
2009-09-02 18:48:15 +00:00
# define SYSTEM_SYNTAX "<command>"
SWITCH_STANDARD_API ( bg_system_function )
{
2010-02-06 03:38:24 +00:00
if ( zstr ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , SYSTEM_SYNTAX ) ;
return SWITCH_STATUS_SUCCESS ;
}
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Executing command: %s \n " , cmd ) ;
if ( switch_system ( cmd , SWITCH_FALSE ) < 0 ) {
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , SWITCH_LOG_NOTICE , " Failed to execute command: %s \n " , cmd ) ;
}
stream - > write_function ( stream , " +OK \n " ) ;
return SWITCH_STATUS_SUCCESS ;
2009-09-02 18:48:15 +00:00
}
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 ] = " " ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) ) {
2008-09-29 17:17:26 +00:00
format = strchr ( cmd , ' ' ) ;
tz_name = cmd ;
if ( format ) {
* format + + = ' \0 ' ;
}
}
2010-02-06 03:38:24 +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 " ) ;
}
2010-02-06 03:38:24 +00:00
2008-09-29 17:17:26 +00:00
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 ;
2009-10-23 16:03:42 +00:00
if ( ! zstr ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
2008-10-01 18:26:19 +00:00
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 ;
}
2009-10-23 16:03:42 +00:00
if ( zstr ( var ) ) {
2008-10-01 18:26:19 +00:00
switch_core_session_hupall ( cause ) ;
} else {
switch_core_session_hupall_matching_var ( var , val , cause ) ;
}
2010-02-06 03:38:24 +00:00
2009-10-23 16:03:42 +00:00
if ( zstr ( var ) ) {
2008-10-01 18:26:19 +00:00
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 ) ) ;
}
2010-02-06 03:38:24 +00:00
2008-10-01 18:26:19 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2009-12-03 02:37:05 +00:00
SWITCH_STANDARD_API ( escape_function )
{
2009-12-22 21:44:46 +00:00
int len ;
char * mycmd ;
2010-02-06 03:38:24 +00:00
2009-12-22 21:44:46 +00:00
if ( zstr ( cmd ) ) {
return SWITCH_STATUS_SUCCESS ;
}
2010-02-06 03:38:24 +00:00
len = strlen ( cmd ) * 2 ;
2009-12-22 21:44:46 +00:00
mycmd = malloc ( len ) ;
2010-02-06 03:38:24 +00:00
2009-12-03 02:37:05 +00:00
stream - > write_function ( stream , " %s " , switch_escape_string ( cmd , mycmd , len ) ) ;
2010-02-06 03:38:24 +00:00
2009-12-03 02:37:05 +00:00
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-01-20 19:19:48 +00:00
# define UUID_LOGLEVEL_SYNTAX "<uuid> <level>"
SWITCH_STANDARD_API ( uuid_loglevel )
{
switch_core_session_t * tsession = NULL ;
char * uuid = NULL , * text = NULL ;
if ( ! zstr ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
if ( zstr ( uuid ) | | zstr ( text ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_LOGLEVEL_SYNTAX ) ;
} else {
switch_log_level_t level = switch_log_str2level ( text ) ;
if ( level = = SWITCH_LOG_INVALID ) {
stream - > write_function ( stream , " -ERR Invalid log level! \n " ) ;
2010-02-06 03:38:24 +00:00
} else if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
2010-01-20 19:19:48 +00:00
switch_core_session_set_loglevel ( tsession , level ) ;
stream - > write_function ( stream , " +OK \n " ) ;
switch_core_session_rwunlock ( tsession ) ;
2010-02-06 03:38:24 +00:00
} else {
2010-01-20 19:19:48 +00:00
stream - > write_function ( stream , " -ERR No Such Channel %s! \n " , uuid ) ;
}
}
switch_safe_free ( uuid ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-01-22 17:55:39 +00:00
# define SQL_ESCAPE_SYNTAX "<string>"
SWITCH_STANDARD_API ( sql_escape )
{
if ( zstr ( cmd ) ) {
stream - > write_function ( stream , " -USAGE: %s \n " , SQL_ESCAPE_SYNTAX ) ;
} else {
stream - > write_function ( stream , " %q " , cmd ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
2010-04-01 21:31:14 -05:00
/* LIMIT Stuff */
# define LIMIT_USAGE_USAGE "<backend> <realm> <id> [rate]"
SWITCH_STANDARD_API ( limit_usage_function )
{
int argc = 0 ;
char * argv [ 5 ] = { 0 } ;
char * mydata = NULL ;
uint32_t count = 0 ;
uint32_t rcount = 0 ;
switch_bool_t dorate = SWITCH_FALSE ;
if ( ! zstr ( cmd ) ) {
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2010-06-20 04:12:50 -05:00
2010-06-20 19:02:50 -05:00
/* backwards compat version */
2010-06-20 04:12:50 -05:00
if ( argc = = 2 ) {
switch_safe_free ( mydata ) ;
/* allocate space for "db " */
mydata = malloc ( strlen ( cmd ) + 10 ) ;
switch_assert ( mydata ) ;
sprintf ( mydata , " db %s " , cmd ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_WARNING , " Using deprecated limit api: Please specify backend. Defaulting to 'db' backend. \n " ) ;
}
2010-04-01 21:31:14 -05:00
if ( argc < 3 ) {
stream - > write_function ( stream , " USAGE: limit_usage %s \n " , LIMIT_USAGE_USAGE ) ;
goto end ;
}
if ( argc > 3 ) {
if ( ! strcasecmp ( " rate " , argv [ 3 ] ) ) {
dorate = SWITCH_TRUE ;
}
}
count = switch_limit_usage ( argv [ 0 ] , argv [ 1 ] , argv [ 2 ] , & rcount ) ;
if ( dorate = = SWITCH_TRUE ) {
stream - > write_function ( stream , " %d/%d " , count , rcount ) ;
} else {
stream - > write_function ( stream , " %d " , count ) ;
}
end :
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2010-06-20 04:12:50 -05:00
# define LIMIT_HASH_USAGE_USAGE "<backend> <realm> <id> [rate]"
SWITCH_STANDARD_API ( limit_hash_usage_function )
{
char * mydata = NULL ;
mydata = switch_core_session_sprintf ( session , " hash %s " , cmd ) ;
return limit_usage_function ( mydata , session , stream ) ;
}
2010-04-01 21:31:14 -05:00
# define LIMIT_STATUS_USAGE "<backend>"
SWITCH_STANDARD_API ( limit_status_function )
{
int argc = 0 ;
char * argv [ 2 ] = { 0 } ;
char * mydata = NULL ;
char * ret = NULL ;
if ( ! zstr ( cmd ) ) {
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
if ( argc < 1 ) {
stream - > write_function ( stream , " USAGE: limit_status %s \n " , LIMIT_STATUS_USAGE ) ;
goto end ;
}
ret = switch_limit_status ( argv [ 0 ] ) ;
stream - > write_function ( stream , " %s " , ret ) ;
end :
switch_safe_free ( mydata ) ;
switch_safe_free ( ret ) ;
return SWITCH_STATUS_SUCCESS ;
}
# define LIMIT_RESET_USAGE "<backend>"
SWITCH_STANDARD_API ( limit_reset_function )
{
int argc = 0 ;
char * argv [ 2 ] = { 0 } ;
char * mydata = NULL ;
switch_status_t ret = SWITCH_STATUS_SUCCESS ;
if ( ! zstr ( cmd ) ) {
mydata = strdup ( cmd ) ;
switch_assert ( mydata ) ;
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
if ( argc < 1 ) {
stream - > write_function ( stream , " USAGE: limit_reset %s \n " , LIMIT_RESET_USAGE ) ;
goto end ;
}
ret = switch_limit_reset ( argv [ 0 ] ) ;
stream - > write_function ( stream , " %s " , ( ret = = SWITCH_STATUS_SUCCESS ) ? " +OK " : " -ERR " ) ;
end :
switch_safe_free ( mydata ) ;
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 ;
}
2010-06-07 11:32:02 -05:00
# define LOG_SYNTAX "<level> <message>"
SWITCH_STANDARD_API ( log_function )
{
char * level , * log_str ;
if ( cmd & & ( level = strdup ( cmd ) ) ) {
switch_log_level_t ltype = SWITCH_LOG_DEBUG ;
if ( ( log_str = strchr ( level , ' ' ) ) ) {
* log_str + + = ' \0 ' ;
ltype = switch_log_str2level ( level ) ;
} else {
log_str = level ;
}
if ( ltype = = SWITCH_LOG_INVALID ) {
ltype = SWITCH_LOG_DEBUG ;
}
switch_log_printf ( SWITCH_CHANNEL_SESSION_LOG ( session ) , ltype , " %s \n " , log_str ) ;
switch_safe_free ( level ) ;
stream - > write_function ( stream , " +OK \n " ) ;
} else {
stream - > write_function ( stream , " -ERR \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 ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " acl " , " compare an ip to an acl list " , acl_function , " <ip> <list_name> " ) ;
SWITCH_ADD_API ( commands_api_interface , " alias " , " Alias " , alias_function , ALIAS_SYNTAX ) ;
2010-01-22 02:42:05 +00:00
SWITCH_ADD_API ( commands_api_interface , " banner " , " Returns the system banner " , banner_function , " " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " bgapi " , " Execute an api command in a thread " , bgapi_function , " <command>[ <arg>] " ) ;
SWITCH_ADD_API ( commands_api_interface , " bg_system " , " Execute a system command in the background " , bg_system_function , SYSTEM_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " break " , " Break " , break_function , BREAK_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " complete " , " Complete " , complete_function , COMPLETE_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " cond " , " Eval a conditional " , cond_function , " <expr> ? <true val> : <false val> " ) ;
2009-12-15 00:19:30 +00:00
SWITCH_ADD_API ( commands_api_interface , " console_complete " , " " , console_complete_function , " <line> " ) ;
2009-12-15 18:26:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " console_complete_xml " , " " , console_complete_xml_function , " <line> " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " create_uuid " , " Create a uuid " , uuid_function , UUID_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " db_cache " , " db cache management " , db_cache_function , " status " ) ;
SWITCH_ADD_API ( commands_api_interface , " domain_exists " , " check if a domain exists " , domain_exists_function , " <domain> " ) ;
SWITCH_ADD_API ( commands_api_interface , " echo " , " echo " , echo_function , " <data> " ) ;
SWITCH_ADD_API ( commands_api_interface , " escape " , " escape a string " , escape_function , " <data> " ) ;
SWITCH_ADD_API ( commands_api_interface , " eval " , " eval (noop) " , eval_function , " [uuid:<uuid> ]<expression> " ) ;
SWITCH_ADD_API ( commands_api_interface , " expand " , " expand vars and execute " , expand_function , " [uuid:<uuid> ]<cmd> <args> " ) ;
SWITCH_ADD_API ( commands_api_interface , " find_user_xml " , " find a user " , find_user_function , " <key> <user> <domain> " ) ;
SWITCH_ADD_API ( commands_api_interface , " fsctl " , " control messages " , ctl_function , CTL_SYNTAX ) ;
2010-01-20 17:45:53 +00:00
SWITCH_ADD_API ( commands_api_interface , " ... " , " shutdown " , shutdown_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " shutdown " , " shutdown " , shutdown_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " version " , " version " , version_function , " " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " global_getvar " , " global_getvar " , global_getvar_function , GLOBAL_GETVAR_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " global_setvar " , " global_setvar " , global_setvar_function , GLOBAL_SETVAR_SYNTAX ) ;
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>] " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " help " , " Show help for all the api commands " , help_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " host_lookup " , " host_lookup " , host_lookup_function , " <hostname> " ) ;
SWITCH_ADD_API ( commands_api_interface , " hostname " , " Returns the system hostname " , hostname_api_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " hupall " , " hupall " , hupall_api_function , " <cause> [<var> <value>] " ) ;
2008-12-23 17:36:50 +00:00
SWITCH_ADD_API ( commands_api_interface , " in_group " , " determine if a user is in a group " , in_group_function , " <user>[@<domain>] <group_name> " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " is_lan_addr " , " see if an ip is a lan addr " , lan_addr_function , " <ip> " ) ;
2010-04-01 21:31:14 -05:00
SWITCH_ADD_API ( commands_api_interface , " limit_usage " , " Gets the usage count of a limited resource " , limit_usage_function , " <backend> <realm> <id> " ) ;
2010-06-20 04:12:50 -05:00
SWITCH_ADD_API ( commands_api_interface , " limit_hash_usage " , " Deprecated: gets the usage count of a limited resource " , limit_hash_usage_function , " <realm> <id> " ) ;
2010-04-01 21:31:14 -05:00
SWITCH_ADD_API ( commands_api_interface , " limit_status " , " Gets the status of a limit backend " , limit_status_function , " <backend> " ) ;
SWITCH_ADD_API ( commands_api_interface , " limit_reset " , " Reset the counters of a limit backend " , limit_reset_function , " <backend> " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " load " , " Load Module " , load_function , LOAD_SYNTAX ) ;
2010-06-07 11:32:02 -05:00
SWITCH_ADD_API ( commands_api_interface , " log " , " Log " , log_function , LOG_SYNTAX ) ;
2008-10-20 23:27:29 +00:00
SWITCH_ADD_API ( commands_api_interface , " md5 " , " md5 " , md5_function , " <data> " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " module_exists " , " check if module exists " , module_exists_function , " <module> " ) ;
SWITCH_ADD_API ( commands_api_interface , " nat_map " , " nat_map " , nat_map_function , " [status|republish|reinit] | [add|del] <port> [tcp|udp] [static] " ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " originate " , " Originate a Call " , originate_function , ORIGINATE_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " pause " , " Pause " , pause_function , PAUSE_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " regex " , " Eval a regex " , regex_function , " <data>|<pattern>[|<subst string>] " ) ;
2008-03-26 22:14:09 +00:00
SWITCH_ADD_API ( commands_api_interface , " reloadacl " , " Reload ACL " , reload_acl_function , " [reloadxml] " ) ;
2008-11-12 17:10:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " reload " , " Reload Module " , reload_function , UNLOAD_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " reloadxml " , " Reload XML " , reload_xml_function , " " ) ;
2010-06-18 17:46:07 -05:00
SWITCH_ADD_API ( commands_api_interface , " replace " , " replace a string " , replace_function , " <data>|<string1>|<string2> " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_api " , " Schedule an api command " , sched_api_function , SCHED_SYNTAX ) ;
2010-02-06 03:38:24 +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-12-14 20:10:06 +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 , " sched_hangup " , " Schedule a running call to hangup " , sched_hangup_function , SCHED_HANGUP_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_transfer " , " Schedule a transfer for a running call " , sched_transfer_function , SCHED_TRANSFER_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " show " , " Show " , show_function , SHOW_SYNTAX ) ;
2010-01-22 17:55:39 +00:00
SWITCH_ADD_API ( commands_api_interface , " sql_escape " , " Escape a string to prevent sql injection " , sql_escape , SQL_ESCAPE_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " status " , " status " , status_function , " " ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " strftime_tz " , " strftime_tz " , strftime_tz_api_function , " <Timezone_name> [format string] " ) ;
SWITCH_ADD_API ( commands_api_interface , " stun " , " stun " , stun_function , " <stun_server>[:port] " ) ;
SWITCH_ADD_API ( commands_api_interface , " system " , " Execute a system command " , system_function , SYSTEM_SYNTAX ) ;
2010-02-02 20:55:09 +00:00
SWITCH_ADD_API ( commands_api_interface , " time_test " , " time_test " , time_test_function , " <mss> [count] " ) ;
2009-12-29 18:54:49 +00:00
SWITCH_ADD_API ( commands_api_interface , " timer_test " , " timer_test " , timer_test_function , TIMER_TEST_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " tone_detect " , " Start Tone Detection on a channel " , tone_detect_session_function , TONE_DETECT_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " unload " , " Unload Module " , unload_function , UNLOAD_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " unsched_api " , " Unschedule an api command " , unsched_api_function , UNSCHED_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " url_decode " , " url decode a string " , url_decode_function , " <string> " ) ;
SWITCH_ADD_API ( commands_api_interface , " url_encode " , " url encode a string " , url_encode_function , " <string> " ) ;
SWITCH_ADD_API ( commands_api_interface , " user_data " , " find user data " , user_data_function , " <user>@<domain> [var|param|attr] <name> " ) ;
SWITCH_ADD_API ( commands_api_interface , " user_exists " , " find a user " , user_exists_function , " <key> <user> <domain> " ) ;
2009-12-17 20:46:49 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_audio " , " uuid_audio " , session_audio_function , AUDIO_SYNTAX ) ;
2010-04-14 12:49:02 -05:00
SWITCH_ADD_API ( commands_api_interface , " uuid_break " , " Break " , break_function , BREAK_SYNTAX ) ;
2007-07-05 17:03:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_bridge " , " uuid_bridge " , uuid_bridge_function , " " ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_broadcast " , " broadcast " , uuid_broadcast_function , BROADCAST_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_chat " , " Send a chat message " , uuid_chat , UUID_CHAT_SYNTAX ) ;
2009-10-29 17:29:05 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_debug_audio " , " debug audio " , uuid_debug_audio_function , DEBUG_AUDIO_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_deflect " , " Send a deflect " , uuid_deflect , UUID_DEFLECT_SYNTAX ) ;
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_display " , " change display " , uuid_display_function , DISPLAY_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_dump " , " uuid_dump " , uuid_dump_function , DUMP_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_exists " , " see if a uuid exists " , uuid_exists_function , EXISTS_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_flush_dtmf " , " Flush dtmf on a given uuid " , uuid_flush_dtmf_function , " <uuid> " ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_getvar " , " uuid_getvar " , uuid_getvar_function , GETVAR_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_hold " , " hold " , uuid_hold_function , HOLD_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_kill " , " Kill Channel " , kill_function , KILL_SYNTAX ) ;
2010-01-20 19:19:48 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_loglevel " , " set loglevel on session " , uuid_loglevel , UUID_LOGLEVEL_SYNTAX ) ;
2008-03-06 17:31:55 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_media " , " media " , uuid_media_function , MEDIA_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_park " , " Park Channel " , park_function , PARK_SYNTAX ) ;
2010-04-16 10:01:00 -05:00
SWITCH_ADD_API ( commands_api_interface , " uuid_phone_event " , " Send and event to the phone " , uuid_phone_event_function , PHONE_EVENT_SYNTAX ) ;
2009-12-14 20:10:06 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_preprocess " , " Pre-process Channel " , preprocess_function , PREPROCESS_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_record " , " session record " , session_record_function , SESS_REC_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_recv_dtmf " , " receive dtmf digits " , uuid_recv_dtmf_function , UUID_RECV_DTMF_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_send_dtmf " , " send dtmf digits " , uuid_send_dtmf_function , UUID_SEND_DTMF_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_session_heartbeat " , " uuid_session_heartbeat " , uuid_session_heartbeat_function , HEARTBEAT_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_setvar_multi " , " uuid_setvar_multi " , uuid_setvar_multi_function , SETVAR_MULTI_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_setvar " , " uuid_setvar " , uuid_setvar_function , SETVAR_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_transfer " , " Transfer a session " , transfer_function , TRANSFER_SYNTAX ) ;
2010-01-20 19:20:11 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_simplify " , " Try to cut out of a call path / attended xfer " , uuid_simplify_function , SIMPLIFY_SYNTAX ) ;
2009-12-14 20:10:06 +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>] " ) ;
SWITCH_ADD_API ( commands_api_interface , " xml_wrap " , " Wrap another api command in xml " , xml_wrap_api_function , " <command> <args> " ) ;
switch_console_set_complete ( " add alias add " ) ;
switch_console_set_complete ( " add alias del " ) ;
switch_console_set_complete ( " add complete add " ) ;
switch_console_set_complete ( " add complete del " ) ;
2009-12-15 18:37:58 +00:00
switch_console_set_complete ( " add db_cache status " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add fsctl debug_level " ) ;
2010-07-01 23:15:37 -05:00
switch_console_set_complete ( " add fsctl last_sps " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add fsctl default_dtmf_duration " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl hupall " ) ;
2009-11-20 23:12:07 +00:00
switch_console_set_complete ( " add fsctl loglevel " ) ;
2010-01-20 19:19:48 +00:00
switch_console_set_complete ( " add fsctl loglevel console " ) ;
switch_console_set_complete ( " add fsctl loglevel alert " ) ;
switch_console_set_complete ( " add fsctl loglevel crit " ) ;
switch_console_set_complete ( " add fsctl loglevel err " ) ;
switch_console_set_complete ( " add fsctl loglevel warning " ) ;
switch_console_set_complete ( " add fsctl loglevel notice " ) ;
switch_console_set_complete ( " add fsctl loglevel info " ) ;
switch_console_set_complete ( " add fsctl loglevel debug " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add fsctl max_dtmf_duration " ) ;
switch_console_set_complete ( " add fsctl max_sessions " ) ;
switch_console_set_complete ( " add fsctl min_dtmf_duration " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl pause " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add fsctl reclaim_mem " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl resume " ) ;
2010-07-01 23:15:37 -05:00
switch_console_set_complete ( " add fsctl calibrate_clock " ) ;
switch_console_set_complete ( " add fsctl crash " ) ;
switch_console_set_complete ( " add fsctl verbose_events " ) ;
switch_console_set_complete ( " add fsctl save_history " ) ;
switch_console_set_complete ( " add fsctl shutdown_check " ) ;
2008-05-28 21:14:06 +00:00
switch_console_set_complete ( " add fsctl shutdown " ) ;
2008-10-21 19:19:49 +00:00
switch_console_set_complete ( " add fsctl shutdown asap " ) ;
2010-01-08 22:51:16 +00:00
switch_console_set_complete ( " add fsctl shutdown now " ) ;
2008-10-21 19:19:49 +00:00
switch_console_set_complete ( " add fsctl shutdown asap restart " ) ;
2008-10-03 14:58:36 +00:00
switch_console_set_complete ( " add fsctl shutdown cancel " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add fsctl shutdown elegant " ) ;
switch_console_set_complete ( " add fsctl shutdown elegant restart " ) ;
switch_console_set_complete ( " add fsctl shutdown restart " ) ;
switch_console_set_complete ( " add fsctl shutdown restart asap " ) ;
switch_console_set_complete ( " add fsctl shutdown restart elegant " ) ;
2008-06-11 03:27:36 +00:00
switch_console_set_complete ( " add fsctl sps " ) ;
2010-02-06 03:38:24 +00:00
switch_console_set_complete ( " add fsctl sync_clock " ) ;
switch_console_set_complete ( " add fsctl flush_db_handles " ) ;
2010-03-16 23:55:19 +00:00
switch_console_set_complete ( " add fsctl min_idle_cpu " ) ;
switch_console_set_complete ( " add fsctl send_sighup " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add nat_map reinit " ) ;
switch_console_set_complete ( " add nat_map republish " ) ;
switch_console_set_complete ( " add nat_map status " ) ;
switch_console_set_complete ( " add reloadacl reloadxml " ) ;
switch_console_set_complete ( " add show aliases " ) ;
switch_console_set_complete ( " add show api " ) ;
switch_console_set_complete ( " add show application " ) ;
switch_console_set_complete ( " add show calls " ) ;
switch_console_set_complete ( " add show channels " ) ;
2010-06-07 09:20:45 -05:00
switch_console_set_complete ( " add show channels count " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add show chat " ) ;
switch_console_set_complete ( " add show codec " ) ;
switch_console_set_complete ( " add show complete " ) ;
switch_console_set_complete ( " add show dialplan " ) ;
switch_console_set_complete ( " add show distinct_channels " ) ;
switch_console_set_complete ( " add show endpoint " ) ;
switch_console_set_complete ( " add show file " ) ;
switch_console_set_complete ( " add show interfaces " ) ;
switch_console_set_complete ( " add show interface_types " ) ;
2010-01-08 21:43:43 +00:00
switch_console_set_complete ( " add show tasks " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add show management " ) ;
switch_console_set_complete ( " add show modules " ) ;
switch_console_set_complete ( " add show nat_map " ) ;
switch_console_set_complete ( " add show say " ) ;
switch_console_set_complete ( " add show timer " ) ;
2010-01-20 17:45:53 +00:00
switch_console_set_complete ( " add shutdown " ) ;
2010-01-22 17:55:39 +00:00
switch_console_set_complete ( " add sql_escape " ) ;
2009-12-17 20:46:49 +00:00
switch_console_set_complete ( " add uuid_audio ::console::list_uuid start read mute " ) ;
switch_console_set_complete ( " add uuid_audio ::console::list_uuid start read level " ) ;
switch_console_set_complete ( " add uuid_audio ::console::list_uuid start write mute " ) ;
switch_console_set_complete ( " add uuid_audio ::console::list_uuid start write level " ) ;
switch_console_set_complete ( " add uuid_audio ::console::list_uuid stop " ) ;
2010-04-14 12:49:02 -05:00
switch_console_set_complete ( " add uuid_break ::console::list_uuid all " ) ;
switch_console_set_complete ( " add uuid_break ::console::list_uuid both " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add uuid_bridge ::console::list_uuid ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_broadcast ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_chat ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_debug_audio ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_deflect ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_displace ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_display ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_dump ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_exists ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_flush_dtmf ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_getvar ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_hold ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_kill ::console::list_uuid " ) ;
2010-01-20 19:19:48 +00:00
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid console " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid alert " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid crit " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid err " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid warning " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid notice " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid info " ) ;
switch_console_set_complete ( " add uuid_loglevel ::console::list_uuid debug " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add uuid_media ::console::list_uuid " ) ;
2010-06-02 11:17:43 -05:00
switch_console_set_complete ( " add uuid_media off ::console::list_uuid " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add uuid_park ::console::list_uuid " ) ;
2010-04-16 10:01:00 -05:00
switch_console_set_complete ( " add uuid_phone_event ::console::list_uuid talk " ) ;
switch_console_set_complete ( " add uuid_phone_event ::console::list_uuid hold " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add uuid_preprocess ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_record ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_recv_dtmf ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_send_dtmf ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_session_heartbeat ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_setvar_multi ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_setvar ::console::list_uuid " ) ;
switch_console_set_complete ( " add uuid_transfer ::console::list_uuid " ) ;
2010-01-20 17:45:53 +00:00
switch_console_set_complete ( " add version " ) ;
2009-12-14 20:10:06 +00:00
switch_console_set_complete ( " add uuid_warning ::console::list_uuid " ) ;
2010-01-20 17:45:53 +00:00
switch_console_set_complete ( " add ... " ) ;
2009-12-14 20:10:06 +00:00
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
*/