curl plugin for portable configuration engine More...
#include "asterisk.h"
#include <curl/curl.h>
#include "asterisk/file.h"
#include "asterisk/channel.h"
#include "asterisk/pbx.h"
#include "asterisk/config.h"
#include "asterisk/module.h"
#include "asterisk/lock.h"
#include "asterisk/utils.h"
Go to the source code of this file.
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static struct ast_config * | config_curl (const char *url, const char *unused, const char *file, struct ast_config *cfg, struct ast_flags flags, const char *sugg_incl, const char *who_asked) |
static int | destroy_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an DELETE query. | |
static int | load_module (void) |
static struct ast_variable * | realtime_curl (const char *url, const char *unused, va_list ap) |
Execute a curl query and return ast_variable list. | |
static struct ast_config * | realtime_multi_curl (const char *url, const char *unused, va_list ap) |
Excute an Select query and return ast_config list. | |
static int | require_curl (const char *url, const char *unused, va_list ap) |
static int | store_curl (const char *url, const char *unused, va_list ap) |
Execute an INSERT query. | |
static int | unload_module (void) |
static int | update2_curl (const char *url, const char *unused, va_list ap) |
static int | update_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, va_list ap) |
Execute an UPDATE query. | |
Variables | |
static struct ast_module_info __MODULE_INFO_SECTION | __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Curl configuration" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } |
static struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_config_engine | curl_engine |
curl plugin for portable configuration engine
Definition in file res_config_curl.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 626 of file res_config_curl.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 626 of file res_config_curl.c.
static struct ast_config* config_curl | ( | const char * | url, |
const char * | unused, | ||
const char * | file, | ||
struct ast_config * | cfg, | ||
struct ast_flags | flags, | ||
const char * | sugg_incl, | ||
const char * | who_asked | ||
) | [static, read] |
Definition at line 518 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_config_get_current_category(), ast_config_internal_load(), ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_buffer(), ast_str_create(), ast_str_set(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, and strsep().
{ struct ast_str *query; char buf1[200]; char *stringp, *line, *pair, *key; const int EncodeSpecialChars = 1, bufsize = 256000; int last_cat_metric = -1, cat_metric = -1; struct ast_category *cat=NULL; char *buffer, *cur_cat = ""; char *category = "", *var_name = "", *var_val = ""; struct ast_flags loader_flags = { 0 }; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return NULL; } if (!(query = ast_str_create(1000))) return NULL; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return NULL; } ast_uri_encode(file, buf1, sizeof(buf1), EncodeSpecialChars); ast_str_set(&query, 0, "${CURL(%s/static?file=%s)}", url, buf1); /* Do the CURL query */ pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); /* Line oriented output */ stringp = buffer; cat = ast_config_get_current_category(cfg); while ((line = strsep(&stringp, "\r\n"))) { if (ast_strlen_zero(line)) continue; while ((pair = strsep(&line, "&"))) { key = strsep(&pair, "="); ast_uri_decode(key); if (pair) ast_uri_decode(pair); if (!strcasecmp(key, "category")) category = S_OR(pair, ""); else if (!strcasecmp(key, "var_name")) var_name = S_OR(pair, ""); else if (!strcasecmp(key, "var_val")) var_val = S_OR(pair, ""); else if (!strcasecmp(key, "cat_metric")) cat_metric = pair ? atoi(pair) : 0; } if (!strcmp(var_name, "#include")) { if (!ast_config_internal_load(var_val, cfg, loader_flags, "", who_asked)) return NULL; } if (strcmp(category, cur_cat) || last_cat_metric != cat_metric) { if (!(cat = ast_category_new(category, "", 99999))) break; cur_cat = category; last_cat_metric = cat_metric; ast_category_append(cfg, cat); } ast_variable_append(cat, ast_variable_new(var_name, var_val, "")); } ast_free(buffer); ast_free(query); return cfg; }
static int destroy_curl | ( | const char * | url, |
const char * | unused, | ||
const char * | keyfield, | ||
const char * | lookup, | ||
va_list | ap | ||
) | [static] |
Execute an DELETE query.
url | |
unused | |
keyfield | where clause field |
lookup | value of field for where clause |
ap | list containing one or more field/value set(s) |
Delete a row from a database table, prepare the sql statement using keyfield and lookup control the number of records to change. Additional params to match rows are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected |
-1 | on failure |
Definition at line 419 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, and pbx_substitute_variables_helper().
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp; int i, rowcount = -1; const int EncodeSpecialChars = 1, bufsize = 100; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return -1; } if (!(query = ast_str_create(1000))) return -1; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return -1; } ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_set(&query, 0, "${CURL(%s/destroy,%s=%s&", url, buf1, buf2); for (i = 0; (newparam = va_arg(ap, const char *)); i++) { newval = va_arg(ap, const char *); ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); /* Line oriented output */ stringp = buffer; while (*stringp <= ' ') stringp++; sscanf(stringp, "%30d", &rowcount); ast_free(buffer); ast_free(query); if (rowcount >= 0) return (int)rowcount; return -1; }
static int load_module | ( | void | ) | [static] |
Definition at line 612 of file res_config_curl.c.
References ast_config_engine_register(), ast_load_resource(), ast_log(), ast_module_check(), AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_verb, and LOG_ERROR.
{ if (!ast_module_check("res_curl.so")) { if (ast_load_resource("res_curl.so") != AST_MODULE_LOAD_SUCCESS) { ast_log(LOG_ERROR, "Cannot load res_curl, so res_config_curl cannot be loaded\n"); return AST_MODULE_LOAD_DECLINE; } } ast_config_engine_register(&curl_engine); ast_verb(1, "res_config_curl loaded.\n"); return 0; }
static struct ast_variable* realtime_curl | ( | const char * | url, |
const char * | unused, | ||
va_list | ap | ||
) | [static, read] |
Execute a curl query and return ast_variable list.
url | The base URL from which to retrieve data |
unused | Not currently used |
ap | list containing one or more field/operator/value set. |
var | on success |
NULL | on failure |
Definition at line 56 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, strsep(), and var.
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp, *pair, *key; int i; struct ast_variable *var=NULL, *prev=NULL; const int EncodeSpecialChars = 1, bufsize = 64000; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return NULL; } if (!(query = ast_str_create(1000))) return NULL; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return NULL; } ast_str_set(&query, 0, "${CURL(%s/single,", url); for (i = 0; (newparam = va_arg(ap, const char *)); i++) { newval = va_arg(ap, const char *); ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); /* Remove any trailing newline characters */ if ((stringp = strchr(buffer, '\r')) || (stringp = strchr(buffer, '\n'))) *stringp = '\0'; stringp = buffer; while ((pair = strsep(&stringp, "&"))) { key = strsep(&pair, "="); ast_uri_decode(key); if (pair) ast_uri_decode(pair); if (!ast_strlen_zero(key)) { if (prev) { prev->next = ast_variable_new(key, S_OR(pair, ""), ""); if (prev->next) prev = prev->next; } else prev = var = ast_variable_new(key, S_OR(pair, ""), ""); } } ast_free(buffer); ast_free(query); return var; }
static struct ast_config* realtime_multi_curl | ( | const char * | url, |
const char * | unused, | ||
va_list | ap | ||
) | [static, read] |
Excute an Select query and return ast_config list.
url | |
unused | |
ap | list containing one or more field/operator/value set. |
struct | ast_config pointer on success |
NULL | on failure |
Definition at line 128 of file res_config_curl.c.
References ast_category_append(), ast_category_new(), ast_category_rename(), ast_config_new(), ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_strdupa, ast_strlen_zero(), ast_uri_decode(), ast_uri_encode(), ast_variable_append(), ast_variable_new(), LOG_ERROR, pbx_substitute_variables_helper(), S_OR, strsep(), and var.
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp, *line, *pair, *key, *initfield = NULL; int i; const int EncodeSpecialChars = 1, bufsize = 256000; struct ast_variable *var=NULL; struct ast_config *cfg=NULL; struct ast_category *cat=NULL; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return NULL; } if (!(query = ast_str_create(1000))) return NULL; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return NULL; } ast_str_set(&query, 0, "${CURL(%s/multi,", url); for (i = 0; (newparam = va_arg(ap, const char *)); i++) { newval = va_arg(ap, const char *); if (i == 0) { char *op; initfield = ast_strdupa(newparam); if ((op = strchr(initfield, ' '))) *op = '\0'; } ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); /* Do the CURL query */ pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); if (!(cfg = ast_config_new())) goto exit_multi; /* Line oriented output */ stringp = buffer; while ((line = strsep(&stringp, "\r\n"))) { if (ast_strlen_zero(line)) continue; if (!(cat = ast_category_new("", "", 99999))) continue; while ((pair = strsep(&line, "&"))) { key = strsep(&pair, "="); ast_uri_decode(key); if (pair) ast_uri_decode(pair); if (!strcasecmp(key, initfield) && pair) ast_category_rename(cat, pair); if (!ast_strlen_zero(key)) { var = ast_variable_new(key, S_OR(pair, ""), ""); ast_variable_append(cat, var); } } ast_category_append(cfg, cat); } exit_multi: ast_free(buffer); ast_free(query); return cfg; }
static int require_curl | ( | const char * | url, |
const char * | unused, | ||
va_list | ap | ||
) | [static] |
Definition at line 472 of file res_config_curl.c.
References ast_custom_function_find(), ast_log(), ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, pbx_substitute_variables_helper(), RQ_CHAR, RQ_DATE, RQ_DATETIME, RQ_FLOAT, RQ_INTEGER1, RQ_INTEGER2, RQ_INTEGER3, RQ_INTEGER4, RQ_INTEGER8, RQ_UINTEGER1, RQ_UINTEGER2, RQ_UINTEGER3, RQ_UINTEGER4, RQ_UINTEGER8, and type.
{ struct ast_str *query; char *elm, field[256], buffer[128]; int type, size; const int EncodeSpecialChars = 1; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return -1; } if (!(query = ast_str_create(100))) { return -1; } ast_str_set(&query, 0, "${CURL(%s/require,", url); while ((elm = va_arg(ap, char *))) { type = va_arg(ap, require_type); size = va_arg(ap, int); ast_uri_encode(elm, field, sizeof(field), EncodeSpecialChars); ast_str_append(&query, 0, "%s=%s%%3A%d", field, type == RQ_CHAR ? "char" : type == RQ_INTEGER1 ? "integer1" : type == RQ_UINTEGER1 ? "uinteger1" : type == RQ_INTEGER2 ? "integer2" : type == RQ_UINTEGER2 ? "uinteger2" : type == RQ_INTEGER3 ? "integer3" : type == RQ_UINTEGER3 ? "uinteger3" : type == RQ_INTEGER4 ? "integer4" : type == RQ_UINTEGER4 ? "uinteger4" : type == RQ_INTEGER8 ? "integer8" : type == RQ_UINTEGER8 ? "uinteger8" : type == RQ_DATE ? "date" : type == RQ_DATETIME ? "datetime" : type == RQ_FLOAT ? "float" : "unknown", size); } va_end(ap); ast_str_append(&query, 0, ")}"); pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, sizeof(buffer) - 1); return atoi(buffer); }
static int store_curl | ( | const char * | url, |
const char * | unused, | ||
va_list | ap | ||
) | [static] |
Execute an INSERT query.
url | |
unused | |
ap | list containing one or more field/value set(s) |
Insert a new record into database table, prepare the sql statement. All values to be changed are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected |
-1 | on failure |
Definition at line 354 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, and pbx_substitute_variables_helper().
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp; int i, rowcount = -1; const int EncodeSpecialChars = 1, bufsize = 100; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return -1; } if (!(query = ast_str_create(1000))) return -1; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return -1; } ast_str_set(&query, 0, "${CURL(%s/store,", url); for (i = 0; (newparam = va_arg(ap, const char *)); i++) { newval = va_arg(ap, const char *); ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); stringp = buffer; while (*stringp <= ' ') stringp++; sscanf(stringp, "%30d", &rowcount); ast_free(buffer); ast_free(query); if (rowcount >= 0) return (int)rowcount; return -1; }
static int unload_module | ( | void | ) | [static] |
Definition at line 605 of file res_config_curl.c.
References ast_config_engine_deregister(), and ast_verb.
{ ast_config_engine_deregister(&curl_engine); ast_verb(1, "res_config_curl unloaded.\n"); return 0; }
static int update2_curl | ( | const char * | url, |
const char * | unused, | ||
va_list | ap | ||
) | [static] |
Definition at line 278 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_uri_encode(), first, LOG_ERROR, pbx_substitute_variables_helper(), and SENTINEL.
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp; int rowcount = -1, lookup = 1, first = 1; const int EncodeSpecialChars = 1, bufsize = 100; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return -1; } if (!(query = ast_str_create(1000))) return -1; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return -1; } ast_str_set(&query, 0, "${CURL(%s/update?", url); for (;;) { if ((newparam = va_arg(ap, const char *)) == SENTINEL) { if (lookup) { lookup = 0; ast_str_append(&query, 0, ","); /* Back to the first parameter; we don't need a starting '&' */ first = 1; continue; } else { break; } } newval = va_arg(ap, const char *); ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", first ? "" : "&", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); /* TODO: Make proxies work */ pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); /* Line oriented output */ stringp = buffer; while (*stringp <= ' ') stringp++; sscanf(stringp, "%30d", &rowcount); ast_free(buffer); ast_free(query); if (rowcount >= 0) return (int)rowcount; return -1; }
static int update_curl | ( | const char * | url, |
const char * | unused, | ||
const char * | keyfield, | ||
const char * | lookup, | ||
va_list | ap | ||
) | [static] |
Execute an UPDATE query.
url | |
unused | |
keyfield | where clause field |
lookup | value of field for where clause |
ap | list containing one or more field/value set(s). |
Update a database table, prepare the sql statement using keyfield and lookup control the number of records to change. All values to be changed are stored in ap list. Sub-in the values to the prepared statement and execute it.
number | of rows affected |
-1 | on failure |
Definition at line 225 of file res_config_curl.c.
References ast_custom_function_find(), ast_free, ast_log(), ast_malloc, ast_str_append(), ast_str_buffer(), ast_str_create(), ast_str_set(), ast_uri_encode(), LOG_ERROR, and pbx_substitute_variables_helper().
{ struct ast_str *query; char buf1[200], buf2[200]; const char *newparam, *newval; char *stringp; int i, rowcount = -1; const int EncodeSpecialChars = 1, bufsize = 100; char *buffer; if (!ast_custom_function_find("CURL")) { ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n"); return -1; } if (!(query = ast_str_create(1000))) return -1; if (!(buffer = ast_malloc(bufsize))) { ast_free(query); return -1; } ast_uri_encode(keyfield, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(lookup, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_set(&query, 0, "${CURL(%s/update?%s=%s,", url, buf1, buf2); for (i = 0; (newparam = va_arg(ap, const char *)); i++) { newval = va_arg(ap, const char *); ast_uri_encode(newparam, buf1, sizeof(buf1), EncodeSpecialChars); ast_uri_encode(newval, buf2, sizeof(buf2), EncodeSpecialChars); ast_str_append(&query, 0, "%s%s=%s", i > 0 ? "&" : "", buf1, buf2); } va_end(ap); ast_str_append(&query, 0, ")}"); pbx_substitute_variables_helper(NULL, ast_str_buffer(query), buffer, bufsize - 1); /* Line oriented output */ stringp = buffer; while (*stringp <= ' ') stringp++; sscanf(stringp, "%30d", &rowcount); ast_free(buffer); ast_free(query); if (rowcount >= 0) return (int)rowcount; return -1; }
struct ast_module_info __MODULE_INFO_SECTION __mod_info = { __MODULE_INFO_GLOBALS .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Realtime Curl configuration" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .load = load_module, .unload = unload_module, } [static] |
Definition at line 626 of file res_config_curl.c.
struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 626 of file res_config_curl.c.
struct ast_config_engine curl_engine [static] |
Definition at line 593 of file res_config_curl.c.