dect
/
asterisk
Archived
13
0
Fork 0

More changes to NEW_CLI.

Also fixes a few cli messages and some minor formatting.

(closes issue #11001)
Reported by: seanbright
Patches:
      newcli.1.patch uploaded by seanbright (license 71)
      newcli.2.patch uploaded by seanbright (license 71)
      newcli.4.patch uploaded by seanbright (license 71)
      newcli.5.patch uploaded by seanbright (license 71)
      newcli.6.patch uploaded by seanbright (license 71)
      newcli.7.patch uploaded by seanbright (license 71)


git-svn-id: http://svn.digium.com/svn/asterisk/trunk@86534 f38db490-d61c-443f-a65b-d21fe96a405b
This commit is contained in:
qwell 2007-10-19 18:01:00 +00:00
parent 4c11437602
commit 4723d35127
10 changed files with 1764 additions and 1385 deletions

View File

@ -2623,51 +2623,71 @@ static int restart_monitor(void)
return 0;
}
static int h323_do_trace(int fd, int argc, char *argv[])
static char *handle_cli_h323_set_trace(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 4) {
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "h323 set trace [off]";
e->usage =
"Usage: h323 set trace (off|<trace level>)\n"
" Enable/Disable H.323 stack tracing for debugging purposes\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
h323_debug(1, atoi(argv[3]));
ast_cli(fd, "H.323 trace set to level %s\n", argv[2]);
return RESULT_SUCCESS;
if (a->argc != 4)
return CLI_SHOWUSAGE;
if (!strcasecmp(a->argv[3], "off")) {
h323_debug(0, 0);
ast_cli(a->fd, "H.323 Trace Disabled\n");
} else {
int tracelevel = atoi(a->argv[3]);
h323_debug(1, tracelevel);
ast_cli(a->fd, "H.323 Trace Enabled (Trace Level: %d)\n", tracelevel);
}
return CLI_SUCCESS;
}
static int h323_no_trace(int fd, int argc, char *argv[])
static char *handle_cli_h323_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc < 3 || argc > 4) {
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "h323 set debug [off]";
e->usage =
"Usage: h323 set debug [off]\n"
" Enable/Disable H.323 debugging output\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
h323_debug(0,0);
ast_cli(fd, "H.323 trace disabled\n");
return RESULT_SUCCESS;
if (a->argc < 3 || a->argc > 4)
return CLI_SHOWUSAGE;
if (a->argc == 4 && strcasecmp(a->argv[3], "off"))
return CLI_SHOWUSAGE;
h323debug = (a->argc == 3) ? 1 : 0;
ast_cli(a->fd, "H.323 Debugging %s\n", h323debug ? "Enabled" : "Disabled");
return CLI_SUCCESS;
}
static int h323_do_debug(int fd, int argc, char *argv[])
static char *handle_cli_h323_cycle_gk(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc < 2 || argc > 3) {
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "h323 cycle gk";
e->usage =
"Usage: h323 cycle gk\n"
" Manually re-register with the Gatekeper (Currently Disabled)\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
h323debug = 1;
ast_cli(fd, "H.323 debug enabled\n");
return RESULT_SUCCESS;
}
static int h323_no_debug(int fd, int argc, char *argv[])
{
if (argc < 3 || argc > 4) {
return RESULT_SHOWUSAGE;
}
h323debug = 0;
ast_cli(fd, "H.323 debug disabled\n");
return RESULT_SUCCESS;
}
if (a->argc != 3)
return CLI_SHOWUSAGE;
static int h323_gk_cycle(int fd, int argc, char *argv[])
{
if (argc != 3) {
return RESULT_SHOWUSAGE;
}
h323_gk_urq();
/* Possibly register with a GK */
@ -2676,126 +2696,59 @@ static int h323_gk_cycle(int fd, int argc, char *argv[])
ast_log(LOG_ERROR, "Gatekeeper registration failed.\n");
}
}
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int h323_ep_hangup(int fd, int argc, char *argv[])
static char *handle_cli_h323_hangup(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 3) {
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "h323 hangup";
e->usage =
"Usage: h323 hangup <token>\n"
" Manually try to hang up the call identified by <token>\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (h323_soft_hangup(argv[2])) {
ast_verb(3, "Hangup succeeded on %s\n", argv[2]);
if (a->argc != 3)
return CLI_SHOWUSAGE;
if (h323_soft_hangup(a->argv[2])) {
ast_verb(3, "Hangup succeeded on %s\n", a->argv[2]);
} else {
ast_verb(3, "Hangup failed for %s\n", argv[2]);
ast_verb(3, "Hangup failed for %s\n", a->argv[2]);
}
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int h323_tokens_show(int fd, int argc, char *argv[])
static char *handle_cli_h323_show_tokens(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 3) {
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "h323 show tokens";
e->usage =
"Usage: h323 show tokens\n"
" Print out all active call tokens\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 3)
return CLI_SHOWUSAGE;
h323_show_tokens();
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static char trace_usage[] =
"Usage: h323 trace <level num>\n"
" Enables H.323 stack tracing for debugging purposes\n";
static char no_trace_usage[] =
"Usage: h323 no trace\n"
" Disables H.323 stack tracing for debugging purposes\n";
static char debug_usage[] =
"Usage: h323 debug\n"
" Enables H.323 debug output\n";
static char no_debug_usage[] =
"Usage: h323 no debug\n"
" Disables H.323 debug output\n";
static char show_cycle_usage[] =
"Usage: h323 gk cycle\n"
" Manually re-register with the Gatekeper (Currently Disabled)\n";
static char show_hangup_usage[] =
"Usage: h323 hangup <token>\n"
" Manually try to hang up call identified by <token>\n";
static char show_tokens_usage[] =
"Usage: h323 show tokens\n"
" Print out all active call tokens\n";
static char h323_reload_usage[] =
"Usage: h323 reload\n"
" Reloads H.323 configuration from h323.conf\n";
static struct ast_cli_entry cli_h323_trace_deprecated =
{ { "h.323", "trace", NULL },
h323_do_trace, "Enable H.323 Stack Tracing",
trace_usage };
static struct ast_cli_entry cli_h323_no_trace_deprecated =
{ { "h.323", "no", "trace", NULL },
h323_no_trace, "Disable H.323 Stack Tracing",
no_trace_usage };
static struct ast_cli_entry cli_h323_debug_deprecated =
{ { "h.323", "debug", NULL },
h323_do_debug, "Enable H.323 debug",
debug_usage };
static struct ast_cli_entry cli_h323_no_debug_deprecated =
{ { "h.323", "no", "debug", NULL },
h323_no_debug, "Disable H.323 debug",
no_debug_usage };
static struct ast_cli_entry cli_h323_gk_cycle_deprecated =
{ { "h.323", "gk", "cycle", NULL },
h323_gk_cycle, "Manually re-register with the Gatekeper",
show_cycle_usage };
static struct ast_cli_entry cli_h323_hangup_deprecated =
{ { "h.323", "hangup", NULL },
h323_ep_hangup, "Manually try to hang up a call",
show_hangup_usage };
static struct ast_cli_entry cli_h323_show_tokens_deprecated =
{ { "h.323", "show", "tokens", NULL },
h323_tokens_show, "Show all active call tokens",
show_tokens_usage };
static struct ast_cli_entry cli_h323[] = {
{ { "h323", "set", "trace", NULL },
h323_do_trace, "Enable H.323 Stack Tracing",
trace_usage, NULL, &cli_h323_trace_deprecated },
{ { "h323", "set", "trace", "off", NULL },
h323_no_trace, "Disable H.323 Stack Tracing",
no_trace_usage, NULL, &cli_h323_no_trace_deprecated },
{ { "h323", "set", "debug", NULL },
h323_do_debug, "Enable H.323 debug",
debug_usage, NULL, &cli_h323_debug_deprecated },
{ { "h323", "set", "debug", "off", NULL },
h323_no_debug, "Disable H.323 debug",
no_debug_usage, NULL, &cli_h323_no_debug_deprecated },
{ { "h323", "cycle", "gk", NULL },
h323_gk_cycle, "Manually re-register with the Gatekeper",
show_cycle_usage, NULL, &cli_h323_gk_cycle_deprecated },
{ { "h323", "hangup", NULL },
h323_ep_hangup, "Manually try to hang up a call",
show_hangup_usage, NULL, &cli_h323_hangup_deprecated },
{ { "h323", "show", "tokens", NULL },
h323_tokens_show, "Show all active call tokens",
show_tokens_usage, NULL, &cli_h323_show_tokens_deprecated },
NEW_CLI(handle_cli_h323_set_trace, "Enable/Disable H.323 Stack Tracing"),
NEW_CLI(handle_cli_h323_set_debug, "Enable/Disable H.323 Debugging"),
NEW_CLI(handle_cli_h323_cycle_gk, "Manually re-register with the Gatekeper"),
NEW_CLI(handle_cli_h323_hangup, "Manually try to hang up a call"),
NEW_CLI(handle_cli_h323_show_tokens, "Show all active call tokens"),
};
static int reload_config(int is_reload)
@ -3075,7 +3028,7 @@ static void prune_peers(void)
ASTOBJ_CONTAINER_PRUNE_MARKED(&peerl, oh323_destroy_peer);
}
static int h323_reload(int fd, int argc, char *argv[])
static int h323_reload(void)
{
ast_mutex_lock(&h323_reload_lock);
if (h323_reloading) {
@ -3088,6 +3041,27 @@ static int h323_reload(int fd, int argc, char *argv[])
return 0;
}
static char *handle_cli_h323_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
switch (cmd) {
case CLI_INIT:
e->command = "h323 reload";
e->usage =
"Usage: h323 reload\n"
" Reloads H.323 configuration from h323.conf\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 2)
return CLI_SHOWUSAGE;
h323_reload();
return CLI_SUCCESS;
}
static int h323_do_reload(void)
{
reload_config(1);
@ -3100,20 +3074,11 @@ static int reload(void)
ast_log(LOG_NOTICE, "Unload and load chan_h323.so again in order to receive configuration changes.\n");
return 0;
}
return h323_reload(0, 0, NULL);
return h323_reload();
}
static struct ast_cli_entry cli_h323_reload_deprecated =
{ { "h.323", "reload", NULL },
h323_reload, "Reload H.323 configuration",
h323_reload_usage
};
static struct ast_cli_entry cli_h323_reload =
{ { "h323", "reload", NULL },
h323_reload, "Reload H.323 configuration",
h323_reload_usage, NULL, &cli_h323_reload_deprecated
};
NEW_CLI(handle_cli_h323_reload, "Reload H.323 configuration");
static enum ast_rtp_get_result oh323_get_rtp_peer(struct ast_channel *chan, struct ast_rtp **rtp)
{

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1606,77 +1606,134 @@ static struct ast_channel *usbradio_request(const char *type, int format, void *
return c;
}
static int console_key(int fd, int argc, char *argv[])
static char *handle_cli_radio_key(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct chan_usbradio_pvt *o = find_desc(usbradio_active);
struct chan_usbradio_pvt *o = NULL;
if (argc != 2)
return RESULT_SHOWUSAGE;
o->txtestkey = 1;
return RESULT_SUCCESS;
}
static int console_unkey(int fd, int argc, char *argv[])
{
struct chan_usbradio_pvt *o = find_desc(usbradio_active);
if (argc != 2)
return RESULT_SHOWUSAGE;
o->txtestkey = 0;
return RESULT_SUCCESS;
}
static int radio_tune(int fd, int argc, char *argv[])
{
struct chan_usbradio_pvt *o = find_desc(usbradio_active);
int i=0;
if ((argc < 2) || (argc > 4))
return RESULT_SHOWUSAGE;
if (argc == 2) /* just show stuff */
{
ast_cli(fd,"Output A is currently set to ");
if(o->txmixa==TX_OUT_COMPOSITE)ast_cli(fd,"composite.\n");
else if (o->txmixa==TX_OUT_VOICE)ast_cli(fd,"voice.\n");
else if (o->txmixa==TX_OUT_LSD)ast_cli(fd,"tone.\n");
else if (o->txmixa==TX_OUT_AUX)ast_cli(fd,"auxvoice.\n");
else ast_cli(fd,"off.\n");
ast_cli(fd,"Output B is currently set to ");
if(o->txmixb==TX_OUT_COMPOSITE)ast_cli(fd,"composite.\n");
else if (o->txmixb==TX_OUT_VOICE)ast_cli(fd,"voice.\n");
else if (o->txmixb==TX_OUT_LSD)ast_cli(fd,"tone.\n");
else if (o->txmixb==TX_OUT_AUX)ast_cli(fd,"auxvoice.\n");
else ast_cli(fd,"off.\n");
ast_cli(fd,"Tx Voice Level currently set to %d\n",o->txmixaset);
ast_cli(fd,"Tx Tone Level currently set to %d\n",o->txctcssadj);
ast_cli(fd,"Rx Squelch currently set to %d\n",o->rxsquelchadj);
return RESULT_SHOWUSAGE;
switch (cmd) {
case CLI_INIT:
e->command = "radio key";
e->usage =
"Usage: radio key\n"
" Simulates COR active.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (!strcasecmp(argv[2],"rxnoise")) tune_rxinput(o);
else if (!strcasecmp(argv[2],"rxvoice")) tune_rxvoice(o);
else if (!strcasecmp(argv[2],"rxtone")) tune_rxctcss(o);
else if (!strcasecmp(argv[2],"rxsquelch"))
if (a->argc != 2)
return CLI_SHOWUSAGE;
o = find_desc(usbradio_active);
o->txtestkey = 1;
return CLI_SUCCESS;
}
static char *handle_cli_radio_unkey(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct chan_usbradio_pvt *o = NULL;
switch (cmd) {
case CLI_INIT:
e->command = "radio unkey";
e->usage =
"Usage: radio unkey\n"
" Simulates COR un-active.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 2)
return CLI_SHOWUSAGE;
o = find_desc(usbradio_active);
o->txtestkey = 0;
return CLI_SUCCESS;
}
static char *handle_cli_radio_tune(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct chan_usbradio_pvt *o = NULL;
int i = 0;
switch (cmd) {
case CLI_INIT:
e->command = "radio tune [rxnoise|rxvoice|rxtone|rxsquelch|rxcap|rxtracecap|"
"txvoice|txtone|txcap|txtracecap|auxvoice|nocap|dump|save]";
/* radio tune 6 3000 measured tx value */
e->usage =
"Usage: radio tune <function>\n"
" rxnoise\n"
" rxvoice\n"
" rxtone\n"
" rxsquelch [newsetting]\n"
" rxcap\n"
" rxtracecap\n"
" txvoice [newsetting]\n"
" txtone [newsetting]\n"
" txcap\n"
" txtracecap\n"
" auxvoice [newsetting]\n"
" nocap\n"
" dump\n"
" save (settings to tuning file)\n"
"\n"
" All [newsetting]s are values 0-999\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if ((a->argc < 2) || (a->argc > 4))
return CLI_SHOWUSAGE;
if (a->argc == 2) /* just show stuff */
{
if (argc == 3)
ast_cli(a->fd,"Output A is currently set to ");
if(o->txmixa==TX_OUT_COMPOSITE)ast_cli(a->fd,"composite.\n");
else if (o->txmixa==TX_OUT_VOICE)ast_cli(a->fd,"voice.\n");
else if (o->txmixa==TX_OUT_LSD)ast_cli(a->fd,"tone.\n");
else if (o->txmixa==TX_OUT_AUX)ast_cli(a->fd,"auxvoice.\n");
else ast_cli(a->fd,"off.\n");
ast_cli(a->fd,"Output B is currently set to ");
if(o->txmixb==TX_OUT_COMPOSITE)ast_cli(a->fd,"composite.\n");
else if (o->txmixb==TX_OUT_VOICE)ast_cli(a->fd,"voice.\n");
else if (o->txmixb==TX_OUT_LSD)ast_cli(a->fd,"tone.\n");
else if (o->txmixb==TX_OUT_AUX)ast_cli(a->fd,"auxvoice.\n");
else ast_cli(a->fd,"off.\n");
ast_cli(a->fd,"Tx Voice Level currently set to %d\n",o->txmixaset);
ast_cli(a->fd,"Tx Tone Level currently set to %d\n",o->txctcssadj);
ast_cli(a->fd,"Rx Squelch currently set to %d\n",o->rxsquelchadj);
return CLI_SHOWUSAGE;
}
o = find_desc(usbradio_active);
if (!strcasecmp(a->argv[2],"rxnoise")) tune_rxinput(o);
else if (!strcasecmp(a->argv[2],"rxvoice")) tune_rxvoice(o);
else if (!strcasecmp(a->argv[2],"rxtone")) tune_rxctcss(o);
else if (!strcasecmp(a->argv[2],"rxsquelch"))
{
if (a->argc == 3)
{
ast_cli(fd,"Current Signal Strength is %d\n",((32767-o->pmrChan->rxRssi)*1000/32767));
ast_cli(fd,"Current Squelch setting is %d\n",o->rxsquelchadj);
//ast_cli(fd,"Current Raw RSSI is %d\n",o->pmrChan->rxRssi);
//ast_cli(fd,"Current (real) Squelch setting is %d\n",*(o->pmrChan->prxSquelchAdjust));
ast_cli(a->fd,"Current Signal Strength is %d\n",((32767-o->pmrChan->rxRssi)*1000/32767));
ast_cli(a->fd,"Current Squelch setting is %d\n",o->rxsquelchadj);
//ast_cli(a->fd,"Current Raw RSSI is %d\n",o->pmrChan->rxRssi);
//ast_cli(a->fd,"Current (real) Squelch setting is %d\n",*(o->pmrChan->prxSquelchAdjust));
} else {
i = atoi(argv[3]);
if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
ast_cli(fd,"Changed Squelch setting to %d\n",i);
i = atoi(a->argv[3]);
if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
ast_cli(a->fd,"Changed Squelch setting to %d\n",i);
o->rxsquelchadj = i;
*(o->pmrChan->prxSquelchAdjust)= ((999 - i) * 32767) / 1000;
}
}
else if (!strcasecmp(argv[2],"txvoice")) {
else if (!strcasecmp(a->argv[2],"txvoice")) {
i = 0;
if( (o->txmixa!=TX_OUT_VOICE) && (o->txmixb!=TX_OUT_VOICE) &&
@ -1685,87 +1742,87 @@ static int radio_tune(int fd, int argc, char *argv[])
{
ast_log(LOG_ERROR,"No txvoice output configured.\n");
}
else if (argc == 3)
else if (a->argc == 3)
{
if((o->txmixa==TX_OUT_VOICE)||(o->txmixa==TX_OUT_COMPOSITE))
ast_cli(fd,"Current txvoice setting on Channel A is %d\n",o->txmixaset);
ast_cli(a->fd,"Current txvoice setting on Channel A is %d\n",o->txmixaset);
else
ast_cli(fd,"Current txvoice setting on Channel B is %d\n",o->txmixbset);
ast_cli(a->fd,"Current txvoice setting on Channel B is %d\n",o->txmixbset);
}
else
{
i = atoi(argv[3]);
if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
i = atoi(a->argv[3]);
if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
if((o->txmixa==TX_OUT_VOICE)||(o->txmixa==TX_OUT_COMPOSITE))
{
o->txmixaset=i;
ast_cli(fd,"Changed txvoice setting on Channel A to %d\n",o->txmixaset);
ast_cli(a->fd,"Changed txvoice setting on Channel A to %d\n",o->txmixaset);
}
else
{
o->txmixbset=i;
ast_cli(fd,"Changed txvoice setting on Channel B to %d\n",o->txmixbset);
ast_cli(a->fd,"Changed txvoice setting on Channel B to %d\n",o->txmixbset);
}
mixer_write(o);
mult_set(o);
ast_cli(fd,"Changed Tx Voice Output setting to %d\n",i);
ast_cli(a->fd,"Changed Tx Voice Output setting to %d\n",i);
}
tune_txoutput(o,i);
}
else if (!strcasecmp(argv[2],"auxvoice")) {
else if (!strcasecmp(a->argv[2],"auxvoice")) {
i = 0;
if( (o->txmixa!=TX_OUT_AUX) && (o->txmixb!=TX_OUT_AUX))
{
ast_log(LOG_WARNING,"No auxvoice output configured.\n");
}
else if (argc == 3)
else if (a->argc == 3)
{
if(o->txmixa==TX_OUT_AUX)
ast_cli(fd,"Current auxvoice setting on Channel A is %d\n",o->txmixaset);
ast_cli(a->fd,"Current auxvoice setting on Channel A is %d\n",o->txmixaset);
else
ast_cli(fd,"Current auxvoice setting on Channel B is %d\n",o->txmixbset);
ast_cli(a->fd,"Current auxvoice setting on Channel B is %d\n",o->txmixbset);
}
else
{
i = atoi(argv[3]);
if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
i = atoi(a->argv[3]);
if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
if(o->txmixa==TX_OUT_AUX)
{
o->txmixbset=i;
ast_cli(fd,"Changed auxvoice setting on Channel A to %d\n",o->txmixaset);
ast_cli(a->fd,"Changed auxvoice setting on Channel A to %d\n",o->txmixaset);
}
else
{
o->txmixbset=i;
ast_cli(fd,"Changed auxvoice setting on Channel B to %d\n",o->txmixbset);
ast_cli(a->fd,"Changed auxvoice setting on Channel B to %d\n",o->txmixbset);
}
mixer_write(o);
mult_set(o);
}
//tune_auxoutput(o,i);
}
else if (!strcasecmp(argv[2],"txtone"))
else if (!strcasecmp(a->argv[2],"txtone"))
{
if (argc == 3)
ast_cli(fd,"Current Tx CTCSS modulation setting = %d\n",o->txctcssadj);
if (a->argc == 3)
ast_cli(a->fd,"Current Tx CTCSS modulation setting = %d\n",o->txctcssadj);
else
{
i = atoi(argv[3]);
if ((i < 0) || (i > 999)) return RESULT_SHOWUSAGE;
i = atoi(a->argv[3]);
if ((i < 0) || (i > 999)) return CLI_SHOWUSAGE;
o->txctcssadj = i;
set_txctcss_level(o);
ast_cli(fd,"Changed Tx CTCSS modulation setting to %i\n",i);
ast_cli(a->fd,"Changed Tx CTCSS modulation setting to %i\n",i);
}
o->txtestkey=1;
usleep(5000000);
o->txtestkey=0;
}
else if (!strcasecmp(argv[2],"dump")) pmrdump(o);
else if (!strcasecmp(argv[2],"nocap"))
else if (!strcasecmp(a->argv[2],"dump")) pmrdump(o);
else if (!strcasecmp(a->argv[2],"nocap"))
{
ast_cli(fd,"File capture (trace) was rx=%d tx=%d and now off.\n",o->b.rxcap2,o->b.txcap2);
ast_cli(fd,"File capture (raw) was rx=%d tx=%d and now off.\n",o->b.rxcapraw,o->b.txcapraw);
ast_cli(a->fd,"File capture (trace) was rx=%d tx=%d and now off.\n",o->b.rxcap2,o->b.txcap2);
ast_cli(a->fd,"File capture (raw) was rx=%d tx=%d and now off.\n",o->b.rxcapraw,o->b.txcapraw);
o->b.rxcapraw=o->b.txcapraw=o->b.rxcap2=o->b.txcap2=o->pmrChan->b.rxCapture=o->pmrChan->b.txCapture=0;
if (frxcapraw) { fclose(frxcapraw); frxcapraw = NULL; }
if (frxcaptrace) { fclose(frxcaptrace); frxcaptrace = NULL; }
@ -1774,37 +1831,37 @@ static int radio_tune(int fd, int argc, char *argv[])
if (ftxcaptrace) { fclose(ftxcaptrace); ftxcaptrace = NULL; }
if (ftxoutraw) { fclose(ftxoutraw); ftxoutraw = NULL; }
}
else if (!strcasecmp(argv[2],"rxtracecap"))
else if (!strcasecmp(a->argv[2],"rxtracecap"))
{
if (!frxcaptrace) frxcaptrace= fopen(RX_CAP_TRACE_FILE,"w");
ast_cli(fd,"Trace rx on.\n");
ast_cli(a->fd,"Trace rx on.\n");
o->b.rxcap2=o->pmrChan->b.rxCapture=1;
}
else if (!strcasecmp(argv[2],"txtracecap"))
else if (!strcasecmp(a->argv[2],"txtracecap"))
{
if (!ftxcaptrace) ftxcaptrace= fopen(TX_CAP_TRACE_FILE,"w");
ast_cli(fd,"Trace tx on.\n");
ast_cli(a->fd,"Trace tx on.\n");
o->b.txcap2=o->pmrChan->b.txCapture=1;
}
else if (!strcasecmp(argv[2],"rxcap"))
else if (!strcasecmp(a->argv[2],"rxcap"))
{
if (!frxcapraw) frxcapraw = fopen(RX_CAP_RAW_FILE,"w");
ast_cli(fd,"cap rx raw on.\n");
ast_cli(a->fd,"cap rx raw on.\n");
o->b.rxcapraw=1;
}
else if (!strcasecmp(argv[2],"txcap"))
else if (!strcasecmp(a->argv[2],"txcap"))
{
if (!ftxcapraw) ftxcapraw = fopen(TX_CAP_RAW_FILE,"w");
ast_cli(fd,"cap tx raw on.\n");
ast_cli(a->fd,"cap tx raw on.\n");
o->b.txcapraw=1;
}
else if (!strcasecmp(argv[2],"save"))
else if (!strcasecmp(a->argv[2],"save"))
{
tune_write(o);
ast_cli(fd,"Saved radio tuning settings to usbradio_tune.conf\n");
ast_cli(a->fd,"Saved radio tuning settings to usbradio_tune.conf\n");
}
else return RESULT_SHOWUSAGE;
return RESULT_SUCCESS;
else return CLI_SHOWUSAGE;
return CLI_SUCCESS;
}
/*
@ -1835,68 +1892,41 @@ static int set_txctcss_level(struct chan_usbradio_pvt *o)
/*
CLI debugging on and off
*/
static int radio_set_debug(int fd, int argc, char *argv[])
static char *handle_cli_radio_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct chan_usbradio_pvt *o = find_desc(usbradio_active);
struct chan_usbradio_pvt *o = NULL;
o->debuglevel=1;
ast_cli(fd,"usbradio debug on.\n");
switch (cmd) {
case CLI_INIT:
e->command = "radio set debug [off]";
e->usage =
"Usage: radio set debug [off]\n"
" Enable/Disable radio debugging.\n";
case CLI_GENERATE:
return NULL;
}
if (a->argc < 3 || a->argc > 4)
return CLI_SHOWUSAGE;
if (a->argc == 4 && strncasecmp(a->argv[3], "off", 3))
return CLI_SHOWUSAGE;
return RESULT_SUCCESS;
o = find_desc(usbradio_active);
if (a->argc == 3)
o->debuglevel = 1;
else
o->debuglevel = 0;
ast_cli(a->fd, "USB Radio debugging %s.\n", o->debuglevel ? "enabled" : "disabled");
return CLI_SUCCESS;
}
static int radio_set_debug_off(int fd, int argc, char *argv[])
{
struct chan_usbradio_pvt *o = find_desc(usbradio_active);
o->debuglevel=0;
ast_cli(fd,"usbradio debug off.\n");
return RESULT_SUCCESS;
}
static char key_usage[] =
"Usage: radio key\n"
" Simulates COR active.\n";
static char unkey_usage[] =
"Usage: radio unkey\n"
" Simulates COR un-active.\n";
/*
radio tune 6 3000 measured tx value
*/
static char radio_tune_usage[] =
"Usage: radio tune <function>\n"
" rxnoise\n"
" rxvoice\n"
" rxtone\n"
" rxsquelch [newsetting]\n"
" txvoice [newsetting]\n"
" txtone [newsetting]\n"
" auxvoice [newsetting]\n"
" save (settings to tuning file)\n"
"\n All [newsetting]'s are values 0-999\n\n";
static struct ast_cli_entry cli_usbradio[] = {
{ { "radio", "key", NULL },
console_key, "Simulate Rx Signal Present",
key_usage, NULL, NULL},
{ { "radio", "unkey", NULL },
console_unkey, "Simulate Rx Signal Lusb",
unkey_usage, NULL, NULL },
{ { "radio", "tune", NULL },
radio_tune, "Radio Tune",
radio_tune_usage, NULL, NULL },
{ { "radio", "set", "debug", NULL },
radio_set_debug, "Radio Debug",
radio_tune_usage, NULL, NULL },
{ { "radio", "set", "debug", "off", NULL },
radio_set_debug_off, "Radio Debug",
radio_tune_usage, NULL, NULL },
NEW_CLI(handle_cli_radio_key, "Simulate Rx Signal Present"),
NEW_CLI(handle_cli_radio_unkey, "Simulate Rx Signal Lusb"),
NEW_CLI(handle_cli_radio_tune, "Radio Tune"),
NEW_CLI(handle_cli_radio_set_debug, "Enable/Disable Radio Debugging"),
};
/*

View File

@ -67,29 +67,10 @@ static struct channel_usage {
int decoders;
} channels;
static char show_transcoder_usage[] =
"Usage: show transcoder\n"
" Displays channel utilization of Zaptel transcoder(s).\n";
static char transcoder_show_usage[] =
"Usage: transcoder show\n"
" Displays channel utilization of Zaptel transcoder(s).\n";
static int transcoder_show(int fd, int argc, char **argv);
static struct ast_cli_entry cli_deprecated[] = {
{ { "show", "transcoder", NULL },
transcoder_show,
"Display Zaptel transcoder utilization.",
show_transcoder_usage}
};
static char *handle_cli_transcoder_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static struct ast_cli_entry cli[] = {
{ { "transcoder", "show", NULL },
transcoder_show,
"Display Zaptel transcoder utilization.",
transcoder_show_usage, NULL,
&cli_deprecated[0]}
NEW_CLI(handle_cli_transcoder_show, "Display Zaptel transcoder utilization.")
};
struct format_map {
@ -116,18 +97,32 @@ struct pvt {
struct ast_frame f;
};
static int transcoder_show(int fd, int argc, char **argv)
static char *handle_cli_transcoder_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct channel_usage copy;
switch (cmd) {
case CLI_INIT:
e->command = "transcoder show";
e->usage =
"Usage: transcoder show\n"
" Displays channel utilization of Zaptel transcoder(s).\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 2)
return CLI_SHOWUSAGE;
copy = channels;
if (copy.total == 0)
ast_cli(fd, "No Zaptel transcoders found.\n");
ast_cli(a->fd, "No Zaptel transcoders found.\n");
else
ast_cli(fd, "%d/%d encoders/decoders of %d channels are in use.\n", copy.encoders, copy.decoders, copy.total);
ast_cli(a->fd, "%d/%d encoders/decoders of %d channels are in use.\n", copy.encoders, copy.decoders, copy.total);
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int zap_framein(struct ast_trans_pvt *pvt, struct ast_frame *f)
@ -492,4 +487,4 @@ AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_DEFAULT, "Generic Zaptel Transcode
.load = load_module,
.unload = unload_module,
.reload = reload,
);
);

View File

@ -2143,37 +2143,42 @@ int ast_parse_arg(const char *arg, enum ast_parse_flags flags,
return error;
}
static int config_command(int fd, int argc, char **argv)
static char *handle_cli_core_show_config_mappings(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ast_config_engine *eng;
struct ast_config_map *map;
switch (cmd) {
case CLI_INIT:
e->command = "core show config mappings";
e->usage =
"Usage: core show config mappings\n"
" Shows the filenames to config engines.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
ast_mutex_lock(&config_lock);
ast_cli(fd, "\n\n");
ast_cli(a->fd, "\n\n");
for (eng = config_engine_list; eng; eng = eng->next) {
ast_cli(fd, "\nConfig Engine: %s\n", eng->name);
ast_cli(a->fd, "\nConfig Engine: %s\n", eng->name);
for (map = config_maps; map; map = map->next)
if (!strcasecmp(map->driver, eng->name)) {
ast_cli(fd, "===> %s (db=%s, table=%s)\n", map->name, map->database,
ast_cli(a->fd, "===> %s (db=%s, table=%s)\n", map->name, map->database,
map->table ? map->table : map->name);
}
}
ast_cli(fd,"\n\n");
ast_cli(a->fd,"\n\n");
ast_mutex_unlock(&config_lock);
return 0;
return CLI_SUCCESS;
}
static char show_config_help[] =
"Usage: core show config mappings\n"
" Shows the filenames to config engines.\n";
static struct ast_cli_entry cli_config[] = {
{ { "core", "show", "config", "mappings", NULL },
config_command, "Display config mappings (file names to config engines)",
show_config_help },
NEW_CLI(handle_cli_core_show_config_mappings, "Display config mappings (file names to config engines)"),
};
int register_config_cli()

View File

@ -3801,16 +3801,14 @@ enum ast_bridge_result ast_rtp_bridge(struct ast_channel *c0, struct ast_channel
return res;
}
static int rtp_do_debug_ip(int fd, int argc, char *argv[])
static char *rtp_do_debug_ip(struct ast_cli_args *a)
{
struct hostent *hp;
struct ast_hostent ahp;
int port = 0;
char *p, *arg;
if (argc != 4)
return RESULT_SHOWUSAGE;
arg = argv[3];
arg = a->argv[3];
p = strstr(arg, ":");
if (p) {
*p = '\0';
@ -3818,29 +3816,29 @@ static int rtp_do_debug_ip(int fd, int argc, char *argv[])
port = atoi(p);
}
hp = ast_gethostbyname(arg, &ahp);
if (hp == NULL)
return RESULT_SHOWUSAGE;
if (hp == NULL) {
ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
return CLI_FAILURE;
}
rtpdebugaddr.sin_family = AF_INET;
memcpy(&rtpdebugaddr.sin_addr, hp->h_addr, sizeof(rtpdebugaddr.sin_addr));
rtpdebugaddr.sin_port = htons(port);
if (port == 0)
ast_cli(fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtpdebugaddr.sin_addr));
ast_cli(a->fd, "RTP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtpdebugaddr.sin_addr));
else
ast_cli(fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtpdebugaddr.sin_addr), port);
ast_cli(a->fd, "RTP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtpdebugaddr.sin_addr), port);
rtpdebug = 1;
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int rtcp_do_debug_ip(int fd, int argc, char *argv[])
static char *rtcp_do_debug_ip(struct ast_cli_args *a)
{
struct hostent *hp;
struct ast_hostent ahp;
int port = 0;
char *p, *arg;
if (argc != 4)
return RESULT_SHOWUSAGE;
arg = argv[3];
arg = a->argv[3];
p = strstr(arg, ":");
if (p) {
*p = '\0';
@ -3848,171 +3846,143 @@ static int rtcp_do_debug_ip(int fd, int argc, char *argv[])
port = atoi(p);
}
hp = ast_gethostbyname(arg, &ahp);
if (hp == NULL)
return RESULT_SHOWUSAGE;
if (hp == NULL) {
ast_cli(a->fd, "Lookup failed for '%s'\n", arg);
return CLI_FAILURE;
}
rtcpdebugaddr.sin_family = AF_INET;
memcpy(&rtcpdebugaddr.sin_addr, hp->h_addr, sizeof(rtcpdebugaddr.sin_addr));
rtcpdebugaddr.sin_port = htons(port);
if (port == 0)
ast_cli(fd, "RTCP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr));
ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr));
else
ast_cli(fd, "RTCP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr), port);
ast_cli(a->fd, "RTCP Debugging Enabled for IP: %s:%d\n", ast_inet_ntoa(rtcpdebugaddr.sin_addr), port);
rtcpdebug = 1;
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int rtp_do_debug(int fd, int argc, char *argv[])
static char *handle_cli_rtp_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 2) {
if (argc != 4)
return RESULT_SHOWUSAGE;
return rtp_do_debug_ip(fd, argc, argv);
switch (cmd) {
case CLI_INIT:
e->command = "rtp debug [off|ip]";
e->usage =
"Usage: rtp debug [off]|[ip host[:port]]\n"
" Enable/Disable dumping of all RTP packets. If 'ip' is\n"
" specified, limit the dumped packets to those to and from\n"
" the specified 'host' with optional port.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
rtpdebug = 1;
memset(&rtpdebugaddr,0,sizeof(rtpdebugaddr));
ast_cli(fd, "RTP Debugging Enabled\n");
return RESULT_SUCCESS;
}
static int rtcp_do_debug(int fd, int argc, char *argv[])
{
if (argc != 2) {
if (argc != 4)
return RESULT_SHOWUSAGE;
return rtcp_do_debug_ip(fd, argc, argv);
if (a->argc < 2 || a->argc > 4)
return CLI_SHOWUSAGE;
if (a->argc == 2) {
rtpdebug = 1;
memset(&rtpdebugaddr, 0, sizeof(rtpdebugaddr));
ast_cli(a->fd, "RTP Debugging Enabled\n");
} else if (a->argc == 3) {
if (strncasecmp(a->argv[2], "off", 3))
return CLI_SHOWUSAGE;
rtpdebug = 0;
ast_cli(a->fd, "RTP Debugging Disabled\n");
} else {
if (strncasecmp(a->argv[2], "ip", 2))
return CLI_SHOWUSAGE;
return rtp_do_debug_ip(a);
}
rtcpdebug = 1;
memset(&rtcpdebugaddr,0,sizeof(rtcpdebugaddr));
ast_cli(fd, "RTCP Debugging Enabled\n");
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int rtcp_do_stats(int fd, int argc, char *argv[])
static char *handle_cli_rtcp_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 2)
return RESULT_SHOWUSAGE;
rtcpstats = 1;
ast_cli(fd, "RTCP Stats Enabled\n");
return RESULT_SUCCESS;
switch (cmd) {
case CLI_INIT:
e->command = "rtcp debug [off|ip]";
e->usage =
"Usage: rtcp debug [off]|[ip host[:port]]\n"
" Enable/Disable dumping of all RTCP packets. If 'ip' is\n"
" specified, limit the dumped packets to those to and from\n"
" the specified 'host' with optional port.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc < 2 || a->argc > 4)
return CLI_SHOWUSAGE;
if (a->argc == 2) {
rtcpdebug = 1;
memset(&rtcpdebugaddr, 0, sizeof(rtcpdebugaddr));
ast_cli(a->fd, "RTCP Debugging Enabled\n");
} else if (a->argc == 3) {
if (strncasecmp(a->argv[2], "off", 3))
return CLI_SHOWUSAGE;
rtcpdebug = 0;
ast_cli(a->fd, "RTCP Debugging Disabled\n");
} else {
if (strncasecmp(a->argv[2], "ip", 2))
return CLI_SHOWUSAGE;
return rtcp_do_debug_ip(a);
}
return CLI_SUCCESS;
}
static int rtp_no_debug(int fd, int argc, char *argv[])
static char *handle_cli_rtcp_stats(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 3)
return RESULT_SHOWUSAGE;
rtpdebug = 0;
ast_cli(fd,"RTP Debugging Disabled\n");
return RESULT_SUCCESS;
switch (cmd) {
case CLI_INIT:
e->command = "rtcp stats [off]";
e->usage =
"Usage: rtcp stats [off]\n"
" Enable/Disable dumping of RTCP stats.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc < 2 || a->argc > 3)
return CLI_SHOWUSAGE;
if (a->argc == 3 && strncasecmp(a->argv[2], "off", 3))
return CLI_SHOWUSAGE;
rtcpstats = (a->argc == 3) ? 0 : 1;
ast_cli(a->fd, "RTCP Stats %s\n", rtcpstats ? "Enabled" : "Disabled");
return CLI_SUCCESS;
}
static int rtcp_no_debug(int fd, int argc, char *argv[])
static char *handle_cli_stun_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
if (argc != 3)
return RESULT_SHOWUSAGE;
rtcpdebug = 0;
ast_cli(fd,"RTCP Debugging Disabled\n");
return RESULT_SUCCESS;
switch (cmd) {
case CLI_INIT:
e->command = "stun debug [off]";
e->usage =
"Usage: stun debug [off]\n"
" Enable/Disable STUN (Simple Traversal of UDP through NATs)\n"
" debugging\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc < 2 || a->argc > 3)
return CLI_SHOWUSAGE;
if (a->argc == 3 && strncasecmp(a->argv[2], "off", 3))
return CLI_SHOWUSAGE;
stundebug = (a->argc == 3) ? 0 : 1;
ast_cli(a->fd, "STUN Debugging %s\n", stundebug ? "Enabled" : "Disabled");
return CLI_SUCCESS;
}
static int rtcp_no_stats(int fd, int argc, char *argv[])
{
if (argc != 3)
return RESULT_SHOWUSAGE;
rtcpstats = 0;
ast_cli(fd,"RTCP Stats Disabled\n");
return RESULT_SUCCESS;
}
static int stun_do_debug(int fd, int argc, char *argv[])
{
if (argc != 2)
return RESULT_SHOWUSAGE;
stundebug = 1;
ast_cli(fd, "STUN Debugging Enabled\n");
return RESULT_SUCCESS;
}
static int stun_no_debug(int fd, int argc, char *argv[])
{
if (argc != 3)
return RESULT_SHOWUSAGE;
stundebug = 0;
ast_cli(fd, "STUN Debugging Disabled\n");
return RESULT_SUCCESS;
}
static const char debug_usage[] =
"Usage: rtp debug [ip host[:port]]\n"
" Enable dumping of all RTP packets to and from host.\n";
static const char no_debug_usage[] =
"Usage: rtp debug off\n"
" Disable all RTP debugging\n";
static const char stun_debug_usage[] =
"Usage: stun debug\n"
" Enable STUN (Simple Traversal of UDP through NATs) debugging\n";
static const char stun_no_debug_usage[] =
"Usage: stun debug off\n"
" Disable STUN debugging\n";
static const char rtcp_debug_usage[] =
"Usage: rtcp debug [ip host[:port]]\n"
" Enable dumping of all RTCP packets to and from host.\n";
static const char rtcp_no_debug_usage[] =
"Usage: rtcp debug off\n"
" Disable all RTCP debugging\n";
static const char rtcp_stats_usage[] =
"Usage: rtcp stats\n"
" Enable dumping of RTCP stats.\n";
static const char rtcp_no_stats_usage[] =
"Usage: rtcp stats off\n"
" Disable all RTCP stats\n";
static struct ast_cli_entry cli_rtp[] = {
{ { "rtp", "debug", "ip", NULL },
rtp_do_debug, "Enable RTP debugging on IP",
debug_usage },
{ { "rtp", "debug", NULL },
rtp_do_debug, "Enable RTP debugging",
debug_usage },
{ { "rtp", "debug", "off", NULL },
rtp_no_debug, "Disable RTP debugging",
no_debug_usage },
{ { "rtcp", "debug", "ip", NULL },
rtcp_do_debug, "Enable RTCP debugging on IP",
rtcp_debug_usage },
{ { "rtcp", "debug", NULL },
rtcp_do_debug, "Enable RTCP debugging",
rtcp_debug_usage },
{ { "rtcp", "debug", "off", NULL },
rtcp_no_debug, "Disable RTCP debugging",
rtcp_no_debug_usage },
{ { "rtcp", "stats", NULL },
rtcp_do_stats, "Enable RTCP stats",
rtcp_stats_usage },
{ { "rtcp", "stats", "off", NULL },
rtcp_no_stats, "Disable RTCP stats",
rtcp_no_stats_usage },
{ { "stun", "debug", NULL },
stun_do_debug, "Enable STUN debugging",
stun_debug_usage },
{ { "stun", "debug", "off", NULL },
stun_no_debug, "Disable STUN debugging",
stun_no_debug_usage },
NEW_CLI(handle_cli_rtp_debug, "Enable/Disable RTP debugging"),
NEW_CLI(handle_cli_rtcp_debug, "Enable/Disable RTCP debugging"),
NEW_CLI(handle_cli_rtcp_stats, "Enable/Disable RTCP stats"),
NEW_CLI(handle_cli_stun_debug, "Enable/Disable STUN debugging"),
};
static int __ast_rtp_reload(int reload)

View File

@ -3,21 +3,21 @@
*
* Copyright (C) 1999-2005, Digium, Inc.
*
* Manuel Guesdon <mguesdon@oxymium.net> - Postgresql RealTime Driver Author/Adaptor
* Manuel Guesdon <mguesdon@oxymium.net> - PostgreSQL RealTime Driver Author/Adaptor
* Mark Spencer <markster@digium.com> - Asterisk Author
* Matthew Boehm <mboehm@cytelcom.com> - MySQL RealTime Driver Author
*
* res_config_pgsql.c <Postgresql plugin for RealTime configuration engine>
* res_config_pgsql.c <PostgreSQL plugin for RealTime configuration engine>
*
* v1.0 - (07-11-05) - Initial version based on res_config_mysql v2.0
*/
/*! \file
*
* \brief Postgresql plugin for Asterisk RealTime Architecture
* \brief PostgreSQL plugin for Asterisk RealTime Architecture
*
* \author Mark Spencer <markster@digium.com>
* \author Manuel Guesdon <mguesdon@oxymium.net> - Postgresql RealTime Driver Author/Adaptor
* \author Manuel Guesdon <mguesdon@oxymium.net> - PostgreSQL RealTime Driver Author/Adaptor
*
* \arg http://www.postgresql.org
*/
@ -64,16 +64,10 @@ static time_t connect_time = 0;
static int parse_config(int reload);
static int pgsql_reconnect(const char *database);
static int realtime_pgsql_status(int fd, int argc, char **argv);
static const char cli_realtime_pgsql_status_usage[] =
"Usage: realtime pgsql status\n"
" Shows connection information for the Postgresql RealTime driver\n";
static char *handle_cli_realtime_pgsql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
static struct ast_cli_entry cli_realtime[] = {
{ { "realtime", "pgsql", "status", NULL },
realtime_pgsql_status, "Shows connection information for the Postgresql RealTime driver",
cli_realtime_pgsql_status_usage },
NEW_CLI(handle_cli_realtime_pgsql_status, "Shows connection information for the PostgreSQL RealTime driver"),
};
static struct ast_variable *realtime_pgsql(const char *database, const char *table, va_list ap)
@ -88,7 +82,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
struct ast_variable *var = NULL, *prev = NULL;
if (!table) {
ast_log(LOG_WARNING, "Postgresql RealTime: No table specified.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: No table specified.\n");
return NULL;
}
@ -97,7 +91,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
newval = va_arg(ap, const char *);
if (!newparam || !newval) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
"PostgreSQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
if (pgsqlConn) {
PQfinish(pgsqlConn);
pgsqlConn = NULL;
@ -131,9 +125,9 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
if (!(result = PQexec(pgsqlConn, sql))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return NULL;
} else {
@ -142,16 +136,16 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return NULL;
}
}
ast_debug(1, "1Postgresql RealTime: Result=%p Query: %s\n", result, sql);
ast_debug(1, "PostgreSQL RealTime: Result=%p Query: %s\n", result, sql);
if ((num_rows = PQntuples(result)) > 0) {
int i = 0;
@ -159,7 +153,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
int numFields = PQnfields(result);
char **fieldnames = NULL;
ast_debug(1, "Postgresql RealTime: Found %d rows.\n", num_rows);
ast_debug(1, "PostgreSQL RealTime: Found %d rows.\n", num_rows);
if (!(fieldnames = ast_calloc(1, numFields * sizeof(char *)))) {
ast_mutex_unlock(&pgsql_lock);
@ -189,7 +183,7 @@ static struct ast_variable *realtime_pgsql(const char *database, const char *tab
ast_free(fieldnames);
} else {
ast_log(LOG_WARNING,
"Postgresql RealTime: Could not find any rows in table %s.\n", table);
"PostgreSQL RealTime: Could not find any rows in table %s.\n", table);
}
ast_mutex_unlock(&pgsql_lock);
@ -213,7 +207,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
struct ast_category *cat = NULL;
if (!table) {
ast_log(LOG_WARNING, "Postgresql RealTime: No table specified.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: No table specified.\n");
return NULL;
}
@ -225,7 +219,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
newval = va_arg(ap, const char *);
if (!newparam || !newval) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
"PostgreSQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
if (pgsqlConn) {
PQfinish(pgsqlConn);
pgsqlConn = NULL;
@ -273,9 +267,9 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
if (!(result = PQexec(pgsqlConn, sql))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return NULL;
} else {
@ -284,16 +278,16 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return NULL;
}
}
ast_debug(1, "2Postgresql RealTime: Result=%p Query: %s\n", result, sql);
ast_debug(1, "PostgreSQL RealTime: Result=%p Query: %s\n", result, sql);
if ((num_rows = PQntuples(result)) > 0) {
int numFields = PQnfields(result);
@ -301,7 +295,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
int rowIndex = 0;
char **fieldnames = NULL;
ast_debug(1, "Postgresql RealTime: Found %d rows.\n", num_rows);
ast_debug(1, "PostgreSQL RealTime: Found %d rows.\n", num_rows);
if (!(fieldnames = ast_calloc(1, numFields * sizeof(char *)))) {
ast_mutex_unlock(&pgsql_lock);
@ -333,7 +327,7 @@ static struct ast_config *realtime_multi_pgsql(const char *database, const char
ast_free(fieldnames);
} else {
ast_log(LOG_WARNING,
"Postgresql RealTime: Could not find any rows in table %s.\n", table);
"PostgreSQL RealTime: Could not find any rows in table %s.\n", table);
}
ast_mutex_unlock(&pgsql_lock);
@ -351,7 +345,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
const char *newparam, *newval;
if (!table) {
ast_log(LOG_WARNING, "Postgresql RealTime: No table specified.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: No table specified.\n");
return -1;
}
@ -360,7 +354,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
newval = va_arg(ap, const char *);
if (!newparam || !newval) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
"PostgreSQL RealTime: Realtime retrieval requires at least 1 parameter and 1 value to search on.\n");
if (pgsqlConn) {
PQfinish(pgsqlConn);
pgsqlConn = NULL;
@ -381,7 +375,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
snprintf(sql + strlen(sql), sizeof(sql) - strlen(sql), " WHERE %s = '%s'", keyfield,
lookup);
ast_debug(1, "Postgresql RealTime: Update SQL: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Update SQL: %s\n", sql);
/* We now have our complete statement; Lets connect to the server and execute it. */
ast_mutex_lock(&pgsql_lock);
@ -392,9 +386,9 @@ static int update_pgsql(const char *database, const char *table, const char *key
if (!(result = PQexec(pgsqlConn, sql))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return -1;
} else {
@ -403,9 +397,9 @@ static int update_pgsql(const char *database, const char *table, const char *key
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return -1;
@ -415,7 +409,7 @@ static int update_pgsql(const char *database, const char *table, const char *key
numrows = atoi(PQcmdTuples(result));
ast_mutex_unlock(&pgsql_lock);
ast_debug(1, "Postgresql RealTime: Updated %d rows on table: %s\n", numrows, table);
ast_debug(1, "PostgreSQL RealTime: Updated %d rows on table: %s\n", numrows, table);
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -441,7 +435,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
const char *newparam, *newval;
if (!table) {
ast_log(LOG_WARNING, "Postgresql RealTime: No table specified.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: No table specified.\n");
return -1;
}
@ -450,7 +444,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
newval = va_arg(ap, const char *);
if (!newparam || !newval) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Realtime storage requires at least 1 parameter and 1 value to store.\n");
"PostgreSQL RealTime: Realtime storage requires at least 1 parameter and 1 value to store.\n");
if (pgsqlConn) {
PQfinish(pgsqlConn);
pgsqlConn = NULL;
@ -481,13 +475,13 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
va_end(ap);
snprintf(sql, sizeof(sql), "INSERT INTO (%s) VALUES (%s)", params, vals);
ast_debug(1, "Postgresql RealTime: Insert SQL: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Insert SQL: %s\n", sql);
if (!(result = PQexec(pgsqlConn, sql))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return -1;
} else {
@ -496,9 +490,9 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return -1;
@ -508,7 +502,7 @@ static int store_pgsql(const char *database, const char *table, va_list ap)
insertid = PQoidValue(result);
ast_mutex_unlock(&pgsql_lock);
ast_debug(1, "Postgresql RealTime: row inserted on table: %s, id: %u\n", table, insertid);
ast_debug(1, "PostgreSQL RealTime: row inserted on table: %s, id: %u\n", table, insertid);
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -532,7 +526,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
const char *newparam, *newval;
if (!table) {
ast_log(LOG_WARNING, "Postgresql RealTime: No table specified.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: No table specified.\n");
return -1;
}
@ -542,7 +536,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
if (!newparam || !newval) {*/
if (ast_strlen_zero(keyfield) || ast_strlen_zero(lookup)) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Realtime destroy requires at least 1 parameter and 1 value to search on.\n");
"PostgreSQL RealTime: Realtime destroy requires at least 1 parameter and 1 value to search on.\n");
if (pgsqlConn) {
PQfinish(pgsqlConn);
pgsqlConn = NULL;
@ -572,13 +566,13 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
}
va_end(ap);
ast_debug(1, "Postgresql RealTime: Delete SQL: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Delete SQL: %s\n", sql);
if (!(result = PQexec(pgsqlConn, sql))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return -1;
} else {
@ -587,9 +581,9 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return -1;
@ -599,7 +593,7 @@ static int destroy_pgsql(const char *database, const char *table, const char *ke
numrows = atoi(PQcmdTuples(result));
ast_mutex_unlock(&pgsql_lock);
ast_debug(1, "Postgresql RealTime: Deleted %d rows on table: %s\n", numrows, table);
ast_debug(1, "PostgreSQL RealTime: Deleted %d rows on table: %s\n", numrows, table);
/* From http://dev.pgsql.com/doc/pgsql/en/pgsql-affected-rows.html
* An integer greater than zero indicates the number of rows affected
@ -631,7 +625,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
last[0] = '\0';
if (!file || !strcmp(file, RES_CONFIG_PGSQL_CONF)) {
ast_log(LOG_WARNING, "Postgresql RealTime: Cannot configure myself.\n");
ast_log(LOG_WARNING, "PostgreSQL RealTime: Cannot configure myself.\n");
return NULL;
}
@ -639,7 +633,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
ast_build_string(&sql, &sqlleft, "WHERE filename='%s' and commented=0", file);
ast_build_string(&sql, &sqlleft, "ORDER BY cat_metric DESC, var_metric ASC, category, var_name ");
ast_debug(1, "Postgresql RealTime: Static SQL: %s\n", sqlbuf);
ast_debug(1, "PostgreSQL RealTime: Static SQL: %s\n", sqlbuf);
/* We now have our complete statement; Lets connect to the server and execute it. */
ast_mutex_lock(&pgsql_lock);
@ -650,9 +644,9 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
if (!(result = PQexec(pgsqlConn, sqlbuf))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s\n", PQerrorMessage(pgsqlConn));
ast_mutex_unlock(&pgsql_lock);
return NULL;
} else {
@ -661,9 +655,9 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
&& result_status != PGRES_TUPLES_OK
&& result_status != PGRES_NONFATAL_ERROR) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "Postgresql RealTime: Query: %s\n", sql);
ast_debug(1, "Postgresql RealTime: Query Failed because: %s (%s)\n",
"PostgreSQL RealTime: Failed to query database. Check debug for more info.\n");
ast_debug(1, "PostgreSQL RealTime: Query: %s\n", sql);
ast_debug(1, "PostgreSQL RealTime: Query Failed because: %s (%s)\n",
PQresultErrorMessage(result), PQresStatus(result_status));
ast_mutex_unlock(&pgsql_lock);
return NULL;
@ -673,7 +667,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
if ((num_rows = PQntuples(result)) > 0) {
int rowIndex = 0;
ast_debug(1, "Postgresql RealTime: Found %ld rows.\n", num_rows);
ast_debug(1, "PostgreSQL RealTime: Found %ld rows.\n", num_rows);
for (rowIndex = 0; rowIndex < num_rows; rowIndex++) {
char *field_category = PQgetvalue(result, rowIndex, 0);
@ -702,7 +696,7 @@ static struct ast_config *config_pgsql(const char *database, const char *table,
}
} else {
ast_log(LOG_WARNING,
"Postgresql RealTime: Could not find config '%s' in database.\n", file);
"PostgreSQL RealTime: Could not find config '%s' in database.\n", file);
}
PQclear(result);
@ -727,7 +721,7 @@ static int load_module(void)
return AST_MODULE_LOAD_DECLINE;
ast_config_engine_register(&pgsql_engine);
ast_verb(1, "Postgresql RealTime driver loaded.\n");
ast_verb(1, "PostgreSQL RealTime driver loaded.\n");
ast_cli_register_multiple(cli_realtime, sizeof(cli_realtime) / sizeof(struct ast_cli_entry));
return 0;
@ -744,7 +738,7 @@ static int unload_module(void)
}
ast_cli_unregister_multiple(cli_realtime, sizeof(cli_realtime) / sizeof(struct ast_cli_entry));
ast_config_engine_deregister(&pgsql_engine);
ast_verb(1, "Postgresql RealTime unloaded.\n");
ast_verb(1, "PostgreSQL RealTime unloaded.\n");
/* Unlock so something else can destroy the lock. */
ast_mutex_unlock(&pgsql_lock);
@ -782,7 +776,7 @@ static int parse_config(int reload)
if (!(s = ast_variable_retrieve(config, "general", "dbuser"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database user found, using 'asterisk' as default.\n");
"PostgreSQL RealTime: No database user found, using 'asterisk' as default.\n");
strcpy(dbuser, "asterisk");
} else {
ast_copy_string(dbuser, s, sizeof(dbuser));
@ -790,7 +784,7 @@ static int parse_config(int reload)
if (!(s = ast_variable_retrieve(config, "general", "dbpass"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database password found, using 'asterisk' as default.\n");
"PostgreSQL RealTime: No database password found, using 'asterisk' as default.\n");
strcpy(dbpass, "asterisk");
} else {
ast_copy_string(dbpass, s, sizeof(dbpass));
@ -798,7 +792,7 @@ static int parse_config(int reload)
if (!(s = ast_variable_retrieve(config, "general", "dbhost"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database host found, using localhost via socket.\n");
"PostgreSQL RealTime: No database host found, using localhost via socket.\n");
dbhost[0] = '\0';
} else {
ast_copy_string(dbhost, s, sizeof(dbhost));
@ -806,7 +800,7 @@ static int parse_config(int reload)
if (!(s = ast_variable_retrieve(config, "general", "dbname"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database name found, using 'asterisk' as default.\n");
"PostgreSQL RealTime: No database name found, using 'asterisk' as default.\n");
strcpy(dbname, "asterisk");
} else {
ast_copy_string(dbname, s, sizeof(dbname));
@ -814,7 +808,7 @@ static int parse_config(int reload)
if (!(s = ast_variable_retrieve(config, "general", "dbport"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database port found, using 5432 as default.\n");
"PostgreSQL RealTime: No database port found, using 5432 as default.\n");
dbport = 5432;
} else {
dbport = atoi(s);
@ -822,7 +816,7 @@ static int parse_config(int reload)
if (!ast_strlen_zero(dbhost) && !(s = ast_variable_retrieve(config, "general", "dbsock"))) {
ast_log(LOG_WARNING,
"Postgresql RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n");
"PostgreSQL RealTime: No database socket found, using '/tmp/pgsql.sock' as default.\n");
strcpy(dbsock, "/tmp/pgsql.sock");
} else {
ast_copy_string(dbsock, s, sizeof(dbsock));
@ -831,23 +825,23 @@ static int parse_config(int reload)
if (option_debug) {
if (!ast_strlen_zero(dbhost)) {
ast_debug(1, "Postgresql RealTime Host: %s\n", dbhost);
ast_debug(1, "Postgresql RealTime Port: %i\n", dbport);
ast_debug(1, "PostgreSQL RealTime Host: %s\n", dbhost);
ast_debug(1, "PostgreSQL RealTime Port: %i\n", dbport);
} else {
ast_debug(1, "Postgresql RealTime Socket: %s\n", dbsock);
ast_debug(1, "PostgreSQL RealTime Socket: %s\n", dbsock);
}
ast_debug(1, "Postgresql RealTime User: %s\n", dbuser);
ast_debug(1, "Postgresql RealTime Password: %s\n", dbpass);
ast_debug(1, "Postgresql RealTime DBName: %s\n", dbname);
ast_debug(1, "PostgreSQL RealTime User: %s\n", dbuser);
ast_debug(1, "PostgreSQL RealTime Password: %s\n", dbpass);
ast_debug(1, "PostgreSQL RealTime DBName: %s\n", dbname);
}
if (!pgsql_reconnect(NULL)) {
ast_log(LOG_WARNING,
"Postgresql RealTime: Couldn't establish connection. Check debug.\n");
ast_debug(1, "Postgresql RealTime: Cannot Connect: %s\n", PQerrorMessage(pgsqlConn));
"PostgreSQL RealTime: Couldn't establish connection. Check debug.\n");
ast_debug(1, "PostgreSQL RealTime: Cannot Connect: %s\n", PQerrorMessage(pgsqlConn));
}
ast_verb(2, "Postgresql RealTime reloaded.\n");
ast_verb(2, "PostgreSQL RealTime reloaded.\n");
/* Done reloading. Release lock so others can now use driver. */
ast_mutex_unlock(&pgsql_lock);
@ -887,61 +881,72 @@ static int pgsql_reconnect(const char *database)
connInfo = NULL;
ast_debug(1, "pgsqlConn=%p\n", pgsqlConn);
if (pgsqlConn && PQstatus(pgsqlConn) == CONNECTION_OK) {
ast_debug(1, "Postgresql RealTime: Successfully connected to database.\n");
ast_debug(1, "PostgreSQL RealTime: Successfully connected to database.\n");
connect_time = time(NULL);
return 1;
} else {
ast_log(LOG_ERROR,
"Postgresql RealTime: Failed to connect database server %s on %s. Check debug for more info.\n",
"PostgreSQL RealTime: Failed to connect database server %s on %s. Check debug for more info.\n",
dbname, dbhost);
ast_debug(1, "Postgresql RealTime: Cannot Connect: %s\n", PQresultErrorMessage(NULL));
ast_debug(1, "PostgreSQL RealTime: Cannot Connect: %s\n", PQresultErrorMessage(NULL));
return 0;
}
} else {
ast_debug(1, "Postgresql RealTime: Everything is fine.\n");
ast_debug(1, "PostgreSQL RealTime: Everything is fine.\n");
return 1;
}
}
static int realtime_pgsql_status(int fd, int argc, char **argv)
static char *handle_cli_realtime_pgsql_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
char status[256], status2[100] = "";
int ctime = time(NULL) - connect_time;
switch (cmd) {
case CLI_INIT:
e->command = "realtime pgsql status";
e->usage =
"Usage: realtime pgsql status\n"
" Shows connection information for the PostgreSQL RealTime driver\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 3)
return CLI_SHOWUSAGE;
if (pgsqlConn && PQstatus(pgsqlConn) == CONNECTION_OK) {
if (!ast_strlen_zero(dbhost)) {
if (!ast_strlen_zero(dbhost))
snprintf(status, 255, "Connected to %s@%s, port %d", dbname, dbhost, dbport);
} else if (!ast_strlen_zero(dbsock)) {
else if (!ast_strlen_zero(dbsock))
snprintf(status, 255, "Connected to %s on socket file %s", dbname, dbsock);
} else {
else
snprintf(status, 255, "Connected to %s@%s", dbname, dbhost);
}
if (!ast_strlen_zero(dbuser)) {
if (!ast_strlen_zero(dbuser))
snprintf(status2, 99, " with username %s", dbuser);
}
if (ctime > 31536000) {
ast_cli(fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n",
if (ctime > 31536000)
ast_cli(a->fd, "%s%s for %d years, %d days, %d hours, %d minutes, %d seconds.\n",
status, status2, ctime / 31536000, (ctime % 31536000) / 86400,
(ctime % 86400) / 3600, (ctime % 3600) / 60, ctime % 60);
} else if (ctime > 86400) {
ast_cli(fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n", status,
else if (ctime > 86400)
ast_cli(a->fd, "%s%s for %d days, %d hours, %d minutes, %d seconds.\n", status,
status2, ctime / 86400, (ctime % 86400) / 3600, (ctime % 3600) / 60,
ctime % 60);
} else if (ctime > 3600) {
ast_cli(fd, "%s%s for %d hours, %d minutes, %d seconds.\n", status, status2,
else if (ctime > 3600)
ast_cli(a->fd, "%s%s for %d hours, %d minutes, %d seconds.\n", status, status2,
ctime / 3600, (ctime % 3600) / 60, ctime % 60);
} else if (ctime > 60) {
ast_cli(fd, "%s%s for %d minutes, %d seconds.\n", status, status2, ctime / 60,
else if (ctime > 60)
ast_cli(a->fd, "%s%s for %d minutes, %d seconds.\n", status, status2, ctime / 60,
ctime % 60);
} else {
ast_cli(fd, "%s%s for %d seconds.\n", status, status2, ctime);
}
else
ast_cli(a->fd, "%s%s for %d seconds.\n", status, status2, ctime);
return RESULT_SUCCESS;
return CLI_SUCCESS;
} else {
return RESULT_FAILURE;
return CLI_FAILURE;
}
}

View File

@ -106,10 +106,6 @@
#define RES_CONFIG_SQLITE_DRIVER "sqlite"
#define RES_CONFIG_SQLITE_DESCRIPTION "Resource Module for SQLite 2"
#define RES_CONFIG_SQLITE_CONF_FILE "res_config_sqlite.conf"
#define RES_CONFIG_SQLITE_STATUS_SUMMARY "Show status information about the SQLite 2 driver"
#define RES_CONFIG_SQLITE_STATUS_USAGE \
"Usage: show sqlite status\n" \
" " RES_CONFIG_SQLITE_STATUS_SUMMARY "\n"
enum {
RES_CONFIG_SQLITE_CONFIG_ID,
@ -456,7 +452,7 @@ static int realtime_destroy_handler(const char *database, const char *table,
* \param argv arguments list
* \return RESULT_SUCCESS
*/
static int cli_status(int fd, int argc, char *argv[]);
static char *handle_cli_show_sqlite_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
/*! The SQLite database object. */
static sqlite *db;
@ -503,12 +499,8 @@ AST_MUTEX_DEFINE_STATIC(mutex);
* Structure containing details and callback functions for the CLI status
* command.
*/
static struct ast_cli_entry cli_status_cmd =
{
.cmda = {"show", "sqlite", "status", NULL},
.handler = cli_status,
.summary = RES_CONFIG_SQLITE_STATUS_SUMMARY,
.usage = RES_CONFIG_SQLITE_STATUS_USAGE
static struct ast_cli_entry cli_status[] = {
NEW_CLI(handle_cli_show_sqlite_status, "Show status information about the SQLite 2 driver"),
};
/*
@ -1382,31 +1374,44 @@ static int realtime_destroy_handler(const char *database, const char *table,
return rows_num;
}
static int cli_status(int fd, int argc, char *argv[])
static char *handle_cli_show_sqlite_status(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
ast_cli(fd, "SQLite database path: %s\n", dbfile);
ast_cli(fd, "config_table: ");
switch (cmd) {
case CLI_INIT:
e->command = "show sqlite status";
e->usage =
"Usage: show sqlite status\n"
" Show status information about the SQLite 2 driver\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 3)
return CLI_SHOWUSAGE;
ast_cli(a->fd, "SQLite database path: %s\n", dbfile);
ast_cli(a->fd, "config_table: ");
if (!config_table)
ast_cli(fd, "unspecified, must be present in extconfig.conf\n");
ast_cli(a->fd, "unspecified, must be present in extconfig.conf\n");
else
ast_cli(fd, "%s\n", config_table);
ast_cli(a->fd, "%s\n", config_table);
ast_cli(fd, "cdr_table: ");
ast_cli(a->fd, "cdr_table: ");
if (!cdr_table)
ast_cli(fd, "unspecified, CDR support disabled\n");
ast_cli(a->fd, "unspecified, CDR support disabled\n");
else
ast_cli(fd, "%s\n", cdr_table);
ast_cli(a->fd, "%s\n", cdr_table);
return RESULT_SUCCESS;
return CLI_SUCCESS;
}
static int unload_module(void)
{
if (cli_status_registered)
ast_cli_unregister(&cli_status_cmd);
ast_cli_unregister_multiple(cli_status, sizeof(cli_status) / sizeof(struct ast_cli_entry));
if (cdr_registered)
ast_cdr_unregister(RES_CONFIG_SQLITE_NAME);
@ -1516,7 +1521,7 @@ static int load_module(void)
cdr_registered = 1;
}
error = ast_cli_register(&cli_status_cmd);
error = ast_cli_register_multiple(cli_status, sizeof(cli_status) / sizeof(struct ast_cli_entry));
if (error) {
unload_module();

View File

@ -52,22 +52,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
/* Globals */
static const char config[] = "indications.conf";
/*
* Help for commands provided by this module ...
*/
static char help_add_indication[] =
"Usage: indication add <country> <indication> \"<tonelist>\"\n"
" Add the given indication to the country.\n";
static char help_remove_indication[] =
"Usage: indication remove <country> <indication>\n"
" Remove the given indication from the country.\n";
static char help_show_indications[] =
"Usage: indication show [<country> ...]\n"
" Display either a condensed for of all country/indications, or the\n"
" indications for the specified countries.\n";
char *playtones_desc=
"PlayTones(arg): Plays a tone list. Execution will continue with the next step immediately,\n"
"while the tones continue to play.\n"
@ -82,122 +66,159 @@ char *playtones_desc=
/*!
* \brief Add a country to indication
* \param fd file descriptor of CLI
* \param argc no of args
* \param argv arguements
* \param e the ast_cli_entry for this CLI command
* \param cmd the reason we are being called
* \param a the arguments being passed to us
*/
static int handle_add_indication(int fd, int argc, char *argv[])
static char *handle_cli_indication_add(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ind_tone_zone *tz;
int created_country = 0;
if (argc != 5) return RESULT_SHOWUSAGE;
tz = ast_get_indication_zone(argv[2]);
switch (cmd) {
case CLI_INIT:
e->command = "indication add";
e->usage =
"Usage: indication add <country> <indication> \"<tonelist>\"\n"
" Add the given indication to the country.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 5)
return CLI_SHOWUSAGE;
tz = ast_get_indication_zone(a->argv[2]);
if (!tz) {
/* country does not exist, create it */
ast_log(LOG_NOTICE, "Country '%s' does not exist, creating it.\n",argv[2]);
ast_log(LOG_NOTICE, "Country '%s' does not exist, creating it.\n", a->argv[2]);
if (!(tz = ast_calloc(1, sizeof(*tz)))) {
return -1;
return CLI_FAILURE;
}
ast_copy_string(tz->country,argv[2],sizeof(tz->country));
ast_copy_string(tz->country, a->argv[2], sizeof(tz->country));
if (ast_register_indication_country(tz)) {
ast_log(LOG_WARNING, "Unable to register new country\n");
ast_free(tz);
return -1;
return CLI_FAILURE;
}
created_country = 1;
}
if (ast_register_indication(tz,argv[3],argv[4])) {
ast_log(LOG_WARNING, "Unable to register indication %s/%s\n",argv[2],argv[3]);
if (ast_register_indication(tz, a->argv[3], a->argv[4])) {
ast_log(LOG_WARNING, "Unable to register indication %s/%s\n", a->argv[2], a->argv[3]);
if (created_country)
ast_unregister_indication_country(argv[2]);
return -1;
ast_unregister_indication_country(a->argv[2]);
return CLI_FAILURE;
}
return 0;
return CLI_SUCCESS;
}
/*!
* \brief Remove a country from indication
* \param fd file descriptor of CLI
* \param argc no of args
* \param argv arguements
* \param e the ast_cli_entry for this CLI command
* \param cmd the reason we are being called
* \param a the arguments being passed to us
*/
static int handle_remove_indication(int fd, int argc, char *argv[])
static char *handle_cli_indication_remove(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ind_tone_zone *tz;
if (argc != 3 && argc != 4) return RESULT_SHOWUSAGE;
if (argc == 3) {
switch (cmd) {
case CLI_INIT:
e->command = "indication remove";
e->usage =
"Usage: indication remove <country> <indication>\n"
" Remove the given indication from the country.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc != 3 && a->argc != 4)
return CLI_SHOWUSAGE;
if (a->argc == 3) {
/* remove entiry country */
if (ast_unregister_indication_country(argv[2])) {
ast_log(LOG_WARNING, "Unable to unregister indication country %s\n",argv[2]);
return -1;
if (ast_unregister_indication_country(a->argv[2])) {
ast_log(LOG_WARNING, "Unable to unregister indication country %s\n", a->argv[2]);
return CLI_FAILURE;
}
return 0;
return CLI_SUCCESS;
}
tz = ast_get_indication_zone(argv[2]);
tz = ast_get_indication_zone(a->argv[2]);
if (!tz) {
ast_log(LOG_WARNING, "Unable to unregister indication %s/%s, country does not exists\n",argv[2],argv[3]);
return -1;
ast_log(LOG_WARNING, "Unable to unregister indication %s/%s, country does not exists\n", a->argv[2], a->argv[3]);
return CLI_FAILURE;
}
if (ast_unregister_indication(tz,argv[3])) {
ast_log(LOG_WARNING, "Unable to unregister indication %s/%s\n",argv[2],argv[3]);
return -1;
if (ast_unregister_indication(tz, a->argv[3])) {
ast_log(LOG_WARNING, "Unable to unregister indication %s/%s\n", a->argv[2], a->argv[3]);
return CLI_FAILURE;
}
return 0;
return CLI_SUCCESS;
}
/*!
* \brief Show the current indications
* \param fd file descriptor of CLI
* \param argc no of args
* \param argv arguements
* \param e the ast_cli_entry for this CLI command
* \param cmd the reason we are being called
* \param a the arguments being passed to us
*/
static int handle_show_indications(int fd, int argc, char *argv[])
static char *handle_cli_indication_show(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
{
struct ind_tone_zone *tz = NULL;
char buf[256];
int found_country = 0;
if (argc == 2) {
switch (cmd) {
case CLI_INIT:
e->command = "indication show";
e->usage =
"Usage: indication show [<country> ...]\n"
" Display either a condensed for of all country/indications, or the\n"
" indications for the specified countries.\n";
return NULL;
case CLI_GENERATE:
return NULL;
}
if (a->argc == 2) {
/* no arguments, show a list of countries */
ast_cli(fd,"Country Alias Description\n"
"===========================\n");
while ( (tz = ast_walk_indications(tz) ) )
ast_cli(fd,"%-7.7s %-7.7s %s\n", tz->country, tz->alias, tz->description);
return 0;
ast_cli(a->fd, "Country Alias Description\n");
ast_cli(a->fd, "===========================\n");
while ((tz = ast_walk_indications(tz)))
ast_cli(a->fd, "%-7.7s %-7.7s %s\n", tz->country, tz->alias, tz->description);
return CLI_SUCCESS;
}
/* there was a request for specific country(ies), lets humor them */
while ( (tz = ast_walk_indications(tz) ) ) {
int i,j;
for (i=2; i<argc; i++) {
if (strcasecmp(tz->country,argv[i])==0 &&
!tz->alias[0]) {
while ((tz = ast_walk_indications(tz))) {
int i, j;
for (i = 2; i < a->argc; i++) {
if (strcasecmp(tz->country, a->argv[i]) == 0 && !tz->alias[0]) {
struct ind_tone_zone_sound* ts;
if (!found_country) {
found_country = 1;
ast_cli(fd,"Country Indication PlayList\n"
"=====================================\n");
ast_cli(a->fd, "Country Indication PlayList\n");
ast_cli(a->fd, "=====================================\n");
}
j = snprintf(buf,sizeof(buf),"%-7.7s %-15.15s ",tz->country,"<ringcadence>");
for (i=0; i<tz->nrringcadence; i++) {
j += snprintf(buf+j,sizeof(buf)-j,"%d,",tz->ringcadence[i]);
j = snprintf(buf, sizeof(buf), "%-7.7s %-15.15s ", tz->country, "<ringcadence>");
for (i = 0; i < tz->nrringcadence; i++) {
j += snprintf(buf + j, sizeof(buf) - j, "%d,", tz->ringcadence[i]);
}
if (tz->nrringcadence)
j--;
ast_copy_string(buf+j,"\n",sizeof(buf)-j);
ast_cli(fd,buf);
for (ts=tz->tones; ts; ts=ts->next)
ast_cli(fd,"%-7.7s %-15.15s %s\n",tz->country,ts->name,ts->data);
ast_copy_string(buf + j, "\n", sizeof(buf) - j);
ast_cli(a->fd, buf);
for (ts = tz->tones; ts; ts = ts->next)
ast_cli(a->fd, "%-7.7s %-15.15s %s\n", tz->country, ts->name, ts->data);
break;
}
}
}
if (!found_country)
ast_cli(fd,"No countries matched your criteria.\n");
return -1;
ast_cli(a->fd, "No countries matched your criteria.\n");
return CLI_SUCCESS;
}
/*!
@ -361,17 +382,9 @@ out: v = v->next;
/*! \brief CLI entries for commands provided by this module */
static struct ast_cli_entry cli_indications[] = {
{ { "indication", "add", NULL },
handle_add_indication, "Add the given indication to the country",
help_add_indication, NULL },
{ { "indication", "remove", NULL },
handle_remove_indication, "Remove the given indication from the country",
help_remove_indication, NULL },
{ { "indication", "show", NULL },
handle_show_indications, "Display a list of all countries/indications",
help_show_indications },
NEW_CLI(handle_cli_indication_add, "Add the given indication to the country"),
NEW_CLI(handle_cli_indication_remove, "Remove the given indication from the country"),
NEW_CLI(handle_cli_indication_show, "Display a list of all countries/indications")
};
/*! \brief Unload indicators module */