Add 'capi show resources'

This commit is contained in:
MelwareDE 2010-10-29 21:51:03 +00:00
parent 90557f5ced
commit 6c7ba82edf
4 changed files with 139 additions and 7 deletions

6
README
View File

@ -138,6 +138,12 @@ capi show channels:
capi chatinfo:
Show status of CAPI CHAT.
capi ifcstate:
Show state of interfaces. (Diva only, chan_capi
compiled with 'make DIVA_STATUS=1')
capi show resources:
Show resources in use.
CAPI command application
========================================

View File

@ -28,34 +28,38 @@
/*
* usages
*/
static char info_usage[] =
static char info_usage[] =
"Usage: " CC_MESSAGE_NAME " info\n"
" Show info about B channels on controllers.\n";
static char show_channels_usage[] =
static char show_channels_usage[] =
"Usage: " CC_MESSAGE_NAME " show channels\n"
" Show info about B channels.\n";
static char debug_usage[] =
static char show_resources_usage[] =
"Usage: " CC_MESSAGE_NAME " show ressources\n"
" Show info about used by channels resources.\n";
static char debug_usage[] =
"Usage: " CC_MESSAGE_NAME " debug\n"
" Enables dumping of " CC_MESSAGE_BIGNAME " packets for debugging purposes\n";
static char no_debug_usage[] =
static char no_debug_usage[] =
"Usage: " CC_MESSAGE_NAME " no debug\n"
" Disables dumping of " CC_MESSAGE_BIGNAME " packets for debugging purposes\n";
static char qsig_debug_usage[] =
static char qsig_debug_usage[] =
"Usage: " CC_MESSAGE_NAME " qsig debug\n"
" Enables dumping of QSIG facilities for debugging purposes\n";
static char qsig_no_debug_usage[] =
static char qsig_no_debug_usage[] =
"Usage: " CC_MESSAGE_NAME " qsig no debug\n"
" Disables dumping of QSIG facilities for debugging purposes\n";
#ifndef CC_AST_HAS_VERSION_1_6
static
#endif
char chatinfo_usage[] =
char chatinfo_usage[] =
"Usage: " CC_MESSAGE_NAME " chatinfo\n"
" Show info about chat status.\n";
@ -66,6 +70,7 @@ char chatinfo_usage[] =
#define CC_CLI_TEXT_QSIG_DEBUG "Enable QSIG debugging"
#define CC_CLI_TEXT_QSIG_NO_DEBUG "Disable QSIG debugging"
#define CC_CLI_TEXT_CHATINFO "Show " CC_MESSAGE_BIGNAME " chat info"
#define CC_CLI_TEXT_SHOW_RESOURCES "Show used resources"
/*
* helper functions to convert conf value to string
@ -226,6 +231,94 @@ static int pbxcli_capi_show_channels(int fd, int argc, char *argv[])
#endif
}
/*
* do command capi show resources
*/
#ifdef CC_AST_HAS_VERSION_1_6
static char *pbxcli_capi_show_resources(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
#else
static int pbxcli_capi_show_ressources(int fd, int argc, char *argv[])
#endif
{
int ifc_type;
const struct capi_pvt *i;
int required_args;
int provided_args;
const char* required_channel_name = NULL;
struct {
const struct capi_pvt *head;
void (*lock_proc)(void);
void (*unlock_proc)(void);
} data[2];
data[0].head = capi_iflist;
data[0].lock_proc = pbx_capi_lock_interfaces;
data[0].unlock_proc = pbx_capi_unlock_interfaces;
data[1].head = pbx_capi_get_nulliflist();
data[1].lock_proc = pbx_capi_nulliflist_lock;
data[1].unlock_proc = pbx_capi_nulliflist_unlock;
#ifdef CC_AST_HAS_VERSION_1_6
int fd = a->fd;
if (cmd == CLI_INIT) {
e->command = CC_MESSAGE_NAME " show resources";
e->usage = show_resources_usage;
return NULL;
} else if (cmd == CLI_GENERATE)
return NULL;
required_args = e->args;
provided_args = a->argc;
if (required_args < provided_args) {
required_channel_name = a->argv[required_args];
}
#else
required_args = 3;
provided_args = argc;
if (required_args < provided_args) {
required_channel_name = argv[required_args];
}
#endif
ast_cli(fd, CC_MESSAGE_BIGNAME " resources in use:\n");
ast_cli(fd, "%-40s %-6s %-4s %-10s %-9s %-5s %-5s %-6s %-6s\n",
"Line-Name", "Domain", "DTMF", "EchoCancel", "NoiseSupp", "RxAGC", "TxAGC", "RxGain", "TxGain");
ast_cli(fd, "------------------------------------------------------------------------------------------------------\n");
for (ifc_type = 0; ifc_type < sizeof(data)/sizeof(data[0]); ifc_type++) {
data[ifc_type].lock_proc();
for (i = data[ifc_type].head; i; i = i->next) {
if ((i->used == 0) || ((i->channeltype != CAPI_CHANNELTYPE_B) &&
(i->channeltype != CAPI_CHANNELTYPE_NULL)))
continue;
if (i->data_plci != 0)
continue;
if ((required_channel_name != NULL) && (strcmp(required_channel_name, i->vname) != 0))
continue;
ast_cli(fd, "%-40s %-6s %-4s %-10s %-9s %-5s %-5s %-.1f%-3s %-.1f%-3s\n",
i->vname,
(i->channeltype == CAPI_CHANNELTYPE_B) ? "TDM" : "IP",
(i->isdnstate & CAPI_ISDN_STATE_DTMF) ? "Y" : "N",
(i->isdnstate & CAPI_ISDN_STATE_EC) ? "Y" : "N",
(i->divaAudioFlags & 0x0080) ? "Y" : "N", /* Noise supression */
(i->divaAudioFlags & 0x0008) ? "Y" : "N", /* Rx AGC */
(i->divaAudioFlags & 0x0004) ? "Y" : "N", /* Tx AGC */
i->divaDigitalRxGainDB, "dB",
i->divaDigitalTxGainDB, "dB");
}
data[ifc_type].unlock_proc();
}
#ifdef CC_AST_HAS_VERSION_1_6
return CLI_SUCCESS;
#else
return RESULT_SUCCESS;
#endif
}
/*
* do command capi info
*/
@ -426,6 +519,7 @@ static struct ast_cli_entry cc_cli_cmd[] = {
#ifdef DIVA_STATUS
AST_CLI_DEFINE(pbxcli_capi_ifc_status, CC_CLI_TEXT_IFC_STATUSINFO),
#endif
AST_CLI_DEFINE(pbxcli_capi_show_resources, CC_CLI_TEXT_SHOW_RESOURCES),
};
#else
static struct ast_cli_entry cli_info =
@ -446,6 +540,8 @@ static struct ast_cli_entry cli_chatinfo =
static struct ast_cli_entry cli_ifcstate =
{ { CC_MESSAGE_NAME, "ifcstate", NULL }, pbxcli_capi_ifc_status, CC_CLI_TEXT_IFC_STATUSINFO, diva_status_ifc_state_usage };
#endif
static struct ast_cli_entry cli_show_resources =
{ { CC_MESSAGE_NAME, "show", "resources", NULL }, pbxcli_capi_show_resources, CC_CLI_TEXT_SHOW_RESOURCES, show_resources_usage };
#endif
@ -465,6 +561,7 @@ void pbx_capi_cli_register(void)
#ifdef DIVA_STATUS
ast_cli_register(&cli_ifcstate);
#endif
ast_cli_register(&cli_show_resources);
#endif
}
@ -483,5 +580,6 @@ void pbx_capi_cli_unregister(void)
#ifdef DIVA_STATUS
ast_cli_unregister(&cli_ifcstate);
#endif
ast_cli_unregister(&cli_show_resources);
#endif
}

View File

@ -1631,3 +1631,18 @@ const char* pbx_capi_get_connectedname(struct ast_channel* c)
return (name);
}
const struct capi_pvt *pbx_capi_get_nulliflist(void)
{
return nulliflist;
}
void pbx_capi_nulliflist_lock(void)
{
cc_mutex_lock(&nullif_lock);
}
void pbx_capi_nulliflist_unlock(void)
{
cc_mutex_unlock(&nullif_lock);
}

View File

@ -80,4 +80,17 @@ extern MESSAGE_EXCHANGE_ERROR capi_sendf(
struct capi_pvt *capii, int waitconf,
_cword command, _cdword Id, _cword Number, char * format, ...);
/*!
\brief nulliflist
*/
const struct capi_pvt *pbx_capi_get_nulliflist(void);
/*!
\brief cc_mutex_lock(&nullif_lock)
*/
void pbx_capi_nulliflist_lock(void);
/*!
\brief cc_mutex_unlock(&nullif_lock)
*/
void pbx_capi_nulliflist_unlock(void);
#endif