@ -513,8 +513,9 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
< / manager >
* * */
# define CONFIG_FILE_NAME "meetme.conf"
# define SLA_CONFIG_FILE "sla.conf"
# define CONFIG_FILE_NAME "meetme.conf"
# define SLA_CONFIG_FILE "sla.conf"
# define STR_CONCISE "concise"
/*! each buffer is 20ms, so this is 640ms total */
# define DEFAULT_AUDIO_BUFFERS 32
@ -1297,71 +1298,131 @@ cnfout:
return cnf ;
}
static char * complete_ meetmecmd( const char * line , const char * word , int pos , int state )
static char * complete_ confno( const char * word , int state )
{
static const char * const cmds [ ] = { " concise " , " lock " , " unlock " , " mute " , " unmute " , " kick " , " list " , NULL } ;
struct ast_conference * cnf ;
char * ret = NULL ;
int which = 0 ;
int len = strlen ( word ) ;
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( ! strncmp ( word , cnf - > confno , len ) & & + + which > state ) {
/* dup before releasing the lock */
ret = ast_strdup ( cnf - > confno ) ;
break ;
}
}
AST_LIST_UNLOCK ( & confs ) ;
return ret ;
}
static char * complete_userno ( struct ast_conference * cnf , const char * word , int state )
{
char usrno [ 50 ] ;
struct ao2_iterator iter ;
struct ast_conf_user * usr ;
char * ret = NULL ;
int which = 0 ;
struct ast_conference * cnf = NULL ;
struct ast_conf_user * usr = NULL ;
char * confno = NULL ;
char usrno [ 50 ] = " " ;
char * myline , * ret = NULL ;
if ( pos = = 1 ) { /* Command */
return ast_cli_complete ( word , cmds , state ) ;
} else if ( pos = = 2 ) { /* Conference Number */
int len = strlen ( word ) ;
iter = ao2_iterator_init ( cnf - > usercontainer , 0 ) ;
for ( ; ( usr = ao2_iterator_next ( & iter ) ) ; ao2_ref ( usr , - 1 ) ) {
snprintf ( usrno , sizeof ( usrno ) , " %d " , usr - > user_no ) ;
if ( ! strncmp ( word , usrno , len ) & & + + which > state ) {
ao2_ref ( usr , - 1 ) ;
ret = ast_strdup ( usrno ) ;
break ;
}
}
ao2_iterator_destroy ( & iter ) ;
return ret ;
}
static char * complete_meetmecmd_mute_kick ( const char * line , const char * word , int pos , int state )
{
if ( pos = = 2 ) {
return complete_confno ( word , state ) ;
}
if ( pos = = 3 ) {
int len = strlen ( word ) ;
char * ret = NULL ;
char * saved = NULL ;
char * myline ;
char * confno ;
struct ast_conference * cnf ;
if ( ! strncasecmp ( word , " all " , len ) ) {
if ( state = = 0 ) {
return ast_strdup ( " all " ) ;
}
- - state ;
}
/* Extract the confno from the command line. */
myline = ast_strdupa ( line ) ;
strtok_r ( myline , " " , & saved ) ;
strtok_r ( NULL , " " , & saved ) ;
confno = strtok_r ( NULL , " " , & saved ) ;
AST_LIST_LOCK ( & confs ) ;
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( ! strncasecmp ( word , cnf - > confno , len ) & & + + which > state ) {
ret = cnf - > confno ;
if ( ! str cmp( confno , cnf - > confno )) {
ret = complete_userno ( cnf , word , state ) ;
break ;
}
}
ret = ast_strdup ( ret ) ; /* dup before releasing the lock */
AST_LIST_UNLOCK ( & confs ) ;
return ret ;
} else if ( pos = = 3 ) {
/* User Number || Conf Command option*/
if ( strstr ( line , " mute " ) | | strstr ( line , " kick " ) ) {
if ( state = = 0 & & ( strstr ( line , " kick " ) | | strstr ( line , " mute " ) ) & & ! strncasecmp ( word , " all " , len ) )
return ast_strdup ( " all " ) ;
which + + ;
AST_LIST_LOCK ( & confs ) ;
}
return NULL ;
}
/* TODO: Find the conf number from the cmdline (ignore spaces) <- test this and make it fail-safe! */
myline = ast_strdupa ( line ) ;
if ( strsep ( & myline , " " ) & & strsep ( & myline , " " ) & & ! confno ) {
while ( ( confno = strsep ( & myline , " " ) ) & & ( strcmp ( confno , " " ) = = 0 ) )
;
}
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( ! strcmp ( confno , cnf - > confno ) )
break ;
}
static char * complete_meetmecmd_lock ( const char * word , int pos , int state )
{
if ( pos = = 2 ) {
return complete_confno ( word , state ) ;
}
return NULL ;
}
if ( cnf ) {
struct ao2_iterator user_iter ;
user_iter = ao2_iterator_init ( cnf - > usercontainer , 0 ) ;
static char * complete_meetmecmd_list ( const char * line , const char * word , int pos , int state )
{
int len ;
while ( ( usr = ao2_iterator_next ( & user_iter ) ) ) {
snprintf ( usrno , sizeof ( usrno ) , " %d " , usr - > user_no ) ;
if ( ! strncasecmp ( word , usrno , len ) & & + + which > state ) {
ao2_ref ( usr , - 1 ) ;
break ;
}
ao2_ref ( usr , - 1 ) ;
}
ao2_iterator_destroy ( & user_iter ) ;
AST_LIST_UNLOCK ( & confs ) ;
return usr ? ast_strdup ( usrno ) : NULL ;
if ( pos = = 2 ) {
len = strlen ( word ) ;
if ( ! strncasecmp ( word , STR_CONCISE , len ) ) {
if ( state = = 0 ) {
return ast_strdup ( STR_CONCISE ) ;
}
AST_LIST_UNLOCK ( & confs ) ;
- - state ;
}
return complete_confno ( word , state ) ;
}
if ( pos = = 3 & & state = = 0 ) {
char * saved = NULL ;
char * myline ;
char * confno ;
/* Extract the confno from the command line. */
myline = ast_strdupa ( line ) ;
strtok_r ( myline , " " , & saved ) ;
strtok_r ( NULL , " " , & saved ) ;
confno = strtok_r ( NULL , " " , & saved ) ;
if ( ! strcasecmp ( confno , STR_CONCISE ) ) {
/* There is nothing valid in this position now. */
return NULL ;
}
len = strlen ( word ) ;
if ( ! strncasecmp ( word , STR_CONCISE , len ) ) {
return ast_strdup ( STR_CONCISE ) ;
}
}
return NULL ;
}
@ -1371,37 +1432,31 @@ static char *meetme_show_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
struct ast_conf_user * user ;
struct ast_conference * cnf ;
int hr , min , sec ;
int i = 0 , total = 0 ;
int total = 0 ;
time_t now ;
struct ast_str * cmdline = NULL ;
# define MC_HEADER_FORMAT "%-14s %-14s %-10s %-8s %-8s %-6s\n"
# define MC_DATA_FORMAT "%-12.12s %4.4d %4.4s %02d:%02d:%02d %-8s %-6s\n"
switch ( cmd ) {
case CLI_INIT :
e - > command = " meetme list [concise] " ;
e - > command = " meetme list " ;
e - > usage =
" Usage: meetme list [ concise] <confno> \n "
" List all or a specific conference.\n " ;
" Usage: meetme list [ <confno>] [" STR_CONCISE " ] \n "
" List all conferences or a specific conference.\n " ;
return NULL ;
case CLI_GENERATE :
return complete_meetmecmd ( a - > line , a - > word , a - > pos , a - > n ) ;
return complete_meetmecmd _list ( a - > line , a - > word , a - > pos , a - > n ) ;
}
/* Check for length so no buffer will overflow... */
for ( i = 0 ; i < a - > argc ; i + + ) {
if ( strlen ( a - > argv [ i ] ) > 100 )
ast_cli ( a - > fd , " Invalid Arguments. \n " ) ;
}
if ( a - > argc = = 2 | | ( a - > argc = = 3 & & ! strcasecmp ( a - > argv [ 2 ] , STR_CONCISE ) ) ) {
/* List all the conferences */
int concise = ( a - > argc = = 3 ) ;
struct ast_str * marked_users ;
/* Max confno length */
if ( ! ( cmdline = ast_str_create ( MAX_CONFNUM ) ) ) {
return CLI_FAILURE ;
}
if ( ! ( marked_users = ast_str_create ( 30 ) ) ) {
return CLI_FAILURE ;
}
if ( a - > argc = = 2 | | ( a - > argc = = 3 & & ! strcasecmp ( a - > argv [ 2 ] , " concise " ) ) ) {
/* List all the conferences */
int concise = ( a - > argc = = 3 & & ! strcasecmp ( a - > argv [ 2 ] , " concise " ) ) ;
now = time ( NULL ) ;
AST_LIST_LOCK ( & confs ) ;
if ( AST_LIST_EMPTY ( & confs ) ) {
@ -1409,23 +1464,25 @@ static char *meetme_show_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
ast_cli ( a - > fd , " No active MeetMe conferences. \n " ) ;
}
AST_LIST_UNLOCK ( & confs ) ;
ast_free ( cmdline ) ;
ast_free ( marked_users ) ;
return CLI_SUCCESS ;
}
if ( ! concise ) {
ast_cli ( a - > fd , MC_HEADER_FORMAT , " Conf Num " , " Parties " , " Marked " , " Activity " , " Creation " , " Locked " ) ;
}
AST_LIST_TRAVERSE ( & confs , cnf , list ) {
if ( cnf - > markedusers = = 0 ) {
ast_str_set ( & cmdline , 0 , " N/A " ) ;
} else {
ast_str_set ( & cmdline , 0 , " %4.4d " , cnf - > markedusers ) ;
}
hr = ( now - cnf - > start ) / 3600 ;
min = ( ( now - cnf - > start ) % 3600 ) / 60 ;
sec = ( now - cnf - > start ) % 60 ;
if ( ! concise ) {
ast_cli ( a - > fd , MC_DATA_FORMAT , cnf - > confno , cnf - > users , ast_str_buffer ( cmdline ) , hr , min , sec , cnf - > isdynamic ? " Dynamic " : " Static " , cnf - > locked ? " Yes " : " No " ) ;
if ( cnf - > markedusers = = 0 ) {
ast_str_set ( & marked_users , 0 , " N/A " ) ;
} else {
ast_str_set ( & marked_users , 0 , " %4.4d " , cnf - > markedusers ) ;
}
ast_cli ( a - > fd , MC_DATA_FORMAT , cnf - > confno , cnf - > users ,
ast_str_buffer ( marked_users ) , hr , min , sec ,
cnf - > isdynamic ? " Dynamic " : " Static " , cnf - > locked ? " Yes " : " No " ) ;
} else {
ast_cli ( a - > fd , " %s!%d!%d!%02d:%02d:%02d!%d!%d \n " ,
cnf - > confno ,
@ -1442,18 +1499,19 @@ static char *meetme_show_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
if ( ! concise ) {
ast_cli ( a - > fd , " * Total number of MeetMe users: %d \n " , total ) ;
}
ast_free ( cmdline ) ;
ast_free ( marked_users ) ;
return CLI_SUCCESS ;
} else if ( strcmp ( a - > argv [ 1 ] , " list " ) = = 0 ) {
}
if ( a - > argc = = 3 | | ( a - > argc = = 4 & & ! strcasecmp ( a - > argv [ 3 ] , STR_CONCISE ) ) ) {
struct ao2_iterator user_iter ;
int concise = ( a - > argc = = 4 & & ( ! strcasecmp ( a - > argv [ 3 ] , " concise " ) ) ) ;
int concise = ( a - > argc = = 4 ) ;
/* List all the users in a conference */
if ( AST_LIST_EMPTY ( & confs ) ) {
if ( ! concise ) {
ast_cli ( a - > fd , " No active MeetMe conferences. \n " ) ;
}
ast_free ( cmdline ) ;
return CLI_SUCCESS ;
return CLI_SUCCESS ;
}
/* Find the right conference */
AST_LIST_LOCK ( & confs ) ;
@ -1466,7 +1524,6 @@ static char *meetme_show_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
if ( ! concise )
ast_cli ( a - > fd , " No such conference: %s. \n " , a - > argv [ 2 ] ) ;
AST_LIST_UNLOCK ( & confs ) ;
ast_free ( cmdline ) ;
return CLI_SUCCESS ;
}
/* Show all the users */
@ -1506,93 +1563,49 @@ static char *meetme_show_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_ar
ast_cli ( a - > fd , " %d users in that conference. \n " , cnf - > users ) ;
}
AST_LIST_UNLOCK ( & confs ) ;
ast_free ( cmdline ) ;
return CLI_SUCCESS ;
}
if ( a - > argc < 2 ) {
ast_free ( cmdline ) ;
return CLI_SHOWUSAGE ;
}
ast_debug ( 1 , " Cmdline: %s \n " , ast_str_buffer ( cmdline ) ) ;
admin_exec ( NULL , ast_str_buffer ( cmdline ) ) ;
ast_free ( cmdline ) ;
return CLI_SUCCESS ;
return CLI_SHOWUSAGE ;
}
static char * meetme_cmd ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a )
static char * meetme_cmd_helper ( struct ast_cli_args * a )
{
/* Process the command */
struct ast_str * cmdline = NULL ;
int i = 0 ;
switch ( cmd ) {
case CLI_INIT :
e - > command = " meetme {lock|unlock|mute|unmute|kick} " ;
e - > usage =
" Usage: meetme (un)lock|(un)mute|kick <confno> <usernumber> \n "
" Executes a command for the conference or on a conferee \n " ;
return NULL ;
case CLI_GENERATE :
return complete_meetmecmd ( a - > line , a - > word , a - > pos , a - > n ) ;
}
if ( a - > argc > 8 )
ast_cli ( a - > fd , " Invalid Arguments. \n " ) ;
/* Check for length so no buffer will overflow... */
for ( i = 0 ; i < a - > argc ; i + + ) {
if ( strlen ( a - > argv [ i ] ) > 100 )
ast_cli ( a - > fd , " Invalid Arguments. \n " ) ;
}
struct ast_str * cmdline ;
/* Max confno length */
if ( ! ( cmdline = ast_str_create ( MAX_CONFNUM ) ) ) {
return CLI_FAILURE ;
}
if ( a - > argc < 1 ) {
ast_free ( cmdline ) ;
return CLI_SHOWUSAGE ;
}
ast_str_set ( & cmdline , 0 , " %s " , a - > argv [ 2 ] ) ; /* Argv 2: conference number */
if ( str str( a - > argv [ 1 ] , " lock " ) ) {
if ( strc mp( a - > argv [ 1 ] , " lock " ) = = 0 ) {
if ( strcasestr ( a - > argv [ 1 ] , " lock " ) ) {
if ( strcasecmp ( a - > argv [ 1 ] , " lock " ) = = 0 ) {
/* Lock */
ast_str_append ( & cmdline , 0 , " ,L " ) ;
} else {
/* Unlock */
ast_str_append ( & cmdline , 0 , " ,l " ) ;
}
} else if ( strstr ( a - > argv [ 1 ] , " mute " ) ) {
if ( a - > argc < 4 ) {
ast_free ( cmdline ) ;
return CLI_SHOWUSAGE ;
}
if ( strcmp ( a - > argv [ 1 ] , " mute " ) = = 0 ) {
} else if ( strcasestr ( a - > argv [ 1 ] , " mute " ) ) {
if ( strcasecmp ( a - > argv [ 1 ] , " mute " ) = = 0 ) {
/* Mute */
if ( strc mp( a - > argv [ 3 ] , " all " ) = = 0 ) {
if ( strcasecmp ( a - > argv [ 3 ] , " all " ) = = 0 ) {
ast_str_append ( & cmdline , 0 , " ,N " ) ;
} else {
ast_str_append ( & cmdline , 0 , " ,M,%s " , a - > argv [ 3 ] ) ;
}
} else {
/* Unmute */
if ( strc mp( a - > argv [ 3 ] , " all " ) = = 0 ) {
if ( strc asec mp( a - > argv [ 3 ] , " all " ) = = 0 ) {
ast_str_append ( & cmdline , 0 , " ,n " ) ;
} else {
ast_str_append ( & cmdline , 0 , " ,m,%s " , a - > argv [ 3 ] ) ;
}
}
} else if ( strcmp ( a - > argv [ 1 ] , " kick " ) = = 0 ) {
if ( a - > argc < 4 ) {
ast_free ( cmdline ) ;
return CLI_SHOWUSAGE ;
}
if ( strcmp ( a - > argv [ 3 ] , " all " ) = = 0 ) {
} else if ( strcasecmp ( a - > argv [ 1 ] , " kick " ) = = 0 ) {
if ( strcasecmp ( a - > argv [ 3 ] , " all " ) = = 0 ) {
/* Kick all */
ast_str_append ( & cmdline , 0 , " ,K " ) ;
} else {
@ -1600,6 +1613,10 @@ static char *meetme_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a
ast_str_append ( & cmdline , 0 , " ,k,%s " , a - > argv [ 3 ] ) ;
}
} else {
/*
* Should never get here because it is already filtered by the
* callers .
*/
ast_free ( cmdline ) ;
return CLI_SHOWUSAGE ;
}
@ -1612,6 +1629,66 @@ static char *meetme_cmd(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a
return CLI_SUCCESS ;
}
static char * meetme_lock_cmd ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a )
{
switch ( cmd ) {
case CLI_INIT :
e - > command = " meetme {lock|unlock} " ;
e - > usage =
" Usage: meetme lock|unlock <confno> \n "
" Lock or unlock a conference to new users. \n " ;
return NULL ;
case CLI_GENERATE :
return complete_meetmecmd_lock ( a - > word , a - > pos , a - > n ) ;
}
if ( a - > argc ! = 3 ) {
return CLI_SHOWUSAGE ;
}
return meetme_cmd_helper ( a ) ;
}
static char * meetme_kick_cmd ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a )
{
switch ( cmd ) {
case CLI_INIT :
e - > command = " meetme kick " ;
e - > usage =
" Usage: meetme kick <confno> all|<userno> \n "
" Kick a conference or a user in a conference. \n " ;
return NULL ;
case CLI_GENERATE :
return complete_meetmecmd_mute_kick ( a - > line , a - > word , a - > pos , a - > n ) ;
}
if ( a - > argc ! = 4 ) {
return CLI_SHOWUSAGE ;
}
return meetme_cmd_helper ( a ) ;
}
static char * meetme_mute_cmd ( struct ast_cli_entry * e , int cmd , struct ast_cli_args * a )
{
switch ( cmd ) {
case CLI_INIT :
e - > command = " meetme {mute|unmute} " ;
e - > usage =
" Usage: meetme mute|unmute <confno> all|<userno> \n "
" Mute or unmute a conference or a user in a conference. \n " ;
return NULL ;
case CLI_GENERATE :
return complete_meetmecmd_mute_kick ( a - > line , a - > word , a - > pos , a - > n ) ;
}
if ( a - > argc ! = 4 ) {
return CLI_SHOWUSAGE ;
}
return meetme_cmd_helper ( a ) ;
}
static const char * sla_hold_str ( unsigned int hold_access )
{
const char * hold = " Unknown " ;
@ -1771,8 +1848,10 @@ static char *sla_show_stations(struct ast_cli_entry *e, int cmd, struct ast_cli_
}
static struct ast_cli_entry cli_meetme [ ] = {
AST_CLI_DEFINE ( meetme_cmd , " Execute a command on a conference or conferee " ) ,
AST_CLI_DEFINE ( meetme_show_cmd , " List all or one conference " ) ,
AST_CLI_DEFINE ( meetme_kick_cmd , " Kick a conference or a user in a conference. " ) ,
AST_CLI_DEFINE ( meetme_show_cmd , " List all conferences or a specific conference. " ) ,
AST_CLI_DEFINE ( meetme_lock_cmd , " Lock or unlock a conference to new users. " ) ,
AST_CLI_DEFINE ( meetme_mute_cmd , " Mute or unmute a conference or a user in a conference. " ) ,
AST_CLI_DEFINE ( sla_show_trunks , " Show SLA Trunks " ) ,
AST_CLI_DEFINE ( sla_show_stations , " Show SLA Stations " ) ,
} ;