From: Olle Johansson Date: Thu, 6 Dec 2007 10:27:54 +0000 (+0000) Subject: Add manager command for showing all current channels. X-Git-Tag: 1.6.0-beta1~3^2~531 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5af2cf109ebf7e8dcfd96b50107d4c0318059342;p=thirdparty%2Fasterisk.git Add manager command for showing all current channels. Thanks, eliel, for writing the original patch. Modified by me to follow other manager events and the new "moremanager" style. (closes issue #11478) Reported by: eliel Patches: manager.c.patch uploaded by eliel (license 64) git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@91347 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/CHANGES b/CHANGES index 3380c62ccb..5aac0bdabe 100644 --- a/CHANGES +++ b/CHANGES @@ -4,6 +4,8 @@ AMI - The manager (TCP/TLS/HTTP) -------------------------------- + * Added a new action 'CoreShowChannels' to list currently defined channels + and some information about them. * Added a new action 'SIPshowregistry' to list SIP registrations. * Added TLS support for the manager interface and HTTP server * Added the URI redirect option for the built-in HTTP server diff --git a/main/manager.c b/main/manager.c index 4c2a340b7d..410e4049b4 100644 --- a/main/manager.c +++ b/main/manager.c @@ -2358,6 +2358,72 @@ static int action_reload(struct mansession *s, const struct message *m) return 0; } +static char mandescr_coreshowchannels[] = +"Description: List currently defined channels and some information\n" +" about them.\n" +"Variables:\n" +" ActionID: Optional Action id for message matching.\n"; + +/*! \brief Manager command "CoreShowChannels" - List currently defined channels + * and some information about them. */ +static int action_coreshowchannels(struct mansession *s, const struct message *m) +{ + const char *actionid = astman_get_header(m, "ActionID"); + char actionidtext[256] = ""; + struct ast_channel *c = NULL; + int numchans = 0; + int duration, durh, durm, durs; + + if (!ast_strlen_zero(actionid)) + snprintf(actionidtext, sizeof(actionidtext), "ActionID: %s\r\n", actionid); + + astman_send_listack(s, m, "Channels will follow", "start"); + + while ((c = ast_channel_walk_locked(c)) != NULL) { + struct ast_channel *bc = ast_bridged_channel(c); + char durbuf[10] = ""; + + if (c->cdr && !ast_tvzero(c->cdr->start)) { + duration = (int)(ast_tvdiff_ms(ast_tvnow(), c->cdr->start) / 1000); + durh = duration / 3600; + durm = (duration % 3600) / 60; + durs = duration % 60; + snprintf(durbuf, sizeof(durbuf), "%02d:%02d:%02d", durh, durm, durs); + } + + astman_append(s, + "Channel: %s\r\n" + "UniqueID: %s\r\n" + "Context: %s\r\n" + "Extension: %s\r\n" + "Priority: %d\r\n" + "ChannelState: %d\r\n" + "ChannelStateDesc: %s\r\n" + "Application: %s\r\n" + "ApplicationData: %s\r\n" + "CallerIDnum: %s\r\n" + "Duration: %s\r\n" + "AccountCode: %s\r\n" + "BridgedChannel: %s\r\n" + "BridgedUniqueID: %s\r\n" + "\r\n", c->name, c->uniqueid, c->context, c->exten, c->priority, c->_state, ast_state2str(c->_state), + c->appl ? c->appl : "", c->data ? S_OR(c->data, ""): "", + S_OR(c->cid.cid_num, ""), durbuf, S_OR(c->accountcode, ""), bc ? bc->name : "", bc ? bc->uniqueid : ""); + ast_channel_unlock(c); + numchans++; + } + + astman_append(s, + "Event: CoreShowChannelsComplete\r\n" + "EventList: Complete\r\n" + "ListItems: %d\r\n" + "%s" + "\r\n", numchans, actionidtext); + + return 0; +} + + /* * Done with the action handlers here, we start with the code in charge * of accepting connections and serving them. @@ -3373,6 +3439,7 @@ static int __init_manager(int reload) ast_manager_register2("CoreSettings", EVENT_FLAG_SYSTEM, action_coresettings, "Show PBX core settings (version etc)", mandescr_coresettings); ast_manager_register2("CoreStatus", EVENT_FLAG_SYSTEM, action_corestatus, "Show PBX core status variables", mandescr_corestatus); ast_manager_register2("Reload", EVENT_FLAG_CONFIG, action_reload, "Send a reload event", mandescr_reload); + ast_manager_register2("CoreShowChannels", EVENT_FLAG_SYSTEM, action_coreshowchannels, "List currently defined channels", mandescr_coreshowchannels); ast_cli_register_multiple(cli_manager, sizeof(cli_manager) / sizeof(struct ast_cli_entry)); ast_extension_state_add(NULL, NULL, manager_state_cb, NULL);