diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index c8391c2047aabc23882ea0532d352f8c65bebd29..26a2d010035c0b3cc922846f047f6ac343ccd028 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -252,6 +252,19 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <description> </description> </manager> + <manager name="PRIShowSpans" language="en_US"> + <synopsis> + Show status of PRI spans. + </synopsis> + <syntax> + <xi:include xpointer="xpointer(/docs/manager[@name='Login']/syntax/parameter[@name='ActionID'])" /> + <parameter name="Span"> + <para>Specify the specific span to show. Show all spans if zero or not present.</para> + </parameter> + </syntax> + <description> + </description> + </manager> ***/ #define SMDI_MD_WAIT_TIMEOUT 1500 /* 1.5 seconds */ @@ -15874,6 +15887,60 @@ static int action_dahdishowchannels(struct mansession *s, const struct message * return 0; } +#if defined(HAVE_PRI) +static int action_prishowspans(struct mansession *s, const struct message *m) +{ + int count; + int idx; + int span_query; + struct dahdi_pri *dspan; + const char *id = astman_get_header(m, "ActionID"); + const char *span_str = astman_get_header(m, "Span"); + char action_id[256]; + const char *show_cmd = "PRIShowSpans"; + + /* NOTE: Asking for span 0 gets all spans. */ + if (!ast_strlen_zero(span_str)) { + span_query = atoi(span_str); + } else { + span_query = 0; + } + + if (!ast_strlen_zero(id)) { + snprintf(action_id, sizeof(action_id), "ActionID: %s\r\n", id); + } else { + action_id[0] = '\0'; + } + + astman_send_ack(s, m, "Span status will follow"); + + count = 0; + for (idx = 0; idx < ARRAY_LEN(pris); ++idx) { + dspan = &pris[idx]; + + /* If a specific span is asked for, only deliver status for that span. */ + if (0 < span_query && dspan->pri.span != span_query) { + continue; + } + + if (dspan->pri.pri) { + count += sig_pri_ami_show_spans(s, show_cmd, &dspan->pri, dspan->dchannels, + action_id); + } + } + + astman_append(s, + "Event: %sComplete\r\n" + "Items: %d\r\n" + "%s" + "\r\n", + show_cmd, + count, + action_id); + return 0; +} +#endif /* defined(HAVE_PRI) */ + #if defined(HAVE_SS7) static int linkset_addsigchan(int sigchan) { @@ -16449,6 +16516,9 @@ static int __unload_module(void) ast_manager_unregister("DAHDIDNDon"); ast_manager_unregister("DAHDIShowChannels"); ast_manager_unregister("DAHDIRestart"); +#if defined(HAVE_PRI) + ast_manager_unregister("PRIShowSpans"); +#endif /* defined(HAVE_PRI) */ ast_data_unregister(NULL); ast_channel_unregister(&dahdi_tech); @@ -18431,6 +18501,9 @@ static int load_module(void) ast_manager_register_xml("DAHDIDNDoff", 0, action_dahdidndoff); ast_manager_register_xml("DAHDIShowChannels", 0, action_dahdishowchannels); ast_manager_register_xml("DAHDIRestart", 0, action_dahdirestart); +#if defined(HAVE_PRI) + ast_manager_register_xml("PRIShowSpans", 0, action_prishowspans); +#endif /* defined(HAVE_PRI) */ ast_cond_init(&ss_thread_complete, NULL); diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 49fb246bedc4c918b217e41138dfd7672a9388f2..c032bf2de262dafe41873585507981ee0aa9c5ea 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -7040,6 +7040,52 @@ static void *pri_dchannel(void *vpri) return NULL; } +/*! + * \brief Output AMI show spans response events for the given PRI span. + * \since 1.10 + * + * \param show_cmd AMI command name + * \param s AMI session to output span information. + * \param pri PRI span control structure. + * \param dchannels Array of D channel channel numbers. + * \param action_id Action ID line to use. + * + * \return Number of D channels on this span. + */ +int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id) +{ + int count; + int x; + + count = 0; + for (x = 0; x < ARRAY_LEN(pri->dchans); ++x) { + if (pri->dchans[x]) { + ++count; + + astman_append(s, + "Event: %s\r\n" + "Span: %d\r\n" + "DChannel: %d\r\n" + "Order: %s\r\n" + "Active: %s\r\n" + "Alarm: %s\r\n" + "Up: %s\r\n" + "%s" + "\r\n", + show_cmd, + pri->span, + dchannels[x], + pri_order(x), + (pri->dchans[x] == pri->pri) ? "Yes" : "No", + (pri->dchanavail[x] & DCHAN_NOTINALARM) ? "No" : "Yes", + (pri->dchanavail[x] & DCHAN_UP) ? "Yes" : "No", + action_id + ); + } + } + return count; +} + void sig_pri_init_pri(struct sig_pri_span *pri) { int i; diff --git a/channels/sig_pri.h b/channels/sig_pri.h index f2eef03d66e01cf2a89042f97d9f73fd3507daf7..9b4f56e68eb8b6f0d4c739cf4fce2bf240f5b9f9 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -615,6 +615,9 @@ void sig_pri_chan_delete(struct sig_pri_chan *doomed); int pri_is_up(struct sig_pri_span *pri); +struct mansession; +int sig_pri_ami_show_spans(struct mansession *s, const char *show_cmd, struct sig_pri_span *pri, const int *dchannels, const char *action_id); + 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);