2006-04-04 22:03:59 +00:00
/*
* FreeSWITCH Modular Media Switching Software Library / Soft - Switch Application
* Copyright ( C ) 2005 / 2006 , Anthony Minessale II < anthmct @ yahoo . com >
*
* 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
* Anthony Minessale II < anthmct @ yahoo . com >
* Portions created by the Initial Developer are Copyright ( C )
* the Initial Developer . All Rights Reserved .
*
* Contributor ( s ) :
*
* Anthony Minessale II < anthmct @ yahoo . com >
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 >
2006-04-04 22:03:59 +00:00
*
2006-04-07 03:57:03 +00:00
*
* mod_commands . c - - Misc . Command Module
2006-04-04 22:03:59 +00:00
*
*/
# include <switch.h>
2006-11-28 19:33:54 +00:00
# include <switch_version.h>
2006-04-04 22:03:59 +00:00
2007-06-13 16:00:14 +00:00
SWITCH_MODULE_LOAD_FUNCTION ( mod_commands_load ) ;
SWITCH_MODULE_DEFINITION ( mod_commands , mod_commands_load , NULL , NULL ) ;
2007-03-03 01:01:37 +00:00
2007-11-08 23:46:26 +00:00
2007-12-04 19:39:14 +00:00
SWITCH_STANDARD_API ( user_data_function )
{
2007-12-06 18:57:02 +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 ;
char * mydata = NULL , * argv [ 3 ] ;
char * key = NULL , * type = NULL , * user , * domain ;
char delim = ' ' ;
const char * err = NULL ;
const char * container = " params " , * elem = " param " ;
char * params = NULL ;
if ( ! cmd ) {
err = " bad args " ;
goto end ;
}
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ) ;
2007-12-04 19:39:14 +00:00
argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 3 ) {
err = " bad args " ;
goto end ;
}
user = argv [ 0 ] ;
type = argv [ 1 ] ;
key = argv [ 2 ] ;
if ( ( domain = strchr ( user , ' @ ' ) ) ) {
* domain + + = ' \0 ' ;
} else {
domain = " cluecon.com " ;
}
params = switch_mprintf ( " user=%s&domain=%s&type=%s&key=%s " , user , domain , type , key ) ;
if ( switch_xml_locate_user ( " id " , user , domain , NULL , & xml , & x_domain , & x_user , params ) ! = SWITCH_STATUS_SUCCESS ) {
err = " can't find user " ;
goto end ;
}
2007-12-14 17:13:20 +00:00
2007-12-04 19:39:14 +00:00
end :
if ( xml ) {
if ( err ) {
//stream->write_function(stream, "-Error %s\n", err);
} else {
if ( ! strcmp ( type , " var " ) ) {
container = " variables " ;
elem = " variable " ;
}
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 " ) ;
if ( ! strcasecmp ( var , key ) ) {
stream - > write_function ( stream , " %s " , val ) ;
break ;
}
}
}
}
switch_xml_free ( xml ) ;
}
free ( mydata ) ;
switch_safe_free ( params ) ;
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 ;
char * mydata = NULL , * argv [ 3 ] ;
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 ;
if ( stream - > event & & ( host = switch_event_get_header ( stream - > event , " http-host " ) ) ) {
2007-12-04 18:17:33 +00:00
stream - > write_function ( stream , " Content-Type: text/xml \r \n \r \n " ) ;
2007-12-04 18:52:13 +00:00
if ( ( path_info = switch_event_get_header ( stream - > event , " http-path-info " ) ) ) {
cmd = path_info ;
delim = ' / ' ;
}
2007-12-04 18:17:33 +00:00
}
2007-12-04 18:52:13 +00:00
2007-11-29 02:48:44 +00:00
if ( ! cmd ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2007-11-29 02:48:44 +00:00
goto end ;
}
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ) ;
2007-11-29 02:48:44 +00:00
2007-12-04 18:52:13 +00:00
argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-11-29 02:48:44 +00:00
if ( argc < 3 ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2007-11-29 02:48:44 +00:00
goto end ;
}
key = argv [ 0 ] ;
user = argv [ 1 ] ;
domain = argv [ 2 ] ;
if ( ! ( key & & user & & domain ) ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2007-11-29 02:48:44 +00:00
goto end ;
}
if ( switch_xml_locate_user ( key , user , domain , NULL , & xml , & x_domain , & x_user , 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 ;
}
end :
2007-12-14 17:13:20 +00:00
if ( session | | tf ) {
stream - > write_function ( stream , err ? " false " : " true " ) ;
switch_xml_free ( xml ) ;
} else {
if ( err ) {
if ( host ) {
stream - > write_function ( stream , " <error>%s</error> \n " , err ) ;
} else {
stream - > write_function ( stream , " -Error %s \n " , err ) ;
}
2007-12-04 18:52:13 +00:00
}
2007-12-14 17:13:20 +00:00
if ( xml & & x_user ) {
xmlstr = switch_xml_toxml ( x_user , SWITCH_FALSE ) ;
switch_assert ( xmlstr ) ;
stream - > write_function ( stream , " %s " , xmlstr ) ;
free ( xmlstr ) ;
switch_xml_free ( xml ) ;
}
2007-11-29 02:48:44 +00:00
}
free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-12-14 17:13:20 +00:00
SWITCH_STANDARD_API ( user_exists_function )
{
return _find_user ( cmd , session , stream , SWITCH_TRUE ) ;
}
SWITCH_STANDARD_API ( find_user_function )
{
return _find_user ( cmd , session , stream , SWITCH_FALSE ) ;
}
2007-11-29 02:48:44 +00:00
2007-12-01 00:01:56 +00:00
SWITCH_STANDARD_API ( xml_locate_function )
{
switch_xml_t xml = NULL , obj = NULL ;
int argc ;
char * mydata = NULL , * argv [ 4 ] ;
char * section , * tag , * tag_attr_name , * tag_attr_val , * params = NULL ;
char * xmlstr ;
2007-12-04 18:52:13 +00:00
char * path_info , delim = ' ' ;
char * host = NULL ;
const char * err = NULL ;
if ( stream - > event & & ( host = switch_event_get_header ( stream - > event , " http-host " ) ) ) {
stream - > write_function ( stream , " Content-Type: text/xml \r \n \r \n " ) ;
if ( ( path_info = switch_event_get_header ( stream - > event , " http-path-info " ) ) ) {
cmd = path_info ;
delim = ' / ' ;
}
}
2007-12-01 00:01:56 +00:00
if ( ! cmd ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2007-12-01 00:01:56 +00:00
goto end ;
}
2007-12-04 18:10:04 +00:00
2007-12-01 00:01:56 +00:00
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ) ;
2007-12-01 00:01:56 +00:00
2007-12-04 18:52:13 +00:00
argc = switch_separate_string ( mydata , delim , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-12-01 00:01:56 +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 ;
goto end ;
}
if ( argc < 4 ) {
2007-12-04 18:52:13 +00:00
err = " bad args " ;
2007-12-01 00:01:56 +00:00
goto end ;
}
section = argv [ 0 ] ;
tag = argv [ 1 ] ;
tag_attr_name = argv [ 2 ] ;
tag_attr_val = argv [ 3 ] ;
params = switch_mprintf ( " section=%s&tag=%s&tag_attr_name=%s&tag_attr_val=%s " , section , tag , tag_attr_name , tag_attr_val ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( params ) ;
2007-12-01 00:01:56 +00:00
if ( switch_xml_locate ( section , tag , tag_attr_name , tag_attr_val , & xml , & obj , params ) ! = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:52:13 +00:00
stream - > write_function ( stream , " can't find anything \n " ) ;
2007-12-01 00:01:56 +00:00
goto end ;
}
end :
2007-12-04 18:52:13 +00:00
if ( err ) {
if ( host ) {
stream - > write_function ( stream , " <error>%s</error> \n " , err ) ;
} else {
stream - > write_function ( stream , " -Error %s \n " , err ) ;
}
}
2007-12-01 00:01:56 +00:00
switch_safe_free ( params ) ;
if ( xml & & obj ) {
xmlstr = switch_xml_toxml ( obj , SWITCH_FALSE ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( xmlstr ) ;
2007-12-01 00:01:56 +00:00
stream - > write_function ( stream , " %s " , xmlstr ) ;
free ( xmlstr ) ;
switch_xml_free ( xml ) ;
}
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 ;
char * mydata = NULL , * argv [ 3 ] ;
size_t len = 0 ;
char * substituted = NULL ;
int proceed = 0 ;
if ( ! cmd ) {
goto error ;
}
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ) ;
2007-11-09 15:26:32 +00:00
argc = switch_separate_string ( mydata , ' | ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc < 2 ) {
goto error ;
}
if ( ( proceed = switch_regex_perform ( argv [ 0 ] , argv [ 1 ] , & re , ovector , sizeof ( ovector ) / sizeof ( ovector [ 0 ] ) ) ) ) {
if ( argc > 2 ) {
len = strlen ( argv [ 0 ] ) * 3 ;
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 ) ;
switch_replace_char ( argv [ 2 ] , ' % ' , ' $ ' , SWITCH_FALSE ) ;
switch_perform_substitution ( re , proceed , argv [ 2 ] , argv [ 0 ] , substituted , len , ovector ) ;
stream - > write_function ( stream , " %s " , substituted ) ;
free ( substituted ) ;
} else {
stream - > write_function ( stream , " true " ) ;
}
} else {
stream - > write_function ( stream , " false " ) ;
}
goto ok ;
error :
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR " ) ;
2007-11-09 15:26:32 +00:00
ok :
switch_regex_safe_free ( re ) ;
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-08 23:46:26 +00:00
typedef enum {
O_NONE ,
O_EQ ,
O_NE ,
O_GT ,
O_GE ,
O_LT ,
O_LE
} o_t ;
2007-11-13 00:33:31 +00:00
SWITCH_STANDARD_API ( cond_function )
2007-11-08 23:46:26 +00:00
{
int argc ;
char * mydata = NULL , * argv [ 3 ] ;
char * expr ;
char * a , * b ;
2007-11-09 01:06:26 +00:00
double a_f = 0.0 , b_f = 0.0 ;
2007-11-08 23:46:26 +00:00
o_t o = O_NONE ;
int is_true = 0 ;
char * p ;
if ( ! cmd ) {
goto error ;
}
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ) ;
2007-11-08 23:46:26 +00:00
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 , ' > ' ) ) ) {
if ( * ( expr + 1 ) = = ' = ' ) {
* expr + + = ' \0 ' ;
o = O_GE ;
} else {
o = O_GT ;
}
} else if ( ( expr = strchr ( a , ' < ' ) ) ) {
if ( * ( expr + 1 ) = = ' = ' ) {
* 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 :
2007-11-09 01:06:26 +00:00
if ( ! a_is_num & & ! b_is_num ) {
is_true = strcmp ( s_a , s_b ) ;
} else {
is_true = a_f ! = b_f ;
}
2007-11-08 23:46:26 +00:00
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 ;
}
error :
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR " ) ;
2007-11-08 23:46:26 +00:00
ok :
switch_safe_free ( mydata ) ;
return SWITCH_STATUS_SUCCESS ;
}
SWITCH_STANDARD_API ( lan_addr_function )
{
stream - > write_function ( stream , " %s " , switch_is_lan_addr ( cmd ) ? " yes " : " no " ) ;
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 ;
2007-10-06 23:44:39 +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 ;
2006-07-26 20:12:49 +00:00
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
2006-05-10 15:47:54 +00:00
switch_core_measure_time ( switch_core_uptime ( ) , & duration ) ;
2006-04-04 22:03:59 +00:00
2006-09-18 22:22:25 +00:00
if ( stream - > event ) {
2006-10-31 05:04:47 +00:00
http = switch_event_get_header ( stream - > event , " http-host " ) ;
}
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 ,
" 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 " ,
2007-03-30 00:15:25 +00:00
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
2007-10-19 17:36:26 +00:00
stream - > write_function ( stream , " % " SWITCH_SIZE_T_FMT " session(s) since startup \n " , switch_core_session_id ( ) - 1 ) ;
2007-10-04 21:35:50 +00:00
switch_core_session_ctl ( SCSC_LAST_SPS , & last_sps ) ;
switch_core_session_ctl ( SCSC_SPS , & sps ) ;
stream - > write_function ( stream , " %d session(s) %d/%d \n " , switch_core_session_count ( ) , last_sps , sps ) ;
2007-03-29 22:31:56 +00:00
2006-05-10 16:47:02 +00:00
if ( html ) {
stream - > write_function ( stream , " </b> \n " ) ;
}
2006-05-10 16:35:42 +00:00
if ( cmd & & strstr ( cmd , " refresh= " ) ) {
char * refresh = strchr ( cmd , ' = ' ) ;
if ( refresh ) {
int r ;
refresh + + ;
r = atoi ( refresh ) ;
2007-03-29 22:31:56 +00:00
if ( r > 0 ) {
2007-03-30 00:13:31 +00:00
stream - > write_function ( stream , " <META HTTP-EQUIV=REFRESH CONTENT= \" %d; URL=/api/status?refresh=%d%s \" > \n " , r , r , html ? " html=1 " : " " ) ;
2006-05-10 16:35:42 +00:00
}
}
}
2006-05-10 15:47:54 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2008-01-06 23:03:12 +00:00
# define CTL_SYNTAX "[hupall|pause|resume|shutdown|reclaim_mem|max_sessions [num]|loglevel [level]]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( ctl_function )
2006-09-20 20:25:26 +00:00
{
int argc ;
char * mydata , * argv [ 5 ] ;
2007-10-03 23:43:01 +00:00
int32_t arg = 0 ;
2006-09-20 20:25:26 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , CTL_SYNTAX ) ;
2006-09-20 20:25:26 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
if ( ( mydata = strdup ( cmd ) ) ) {
2006-09-20 20:25:26 +00:00
argc = switch_separate_string ( mydata , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-03-29 22:31:56 +00:00
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " hupall " ) ) {
2006-09-20 20:25:26 +00:00
arg = 1 ;
switch_core_session_ctl ( SCSC_HUPALL , & arg ) ;
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 ) ;
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 ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " shutdown " ) ) {
2006-09-20 20:25:26 +00:00
arg = 0 ;
switch_core_session_ctl ( SCSC_SHUTDOWN , & arg ) ;
2007-10-04 17:25:06 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " reclaim_mem " ) ) {
switch_core_session_ctl ( SCSC_RECLAIM , & arg ) ;
2007-10-05 13:42:11 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " max_sessions " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
}
switch_core_session_ctl ( SCSC_MAX_SESSIONS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK max sessions: %d \n " , arg ) ;
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
if ( arg = = - 1 | | arg = = SWITCH_LOG_INVALID ) {
stream - > write_function ( stream , " -ERR syntax error, log level not set! \n " ) ;
} else {
switch_core_session_ctl ( SCSC_LOGLEVEL , & arg ) ;
stream - > write_function ( stream , " +OK log level: %s [%d] \n " , switch_log_level2str ( arg ) , arg ) ;
}
2007-10-04 21:35:50 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " last_sps " ) ) {
switch_core_session_ctl ( SCSC_LAST_SPS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK last sessions per second: %d \n " , arg ) ;
2007-10-04 14:19:51 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " sps " ) ) {
if ( argc > 1 ) {
arg = atoi ( argv [ 1 ] ) ;
} else {
arg = 0 ;
}
switch_core_session_ctl ( SCSC_SPS , & arg ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK sessions per second: %d \n " , arg ) ;
2008-01-11 00:43:49 +00:00
} else if ( ! strcasecmp ( argv [ 0 ] , " sync_clock " ) ) {
arg = 0 ;
switch_core_session_ctl ( SCSC_SYNC_CLOCK , & arg ) ;
stream - > write_function ( stream , " +OK clock syncronized \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-01-11 00:43:49 +00:00
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-03-29 22:31:56 +00:00
end :
2006-09-20 20:25:26 +00:00
free ( mydata ) ;
} else {
2007-12-04 18:23:41 +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
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
2006-10-31 05:04:47 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , LOAD_SYNTAX ) ;
2006-10-08 04:40:15 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-10-31 05:04:47 +00:00
2007-05-12 21:36:15 +00:00
if ( switch_loadable_module_load_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , SWITCH_TRUE , & err ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-03-17 19:51:08 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR [%s] \n " , err ) ;
2007-05-03 16:28:23 +00:00
}
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( unload_function )
2007-05-03 16:28:23 +00:00
{
const char * err ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
2007-05-12 21:36:15 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , LOAD_SYNTAX ) ;
2007-05-03 16:28:23 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
if ( switch_loadable_module_unload_module ( ( char * ) SWITCH_GLOBAL_dirs . mod_dir , ( char * ) cmd , & 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 )
2006-05-26 17:27:09 +00:00
{
const char * err ;
switch_xml_t xml_root ;
2006-07-26 20:12:49 +00:00
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2006-05-26 17:27:09 +00:00
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 ;
}
2007-06-20 03:26:52 +00:00
# define KILL_SYNTAX "<uuid>"
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 ;
2006-04-04 22:03:59 +00:00
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-07-26 20:12:49 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-05-12 21:36:15 +00:00
if ( ! cmd ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , KILL_SYNTAX ) ;
2007-05-12 21:36:15 +00:00
} else if ( ( ksession = switch_core_session_locate ( cmd ) ) ) {
switch_channel_t * channel = switch_core_session_get_channel ( ksession ) ;
2006-04-22 03:05:25 +00:00
switch_channel_hangup ( channel , SWITCH_CAUSE_NORMAL_CLEARING ) ;
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
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2006-04-04 22:03:59 +00:00
}
return SWITCH_STATUS_SUCCESS ;
}
2007-12-13 22:17:20 +00:00
# define PARK_SYNTAX "<uuid>"
SWITCH_STANDARD_API ( park_function )
{
switch_core_session_t * ksession = NULL ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
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 ;
2006-07-26 20:12:49 +00:00
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-07-26 20:12:49 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
2007-10-29 06:42:13 +00:00
if ( argc > = 2 & & argc < = 5 ) {
2007-12-11 21:43:30 +00:00
char * tuuid = argv [ 0 ] ;
2007-05-12 14:48:14 +00:00
char * dest = argv [ 1 ] ;
char * dp = argv [ 2 ] ;
char * context = argv [ 3 ] ;
2007-10-01 14:57:15 +00:00
char * arg = NULL ;
2006-04-28 19:46:57 +00:00
2007-12-11 21:43:30 +00:00
if ( ( tsession = switch_core_session_locate ( tuuid ) ) ) {
2007-03-29 22:31:56 +00:00
2007-10-01 14:57:15 +00:00
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 ) ;
arg + + ;
if ( ! strcasecmp ( arg , " bleg " ) ) {
2007-11-01 11:28:26 +00:00
const char * uuid = switch_channel_get_variable ( channel , SWITCH_BRIDGE_VARIABLE ) ;
2007-10-01 14:57:15 +00:00
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 " ) ) {
2007-11-01 11:28:26 +00:00
const char * uuid = switch_channel_get_variable ( channel , SWITCH_BRIDGE_VARIABLE ) ;
2007-10-01 14:57:15 +00:00
if ( uuid & & ( other_session = switch_core_session_locate ( uuid ) ) ) {
switch_ivr_session_transfer ( other_session , dest , dp , context ) ;
switch_core_session_rwunlock ( other_session ) ;
}
}
}
2007-05-12 21:36:15 +00:00
if ( switch_ivr_session_transfer ( tsession , dest , dp , context ) = = SWITCH_STATUS_SUCCESS ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-05-12 14:48:14 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR \n " ) ;
2007-05-12 14:48:14 +00:00
}
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( tsession ) ;
2007-10-01 14:57:15 +00:00
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
goto done ;
2006-04-28 19:46:57 +00:00
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , TRANSFER_SYNTAX ) ;
2007-05-12 14:48:14 +00:00
done :
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 TONE_DETECT_SYNTAX "<uuid> <key> <tone_spec> [<flags> <timeout> <app> <args>]"
2007-06-16 02:25:40 +00:00
SWITCH_STANDARD_API ( tone_detect_session_function )
{
2007-08-03 03:44:27 +00:00
char * argv [ 7 ] = { 0 } ;
2007-06-16 02:25:40 +00:00
int argc ;
char * mydata = NULL ;
time_t to = 0 ;
switch_core_session_t * rsession ;
2007-12-04 18:52:13 +00:00
2007-10-20 06:01:41 +00:00
if ( ! cmd ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , TONE_DETECT_SYNTAX ) ;
2007-10-20 06:01:41 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-16 03:43:13 +00:00
mydata = strdup ( cmd ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( mydata ! = NULL ) ;
2007-06-16 03:43:13 +00:00
2007-12-22 01:00:10 +00:00
if ( ( argc = switch_separate_string ( mydata , ' ' , argv , sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) < 3 | | ! argv [ 0 ] ) {
2007-12-04 18:23:41 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " -ERR INVALID ARGS! \n " ) ;
2007-12-22 01:00:10 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-06-16 02:25:40 +00:00
}
2007-12-04 18:52:13 +00:00
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 ;
}
2007-12-04 18:52:13 +00:00
2007-06-16 02:25:40 +00:00
if ( argv [ 4 ] ) {
uint32_t mto ;
2007-06-16 03:43:13 +00:00
if ( * argv [ 4 ] = = ' + ' ) {
if ( ( mto = atoi ( argv [ 4 ] + 1 ) ) > 0 ) {
2008-01-11 00:43:49 +00:00
to = switch_timestamp ( NULL ) + mto ;
2007-06-16 02:25:40 +00:00
} else {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
goto done ;
}
} else {
2008-01-11 00:43:49 +00:00
if ( ( to = atoi ( argv [ 4 ] ) ) < switch_timestamp ( NULL ) ) {
2007-06-16 02:25:40 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " INVALID Timeout! \n " ) ;
to = 0 ;
goto done ;
}
}
}
switch_ivr_tone_detect_session ( rsession , argv [ 1 ] , argv [ 2 ] , argv [ 3 ] , to , argv [ 5 ] , argv [ 6 ] ) ;
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
done :
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 ) ;
switch_uuid_format ( uuid_str , & uuid ) ;
stream - > write_function ( stream , " %s " , uuid_str ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-16 20:20:43 +00:00
# define UUID_CHAT_SYNTAX "<uuid> <text>"
SWITCH_STANDARD_API ( uuid_chat )
{
switch_core_session_t * tsession = NULL ;
char * uuid = NULL , * text = NULL ;
if ( ! switch_strlen_zero ( cmd ) & & ( uuid = strdup ( cmd ) ) ) {
if ( ( text = strchr ( uuid , ' ' ) ) ) {
* text + + = ' \0 ' ;
}
}
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( text ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_CHAT_SYNTAX ) ;
2007-11-16 20:20:43 +00:00
} else {
if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
switch_event_t * event ;
if ( switch_event_create ( & event , SWITCH_EVENT_MESSAGE ) = = SWITCH_STATUS_SUCCESS ) {
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 ;
}
2007-07-05 17:03:14 +00:00
2007-06-20 03:26:52 +00:00
# define SCHED_TRANSFER_SYNTAX "[+]<time> <uuid> <extension> [<dialplan>] [<context>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_transfer_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * tsession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 6 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
2007-05-12 21:36:15 +00:00
if ( session ) {
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 | | argc > 5 ) {
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 ] = = ' + ' ) {
2008-01-11 00:43:49 +00:00
when = switch_timestamp ( NULL ) + atol ( argv [ 0 ] + 1 ) ;
2007-03-28 23:37:12 +00:00
} else {
when = atol ( argv [ 0 ] ) ;
}
2007-05-12 21:36:15 +00:00
if ( ( tsession = switch_core_session_locate ( uuid ) ) ) {
2007-03-28 23:37:12 +00:00
switch_ivr_schedule_transfer ( when , uuid , dest , dp , context ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-05-12 21:36:15 +00:00
switch_core_session_rwunlock ( tsession ) ;
2007-03-28 23:37:12 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-03-28 23:37:12 +00:00
}
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SCHED_HANGUP_SYNTAX "[+]<time> <uuid> [<cause>]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_hangup_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * hsession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
2007-05-12 21:36:15 +00:00
if ( session ) {
2007-03-28 23:37:12 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 ) {
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 ] = = ' + ' ) {
2008-01-11 00:43:49 +00:00
when = switch_timestamp ( 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 ;
}
2007-06-20 03:26:52 +00:00
# define MEDIA_SYNTAX "<uuid>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_media_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-03-29 22:31:56 +00:00
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-10-31 21:38:06 +00:00
return status ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , MEDIA_SYNTAX ) ;
2006-10-31 21:38:06 +00:00
} else {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 0 ] , " off " ) ) {
2006-10-31 21:38:06 +00:00
status = switch_ivr_nomedia ( argv [ 1 ] , SMF_REBRIDGE ) ;
} else {
status = switch_ivr_media ( argv [ 0 ] , SMF_REBRIDGE ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define BROADCAST_SYNTAX "<uuid> <path> [aleg|bleg|both]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_broadcast_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-10-31 21:38:06 +00:00
return status ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , BROADCAST_SYNTAX ) ;
2006-10-31 21:38:06 +00:00
} else {
switch_media_flag_t flags = SMF_NONE ;
2006-11-10 08:13:01 +00:00
if ( argv [ 2 ] ) {
2007-09-29 01:06:08 +00:00
if ( ! strcasecmp ( argv [ 2 ] , " both " ) ) {
2006-11-10 08:13:01 +00:00
flags | = ( SMF_ECHO_ALEG | SMF_ECHO_BLEG ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 2 ] , " aleg " ) ) {
2006-11-10 08:13:01 +00:00
flags | = SMF_ECHO_ALEG ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( argv [ 2 ] , " bleg " ) ) {
2006-11-10 08:13:01 +00:00
flags | = SMF_ECHO_BLEG ;
}
} else {
flags | = SMF_ECHO_ALEG ;
2006-10-31 21:38:06 +00:00
}
2007-03-29 22:31:56 +00:00
2006-10-31 21:38:06 +00:00
status = switch_ivr_broadcast ( argv [ 0 ] , argv [ 1 ] , flags ) ;
stream - > write_function ( stream , " +OK Message Sent \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define SCHED_BROADCAST_SYNTAX "[+]<time> <uuid> <path> [aleg|bleg|both]"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( sched_broadcast_function )
2007-03-28 23:37:12 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2007-03-28 23:37:12 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-05-12 21:36:15 +00:00
if ( session ) {
2007-03-28 23:37:12 +00:00
return status ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2007-03-28 23:37:12 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 3 ) {
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 ] = = ' + ' ) {
2008-01-11 00:43:49 +00:00
when = switch_timestamp ( 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 ;
}
2007-06-20 03:26:52 +00:00
# define HOLD_SYNTAX "<uuid>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_hold_function )
2006-10-31 21:38:06 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-10-31 21:38:06 +00:00
int argc = 0 ;
switch_status_t status = SWITCH_STATUS_FALSE ;
2007-03-29 22:31:56 +00:00
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-10-31 21:38:06 +00:00
return status ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-10-31 21:38:06 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 1 ) {
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 {
status = switch_ivr_hold_uuid ( argv [ 0 ] ) ;
}
}
if ( status = = SWITCH_STATUS_SUCCESS ) {
stream - > write_function ( stream , " +OK Success \n " ) ;
} else {
stream - > write_function ( stream , " -ERR Operation Failed \n " ) ;
}
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2006-10-31 21:38:06 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define UUID_SYNTAX "<uuid> <other_uuid>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( uuid_bridge_function )
2006-09-19 02:18:24 +00:00
{
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-09-19 02:18:24 +00:00
int argc = 0 ;
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-09-19 02:18:24 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-09-19 02:18:24 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc ! = 2 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , UUID_SYNTAX ) ;
2006-09-19 02:18:24 +00:00
} else {
2006-10-08 04:40:15 +00:00
if ( switch_ivr_uuid_bridge ( argv [ 0 ] , argv [ 1 ] ) ! = SWITCH_STATUS_SUCCESS ) {
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
2007-05-12 21:36:15 +00:00
if ( session ) {
2007-01-12 16:05:49 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-01-12 16:05:49 +00:00
if ( switch_strlen_zero ( cmd ) ) {
2007-03-29 22:31:56 +00:00
goto usage ;
}
2007-01-12 16:05:49 +00:00
2007-05-12 14:48:14 +00:00
if ( ! ( mycmd = strdup ( cmd ) ) ) {
goto usage ;
}
2007-06-15 01:47:48 +00:00
if ( ( argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 3 ) {
2007-03-29 22:31:56 +00:00
goto usage ;
}
uuid = argv [ 0 ] ;
action = argv [ 1 ] ;
path = argv [ 2 ] ;
2007-05-31 14:42:23 +00:00
limit = argv [ 3 ] ? atoi ( argv [ 3 ] ) : 0 ;
2007-12-22 01:00:10 +00:00
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( action ) | | switch_strlen_zero ( path ) ) {
goto usage ;
}
2007-05-12 21:36:15 +00:00
if ( ! ( rsession = switch_core_session_locate ( uuid ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Cannot locate session! \n " ) ;
2007-03-29 22:31:56 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-05-15 02:21:53 +00:00
2007-03-29 22:31:56 +00:00
if ( ! strcasecmp ( action , " start " ) ) {
2007-05-31 14:42:23 +00:00
switch_ivr_record_session ( rsession , path , limit , NULL ) ;
2007-03-29 22:31:56 +00:00
} else if ( ! strcasecmp ( action , " stop " ) ) {
2007-05-12 21:36:15 +00:00
switch_ivr_stop_record_session ( rsession , path ) ;
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
2007-03-29 22:31:56 +00:00
usage :
2007-01-12 16:05:49 +00:00
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SESS_REC_SYNTAX ) ;
2007-05-12 14:48:14 +00:00
switch_safe_free ( mycmd ) ;
2007-05-15 02:21:53 +00:00
2007-01-12 16:05:49 +00:00
2007-03-29 22:31:56 +00:00
done :
2007-01-12 16:05:49 +00:00
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
}
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 ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
if ( switch_strlen_zero ( cmd ) ) {
goto usage ;
}
if ( ! ( mycmd = strdup ( cmd ) ) ) {
goto usage ;
}
if ( ( argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ) < 3 ) {
goto usage ;
}
uuid = argv [ 0 ] ;
action = argv [ 1 ] ;
path = argv [ 2 ] ;
limit = argv [ 3 ] ? atoi ( argv [ 3 ] ) : 0 ;
flags = argv [ 4 ] ;
2007-12-22 01:00:10 +00:00
if ( switch_strlen_zero ( uuid ) | | switch_strlen_zero ( action ) | | switch_strlen_zero ( path ) ) {
goto usage ;
}
2007-06-15 01:47:48 +00:00
if ( ! ( rsession = switch_core_session_locate ( uuid ) ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Cannot locate session! \n " ) ;
2007-06-15 01:47:48 +00:00
return SWITCH_STATUS_SUCCESS ;
}
if ( ! strcasecmp ( action , " start " ) ) {
switch_ivr_displace_session ( rsession , path , limit , flags ) ;
} else if ( ! strcasecmp ( action , " stop " ) ) {
switch_ivr_stop_displace_session ( rsession , path ) ;
} else {
goto usage ;
}
goto done ;
usage :
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR INVALID SYNTAX \n " ) ;
2007-06-15 01:47:48 +00:00
switch_safe_free ( mycmd ) ;
done :
if ( rsession ) {
switch_core_session_rwunlock ( rsession ) ;
}
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-06-25 18:37:40 +00:00
# define BREAK_SYNTAX "<uuid>"
SWITCH_STANDARD_API ( break_function )
{
switch_core_session_t * psession = NULL ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
if ( switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , BREAK_SYNTAX ) ;
2007-06-25 18:37:40 +00:00
} else {
if ( ( psession = switch_core_session_locate ( cmd ) ) ) {
switch_channel_t * channel = switch_core_session_get_channel ( psession ) ;
switch_channel_set_flag ( channel , CF_BREAK ) ;
switch_core_session_rwunlock ( psession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-06-25 18:37:40 +00:00
}
}
return SWITCH_STATUS_SUCCESS ;
}
2007-06-20 03:26:52 +00:00
# define PAUSE_SYNTAX "<uuid> <on|off>"
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( pause_function )
2006-04-28 19:46:57 +00:00
{
2007-05-12 21:36:15 +00:00
switch_core_session_t * psession = NULL ;
2007-05-12 14:48:14 +00:00
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
2006-04-28 19:46:57 +00:00
int argc = 0 ;
2006-07-26 20:12:49 +00:00
2007-05-12 21:36:15 +00:00
if ( session ) {
2006-07-26 20:12:49 +00:00
return SWITCH_STATUS_FALSE ;
}
2007-03-29 22:31:56 +00:00
2007-05-12 14:48:14 +00:00
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
}
2006-04-28 19:46:57 +00:00
2006-12-08 16:31:58 +00:00
if ( switch_strlen_zero ( cmd ) | | argc < 2 ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , 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 ;
if ( session | | switch_strlen_zero ( cmd ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Illegal Usage \n " ) ;
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 ] ) ) ) ;
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-09-29 01:06:08 +00:00
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 ] ) ;
}
2007-12-20 21:42:00 +00:00
if ( switch_ivr_originate ( NULL , & caller_session , & cause , aleg , timeout , NULL , cid_name , cid_num , NULL , SOF_NONE ) ! = SWITCH_STATUS_SUCCESS ) {
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 ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( caller_channel ! = NULL ) ;
2006-08-17 00:53:09 +00:00
switch_channel_clear_state_handler ( caller_channel , NULL ) ;
2007-09-29 01:06:08 +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 ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_CRIT , " memory error! \n " ) ;
2007-09-29 01:06:08 +00:00
abort ( ) ;
2006-09-07 03:58:01 +00:00
}
switch_caller_extension_add_application ( caller_session , extension , app_name , arg ) ;
switch_channel_set_caller_extension ( caller_channel , extension ) ;
switch_channel_set_state ( caller_channel , CS_EXECUTE ) ;
} else {
switch_ivr_session_transfer ( caller_session , exten , dp , context ) ;
}
2006-11-09 05:39:04 +00:00
if ( machine ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK %s \n " , switch_core_session_get_uuid ( caller_session ) ) ;
2006-11-09 05:39:04 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Created Session: %s \n " , switch_core_session_get_uuid ( caller_session ) ) ;
2006-11-09 05:39:04 +00:00
}
2007-04-13 22:15:58 +00:00
if ( caller_session ) {
switch_core_session_rwunlock ( caller_session ) ;
}
2006-11-09 05:39:04 +00:00
2007-09-29 01:06:08 +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-03-30 00:10:33 +00:00
static void sch_api_callback ( switch_scheduler_task_t * task )
{
char * cmd , * arg = NULL ;
switch_stream_handle_t stream = { 0 } ;
2007-12-11 21:43:30 +00:00
switch_assert ( task ) ;
2007-03-30 00:10:33 +00:00
cmd = ( char * ) task - > cmd_arg ;
2007-03-30 00:13:31 +00:00
2007-03-30 00:10:33 +00:00
if ( ( arg = strchr ( cmd , ' ' ) ) ) {
* arg + + = ' \0 ' ;
}
SWITCH_STANDARD_STREAM ( stream ) ;
switch_api_execute ( cmd , arg , NULL , & stream ) ;
2007-03-30 00:13:31 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_DEBUG , " Command %s(%s): \n %s \n " , cmd , arg , switch_str_nil ( ( char * ) stream . data ) ) ;
2007-03-30 00:10:33 +00:00
switch_safe_free ( stream . data ) ;
}
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 ;
}
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 ) {
cnt = switch_scheduler_del_task_id ( ( uint32_t ) tmp ) ;
}
} 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 ;
}
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 ;
}
}
stream - > write_function ( stream ,
" <result> \n "
" <row id= \" 1 \" > \n "
" <data>%s</data> \n "
" </row> \n "
" </result> \n " ,
send ? send : " ERROR "
) ;
switch_safe_free ( mystream . data ) ;
switch_safe_free ( edata ) ;
free ( dcommand ) ;
}
return SWITCH_STATUS_SUCCESS ;
}
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 ;
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 ;
}
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 = = ' + ' ) {
2008-01-11 00:43:49 +00:00
when = switch_timestamp ( NULL ) + atol ( tm + 1 ) ;
2007-03-30 00:36:02 +00:00
} else {
when = atol ( tm ) ;
}
id = switch_scheduler_add_task ( when , sch_api_callback , ( char * ) __SWITCH_FUNC__ , group , 0 , strdup ( dcmd ) , SSHF_FREE_ARG ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK Added: %u \n " , id ) ;
2007-03-30 00:36:02 +00:00
goto good ;
}
2007-03-30 00:13:31 +00:00
}
2007-03-30 00:10:33 +00:00
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR Invalid syntax \n " ) ;
2007-03-30 00:36:02 +00:00
good :
2007-03-30 00:10:33 +00:00
switch_safe_free ( tm ) ;
2007-03-30 00:13:31 +00:00
2007-03-30 00:10:33 +00:00
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 ;
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 ;
}
}
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 ) ;
2007-08-03 21:29:01 +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
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 ;
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 ] ;
switch_amp_encode ( argv [ x ] , 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 ;
}
2007-06-20 03:26:52 +00:00
# define SHOW_SYNTAX "codec|application|api|dialplan|file|timer|calls|channels"
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 ;
switch_core_db_t * db = switch_core_db_handle ( ) ;
2007-03-29 22:31:56 +00:00
struct holder holder = { 0 } ;
2006-10-08 08:09:57 +00:00
int help = 0 ;
2007-04-24 01:15:27 +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 ( ) ;
2006-07-20 03:55:07 +00:00
2006-07-26 20:12:49 +00:00
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
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 ] ;
}
2007-04-07 20:30:28 +00:00
}
2007-12-04 16:22:02 +00:00
if ( stream - > event ) {
2006-10-31 05:04:47 +00:00
holder . http = switch_event_get_header ( stream - > event , " http-host " ) ;
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 " ) ;
2007-09-29 01:06:08 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-10-31 05:04:47 +00:00
// If you changes the field qty or order of any of these select
// statmements, 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 ) ;
2007-02-23 20:32:31 +00:00
return SWITCH_STATUS_SUCCESS ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " codec " ) | | ! strcasecmp ( command , " dialplan " ) | | ! strcasecmp ( command , " file " ) | | ! strcasecmp ( command , " timer " ) ) {
2007-05-12 21:36:15 +00:00
sprintf ( sql , " select type, name from interfaces where type = '%s' " , command ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " tasks " ) ) {
2007-05-12 21:36:15 +00:00
sprintf ( sql , " select * from %s " , command ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " application " ) | | ! strcasecmp ( command , " api " ) ) {
2007-05-12 21:36:15 +00:00
sprintf ( sql , " select name, description, syntax from interfaces where type = '%s' and description != '' " , command ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " calls " ) ) {
2007-03-29 22:31:56 +00:00
sprintf ( sql , " select * from calls " ) ;
2007-09-29 01:06:08 +00:00
} else if ( ! strcasecmp ( command , " channels " ) ) {
2007-03-29 22:31:56 +00:00
sprintf ( sql , " select * from channels " ) ;
2007-05-12 21:36:15 +00:00
} else if ( ! strncasecmp ( command , " help " , 4 ) ) {
2006-10-08 08:09:57 +00:00
char * cmdname = NULL ;
2006-10-31 05:04:47 +00:00
2006-10-08 08:09:57 +00:00
help = 1 ;
holder . print_title = 0 ;
2007-05-12 21:36:15 +00:00
if ( ( cmdname = strchr ( command , ' ' ) ) ! = 0 ) {
2006-10-08 08:09:57 +00:00
* cmdname + + = ' \0 ' ;
2007-12-12 21:53:32 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 , " select name, syntax, description from interfaces where type = 'api' and name = '%s' " , cmdname ) ;
2006-10-08 08:09:57 +00:00
} else {
2007-12-12 21:53:32 +00:00
switch_snprintf ( sql , sizeof ( sql ) - 1 , " select name, syntax, description from interfaces where type = 'api' " ) ;
2006-10-08 08:09:57 +00:00
}
2006-10-31 05:04:47 +00:00
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SHOW_SYNTAX ) ;
2006-10-31 05:04:47 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2007-03-29 22:31:56 +00:00
2006-07-19 19:16:42 +00:00
holder . stream = stream ;
holder . count = 0 ;
2006-07-20 03:55:07 +00:00
if ( holder . http ) {
holder . stream - > write_function ( holder . stream , " <table cellpadding=1 cellspacing=4 border=1> \n " ) ;
}
2007-04-07 20:30:28 +00:00
if ( ! as ) {
2007-04-24 01:15:27 +00:00
as = " delim " ;
holder . delim = " , " ;
2006-07-20 03:55:07 +00:00
}
2007-04-24 01:15:27 +00:00
if ( ! strcasecmp ( as , " delim " ) | | ! strcasecmp ( as , " csv " ) ) {
if ( switch_strlen_zero ( holder . delim ) ) {
if ( ! ( holder . delim = argv [ 3 ] ) ) {
holder . delim = " , " ;
}
}
2007-04-07 20:30:28 +00:00
switch_core_db_exec ( db , sql , show_callback , & holder , & errmsg ) ;
if ( holder . http ) {
holder . stream - > write_function ( holder . stream , " </table> " ) ;
}
if ( errmsg ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR SQL Error [%s] \n " , errmsg ) ;
2007-04-07 20:30:28 +00:00
switch_core_db_free ( errmsg ) ;
errmsg = NULL ;
} else if ( help ) {
if ( holder . count = = 0 )
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No such command. \n " ) ;
2007-04-07 20:30:28 +00:00
} else {
stream - > write_function ( stream , " \n %u total. \n " , holder . count ) ;
}
} else if ( ! strcasecmp ( as , " xml " ) ) {
switch_core_db_exec ( db , sql , show_as_xml_callback , & holder , & errmsg ) ;
2007-04-26 15:02:46 +00:00
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
switch_xml_set_attr ( switch_xml_set_flag ( holder . xml , SWITCH_XML_DUP ) , strdup ( " row_count " ) , strdup ( count ) ) ;
2007-11-30 23:45:27 +00:00
xmlstr = switch_xml_toxml ( holder . xml , SWITCH_FALSE ) ;
2007-04-14 01:52:42 +00:00
2007-04-07 20:30:28 +00:00
if ( xmlstr ) {
holder . stream - > write_function ( holder . stream , " %s " , xmlstr ) ;
free ( xmlstr ) ;
} else {
2007-04-14 01:52:42 +00:00
holder . stream - > write_function ( holder . stream , " <result row_count= \" 0 \" /> \n " ) ;
2007-04-07 20:30:28 +00:00
}
} else {
2007-04-14 01:52:42 +00:00
holder . stream - > write_function ( holder . stream , " <result row_count= \" 0 \" /> \n " ) ;
2007-04-07 20:30:28 +00:00
}
2006-07-19 19:16:42 +00:00
} else {
2007-12-04 18:23:41 +00:00
holder . stream - > write_function ( holder . stream , " -ERR Cannot find format %s \n " , as ) ;
2006-05-04 16:04:04 +00:00
}
2007-04-07 20:30:28 +00:00
switch_safe_free ( mydata ) ;
2006-05-04 16:04:04 +00:00
switch_core_db_close ( db ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( version_function )
2006-11-28 19:33:54 +00:00
{
char version_string [ 1024 ] ;
2007-12-12 21:53:32 +00:00
switch_snprintf ( version_string , sizeof ( version_string ) - 1 , " FreeSwitch Version %s \n " , SWITCH_VERSION_FULL ) ;
2006-11-28 19:33:54 +00:00
stream - > write_function ( stream , version_string ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-05-12 21:36:15 +00:00
SWITCH_STANDARD_API ( help_function )
2006-10-08 08:09:57 +00:00
{
char showcmd [ 1024 ] ;
int all = 0 ;
if ( switch_strlen_zero ( cmd ) ) {
2007-03-29 22:31:56 +00:00
sprintf ( showcmd , " help " ) ;
2006-10-08 08:09:57 +00:00
all = 1 ;
} else {
2007-12-12 21:53:32 +00:00
switch_snprintf ( showcmd , sizeof ( showcmd ) - 1 , " help %s " , cmd ) ;
2006-10-08 08:09:57 +00:00
}
2006-10-31 05:04:47 +00:00
if ( all ) {
2006-10-08 08:09:57 +00:00
stream - > write_function ( stream , " \n Valid Commands: \n \n " ) ;
2006-10-31 05:04:47 +00:00
}
2006-10-08 08:09:57 +00:00
show_function ( showcmd , session , stream ) ;
2006-10-31 05:04:47 +00:00
2006-10-08 08:09:57 +00:00
return SWITCH_STATUS_SUCCESS ;
}
2006-05-04 16:04:04 +00:00
2007-08-19 00:18:34 +00:00
# define SETVAR_SYNTAX "<uuid> <var> <value>"
SWITCH_STANDARD_API ( uuid_setvar_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
int argc = 0 ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc = = 3 ) {
char * uuid = argv [ 0 ] ;
char * var_name = argv [ 1 ] ;
char * var_value = argv [ 2 ] ;
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel ;
channel = switch_core_session_get_channel ( psession ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( channel ! = NULL ) ;
2007-08-19 00:18:34 +00:00
if ( switch_strlen_zero ( var_name ) ) {
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No variable specified \n " ) ;
2007-08-19 00:18:34 +00:00
} else {
switch_channel_set_variable ( channel , var_name , var_value ) ;
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " +OK \n " ) ;
2007-08-19 00:18:34 +00:00
}
switch_core_session_rwunlock ( psession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-08-19 00:18:34 +00:00
}
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , SETVAR_SYNTAX ) ;
2007-08-19 00:18:34 +00:00
done :
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
2007-08-04 06:03:33 +00:00
}
2007-11-02 22:09:28 +00:00
# define GETVAR_SYNTAX "<uuid> <var>"
SWITCH_STANDARD_API ( uuid_getvar_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
int argc = 0 ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc > = 2 ) {
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 ) ;
2007-12-11 21:43:30 +00:00
switch_assert ( channel ! = NULL ) ;
2007-11-02 22:09:28 +00:00
if ( switch_strlen_zero ( var_name ) ) {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No variable name specified! \n " ) ;
2007-11-02 22:09:28 +00:00
switch_log_printf ( SWITCH_CHANNEL_LOG , SWITCH_LOG_ERROR , " No variable name specified. \n " ) ;
} else {
var_value = switch_channel_get_variable ( channel , var_name ) ;
if ( var_value ! = NULL ) {
stream - > write_function ( stream , " %s " , var_value ) ;
} else {
stream - > write_function ( stream , " _undef_ " ) ;
}
}
switch_core_session_rwunlock ( psession ) ;
} else {
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -ERR No Such Channel! \n " ) ;
2007-11-02 22:09:28 +00:00
}
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , GETVAR_SYNTAX ) ;
2007-11-02 22:09:28 +00:00
done :
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-09 16:12:11 +00:00
2007-12-14 23:11:14 +00:00
# define DUMP_SYNTAX "<uuid> [format]"
SWITCH_STANDARD_API ( uuid_dump_function )
{
switch_core_session_t * psession = NULL ;
char * mycmd = NULL , * argv [ 4 ] = { 0 } ;
int argc = 0 ;
if ( session ) {
return SWITCH_STATUS_FALSE ;
}
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc > = 0 ) {
char * uuid = argv [ 0 ] ;
char * format = argv [ 1 ] ;
if ( ( psession = switch_core_session_locate ( uuid ) ) ) {
switch_channel_t * channel ;
switch_event_t * event ;
char * buf ;
channel = switch_core_session_get_channel ( psession ) ;
switch_assert ( channel ! = NULL ) ;
if ( switch_event_create ( & event , SWITCH_EVENT_MESSAGE ) = = 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 ) ;
if ( format & & ! strcasecmp ( format , " xml " ) ) {
if ( ( xml = switch_event_xmlize ( event , " %s " , " " ) ) ) {
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 " ) ;
switch_core_session_rwunlock ( psession ) ;
goto done ;
2007-12-14 23:11:14 +00:00
}
} else {
switch_event_serialize ( event , & buf , SWITCH_TRUE ) ;
}
switch_assert ( buf ) ;
2008-01-03 21:34:44 +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 {
abort ( ) ;
}
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 ) ;
done :
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
2007-11-09 16:12:11 +00:00
# define GLOBAL_SETVAR_SYNTAX "<var> <value>"
SWITCH_STANDARD_API ( global_setvar_function )
{
char * mycmd = NULL , * argv [ 3 ] = { 0 } ;
int argc = 0 ;
if ( ! switch_strlen_zero ( cmd ) & & ( mycmd = strdup ( cmd ) ) ) {
argc = switch_separate_string ( mycmd , ' = ' , argv , ( sizeof ( argv ) / sizeof ( argv [ 0 ] ) ) ) ;
if ( argc > 0 ) {
char * var_name = argv [ 0 ] ;
char * var_value = argv [ 1 ] ;
if ( switch_strlen_zero ( var_value ) ) {
var_value = NULL ;
}
switch_core_set_variable ( var_name , var_value ) ;
stream - > write_function ( stream , " +OK " ) ;
goto done ;
}
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , GLOBAL_SETVAR_SYNTAX ) ;
2007-11-09 16:12:11 +00:00
done :
switch_safe_free ( mycmd ) ;
return SWITCH_STATUS_SUCCESS ;
}
# define GLOBAL_GETVAR_SYNTAX "<var>"
SWITCH_STANDARD_API ( global_getvar_function )
{
if ( ! switch_strlen_zero ( cmd ) ) {
stream - > write_function ( stream , " %s " , switch_str_nil ( switch_core_get_variable ( cmd ) ) ) ;
goto done ;
}
2007-12-04 18:23:41 +00:00
stream - > write_function ( stream , " -USAGE: %s \n " , GLOBAL_GETVAR_SYNTAX ) ;
2007-11-09 16:12:11 +00:00
done :
return SWITCH_STATUS_SUCCESS ;
}
2007-11-02 22:09:28 +00:00
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 ) ;
SWITCH_ADD_API ( commands_api_interface , " originate " , " Originate a Call " , originate_function , ORIGINATE_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " tone_detect " , " Start Tone Detection on a channel " , tone_detect_session_function , TONE_DETECT_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " killchan " , " Kill Channel (depricated) " , kill_function , KILL_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_kill " , " Kill Channel " , kill_function , KILL_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_park " , " Park Channel " , park_function , PARK_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " reloadxml " , " Reload XML " , reload_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " unload " , " Unload Module " , unload_function , LOAD_SYNTAX ) ;
2007-06-20 08:44:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " load " , " Load Module " , load_function , LOAD_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " transfer " , " Transfer (depricated) " , transfer_function , TRANSFER_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_transfer " , " Transfer a session " , transfer_function , TRANSFER_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " pause " , " Pause " , pause_function , PAUSE_SYNTAX ) ;
2007-06-25 18:37:40 +00:00
SWITCH_ADD_API ( commands_api_interface , " break " , " Break " , break_function , BREAK_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " show " , " Show " , show_function , SHOW_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " status " , " status " , status_function , " " ) ;
2007-07-05 17:03:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_bridge " , " uuid_bridge " , uuid_bridge_function , " " ) ;
2007-08-04 06:03:33 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_setvar " , " uuid_setvar " , uuid_setvar_function , SETVAR_SYNTAX ) ;
2007-11-02 22:09:28 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_getvar " , " uuid_getvar " , uuid_getvar_function , GETVAR_SYNTAX ) ;
2007-12-14 23:11:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_dump " , " uuid_dump " , uuid_dump_function , DUMP_SYNTAX ) ;
2007-11-09 16:12:11 +00:00
SWITCH_ADD_API ( commands_api_interface , " global_setvar " , " global_setvar " , global_setvar_function , GLOBAL_SETVAR_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " global_getvar " , " global_getvar " , global_getvar_function , GLOBAL_GETVAR_SYNTAX ) ;
2007-12-13 22:17:20 +00:00
SWITCH_ADD_API ( commands_api_interface , " session_displace " , " session displace (depricated) " ,
session_displace_function , " <uuid> [start|stop] <path> [<limit>] [mux] " ) ;
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 , " session_record " , " session record (depricated) " , session_record_function , SESS_REC_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_record " , " session record " , session_record_function , SESS_REC_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " broadcast " , " broadcast (depricated) " , uuid_broadcast_function , BROADCAST_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_broadcast " , " broadcast " , uuid_broadcast_function , BROADCAST_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " hold " , " hold (depricated) " , uuid_hold_function , HOLD_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid_hold " , " hold " , uuid_hold_function , HOLD_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " media " , " media (depricated) " , uuid_media_function , MEDIA_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " uuid media " , " media " , uuid_media_function , MEDIA_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " fsctl " , " control messages " , ctl_function , CTL_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " help " , " Show help for all the api commands " , help_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " version " , " Show version of the switch " , version_function , " " ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_hangup " , " Schedule a running call to hangup " , sched_hangup_function , SCHED_HANGUP_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_broadcast " , " Schedule a broadcast event to a running call " , sched_broadcast_function , SCHED_BROADCAST_SYNTAX ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_transfer " , " Schedule a broadcast event to a running call " , sched_transfer_function , SCHED_TRANSFER_SYNTAX ) ;
2007-07-05 17:03:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " create_uuid " , " Create a uuid " , uuid_function , UUID_SYNTAX ) ;
2007-06-20 03:26:52 +00:00
SWITCH_ADD_API ( commands_api_interface , " sched_api " , " Schedule an api command " , sched_api_function , " [+]<time> <group_name> <command_string> " ) ;
SWITCH_ADD_API ( commands_api_interface , " sched_del " , " Delete a Scheduled task " , sched_del_function , " <task_id>|<group_id> " ) ;
SWITCH_ADD_API ( commands_api_interface , " xml_wrap " , " Wrap another api command in xml " , xml_wrap_api_function , " <command> <args> " ) ;
2007-11-08 23:46:26 +00:00
SWITCH_ADD_API ( commands_api_interface , " is_lan_addr " , " see if an ip is a lan addr " , lan_addr_function , " <ip> " ) ;
2007-11-13 00:33:31 +00:00
SWITCH_ADD_API ( commands_api_interface , " cond " , " Eval a conditional " , cond_function , " <expr> ? <true val> : <false val> " ) ;
// remove me before final release
SWITCH_ADD_API ( commands_api_interface , " qq " , " Eval a conditional " , cond_function , " <expr> ? <true val> : <false val> " ) ;
2007-11-09 15:26:32 +00:00
SWITCH_ADD_API ( commands_api_interface , " regex " , " Eval a regex " , regex_function , " <data>|<pattern>[|<subst string>] " ) ;
2007-11-16 20:20:43 +00:00
SWITCH_ADD_API ( commands_api_interface , " uuid_chat " , " Send a chat message " , uuid_chat , UUID_CHAT_SYNTAX ) ;
2008-01-14 16:59:03 +00:00
SWITCH_ADD_API ( commands_api_interface , " find_user_xml " , " find a user " , find_user_function , " <key> <user> <domain> " ) ;
2007-12-18 15:28:28 +00:00
SWITCH_ADD_API ( commands_api_interface , " user_exists " , " find a user " , user_exists_function , " <key> <user> <domain> " ) ;
2007-12-01 00:01:56 +00:00
SWITCH_ADD_API ( commands_api_interface , " xml_locate " , " find some xml " , xml_locate_function , " [root | <section> <tag> <tag_attr_name> <tag_attr_val>] " ) ;
2007-12-04 19:39:14 +00:00
SWITCH_ADD_API ( commands_api_interface , " user_data " , " find user data " , user_data_function , " <user>@<domain> [var|param] <name> " ) ;
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
2007-02-09 02:36:03 +00:00
* indent - tabs - mode : t
2006-11-27 22:30:48 +00:00
* tab - width : 4
* c - basic - offset : 4
* End :
* For VIM :
* vim : set softtabstop = 4 shiftwidth = 4 tabstop = 4 expandtab :
*/