Add CLI "pri show channels" command.
List the current mapping of DAHDI B channels to Asterisk channel names and which calls are on hold or call-waiting. Calls on hold or call-waiting are not associated with any B channel. JIRA LIBPRI-27 JIRA SWP-2547 git-svn-id: http://svn.digium.com/svn/asterisk/trunk@307964 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
parent
eb7b873c8f
commit
2e3f3f2af7
|
@ -14025,6 +14025,7 @@ static char *handle_pri_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_a
|
|||
}
|
||||
#endif /* defined(HAVE_PRI) */
|
||||
|
||||
#if defined(HAVE_PRI)
|
||||
#if defined(HAVE_PRI_SERVICE_MESSAGES)
|
||||
static char *handle_pri_service_generic(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a, int changestatus)
|
||||
{
|
||||
|
@ -14168,6 +14169,36 @@ static char *handle_pri_service_disable_channel(struct ast_cli_entry *e, int cmd
|
|||
return handle_pri_service_generic(e, cmd, a, 2);
|
||||
}
|
||||
#endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
|
||||
#endif /* defined(HAVE_PRI) */
|
||||
|
||||
#if defined(HAVE_PRI)
|
||||
static char *handle_pri_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||
{
|
||||
int span;
|
||||
|
||||
switch (cmd) {
|
||||
case CLI_INIT:
|
||||
e->command = "pri show channels";
|
||||
e->usage =
|
||||
"Usage: pri show channels\n"
|
||||
" Displays PRI channel information\n";
|
||||
return NULL;
|
||||
case CLI_GENERATE:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (a->argc != 3)
|
||||
return CLI_SHOWUSAGE;
|
||||
|
||||
sig_pri_cli_show_channels_header(a->fd);
|
||||
for (span = 0; span < NUM_SPANS; ++span) {
|
||||
if (pris[span].pri.pri) {
|
||||
sig_pri_cli_show_channels(a->fd, &pris[span].pri);
|
||||
}
|
||||
}
|
||||
return CLI_SUCCESS;
|
||||
}
|
||||
#endif /* defined(HAVE_PRI) */
|
||||
|
||||
#if defined(HAVE_PRI)
|
||||
static char *handle_pri_show_spans(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
||||
|
@ -14179,7 +14210,7 @@ static char *handle_pri_show_spans(struct ast_cli_entry *e, int cmd, struct ast_
|
|||
e->command = "pri show spans";
|
||||
e->usage =
|
||||
"Usage: pri show spans\n"
|
||||
" Displays PRI Information\n";
|
||||
" Displays PRI span information\n";
|
||||
return NULL;
|
||||
case CLI_GENERATE:
|
||||
return NULL;
|
||||
|
@ -14300,8 +14331,9 @@ static struct ast_cli_entry dahdi_pri_cli[] = {
|
|||
AST_CLI_DEFINE(handle_pri_service_enable_channel, "Return a channel to service"),
|
||||
AST_CLI_DEFINE(handle_pri_service_disable_channel, "Remove a channel from service"),
|
||||
#endif /* defined(HAVE_PRI_SERVICE_MESSAGES) */
|
||||
AST_CLI_DEFINE(handle_pri_show_spans, "Displays PRI Information"),
|
||||
AST_CLI_DEFINE(handle_pri_show_span, "Displays PRI Information"),
|
||||
AST_CLI_DEFINE(handle_pri_show_channels, "Displays PRI channel information"),
|
||||
AST_CLI_DEFINE(handle_pri_show_spans, "Displays PRI span information"),
|
||||
AST_CLI_DEFINE(handle_pri_show_span, "Displays PRI span information"),
|
||||
AST_CLI_DEFINE(handle_pri_show_debug, "Displays current PRI debug settings"),
|
||||
AST_CLI_DEFINE(handle_pri_set_debug_file, "Sends PRI debug output to the specified file"),
|
||||
AST_CLI_DEFINE(handle_pri_version, "Displays libpri version"),
|
||||
|
@ -14892,7 +14924,7 @@ static char *dahdi_show_channels(struct ast_cli_entry *e, int cmd, struct ast_cl
|
|||
}
|
||||
break;
|
||||
default:
|
||||
;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (tmp->channel > 0) {
|
||||
|
|
|
@ -109,6 +109,25 @@ static int pri_gendigittimeout = 8000;
|
|||
|
||||
static int pri_active_dchan_index(struct sig_pri_span *pri);
|
||||
|
||||
static const char *sig_pri_call_level2str(enum sig_pri_call_level level)
|
||||
{
|
||||
switch (level) {
|
||||
case SIG_PRI_CALL_LEVEL_IDLE:
|
||||
return "Idle";
|
||||
case SIG_PRI_CALL_LEVEL_SETUP:
|
||||
return "Setup";
|
||||
case SIG_PRI_CALL_LEVEL_OVERLAP:
|
||||
return "Overlap";
|
||||
case SIG_PRI_CALL_LEVEL_PROCEEDING:
|
||||
return "Proceeding";
|
||||
case SIG_PRI_CALL_LEVEL_ALERTING:
|
||||
return "Alerting";
|
||||
case SIG_PRI_CALL_LEVEL_CONNECT:
|
||||
return "Connect";
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
|
||||
static inline void pri_rel(struct sig_pri_span *pri)
|
||||
{
|
||||
ast_mutex_unlock(&pri->lock);
|
||||
|
@ -7880,8 +7899,9 @@ int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char
|
|||
}
|
||||
if (pvt->call_level < SIG_PRI_CALL_LEVEL_CONNECT) {
|
||||
ast_log(LOG_WARNING,
|
||||
"Span %d: Digit '%c' may be ignored by peer. (Call level:%d)\n",
|
||||
pvt->pri->span, digit, pvt->call_level);
|
||||
"Span %d: Digit '%c' may be ignored by peer. (Call level:%d(%s))\n",
|
||||
pvt->pri->span, digit, pvt->call_level,
|
||||
sig_pri_call_level2str(pvt->call_level));
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
|
@ -8300,6 +8320,54 @@ void sig_pri_chan_delete(struct sig_pri_chan *doomed)
|
|||
ast_free(doomed);
|
||||
}
|
||||
|
||||
#define SIG_PRI_SC_HEADER "%-4s %4s %-4s %-10s %-4s %s\n"
|
||||
#define SIG_PRI_SC_LINE "%4d %4d %-4s %-10s %-4s %s"
|
||||
void sig_pri_cli_show_channels_header(int fd)
|
||||
{
|
||||
ast_cli(fd, SIG_PRI_SC_HEADER, "PRI", "", "B", "Call", "PRI", "Channel");
|
||||
ast_cli(fd, SIG_PRI_SC_HEADER, "Span", "Chan", "Chan", "Level", "Call", "Name");
|
||||
}
|
||||
|
||||
void sig_pri_cli_show_channels(int fd, struct sig_pri_span *pri)
|
||||
{
|
||||
char line[256];
|
||||
int idx;
|
||||
struct sig_pri_chan *pvt;
|
||||
|
||||
ast_mutex_lock(&pri->lock);
|
||||
for (idx = 0; idx < pri->numchans; ++idx) {
|
||||
if (!pri->pvts[idx]) {
|
||||
continue;
|
||||
}
|
||||
pvt = pri->pvts[idx];
|
||||
sig_pri_lock_private(pvt);
|
||||
sig_pri_lock_owner(pri, idx);
|
||||
if (pvt->no_b_channel && !pvt->call && !pvt->owner) {
|
||||
/* Don't show held/call-waiting channels if they are not in use. */
|
||||
sig_pri_unlock_private(pvt);
|
||||
continue;
|
||||
}
|
||||
|
||||
snprintf(line, sizeof(line), SIG_PRI_SC_LINE,
|
||||
pri->span,
|
||||
pvt->channel,
|
||||
pvt->no_b_channel ? "No" : "Yes",/* Has media */
|
||||
sig_pri_call_level2str(pvt->call_level),
|
||||
pvt->call ? "Yes" : "No",
|
||||
pvt->owner ? pvt->owner->name : "");
|
||||
|
||||
if (pvt->owner) {
|
||||
ast_channel_unlock(pvt->owner);
|
||||
}
|
||||
sig_pri_unlock_private(pvt);
|
||||
|
||||
ast_mutex_unlock(&pri->lock);
|
||||
ast_cli(fd, "%s\n", line);
|
||||
ast_mutex_lock(&pri->lock);
|
||||
}
|
||||
ast_mutex_unlock(&pri->lock);
|
||||
}
|
||||
|
||||
static void build_status(char *s, size_t len, int status, int active)
|
||||
{
|
||||
if (!s || len < 1) {
|
||||
|
|
|
@ -572,6 +572,8 @@ void sig_pri_chan_delete(struct sig_pri_chan *doomed);
|
|||
|
||||
int pri_is_up(struct sig_pri_span *pri);
|
||||
|
||||
void sig_pri_cli_show_channels_header(int fd);
|
||||
void sig_pri_cli_show_channels(int fd, struct sig_pri_span *pri);
|
||||
void sig_pri_cli_show_spans(int fd, int span, struct sig_pri_span *pri);
|
||||
|
||||
void sig_pri_cli_show_span(int fd, int *dchannels, struct sig_pri_span *pri);
|
||||
|
|
Reference in New Issue