@ -22,6 +22,7 @@ static void cli_incoming_list_totals(char* buffer, int len, struct callmaster* m
int printlen = 0 ;
struct timeval avg , calls_dur_iv ;
u_int64_t num_sessions , min_sess_iv , max_sess_iv ;
struct request_time offer_iv , answer_iv , delete_iv ;
mutex_lock ( & m - > totalstats . total_average_lock ) ;
avg = m - > totalstats . total_average_call_dur ;
@ -40,6 +41,8 @@ static void cli_incoming_list_totals(char* buffer, int len, struct callmaster* m
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Total timed-out sessions via SILENT_TIMEOUT : " UINT64F " \n " , atomic64_get ( & m - > totalstats . total_silent_timeout_sess ) ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Total timed-out sessions via FINAL_TIMEOUT : " UINT64F " \n " , atomic64_get ( & m - > totalstats . total_final_timeout_sess ) ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Total regular terminated sessions : " UINT64F " \n " , atomic64_get ( & m - > totalstats . total_regular_term_sess ) ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Total forced terminated sessions : " UINT64F " \n " , atomic64_get ( & m - > totalstats . total_forced_term_sess ) ) ;
@ -59,7 +62,15 @@ static void cli_incoming_list_totals(char* buffer, int len, struct callmaster* m
calls_dur_iv = m - > totalstats_lastinterval . total_calls_duration_interval ;
min_sess_iv = m - > totalstats_lastinterval . managed_sess_min ;
max_sess_iv = m - > totalstats_lastinterval . managed_sess_max ;
mutex_unlock ( & m - > totalstats_lastinterval_lock ) ;
offer_iv = m - > totalstats_lastinterval . offer ;
answer_iv = m - > totalstats_lastinterval . answer ;
delete_iv = m - > totalstats_lastinterval . delete ;
mutex_unlock ( & m - > totalstats_lastinterval_lock ) ;
// compute average offer/answer/delete time
timeval_divide ( & offer_iv . time_avg , & offer_iv . time_avg , offer_iv . count ) ;
timeval_divide ( & answer_iv . time_avg , & answer_iv . time_avg , answer_iv . count ) ;
timeval_divide ( & delete_iv . time_avg , & delete_iv . time_avg , delete_iv . count ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " \n Graphite interval statistics (last reported values to graphite): \n " ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
@ -69,6 +80,21 @@ static void cli_incoming_list_totals(char* buffer, int len, struct callmaster* m
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Max managed sessions : " UINT64F " \n " , max_sess_iv ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Min/Max/Avg offer processing delay :%llu.%06llu/%llu.%06llu/%llu.%06llu sec \n " ,
( unsigned long long ) offer_iv . time_min . tv_sec , ( unsigned long long ) offer_iv . time_min . tv_usec ,
( unsigned long long ) offer_iv . time_max . tv_sec , ( unsigned long long ) offer_iv . time_max . tv_usec ,
( unsigned long long ) offer_iv . time_avg . tv_sec , ( unsigned long long ) offer_iv . time_avg . tv_usec ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Min/Max/Avg answer processing delay :%llu.%06llu/%llu.%06llu/%llu.%06llu sec \n " ,
( unsigned long long ) answer_iv . time_min . tv_sec , ( unsigned long long ) answer_iv . time_min . tv_usec ,
( unsigned long long ) answer_iv . time_max . tv_sec , ( unsigned long long ) answer_iv . time_max . tv_usec ,
( unsigned long long ) answer_iv . time_avg . tv_sec , ( unsigned long long ) answer_iv . time_avg . tv_usec ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Min/Max/Avg delete processing delay :%llu.%06llu/%llu.%06llu/%llu.%06llu sec \n " ,
( unsigned long long ) delete_iv . time_min . tv_sec , ( unsigned long long ) delete_iv . time_min . tv_usec ,
( unsigned long long ) delete_iv . time_max . tv_sec , ( unsigned long long ) delete_iv . time_max . tv_usec ,
( unsigned long long ) delete_iv . time_avg . tv_sec , ( unsigned long long ) delete_iv . time_avg . tv_usec ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " \n \n " ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
@ -137,6 +163,24 @@ static void cli_incoming_list_maxopenfiles(char* buffer, int len, struct callmas
return ;
}
static void cli_incoming_list_timeout ( char * buffer , int len , struct callmaster * m , char * replybuffer , const char * outbufend ) {
int printlen = 0 ;
rwlock_lock_r ( & m - > conf . config_lock ) ;
/* don't lock anything while reading the value */
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " TIMEOUT=%u \n " , m - > conf . timeout ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " SILENT_TIMEOUT=%u \n " , m - > conf . silent_timeout ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " FINAL_TIMEOUT=%u \n " , m - > conf . final_timeout ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
rwlock_unlock_r ( & m - > conf . config_lock ) ;
return ;
}
static void cli_incoming_list_callid ( char * buffer , int len , struct callmaster * m , char * replybuffer , const char * outbufend ) {
str callid ;
struct call * c = 0 ;
@ -250,11 +294,12 @@ static void cli_incoming_set_maxopenfiles(char* buffer, int len, struct callmast
unsigned int open_files_num ;
str open_files ;
pid_t pid ;
char * endptr ;
// limit the minimum number of open files to avoid rtpengine freeze for low open_files_num values
unsigned int min_open_files_num = ( 1 < < 16 ) ;
if ( len < = 1 ) {
if ( len < = 1 ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " %s \n " , " More parameters required. " ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
@ -263,23 +308,27 @@ static void cli_incoming_set_maxopenfiles(char* buffer, int len, struct callmast
+ + buffer ; - - len ; // one space
open_files . s = buffer ;
open_files . len = len ;
open_files_num = str _to_ui( & open_files , - 1 ) ;
open_files_num = str tol( open_files . s , & endptr , 10 ) ;
if ( open_files_num = = - 1 ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to %.*s; not an unsigned integer \n " , open_files . len , open_files . s ) ;
if ( ( errno = = ERANGE & & ( open_files_num = = LONG_MAX | | open_files_num = = LONG_MIN ) ) | | ( errno ! = 0 & & open_files_num = = 0 ) ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to %.*s; errno=%d \n " , open_files . len , open_files . s , errno ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( endptr = = open_files . s ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to %.*s; no digists found \n " , open_files . len , open_files . s ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( open_files_num < min_open_files_num ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to %.*s; can't set it under %u \n " , open_files . len , open_files . s , min_open_files_num ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to % u; can't set it under %u\n " , open_files_num , min_open_files_num ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( rlim ( RLIMIT_NOFILE , open_files_num ) = = - 1 ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to % .*s; errno = %d\n " , open_files . len , open_files . s , errno ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting open_files to % u; errno = %d\n " , open_files_num , errno ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else {
pid = getpid ( ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Success setting open_files to % .*s; cat /proc/%u/limits\n " , open_files . len , open_files . s , pid ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Success setting open_files to % u; cat /proc/%u/limits\n " , open_files_num , pid ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
}
}
@ -287,11 +336,11 @@ static void cli_incoming_set_maxopenfiles(char* buffer, int len, struct callmast
static void cli_incoming_set_maxsessions ( char * buffer , int len , struct callmaster * m , char * replybuffer , const char * outbufend ) {
int printlen = 0 ;
int maxsessions_num ;
int err = 0x80000000 ;
int disabled = - 1 ;
str maxsessions ;
char * endptr ;
if ( len < = 1 ) {
if ( len < = 1 ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " %s \n " , " More parameters required. " ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
@ -300,22 +349,29 @@ static void cli_incoming_set_maxsessions(char* buffer, int len, struct callmaste
+ + buffer ; - - len ; // one space
maxsessions . s = buffer ;
maxsessions . len = len ;
maxsessions_num = str _to_i( & maxsessions , err ) ;
maxsessions_num = str tol( maxsessions . s , & endptr , 10 ) ;
if ( maxsessions_num = = err ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting maxsessions to %.*s; not an integer \n " , maxsessions . len , maxsessions . s ) ;
if ( ( errno = = ERANGE & & ( maxsessions_num = = LONG_MAX | | maxsessions_num = = LONG_MIN ) ) | | ( errno ! = 0 & & maxsessions_num = = 0 ) ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting maxsessions to %.*s; errno=%d \n " , maxsessions . len , maxsessions . s , errno ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( endptr = = maxsessions . s ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting maxsessions to %.*s; no digists found \n " , maxsessions . len , maxsessions . s ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( maxsessions_num < disabled ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting maxsessions to %d; either positive or -1 values allowed \n " , maxsessions_num ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
} else if ( maxsessions_num = = disabled ) {
/* don't lock anything while writing the value - only this command modifies its value */
rwlock_lock_w ( & m - > conf . config_lock ) ;
m - > conf . max_sessions = maxsessions_num ;
rwlock_unlock_w ( & m - > conf . config_lock ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Success setting maxsessions to %d; disable feature \n " , maxsessions_num ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
} else {
/* don't lock anything while writing the value - only this command modifies its value */
rwlock_lock_w ( & m - > conf . config_lock ) ;
m - > conf . max_sessions = maxsessions_num ;
rwlock_unlock_w ( & m - > conf . config_lock ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Success setting maxsessions to %d \n " , maxsessions_num ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
}
@ -323,6 +379,41 @@ static void cli_incoming_set_maxsessions(char* buffer, int len, struct callmaste
return ;
}
static void cli_incoming_set_timeout ( char * buffer , int len , struct callmaster * m , char * replybuffer , const char * outbufend , unsigned int * conf_timeout ) {
int printlen = 0 ;
unsigned int timeout_num ;
str timeout ;
char * endptr ;
if ( len < = 1 ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " %s \n " , " More parameters required. " ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
}
+ + buffer ; - - len ; // one space
timeout . s = buffer ;
timeout . len = len ;
timeout_num = strtol ( timeout . s , & endptr , 10 ) ;
if ( ( errno = = ERANGE & & ( timeout_num = = LONG_MAX | | timeout_num = = LONG_MIN ) ) | | ( errno ! = 0 & & timeout_num = = 0 ) ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting timeout to %.*s; errno=%d \n " , timeout . len , timeout . s , errno ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else if ( endptr = = timeout . s ) {
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Fail setting timeout to %.*s; no digists found \n " , timeout . len , timeout . s ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
return ;
} else {
/* don't lock anything while writing the value - only this command modifies its value */
rwlock_lock_w ( & m - > conf . config_lock ) ;
* conf_timeout = timeout_num ;
rwlock_unlock_w ( & m - > conf . config_lock ) ;
printlen = snprintf ( replybuffer , ( outbufend - replybuffer ) , " Success setting timeout to %u \n " , timeout_num ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
}
}
static void cli_incoming_list ( char * buffer , int len , struct callmaster * m , char * replybuffer , const char * outbufend ) {
GHashTableIter iter ;
gpointer key , value ;
@ -336,6 +427,7 @@ static void cli_incoming_list(char* buffer, int len, struct callmaster* m, char*
static const char * LIST_TOTALS = " totals " ;
static const char * LIST_MAX_OPEN_FILES = " maxopenfiles " ;
static const char * LIST_MAX_SESSIONS = " maxsessions " ;
static const char * LIST_TIMEOUT = " timeout " ;
if ( len < = 1 ) {
printlen = snprintf ( replybuffer , outbufend - replybuffer , " %s \n " , " More parameters required. " ) ;
@ -377,6 +469,8 @@ static void cli_incoming_list(char* buffer, int len, struct callmaster* m, char*
cli_incoming_list_maxsessions ( buffer + strlen ( LIST_MAX_SESSIONS ) , len - strlen ( LIST_MAX_SESSIONS ) , m , replybuffer , outbufend ) ;
} else if ( len > = strlen ( LIST_MAX_OPEN_FILES ) & & strncmp ( buffer , LIST_MAX_OPEN_FILES , strlen ( LIST_MAX_OPEN_FILES ) ) = = 0 ) {
cli_incoming_list_maxopenfiles ( buffer + strlen ( LIST_MAX_OPEN_FILES ) , len - strlen ( LIST_MAX_OPEN_FILES ) , m , replybuffer , outbufend ) ;
} else if ( len > = strlen ( LIST_TIMEOUT ) & & strncmp ( buffer , LIST_TIMEOUT , strlen ( LIST_TIMEOUT ) ) = = 0 ) {
cli_incoming_list_timeout ( buffer + strlen ( LIST_TIMEOUT ) , len - strlen ( LIST_TIMEOUT ) , m , replybuffer , outbufend ) ;
} else {
printlen = snprintf ( replybuffer , outbufend - replybuffer , " %s:%s \n " , " Unknown 'list' command " , buffer ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;
@ -388,6 +482,9 @@ static void cli_incoming_set(char* buffer, int len, struct callmaster* m, char*
static const char * SET_MAX_OPEN_FILES = " maxopenfiles " ;
static const char * SET_MAX_SESSIONS = " maxsessions " ;
static const char * SET_TIMEOUT = " timeout " ;
static const char * SET_SILENT_TIMEOUT = " silenttimeout " ;
static const char * SET_FINAL_TIMEOUT = " finaltimeout " ;
if ( len < = 1 ) {
printlen = snprintf ( replybuffer , outbufend - replybuffer , " %s \n " , " More parameters required. " ) ;
@ -400,6 +497,12 @@ static void cli_incoming_set(char* buffer, int len, struct callmaster* m, char*
cli_incoming_set_maxopenfiles ( buffer + strlen ( SET_MAX_OPEN_FILES ) , len - strlen ( SET_MAX_OPEN_FILES ) , m , replybuffer , outbufend ) ;
} else if ( len > = strlen ( SET_MAX_SESSIONS ) & & strncmp ( buffer , SET_MAX_SESSIONS , strlen ( SET_MAX_SESSIONS ) ) = = 0 ) {
cli_incoming_set_maxsessions ( buffer + strlen ( SET_MAX_SESSIONS ) , len - strlen ( SET_MAX_SESSIONS ) , m , replybuffer , outbufend ) ;
} else if ( len > = strlen ( SET_TIMEOUT ) & & strncmp ( buffer , SET_TIMEOUT , strlen ( SET_TIMEOUT ) ) = = 0 ) {
cli_incoming_set_timeout ( buffer + strlen ( SET_TIMEOUT ) , len - strlen ( SET_TIMEOUT ) , m , replybuffer , outbufend , & m - > conf . timeout ) ;
} else if ( len > = strlen ( SET_SILENT_TIMEOUT ) & & strncmp ( buffer , SET_SILENT_TIMEOUT , strlen ( SET_SILENT_TIMEOUT ) ) = = 0 ) {
cli_incoming_set_timeout ( buffer + strlen ( SET_SILENT_TIMEOUT ) , len - strlen ( SET_SILENT_TIMEOUT ) , m , replybuffer , outbufend , & m - > conf . silent_timeout ) ;
} else if ( len > = strlen ( SET_FINAL_TIMEOUT ) & & strncmp ( buffer , SET_FINAL_TIMEOUT , strlen ( SET_FINAL_TIMEOUT ) ) = = 0 ) {
cli_incoming_set_timeout ( buffer + strlen ( SET_FINAL_TIMEOUT ) , len - strlen ( SET_FINAL_TIMEOUT ) , m , replybuffer , outbufend , & m - > conf . final_timeout ) ;
} else {
printlen = snprintf ( replybuffer , outbufend - replybuffer , " %s:%s \n " , " Unknown 'set' command " , buffer ) ;
ADJUSTLEN ( printlen , outbufend , replybuffer ) ;