Index: doc/asterisk-mib.txt =================================================================== --- doc/asterisk-mib.txt (revision 86375) +++ doc/asterisk-mib.txt (working copy) @@ -11,7 +11,7 @@ FROM DIGIUM-MIB; asterisk MODULE-IDENTITY - LAST-UPDATED "200606081626Z" + LAST-UPDATED "200708211450Z" ORGANIZATION "Digium, Inc." CONTACT-INFO "Mark A. Spencer @@ -30,6 +30,9 @@ Tel: +47 5598 7200 Email: tholo@voop.no" DESCRIPTION + "Add total and current call counter statistics." + REVISION "200708211450Z" + DESCRIPTION "Asterisk is an Open Source PBX. This MIB defined objects for managing Asterisk instances." REVISION "200603061840Z" @@ -104,6 +107,23 @@ "The control socket for giving Asterisk commands." ::= { asteriskConfiguration 4 } +astConfigCallsActive OBJECT-TYPE + SYNTAX Gauge32 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The number of calls currently active on the Asterisk PBX." + ::= { asteriskConfiguration 5 } + +astConfigCallsProcessed OBJECT-TYPE + SYNTAX Counter32 + MAX-ACCESS read-only + STATUS current + DESCRIPTION + "The total number of calls processed through the Asterisk PBX since last + restart." + ::= { asteriskConfiguration 6 } + -- asteriskModules astNumModules OBJECT-TYPE @@ -194,7 +214,7 @@ -- asteriskChannels astNumChannels OBJECT-TYPE - SYNTAX Integer32 + SYNTAX Gauge32 MAX-ACCESS read-only STATUS current DESCRIPTION Index: include/asterisk/pbx.h =================================================================== --- include/asterisk/pbx.h (revision 86375) +++ include/asterisk/pbx.h (working copy) @@ -880,6 +880,11 @@ * \brief Retrieve the number of active calls */ int ast_active_calls(void); + +/*! + * \brief Retrieve the total number of calls processed through the PBX since last restart + */ +int ast_processed_calls(void); /*! * \brief executes a read operation on a function Index: main/cli.c =================================================================== --- main/cli.c (revision 86375) +++ main/cli.c (working copy) @@ -574,6 +574,63 @@ #undef MODLIST_FORMAT #undef MODLIST_FORMAT2 +static char *handle_showcalls(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) +{ + struct timeval curtime = ast_tvnow(); + int showuptime, printsec; + + switch (cmd) { + case CLI_INIT: + e->command = "core show calls [uptime]"; + e->usage = + "Usage: core show calls [uptime] [seconds]\n" + " Lists number of currently active calls and total number of calls\n" + " processed through PBX since last restart. If 'uptime' is specified\n" + " the system uptime is also displayed. If 'seconds' is specified in\n" + " addition to 'uptime', the system uptime is displayed in seconds.\n"; + return NULL; + + case CLI_GENERATE: + if (a->pos != e->args) + return NULL; + return a->n == 0 ? ast_strdup("seconds") : NULL; + } + + /* regular handler */ + if (a->argc >= e->args && !strcasecmp(a->argv[e->args-1],"uptime")) { + showuptime = 1; + + if (a->argc == e->args+1 && !strcasecmp(a->argv[e->args],"seconds")) + printsec = 1; + else if (a->argc == e->args) + printsec = 0; + else + return CLI_SHOWUSAGE; + } + else if (a->argc == e->args-1) { + showuptime = 0; + printsec = 0; + } + else + return CLI_SHOWUSAGE; + + if (option_maxcalls) + ast_cli(a->fd, "%d of %d max active call%s (%5.2f%% of capacity)\n", + ast_active_calls(), option_maxcalls, ESS(ast_active_calls()), + ((double)ast_active_calls() / (double)option_maxcalls) * 100.0); + else { + ast_cli(a->fd, "%d active call%s\n", ast_active_calls(), ESS(ast_active_calls())); + } + + ast_cli(a->fd, "%d call%s processed\n", ast_processed_calls(), ESS(ast_processed_calls())); + + if (ast_startuptime.tv_sec && showuptime) { + print_uptimestr(a->fd, ast_tvsub(curtime, ast_startuptime), "System uptime", printsec); + } + + return RESULT_SUCCESS; +} + static char *handle_chanlist(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { #define FORMAT_STRING "%-20.20s %-20.20s %-7.7s %-30.30s\n" @@ -681,6 +738,8 @@ ((double)ast_active_calls() / (double)option_maxcalls) * 100.0); else ast_cli(fd, "%d active call%s\n", ast_active_calls(), ESS(ast_active_calls())); + + ast_cli(fd, "%d call%s processed\n", ast_processed_calls(), ESS(ast_processed_calls())); } return CLI_SUCCESS; @@ -1125,6 +1184,8 @@ NEW_CLI(handle_chanlist, "Display information on channels"), + NEW_CLI(handle_showcalls, "Display information on calls"), + NEW_CLI(handle_showchan, "Display information on a specific channel"), NEW_CLI(handle_core_set_debug_channel, "Enable/disable debugging on a channel", Index: main/pbx.c =================================================================== --- main/pbx.c (revision 86375) +++ main/pbx.c (working copy) @@ -294,6 +294,7 @@ AST_MUTEX_DEFINE_STATIC(maxcalllock); static int countcalls; +static int totalcalls; static AST_RWLIST_HEAD_STATIC(acf_root, ast_custom_function); @@ -2713,8 +2714,10 @@ } #endif - if (!failed) + if (!failed) { countcalls++; + totalcalls++; + } ast_mutex_unlock(&maxcalllock); return failed; @@ -2797,6 +2800,11 @@ return countcalls; } +int ast_processed_calls(void) +{ + return totalcalls; +} + int pbx_set_autofallthrough(int newval) { int oldval = autofallthrough; Index: res/snmp/agent.c =================================================================== --- res/snmp/agent.c (revision 86375) +++ res/snmp/agent.c (working copy) @@ -67,6 +67,8 @@ #define ASTCONFRELOADTIME 2 #define ASTCONFPID 3 #define ASTCONFSOCKET 4 +#define ASTCONFACTIVECALLS 5 +#define ASTCONFPROCESSEDCALLS 6 #define ASTMODULES 3 #define ASTMODCOUNT 1 @@ -592,6 +594,12 @@ case ASTCONFSOCKET: *var_len = strlen(ast_config_AST_SOCKET); return (u_char *)ast_config_AST_SOCKET; + case ASTCONFACTIVECALLS: + long_ret = ast_active_calls(); + return (u_char *)&long_ret; + case ASTCONFPROCESSEDCALLS: + long_ret = ast_processed_calls(); + return (u_char *)&long_ret; default: break; } @@ -723,6 +731,8 @@ {ASTCONFRELOADTIME, ASN_TIMETICKS, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFRELOADTIME}}, {ASTCONFPID, ASN_INTEGER, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFPID}}, {ASTCONFSOCKET, ASN_OCTET_STR, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFSOCKET}}, + {ASTCONFACTIVECALLS, ASN_GAUGE, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFACTIVECALLS}}, + {ASTCONFPROCESSEDCALLS, ASN_INTEGER, RONLY, ast_var_Config, 2, {ASTCONFIGURATION, ASTCONFPROCESSEDCALLS}}, {ASTMODCOUNT, ASN_INTEGER, RONLY, ast_var_Modules , 2, {ASTMODULES, ASTMODCOUNT}}, {ASTINDCOUNT, ASN_INTEGER, RONLY, ast_var_indications, 2, {ASTINDICATIONS, ASTINDCOUNT}}, {ASTINDCURRENT, ASN_OCTET_STR, RONLY, ast_var_indications, 2, {ASTINDICATIONS, ASTINDCURRENT}},