提交 02e4be4b authored 作者: Leon de Rooij's avatar Leon de Rooij

Created templating based on sql queries to generate XML - not finished yet


git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk/scripts/contrib@13885 d0543943-73ff-0310-b7d9-9358b9ac24b2
上级 09c2f164
......@@ -38,7 +38,10 @@
#endif
typedef enum {
XML_ODBC_DIRECTORY
XML_ODBC_CONFIG = 0,
XML_ODBC_DIRECTORY = 0,
XML_ODBC_DIALPLAN = 0,
XML_ODBC_PHRASE = 0
} xml_odbc_query_type_t;
SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load);
......@@ -47,7 +50,31 @@ SWITCH_MODULE_DEFINITION(mod_xml_odbc, mod_xml_odbc_load, mod_xml_odbc_shutdown,
static switch_bool_t debug = SWITCH_FALSE;
#define XML_ODBC_SYNTAX "[debug_on|debug_off]"
static switch_status_t xml_odbc_render_template(char *template, switch_hash_t *hash, switch_xml_t xml_out, int *off);
static switch_status_t xml_odbc_render_tag(switch_xml_t xml_in, switch_hash_t *hash, switch_xml_t xml_out, int *off);
#define XML_ODBC_SYNTAX "[debug_on|debug_off|render_template]"
static int logi = 0;
static void logger(char *str)
{
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG[%i] [%s]\n", ++logi, str);
}
static struct {
char *dbname;
char *odbc_dsn;
char *template;
switch_xml_t templates_tag;
switch_mutex_t *mutex;
switch_memory_pool_t *pool;
#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
#else
void *filler1;
#endif
} globals;
SWITCH_STANDARD_API(xml_odbc_function)
{
......@@ -63,6 +90,16 @@ SWITCH_STANDARD_API(xml_odbc_function)
debug = SWITCH_TRUE;
} else if (!strcasecmp(cmd, "debug_off")) {
debug = SWITCH_FALSE;
} else if (!strcasecmp(cmd, "render_template")) {
// TODO make it configurable what themplate is rendered instead of static "not_found"
int off = 0;
switch_xml_t xml_out = NULL;
switch_hash_t *hash;
if (switch_core_hash_init(&hash, globals.pool) != SWITCH_STATUS_SUCCESS) {
// need_vars_map = -1; // does it need to be freed ? :)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't init params hash!\n");
}
xml_odbc_render_template("not_found", hash, xml_out, &off);
} else {
goto usage;
}
......@@ -80,122 +117,152 @@ typedef struct xml_binding {
char *bindings;
} xml_binding_t;
static struct {
char *dbname;
char *odbc_dsn;
char *query_domain_key_user;
char *query_domain_params;
char *query_domain_variables;
char *query_user_attrs;
char *query_user_params;
char *query_user_variables;
char *query_groups;
switch_mutex_t *mutex;
switch_memory_pool_t *pool;
#ifdef SWITCH_HAVE_ODBC
switch_odbc_handle_t *master_odbc;
#else
void *filler1;
#endif
} globals;
typedef struct did_uid_helper {
char *domain_id;
char *user_id;
} did_uid_helper_t;
typedef struct xml_odbc_query_helper {
switch_xml_t xml_in;
switch_xml_t xml_out;
int *off;
switch_hash_t *hash;
} xml_odbc_query_helper_t;
static int did_uid_callback(void *pArg, int argc, char **argv, char **columnNames)
static int xml_odbc_query_callback(void *pArg, int argc, char **argv, char **columnName)
{
did_uid_helper_t *h = (did_uid_helper_t *) pArg;
xml_odbc_query_helper_t *qh = (xml_odbc_query_helper_t *) pArg;
switch_xml_t xml_in_tmp;
int i;
h->domain_id = strdup(argv[0]);
h->user_id = strdup(argv[1]);
/* set all columnName/argv key/value pairs in qh->hash */
for (i = 0; i < argc; i++) {
switch_core_hash_insert(qh->hash, columnName[i], argv[i]); // does a hash insert overwrite old entries ?
}
return 0;
}
/* render all xml children */
for (xml_in_tmp = qh->xml_in->child; xml_in_tmp; xml_in_tmp = xml_in_tmp->ordered) {
xml_odbc_render_tag(xml_in_tmp, qh->hash, qh->xml_out, qh->off);
}
static int set_xml_attr_callback(void *pArg, int argc, char **argv, char **columnNames)
{
switch_xml_t *xml = (switch_xml_t *) pArg;
switch_xml_set_attr_d(*xml, argv[0], argv[1]);
return 0;
}
typedef struct xml_helper {
switch_xml_t xml;
char *str;
int off;
} xml_helper_t;
static int add_xml_child_with_nvpair_callback(void *pArg, int argc, char **argv, char **columnNames)
static switch_status_t xml_odbc_render_tag(switch_xml_t xml_in, switch_hash_t *hash, switch_xml_t xml_out, int *off)
{
xml_helper_t *h = (xml_helper_t *) pArg;
switch_xml_t xml = NULL;
switch_xml_t xml_in_tmp = NULL;
int i;
xml_odbc_query_helper_t query_helper;
if (!strcasecmp(xml_in->name, "xml-odbc-do")) {
char *name = NULL;
char *value = NULL;
char *zero_rows_break_to = NULL;
char *no_template_break_to = NULL;
name = (char *) switch_xml_attr_soft(xml_in, "name");
value = (char *) switch_xml_attr_soft(xml_in, "value");
zero_rows_break_to = (char *) switch_xml_attr_soft(xml_in, "on-zero-rows-break-to");
no_template_break_to = (char *) switch_xml_attr_soft(xml_in, "on-no-template-break-to");
if (!strcasecmp(name, "break-to") && !switch_strlen_zero(value)) { // WHAT TO DO WITH FURTHER RENDERING LOWER ON THE STACK ?!?!?!
xml_out = NULL;
off = 0; // <- ?
if (xml_odbc_render_template(value, hash, xml_out, off) == SWITCH_STATUS_FALSE) {
if (!switch_strlen_zero(no_template_break_to)) {
xml_odbc_render_template(no_template_break_to, hash, xml_out, off);
}
}
} else if (!strcasecmp(name, "query") && !switch_strlen_zero(value)) {
// do an auto expasion on value to replace all ${foo} parts based on switch_hash_t hash
query_helper.xml_in = xml_in;
query_helper.xml_out = xml_out;
query_helper.off = off;
query_helper.hash = hash;
if (switch_odbc_handle_callback_exec(globals.master_odbc, value, xml_odbc_query_callback, &query_helper) == SWITCH_ODBC_SUCCESS) {
// nothing
} else if (!switch_strlen_zero(zero_rows_break_to)) { // if zero rows returned then switch_odbc_handle_callback_exec != SWITCH_ODBC_SUCCESS ???
xml_out = NULL;
off = 0; // <- ?
xml_odbc_render_template(zero_rows_break_to, hash, xml_out, off);
}
}
if ((xml = switch_xml_add_child_d(h->xml, h->str, h->off++))) {
switch_xml_set_attr_d(xml, "name", argv[0]);
switch_xml_set_attr_d(xml, "value", argv[1]);
}
} else {
return 0;
}
/* set name if current root node */
if (switch_strlen_zero(xml_out->name)) { // I should match here on off instead of on name == "" ?
xml_out->name = strdup(xml_in->name);
static int add_xml_group_and_user_callback(void *pArg, int argc, char **argv, char **columnName)
{
xml_helper_t *h = (xml_helper_t *) pArg;
switch_xml_t xml = NULL;
if ((xml = switch_xml_add_child_d(h->xml, "group", h->off++))) {
switch_xml_set_attr_d(xml, "name", argv[0]);
if ((xml = switch_xml_add_child_d(xml, "users", h->off++))) {
if ((xml = switch_xml_add_child_d(xml, "user", h->off++))) {
switch_xml_set_attr_d(xml, "id", h->str);
switch_xml_set_attr_d(xml, "type", "pointer");
}
/* or create a child */
} else if (!(xml_out = switch_xml_add_child_d(xml_out, xml_in->name, *off++))) {
return SWITCH_STATUS_FALSE;
}
//SWITCH_DECLARE(void *) switch_core_hash_find(_In_ switch_hash_t *hash, _In_z_ const char *key);
logger((char *)switch_core_hash_find(hash, "domain"));
/* copy all attrs */
for (i = 0; xml_in->attr[i]; i+=2) {
// do an auto expasion on attr[i+1] to replace all ${foo} parts based on switch_hash_t hash
switch_xml_set_attr(xml_out, xml_in->attr[i], xml_in->attr[i+1]);
}
/* copy all children and render them */
for (xml_in_tmp = xml_in->child; xml_in_tmp; xml_in_tmp = xml_in_tmp->ordered) {
xml_odbc_render_tag(xml_in_tmp, hash, xml_out, off);
}
}
return 0;
return SWITCH_STATUS_SUCCESS;
}
static int xml_odbc_result_not_found(switch_xml_t xml, int *off)
{
switch_xml_t sub = NULL;
if ((sub = switch_xml_add_child_d(xml, "section", *off++))) {
switch_xml_set_attr_d(sub, "name", "result");
if ((sub = switch_xml_add_child_d(sub, "result", *off++))) {
switch_xml_set_attr_d(sub, "status", "not found");
static switch_status_t xml_odbc_render_template(char *template_name, switch_hash_t *hash, switch_xml_t xml_out, int *off)
{
switch_xml_t template_tag = NULL, sub_tag = NULL;
for (template_tag = switch_xml_child(globals.templates_tag, "template"); template_tag; template_tag = template_tag->next) {
char *template_tag_name = (char*) switch_xml_attr_soft(template_tag, "name");
if (!strcmp(template_tag_name, template_name)) {
for (sub_tag = template_tag->child; sub_tag; sub_tag = sub_tag->ordered) {
xml_odbc_render_tag(sub_tag, hash, xml_out, off);
return SWITCH_STATUS_SUCCESS;
}
}
}
return 0;
return SWITCH_STATUS_FALSE;
}
static switch_xml_t xml_odbc_search(const char *section, const char *tag_name, const char *key_name, const char *key_value, switch_event_t *params, void *user_data)
{
xml_binding_t *binding = (xml_binding_t *) user_data;
switch_event_header_t *hi;
switch_xml_t xml = NULL, sub = NULL, sub2 = NULL, sub3 = NULL;
char *dir_user = NULL, *dir_domain = NULL, *dir_key = NULL;
char *sql;
int off = 0, ret = 1;
switch_xml_t xml_out = NULL;
if ((xml_out = switch_xml_new(""))) {
//switch_xml_set_attr_d(xml_out, "type", "freeswitch/xml");
}
xml_odbc_query_type_t query_type;
did_uid_helper_t pdata;
xml_helper_t pdata2;
switch_hash_t *hash;
int off = 0, ret = 1;
if (!binding) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "No bindings... sorry bud returning now\n");
return NULL;
}
if (!strcmp(section, "directory")) {
if (!strcmp(section, "configuration")) {
query_type = XML_ODBC_CONFIG;
} else if (!strcmp(section, "directory")) {
query_type = XML_ODBC_DIRECTORY;
} else if (!strcmp(section, "dialplan")) {
query_type = XML_ODBC_DIALPLAN;
} else if (!strcmp(section, "phrases")) {
query_type = XML_ODBC_PHRASE;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Invalid section\n");
return NULL;
......@@ -203,147 +270,29 @@ static switch_xml_t xml_odbc_search(const char *section, const char *tag_name, c
if (params) {
if ((hi = params->headers)) {
for (; hi; hi = hi->next) {
switch (query_type) {
case XML_ODBC_DIRECTORY:
//switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG in xml_odbc_search with header name=[%s], value=[%s]\n", hi->name, hi->value);
if (!strcmp(hi->name, "user")) {
dir_user = strdup(hi->value);
} else if (!strcmp(hi->name, "domain")) {
dir_domain = strdup(hi->value);
} else if (!strcmp(hi->name, "key")) {
dir_key = strdup(hi->value);
}
break;
}
/* initialize hash */
if (switch_core_hash_init(&hash, globals.pool) != SWITCH_STATUS_SUCCESS) {
// need_vars_map = -1; // does it need to be freed ? :)
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, "Can't init params hash!\n");
}
switch (query_type) {
case XML_ODBC_DIRECTORY:
//if (dir_user && dir_domain) {
if (dir_domain) {
if ((xml = switch_xml_new("document"))) {
switch_xml_set_attr_d(xml, "type", "freeswitch/xml");
if (!dir_user) {
// sql = switch_mprintf("SELECT count(*) FROM dir_domains WHERE name = '%q';", dir_domain);
// if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, count_callback, &pdata10741) == SWITCH_ODBC_SUCCESS) {
// TODO: Factor out the domain search thing (with params and variables) from below, and call it from here as well..
// xml_odbc_result_not_found(xml, &off);
// } else {
xml_odbc_result_not_found(xml, &off);
// }
} else {
sql = switch_mprintf(globals.query_domain_key_user, dir_domain, dir_key, dir_user);
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, did_uid_callback, &pdata) == SWITCH_ODBC_SUCCESS) {
if (!pdata.domain_id || !pdata.user_id) {
xml_odbc_result_not_found(xml, &off);
} else {
if ((sub = switch_xml_add_child_d(xml, "section", off++))) {
switch_xml_set_attr_d(sub, "name", "directory");
if ((sub = switch_xml_add_child_d(sub, "domain", off++))) {
switch_xml_set_attr_d(sub, "name", dir_domain);
if ((sub2 = switch_xml_add_child_d(sub, "params", off++))) {
sql = switch_mprintf(globals.query_domain_params, pdata.domain_id);
pdata2.xml = sub2;
pdata2.off = off;
pdata2.str = "param";
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
}
}
if ((sub2 = switch_xml_add_child_d(sub, "variables", off++))) {
sql = switch_mprintf(globals.query_domain_variables, pdata.domain_id);
pdata2.xml = sub2;
pdata2.off = off;
pdata2.str = "variable";
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
}
}
if ((sub = switch_xml_add_child_d(sub, "groups", off++))) {
if ((sub2 = switch_xml_add_child_d(sub, "group", off++))) {
switch_xml_set_attr_d(sub2, "name", "default");
if ((sub2 = switch_xml_add_child_d(sub2, "users", off++))) {
if ((sub2 = switch_xml_add_child_d(sub2, "user", off++))) {
sql = switch_mprintf(globals.query_user_attrs, pdata.user_id);
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, set_xml_attr_callback, &sub2)) {
}
if ((sub3 = switch_xml_add_child_d(sub2, "params", off++))) {
sql = switch_mprintf(globals.query_user_params, pdata.user_id);
pdata2.xml = sub3;
pdata2.off = off;
pdata2.str = "param";
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
}
}
if ((sub3 = switch_xml_add_child_d(sub2, "variables", off++))) {
sql = switch_mprintf(globals.query_user_variables, pdata.user_id);
pdata2.xml = sub3;
pdata2.off = off;
pdata2.str = "variable";
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_child_with_nvpair_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
}
}
}
}
}
sql = switch_mprintf(globals.query_groups, pdata.user_id);
pdata2.xml = sub;
pdata2.off = off;
pdata2.str = dir_user;
if (switch_odbc_handle_callback_exec(globals.master_odbc, sql, add_xml_group_and_user_callback, &pdata2) == SWITCH_ODBC_SUCCESS) {
}
}
}
}
}
}
}
}
if (debug == SWITCH_TRUE) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Debug dump of XML generated:\n%s", switch_xml_toxml(xml, SWITCH_FALSE));
}
free(dir_user);
dir_user = NULL;
free(dir_key);
dir_key = NULL;
free(dir_domain);
dir_domain = NULL;
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR,
"Something bad happened during the query construction phase likely exten(%s) or domain(%s) is null\n", dir_user, dir_domain);
goto cleanup;
for (; hi; hi = hi->next) {
if (debug == SWITCH_TRUE) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "DEBUG in xml_odbc_search, header [%s]=[%s]\n", hi->name, hi->value);
}
break;
switch_core_hash_insert(hash, hi->name, hi->value); // prefix with 'h_' to avoid collision with keys returned by SELECT's ?
}
} else {
goto cleanup;
xml_odbc_render_template(globals.template, hash, xml_out, &off); // TODO globals.template should be replace with something specific for this section
}
} else {
goto cleanup;
}
if (debug == SWITCH_TRUE) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Debug dump of XML generated:\n%s", switch_xml_toxml(xml_out, SWITCH_FALSE));
}
ret = 0;
......@@ -351,26 +300,28 @@ static switch_xml_t xml_odbc_search(const char *section, const char *tag_name, c
cleanup:
if (ret) {
switch_xml_free(xml);
switch_xml_free(xml_out);
return NULL;
}
return xml;
return xml_out;
}
static switch_status_t do_config()
{
char *cf = "xml_odbc.conf";
switch_xml_t cfg, xml, bindings_tag, binding_tag, param;
switch_xml_t cfg, xml, bindings_tag, binding_tag, templates_tag, param;
xml_binding_t *binding = NULL;
//switch_core_db_t *db;
switch_status_t status = SWITCH_STATUS_SUCCESS;
char *odbc_user = NULL;
char *odbc_pass = NULL;
char *sql = NULL;
logger("X");
if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Open of %s failed\n", cf);
return SWITCH_STATUS_TERM;
......@@ -381,6 +332,13 @@ static switch_status_t do_config()
goto done;
}
if (!(templates_tag = switch_xml_child(cfg, "templates"))) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Missing <templates> tag!\n");
goto done;
}
globals.templates_tag = templates_tag;
for (binding_tag = switch_xml_child(bindings_tag, "binding"); binding_tag; binding_tag = binding_tag->next) {
char *bname = (char*) switch_xml_attr_soft(binding_tag, "name");
......@@ -399,20 +357,8 @@ static switch_status_t do_config()
*odbc_pass++ = '\0';
}
}
} else if (!strcasecmp(var, "query-domain-key-user") && !switch_strlen_zero(val)) {
globals.query_domain_key_user = strdup(val);
} else if (!strcasecmp(var, "query-domain-params") && !switch_strlen_zero(val)) {
globals.query_domain_params = strdup(val);
} else if (!strcasecmp(var, "query-domain-variables") && !switch_strlen_zero(val)) {
globals.query_domain_variables = strdup(val);
} else if (!strcasecmp(var, "query-user-attrs") && !switch_strlen_zero(val)) {
globals.query_user_attrs = strdup(val);
} else if (!strcasecmp(var, "query-user-params") && !switch_strlen_zero(val)) {
globals.query_user_params = strdup(val);
} else if (!strcasecmp(var, "query-user-variables") && !switch_strlen_zero(val)) {
globals.query_user_variables = strdup(val);
} else if (!strcasecmp(var, "query-groups") && !switch_strlen_zero(val)) {
globals.query_groups = strdup(val);
} else if (!strcasecmp(var, "template") && !switch_strlen_zero(val)) {
globals.template = strdup(val);
}
}
......@@ -459,6 +405,7 @@ static switch_status_t do_config()
return status;
}
SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load)
{
......@@ -480,6 +427,7 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load)
SWITCH_ADD_API(xml_odbc_api_interface, "xml_odbc", "XML ODBC", xml_odbc_function, XML_ODBC_SYNTAX);
switch_console_set_complete("add xml_odbc debug_on");
switch_console_set_complete("add xml_odbc debug_off");
switch_console_set_complete("add xml_odbc render_template");
if (do_config() != SWITCH_STATUS_SUCCESS) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Unable to load xml_odbc config file\n");
......@@ -490,11 +438,13 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_xml_odbc_load)
return SWITCH_STATUS_SUCCESS;
}
SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_odbc_shutdown)
{
return SWITCH_STATUS_SUCCESS;
}
/* For Emacs:
* Local Variables:
* mode:c
......@@ -503,5 +453,5 @@ SWITCH_MODULE_SHUTDOWN_FUNCTION(mod_xml_odbc_shutdown)
* c-basic-offset:4
* End:
* For VIM:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
*/
......@@ -39,21 +39,19 @@ CREATE TABLE `dir_groups_users` (
CREATE TABLE `dir_users` (
`id` INT NOT NULL AUTO_INCREMENT,
`dir_domain_id` INT NOT NULL,
`enabled` TINYINT(1) NOT NULL,
`username` VARCHAR(255) NOT NULL,
`cidr` VARCHAR(255),
`mailbox` VARCHAR(255),
`number-alias` VARCHAR(255),
PRIMARY KEY (`id`),
KEY `dir_users_username` (`username`),
KEY `dir_users_cidr` (`cidr`),
KEY `dir_users_mailbox` (`mailbox`),
KEY `dir_users_number-alias` (`number-alias`),
FOREIGN KEY (`dir_domain_id`) REFERENCES `dir_domains` (`id`)
);
CREATE TABLE `dir_user_attrs` (
`id` INT NOT NULL AUTO_INCREMENT,
`dir_user_id` INT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`value` VARCHAR(255) NOT NULL,
PRIMARY KEY (`id`),
FOREIGN KEY (`dir_user_id`) REFERENCES `dir_users` (`id`),
KEY `dir_user_attrs_name` (`name`),
KEY `dir_user_attrs_value` (`value`)
);
CREATE TABLE `dir_user_params` (
`id` INT NOT NULL AUTO_INCREMENT,
`dir_user_id` INT NOT NULL,
......
<configuration name="xml_odbc.conf" description="XML ODBC Configuration">
<bindings>
<!--
<binding name="configuration">
<param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
<param name="template" value="configuration"/>
</binding>
-->
<binding name="directory">
<param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
<!-- <param name="template" value="directory"/> -->
<!-- <param name="template" value="not_found"/> -->
<param name="template" value="someuser"/>
</binding>
<!--
<binding name="dialplan">
<param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
<param name="template" value="dialplan"/>
</binding>
<param name="query-domain-key-user" value="SELECT
dir_domains.id AS domain_id,
dir_users.id AS user_id
FROM
dir_domains,
dir_users,
dir_user_attrs
WHERE
dir_domains.name = '%q' AND
dir_user_attrs.name = '%q' AND
dir_user_attrs.value = '%q' AND
dir_domains.id = dir_users.dir_domain_id AND
dir_users.id = dir_user_attrs.dir_user_id;"/>
<param name="query-domain-params" value="SELECT name, value FROM dir_domain_params WHERE dir_domain_id = '%q';"/>
<binding name="phrases">
<param name="odbc-dsn" value="freeswitch:freeswitch:secret"/>
<param name="template" value="phrases"/>
</binding>
-->
</bindings>
<param name="query-domain-variables" value="SELECT name, value FROM dir_domain_variables WHERE dir_domain_id = '%q';"/>
<templates>
<param name="query-user-attrs" value="SELECT name, value FROM dir_user_attrs WHERE dir_user_id = '%q';"/>
<template name="configuration">
<xml-odbc-do name="break-to" value="${section}" on-no-template-break-to="simple_configuration"/>
</template>
<param name="query-user-params" value="SELECT name, value FROM dir_user_params WHERE dir_user_id = '%q';"/>
<template name="simple_configuration">
<document type="freeswitch/xml"> <!-- should this tag be automatically rendered first on xml_out and left out here ? -->
<configuration name="${section}">
<settings>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
cnf_settings
WHERE
hostname = '${hostname}' AND
section = '${section}';">
<param name="${name}" value="${value}"/>
</xml-odbc-do>
</settings>
</configuration>
</document>
</template>
<template name="not_found">
<document type="freeswitch/xml">
<section name="result">
<result status="not found"/>
</section>
</document>
</template>
<param name="query-user-variables" value="SELECT name, value FROM dir_user_variables WHERE dir_user_id = '%q';"/>
<template name="someuser">
<document type="freeswitch/xml">
<section name="directory">
<domain name="${domain}">
<params>
<param name="some_domain_param" value="some_domain_value"/>
</params>
<variables>
</variables>
<groups>
<group name="default">
<users>
<user id="someuser" mailbox="leon@toyos.nl" cidr="" number-alias="0031320227470">
<params>
<param name="password" value="secret"/>
</params>
<variables>
<variable name="accountcode" value="1234"/>
</variables>
</user>
</users>
</group>
<group name="prepay">
<user id="someuser" type="pointer"/>
</group>
</groups>
</domain>
</section>
</document>
</template>
<X-PRE-PROCESS cmd="include" data="xml_odbc_templates/*.xml"/>
<param name="query-groups" value="SELECT dir_groups.name FROM dir_groups, dir_groups_users
WHERE dir_groups_users.dir_user_id = '%q' AND dir_groups_users.dir_group_id = dir_groups.id;"/>
</templates>
</binding>
</bindings>
</configuration>
<include>
<template name="console.conf">
<document type="freeswitch/xml">
<configuration name="console.conf" description="Console Logger">
<mappings>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
cnf_console_mappings
WHERE
hostname = '${hostname}';">
<mapping name="${name}" value="${value}"/>
</xml-odbc-do>
</mappings>
<settings>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
cnf_settings
WHERE
hostname = '${hostname}' AND
section = '${section}';">
<param name="${name}" value="${value}"/>
</xml-odbc-do>
</settings>
</configuration>
</document>
</template>
</include>
<include> <!-- NOT FINISHED ! -->
<template name="dialplan">
<document type="freeswitch/xml">
<xml-odbc-do name="query" on-zero-rows-break-to="not_found" value="
SELECT * FROM dialplan WHERE dialed_number='${dialed_number}';"/>
<section name="dialplan" description="RE Dial Plan For FreeSwitch">
<context name="default">
<extension name="test9">
<condition field="destination_number" expression="^83789$">
<action application="bridge" data="iax/guest@conference.freeswitch.org/888"/>
</condition>
</extension>
</context>
</section>
</document>
</template>
</include>
<include>
<template name="directory">
<document type="freeswitch/xml">
<xml-odbc-do name="query" on-zero-rows-break-to="not_found" value="
SELECT
dir_domains.id AS domain_id,
dir_users.id AS user_id,
dir_users.username,
dir_users.cidr,
dir_users.mailbox,
dir_users.number-alias
FROM
dir_domains,
dir_users
WHERE
dir_users.${key} = '${value}' AND
dir_domains.name = '${domain_name}' AND
dir_users.domain_id = dir_domains.id AND
dir_users.enabled = 1;"/>
<section name="directory">
<domain name="${domain_name}">
<params>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
dir_domain_params
WHERE
dir_domain_id = '${domain_id}';">
<param name="${name}" value="${value}"/>
</xml-odbc-do>
</params>
<variables>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
dir_domain_variables
WHERE
dir_domain_id = '${domain_id}';">
<variable name="${name}" value="${value}"/>
</xml-odbc-do>
</variables>
<groups>
<group name="default">
<users>
<user id="${username}" mailbox="${mailbox}" cidr="${cidr}" number-alias="${number-alias}">
<params>
<xml-odbc-do name="query" on-zero-rows-break-to="not_found" value="
SELECT
name, value
FROM
dir_domain_params
WHERE
dir_domain_id = '${domain_id}';">
<param name="${name}" value="${value}"/>
</xml-odbc-do>
</params>
<variables>
<xml-odbc-do name="query" value="
SELECT
name, value
FROM
dir_domain_params
WHERE
dir_domain_id = '${domain_id}';">
<variable name="${name}" value="${value}"/>
</xml-odbc-do>
</variables>
</user>
</users>
</group>
<xml-odbc-do name="query" value="
SELECT
name AS group_name
FROM
dir_groups,
dir_groups_users
WHERE
dir_groups_users.dir_group_id
dir_user_id = '${user_id}';">
<group name="${group_name}">
<user id="${username}" type="pointer"/>
</group>
</xml-odbc-do>
</groups>
</domain>
</section>
</document>
</template>
</include>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论