Add CLI "pri show channels" command.
authorRichard Mudgett <rmudgett@digium.com>
Tue, 15 Feb 2011 21:42:55 +0000 (21:42 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Tue, 15 Feb 2011 21:42:55 +0000 (21:42 +0000)
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: https://origsvn.digium.com/svn/asterisk/trunk@307964 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_pri.c
channels/sig_pri.h

index 58e2753..103bb89 100644 (file)
@@ -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) {
index b3117f5..556c7db 100644 (file)
@@ -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) {
index 1438396..2d41664 100644 (file)
@@ -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);