|
|
|
@ -1953,8 +1953,6 @@ static int peer_status(struct sip_peer *peer, char *status, int statuslen);
|
|
|
|
|
static char *sip_show_sched(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
|
|
|
|
|
static char * _sip_show_peers(int fd, int *total, struct mansession *s, const struct message *m, int argc, const char *argv[]);
|
|
|
|
|
static char *sip_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
|
|
|
|
|
static char *_sip_dbdump(int fd, int *total, struct mansession *s, const struct message *m, int argc, const char *argv[]);
|
|
|
|
|
static char *sip_dbdump(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
|
|
|
|
|
static char *sip_show_objects(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a);
|
|
|
|
|
static void print_group(int fd, ast_group_t group, int crlf);
|
|
|
|
|
static const char *dtmfmode2str(int mode) attribute_const;
|
|
|
|
@ -12302,287 +12300,6 @@ static char *sip_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_arg
|
|
|
|
|
return _sip_show_peers(a->fd, NULL, NULL, NULL, a->argc, (const char **) a->argv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! \brief Execute sip dbdump command
|
|
|
|
|
*/
|
|
|
|
|
static char *sip_dbdump(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)
|
|
|
|
|
{
|
|
|
|
|
switch (cmd) {
|
|
|
|
|
case CLI_INIT:
|
|
|
|
|
e->command = "sip dbdump";
|
|
|
|
|
e->usage =
|
|
|
|
|
"Usage: sip dbdump [<file>]\n"
|
|
|
|
|
" dumps user/peer info to the screen in SQL INSERT command form\n"
|
|
|
|
|
" Optional file path will be output instead of to console if present.\n";
|
|
|
|
|
return NULL;
|
|
|
|
|
case CLI_GENERATE:
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return _sip_dbdump(a->fd, NULL, NULL, NULL, a->argc, (const char **) a->argv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/*! \brief Actually execute sip dbdump command */
|
|
|
|
|
static char *_sip_dbdump(int fd, int *total, struct mansession *s, const struct message *m, int argc, const char *argv[])
|
|
|
|
|
{
|
|
|
|
|
struct sip_peer *peer;
|
|
|
|
|
struct ao2_iterator i;
|
|
|
|
|
char fname[1024];
|
|
|
|
|
const char *id;
|
|
|
|
|
FILE *f1;
|
|
|
|
|
char idtext[256] = "";
|
|
|
|
|
int realtimepeers;
|
|
|
|
|
|
|
|
|
|
realtimepeers = ast_check_realtime("sippeers");
|
|
|
|
|
|
|
|
|
|
if (s) { /* Manager - get ActionID */
|
|
|
|
|
id = astman_get_header(m, "ActionID");
|
|
|
|
|
if (!ast_strlen_zero(id))
|
|
|
|
|
snprintf(idtext, sizeof(idtext), "ActionID: %s\r\n", id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
switch (argc) {
|
|
|
|
|
case 3:
|
|
|
|
|
strncpy(fname, argv[2], sizeof(fname));
|
|
|
|
|
f1 = fopen(fname, "w");
|
|
|
|
|
if (!f1) {
|
|
|
|
|
ast_cli(fd, "Sorry, could not open %s for writing!", fname);
|
|
|
|
|
return CLI_SHOWUSAGE;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
ast_cli(fd, "Sorry, will only generate a file at the moment. Please run again with a file name to write to.\n");
|
|
|
|
|
default:
|
|
|
|
|
return CLI_SHOWUSAGE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
i = ao2_iterator_init(peers, 0);
|
|
|
|
|
while ((peer = ao2_t_iterator_next(&i, "iterate thru peers table"))) {
|
|
|
|
|
|
|
|
|
|
peer = find_peer(peer->name, NULL, realtimepeers, TRUE);
|
|
|
|
|
|
|
|
|
|
ao2_lock(peer);
|
|
|
|
|
|
|
|
|
|
fprintf(f1, "INSERT INTO sipbuddies (");
|
|
|
|
|
|
|
|
|
|
/* print out the populated field names in order */
|
|
|
|
|
fprintf(f1,"name");
|
|
|
|
|
|
|
|
|
|
if (peer->host_dynamic)
|
|
|
|
|
fprintf(f1, ",host");
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_NAT))
|
|
|
|
|
fprintf(f1, ",nat");
|
|
|
|
|
fprintf(f1,",type");
|
|
|
|
|
if (!ast_strlen_zero(peer->accountcode))
|
|
|
|
|
fprintf(f1, ",accountcode");
|
|
|
|
|
if (peer->amaflags)
|
|
|
|
|
fprintf(f1, ",amaflags");
|
|
|
|
|
fprintf(f1, ",`call-limit`");
|
|
|
|
|
if (peer->callgroup)
|
|
|
|
|
fprintf(f1, ", callgroup");
|
|
|
|
|
if (!ast_strlen_zero(peer->cid_num))
|
|
|
|
|
fprintf(f1, ", callerid");
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_REINVITE))
|
|
|
|
|
fprintf(f1, ",canreinvite");
|
|
|
|
|
if (!ast_strlen_zero(peer->context))
|
|
|
|
|
fprintf(f1, ",context");
|
|
|
|
|
if (peer->defaddr.sin_addr.s_addr)
|
|
|
|
|
fprintf(f1, ",defaultip");
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_DTMF))
|
|
|
|
|
fprintf(f1, ",dtmfmode");
|
|
|
|
|
if (!ast_strlen_zero(peer->fromuser))
|
|
|
|
|
fprintf(f1, ",fromuser");
|
|
|
|
|
if (!ast_strlen_zero(peer->fromdomain))
|
|
|
|
|
fprintf(f1, ",fromdomain");
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_INSECURE))
|
|
|
|
|
fprintf(f1, ",insecure");
|
|
|
|
|
if (!ast_strlen_zero(peer->language))
|
|
|
|
|
fprintf(f1, ",language");
|
|
|
|
|
if (!AST_LIST_EMPTY(&peer->mailboxes)) {
|
|
|
|
|
fprintf(f1, ",mailbox");
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->md5secret))
|
|
|
|
|
fprintf(f1, ",md5secret");
|
|
|
|
|
if (peer->ha) {
|
|
|
|
|
if (peer->ha->sense == AST_SENSE_DENY) {
|
|
|
|
|
fprintf(f1, ",deny");
|
|
|
|
|
}
|
|
|
|
|
if (peer->ha->next && peer->ha->next->sense == AST_SENSE_ALLOW) {
|
|
|
|
|
fprintf(f1, ",permit");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->mohinterpret))
|
|
|
|
|
fprintf(f1, ",mohinterpret");
|
|
|
|
|
if (!ast_strlen_zero(peer->mohsuggest))
|
|
|
|
|
fprintf(f1, ",mohsuggest");
|
|
|
|
|
if (peer->pickupgroup)
|
|
|
|
|
fprintf(f1, ",pickupgroup");
|
|
|
|
|
if (peer->maxms)
|
|
|
|
|
fprintf(f1, ",qualify");
|
|
|
|
|
if (!ast_strlen_zero(peer->regexten))
|
|
|
|
|
fprintf(f1, ",regexten");
|
|
|
|
|
if (peer->rtptimeout)
|
|
|
|
|
fprintf(f1, ",rtptimeout");
|
|
|
|
|
if (peer->rtpholdtimeout)
|
|
|
|
|
fprintf(f1, ",rtpholdtimeout");
|
|
|
|
|
if (!ast_strlen_zero(peer->secret))
|
|
|
|
|
fprintf(f1, ",secret");
|
|
|
|
|
if (peer->chanvars)
|
|
|
|
|
fprintf(f1, ",setvar");
|
|
|
|
|
if (ast_codec_pref_index(&peer->prefs, 0)) { /* print the codecs wanted in order */
|
|
|
|
|
fprintf(f1, ",allow");
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->fullcontact))
|
|
|
|
|
fprintf(f1, ",fullcontact");
|
|
|
|
|
if (peer->addr.sin_addr.s_addr)
|
|
|
|
|
fprintf(f1, ",ipaddr");
|
|
|
|
|
if (peer->addr.sin_port)
|
|
|
|
|
fprintf(f1, ",port");
|
|
|
|
|
if (!ast_strlen_zero(peer->username))
|
|
|
|
|
fprintf(f1, ",username");
|
|
|
|
|
|
|
|
|
|
/* print out the values in order */
|
|
|
|
|
fprintf(f1, ") VALUES (");
|
|
|
|
|
|
|
|
|
|
fprintf(f1, "'%s'", peer->name);
|
|
|
|
|
|
|
|
|
|
if (peer->host_dynamic)
|
|
|
|
|
fprintf(f1, ",'dynamic'");
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_NAT)) {
|
|
|
|
|
fprintf(f1, ",'%s'", nat2strconfig(ast_test_flag(&peer->flags[0], SIP_NAT)));
|
|
|
|
|
}
|
|
|
|
|
fprintf(f1, ",'peer'");
|
|
|
|
|
if (!ast_strlen_zero(peer->accountcode))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->accountcode);
|
|
|
|
|
if (peer->amaflags)
|
|
|
|
|
fprintf(f1, ",'%s'", ast_cdr_flags2str(peer->amaflags));
|
|
|
|
|
fprintf(f1, ",%d", peer->call_limit);
|
|
|
|
|
if (peer->callgroup) {
|
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
|
|
fprintf(f1, ",'%s'", ast_print_group(buf, sizeof(buf), peer->callgroup));
|
|
|
|
|
}
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_REINVITE)) {
|
|
|
|
|
switch (ast_test_flag(&peer->flags[0], SIP_REINVITE)) {
|
|
|
|
|
case SIP_REINVITE_NONE:
|
|
|
|
|
fprintf(f1, ",'no'");
|
|
|
|
|
break;
|
|
|
|
|
case SIP_CAN_REINVITE:
|
|
|
|
|
fprintf(f1, ",'yes'");
|
|
|
|
|
break;
|
|
|
|
|
case SIP_CAN_REINVITE_NAT:
|
|
|
|
|
fprintf(f1, ",'nonat'");
|
|
|
|
|
break;
|
|
|
|
|
case SIP_REINVITE_UPDATE:
|
|
|
|
|
fprintf(f1, ",'update'");
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
fprintf(f1, ",'no'");
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->context))
|
|
|
|
|
fprintf(f1, ",'%s'",peer->context);
|
|
|
|
|
if (peer->defaddr.sin_addr.s_addr)
|
|
|
|
|
fprintf(f1, ",'%s'", ast_inet_ntoa(peer->defaddr.sin_addr));
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_DTMF)) {
|
|
|
|
|
fprintf(f1, ",'%s'", dtmfmode2str(ast_test_flag(&peer->flags[0], SIP_DTMF)));
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->fromuser))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->fromuser);
|
|
|
|
|
if (!ast_strlen_zero(peer->fromdomain))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->fromdomain);
|
|
|
|
|
if (ast_test_flag(&peer->flags[0], SIP_INSECURE)) {
|
|
|
|
|
|
|
|
|
|
fprintf(f1, ",'%s'", insecure2str(ast_test_flag(&peer->flags[0], SIP_INSECURE)));
|
|
|
|
|
}
|
|
|
|
|
if (!ast_strlen_zero(peer->language))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->language);
|
|
|
|
|
|
|
|
|
|
if (!AST_LIST_EMPTY(&peer->mailboxes)) {
|
|
|
|
|
struct ast_str *mailbox_str = ast_str_alloca(512);
|
|
|
|
|
peer_mailboxes_to_str(&mailbox_str, peer);
|
|
|
|
|
fprintf(f1, ",'%s'", mailbox_str->str);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(peer->md5secret))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->md5secret);
|
|
|
|
|
if (peer->ha) {
|
|
|
|
|
if (peer->ha->sense == AST_SENSE_DENY) {
|
|
|
|
|
fprintf(f1, ",'%s/%s'", ast_inet_ntoa(peer->ha->netaddr), ast_inet_ntoa(peer->ha->netmask));
|
|
|
|
|
}
|
|
|
|
|
if (peer->ha->next && peer->ha->next->sense == AST_SENSE_ALLOW) {
|
|
|
|
|
fprintf(f1, ",'%s/%s'", ast_inet_ntoa(peer->ha->next->netaddr), ast_inet_ntoa(peer->ha->next->netmask));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(peer->mohinterpret))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->mohinterpret);
|
|
|
|
|
if (!ast_strlen_zero(peer->mohsuggest))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->mohsuggest);
|
|
|
|
|
if (peer->pickupgroup) {
|
|
|
|
|
char buf[256];
|
|
|
|
|
|
|
|
|
|
fprintf(f1, ",'%s'", ast_print_group(buf, sizeof(buf), peer->pickupgroup));
|
|
|
|
|
}
|
|
|
|
|
if (peer->maxms)
|
|
|
|
|
fprintf(f1, ",'%d'", peer->maxms);
|
|
|
|
|
if (!ast_strlen_zero(peer->regexten))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->regexten);
|
|
|
|
|
if (peer->rtptimeout)
|
|
|
|
|
fprintf(f1, ",'%d'", peer->rtptimeout);
|
|
|
|
|
if (peer->rtpholdtimeout)
|
|
|
|
|
fprintf(f1, ",'%d'", peer->rtpholdtimeout);
|
|
|
|
|
if (!ast_strlen_zero(peer->secret))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->secret);
|
|
|
|
|
if (peer->chanvars) {
|
|
|
|
|
int first=1;
|
|
|
|
|
struct ast_variable *p1 = peer->chanvars;
|
|
|
|
|
fprintf(f1, ",'");
|
|
|
|
|
while (p1)
|
|
|
|
|
{
|
|
|
|
|
if (!first)
|
|
|
|
|
fprintf(f1, ";");
|
|
|
|
|
else
|
|
|
|
|
first = 0;
|
|
|
|
|
|
|
|
|
|
fprintf(f1, "%s=%s", p1->name, p1->value);
|
|
|
|
|
p1 = p1->next;
|
|
|
|
|
}
|
|
|
|
|
fprintf(f1, "'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ast_codec_pref_index(&peer->prefs, 0)) { /* print the codecs wanted in order */
|
|
|
|
|
/* this code isn't general, it assumes deny=all; but that's pretty common.
|
|
|
|
|
people who use this differently will have to modify the results by hand. sorry. */
|
|
|
|
|
int x, codec;
|
|
|
|
|
fprintf(f1, ",'");
|
|
|
|
|
for(x = 0; x < 32 ; x++) {
|
|
|
|
|
codec = ast_codec_pref_index(&peer->prefs, x);
|
|
|
|
|
if (!codec)
|
|
|
|
|
break;
|
|
|
|
|
fprintf(f1, "%s", ast_getformatname(codec));
|
|
|
|
|
fprintf(f1, ":%d", peer->prefs.framing[x]);
|
|
|
|
|
if (x < 31 && ast_codec_pref_index(&peer->prefs, x + 1))
|
|
|
|
|
fprintf(f1, ",");
|
|
|
|
|
}
|
|
|
|
|
fprintf(f1,"'");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!ast_strlen_zero(peer->fullcontact))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->fullcontact);
|
|
|
|
|
if (peer->addr.sin_addr.s_addr)
|
|
|
|
|
fprintf(f1, ",'%s'", ast_inet_ntoa(peer->addr.sin_addr));
|
|
|
|
|
if (peer->addr.sin_port)
|
|
|
|
|
fprintf(f1, ",%d", peer->addr.sin_port);
|
|
|
|
|
if (!ast_strlen_zero(peer->username))
|
|
|
|
|
fprintf(f1, ",'%s'", peer->username);
|
|
|
|
|
|
|
|
|
|
fprintf(f1, ");\n");
|
|
|
|
|
}
|
|
|
|
|
fclose(f1);
|
|
|
|
|
return CLI_SUCCESS;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int peercomparefunc(const void *a, const void *b);
|
|
|
|
|
|
|
|
|
|
int peercomparefunc(const void *a, const void *b)
|
|
|
|
@ -22351,7 +22068,6 @@ static struct ast_cli_entry cli_sip[] = {
|
|
|
|
|
AST_CLI_DEFINE(sip_show_inuse, "List all inuse/limits"),
|
|
|
|
|
AST_CLI_DEFINE(sip_show_objects, "List all SIP object allocations"),
|
|
|
|
|
AST_CLI_DEFINE(sip_show_peers, "List defined SIP peers"),
|
|
|
|
|
AST_CLI_DEFINE(sip_dbdump, "Dump peer info into realtime database SQL format"),
|
|
|
|
|
AST_CLI_DEFINE(sip_show_registry, "List SIP registration status"),
|
|
|
|
|
AST_CLI_DEFINE(sip_unregister, "Unregister (force expiration) a SIP peer from the registery\n"),
|
|
|
|
|
AST_CLI_DEFINE(sip_show_settings, "Show SIP global settings"),
|
|
|
|
|