Asterisk - The Open Source Telephony Project  18.5.0
Functions | Variables
res_config_curl.c File Reference

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"
#include "asterisk/threadstorage.h"
Include dependency graph for res_config_curl.c:

Go to the source code of this file.

Functions

static void __init_query_buf (void)
 
static void __init_result_buf (void)
 
static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static struct ast_configconfig_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, const struct ast_variable *fields)
 Execute an DELETE query. More...
 
static int load_module (void)
 
static struct ast_variablerealtime_curl (const char *url, const char *unused, const struct ast_variable *fields)
 Execute a curl query and return ast_variable list. More...
 
static struct ast_configrealtime_multi_curl (const char *url, const char *unused, const struct ast_variable *fields)
 Excute an Select query and return ast_config list. More...
 
static int reload_module (void)
 
static int require_curl (const char *url, const char *unused, va_list ap)
 
static int store_curl (const char *url, const char *unused, const struct ast_variable *fields)
 Execute an INSERT query. More...
 
static int unload_module (void)
 
static int update2_curl (const char *url, const char *unused, const struct ast_variable *lookup_fields, const struct ast_variable *update_fields)
 
static int update_curl (const char *url, const char *unused, const char *keyfield, const char *lookup, const struct ast_variable *fields)
 Execute an UPDATE query. More...
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, .requires = "extconfig,res_curl,func_curl", }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_config_engine curl_engine
 
static struct ast_threadstorage query_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_query_buf , .custom_init = NULL , }
 
static struct ast_threadstorage result_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_result_buf , .custom_init = NULL , }
 

Detailed Description

curl plugin for portable configuration engine

Author
Tilghman Lesher res_c.nosp@m.onfi.nosp@m.g_cur.nosp@m.l_v1.nosp@m.@the-.nosp@m.tilg.nosp@m.hman..nosp@m.com

Depends on the CURL library - http://curl.haxx.se/

Definition in file res_config_curl.c.

Function Documentation

◆ __init_query_buf()

static void __init_query_buf ( void  )
static

Definition at line 49 of file res_config_curl.c.

62 {

◆ __init_result_buf()

static void __init_result_buf ( void  )
static

Definition at line 50 of file res_config_curl.c.

62 {

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 659 of file res_config_curl.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 659 of file res_config_curl.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module* AST_MODULE_SELF_SYM ( void  )

Definition at line 659 of file res_config_curl.c.

◆ config_curl()

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

Definition at line 515 of file res_config_curl.c.

References ast_category_append(), ast_category_new_dynamic, ast_config_get_current_category(), ast_config_internal_load(), ast_custom_function_find(), ast_log, ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strlen_zero, ast_uri_decode(), ast_uri_encode(), ast_uri_http, ast_variable_append(), ast_variable_new, buf1, LOG_ERROR, NULL, query_buf, result_buf, S_OR, and strsep().

516 {
517  struct ast_str *query, *buffer;
518  char buf1[200];
519  char *stringp, *line, *pair, *key;
520  int last_cat_metric = -1, cat_metric = -1;
521  struct ast_category *cat = NULL;
522  char *cur_cat = "";
523  char *category = "", *var_name = "", *var_val = "";
524  struct ast_flags loader_flags = { 0 };
525 
526  if (!ast_custom_function_find("CURL")) {
527  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
528  return NULL;
529  }
530 
531  if (!(query = ast_str_thread_get(&query_buf, 100))) {
532  return NULL;
533  }
534 
535  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
536  return NULL;
537  }
538 
539  ast_uri_encode(file, buf1, sizeof(buf1), ast_uri_http);
540  ast_str_set(&query, 0, "${CURL(%s/static?file=%s)}", url, buf1);
541 
542  /* Do the CURL query */
543  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
544 
545  /* Line oriented output */
546  stringp = ast_str_buffer(buffer);
548 
549  while ((line = strsep(&stringp, "\r\n"))) {
550  if (ast_strlen_zero(line)) {
551  continue;
552  }
553 
554  while ((pair = strsep(&line, "&"))) {
555  key = strsep(&pair, "=");
557  if (pair) {
559  }
560 
561  if (!strcasecmp(key, "category")) {
562  category = S_OR(pair, "");
563  } else if (!strcasecmp(key, "var_name")) {
564  var_name = S_OR(pair, "");
565  } else if (!strcasecmp(key, "var_val")) {
566  var_val = S_OR(pair, "");
567  } else if (!strcasecmp(key, "cat_metric")) {
568  cat_metric = pair ? atoi(pair) : 0;
569  }
570  }
571 
572  if (!strcmp(var_name, "#include")) {
573  if (!ast_config_internal_load(var_val, cfg, loader_flags, "", who_asked))
574  return NULL;
575  }
576 
577  if (!cat || strcmp(category, cur_cat) || last_cat_metric != cat_metric) {
578  cat = ast_category_new_dynamic(category);
579  if (!cat) {
580  break;
581  }
582  cur_cat = category;
583  last_cat_metric = cat_metric;
584  ast_category_append(cfg, cat);
585  }
586  ast_variable_append(cat, ast_variable_new(var_name, var_val, ""));
587  }
588 
589  return cfg;
590 }
void ast_uri_decode(char *s, struct ast_flags spec)
Decode URI, URN, URL (overwrite string)
Definition: main/utils.c:616
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
struct ast_category * ast_config_get_current_category(const struct ast_config *cfg)
Retrieve the current category name being built.
Definition: extconf.c:2783
#define NULL
Definition: resample.c:96
struct ast_config * ast_config_internal_load(const char *configfile, struct ast_config *cfg, struct ast_flags flags, const char *suggested_incl_file, const char *who_asked)
Definition: main/config.c:3112
#define ast_strlen_zero(foo)
Definition: strings.h:52
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
#define ast_variable_new(name, value, filename)
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
#define ast_category_new_dynamic(name)
Create a category that is not backed by a file.
Structure used to handle boolean flags.
Definition: utils.h:199
void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
Definition: extconf.c:1178
void ast_category_append(struct ast_config *config, struct ast_category *cat)
Appends a category to a config.
Definition: extconf.c:2835
char * strsep(char **str, const char *delims)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ destroy_curl()

static int destroy_curl ( const char *  url,
const char *  unused,
const char *  keyfield,
const char *  lookup,
const struct ast_variable fields 
)
static

Execute an DELETE query.

Parameters
url
unused
keyfieldwhere clause field
lookupvalue of field for where clause
fieldslist 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.

Return values
numberof rows affected
-1on failure

Definition at line 415 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), ast_uri_http, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, and ast_variable::value.

416 {
417  struct ast_str *query, *buffer;
418  char buf1[200], buf2[200];
419  const struct ast_variable *field;
420  char *stringp;
421  int start = 1, rowcount = -1;
422 
423  if (!ast_custom_function_find("CURL")) {
424  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
425  return -1;
426  }
427 
428  if (!(query = ast_str_thread_get(&query_buf, 1000))) {
429  return -1;
430  }
431 
432  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
433  return -1;
434  }
435 
436  ast_uri_encode(keyfield, buf1, sizeof(buf1), ast_uri_http);
437  ast_uri_encode(lookup, buf2, sizeof(buf2), ast_uri_http);
438  ast_str_set(&query, 0, "${CURL(%s/destroy,%s=%s&", url, buf1, buf2);
439 
440  for (field = fields; field; field = field->next) {
441  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
442  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
443  ast_str_append(&query, 0, "%s%s=%s", !start ? "&" : "", buf1, buf2);
444  start = 0;
445  }
446 
447  ast_str_append(&query, 0, ")}");
448  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
449 
450  /* Line oriented output */
451  stringp = ast_str_buffer(buffer);
452  while (*stringp <= ' ') {
453  stringp++;
454  }
455  sscanf(stringp, "%30d", &rowcount);
456 
457  if (rowcount >= 0) {
458  return (int)rowcount;
459  }
460 
461  return -1;
462 }
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ load_module()

static int load_module ( void  )
static

Definition at line 643 of file res_config_curl.c.

References ast_config_engine_register(), AST_MODFLAG_LOAD_ORDER, AST_MODPRI_REALTIME_DRIVER, AST_MODULE_INFO(), AST_MODULE_SUPPORT_CORE, ASTERISK_GPL_KEY, reload(), reload_module(), and unload_module().

644 {
645  reload_module();
646 
648 
649  return 0;
650 }
static int reload_module(void)
int ast_config_engine_register(struct ast_config_engine *newconfig)
Register config engine.
Definition: main/config.c:2990
static struct ast_config_engine curl_engine

◆ realtime_curl()

static struct ast_variable* realtime_curl ( const char *  url,
const char *  unused,
const struct ast_variable fields 
)
static

Execute a curl query and return ast_variable list.

Parameters
urlThe base URL from which to retrieve data
unusedNot currently used
fieldslist containing one or more field/operator/value set.
Return values
varon success
NULLon failure

Definition at line 61 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strlen_zero, ast_uri_decode(), ast_uri_encode(), ast_uri_http, ast_variable_new, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, S_OR, strsep(), ast_variable::value, and var.

62 {
63  struct ast_str *query, *buffer;
64  char buf1[256], buf2[256];
65  const struct ast_variable *field;
66  char *stringp, *pair, *key;
67  unsigned int start = 1;
68  struct ast_variable *var = NULL, *prev = NULL;
69 
70  if (!ast_custom_function_find("CURL")) {
71  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
72  return NULL;
73  }
74 
75  if (!(query = ast_str_thread_get(&query_buf, 16))) {
76  return NULL;
77  }
78 
79  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
80  return NULL;
81  }
82 
83  ast_str_set(&query, 0, "${CURL(%s/single,", url);
84 
85  for (field = fields; field; field = field->next) {
86  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
87  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
88  ast_str_append(&query, 0, "%s%s=%s", !start ? "&" : "", buf1, buf2);
89  start = 0;
90  }
91 
92  ast_str_append(&query, 0, ")}");
94 
95  /* Remove any trailing newline characters */
96  if ((stringp = strchr(ast_str_buffer(buffer), '\r')) || (stringp = strchr(ast_str_buffer(buffer), '\n'))) {
97  *stringp = '\0';
98  }
99 
100  stringp = ast_str_buffer(buffer);
101  while ((pair = strsep(&stringp, "&"))) {
102  key = strsep(&pair, "=");
104  if (pair) {
106  }
107 
108  if (!ast_strlen_zero(key)) {
109  if (prev) {
110  prev->next = ast_variable_new(key, S_OR(pair, ""), "");
111  if (prev->next) {
112  prev = prev->next;
113  }
114  } else {
115  prev = var = ast_variable_new(key, S_OR(pair, ""), "");
116  }
117  }
118  }
119 
120  return var;
121 }
void ast_uri_decode(char *s, struct ast_flags spec)
Decode URI, URN, URL (overwrite string)
Definition: main/utils.c:616
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
#define var
Definition: ast_expr2f.c:614
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
#define ast_variable_new(name, value, filename)
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
char * strsep(char **str, const char *delims)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ realtime_multi_curl()

static struct ast_config* realtime_multi_curl ( const char *  url,
const char *  unused,
const struct ast_variable fields 
)
static

Excute an Select query and return ast_config list.

Parameters
url
unused
fieldslist containing one or more field/operator/value set.
Return values
structast_config pointer on success
NULLon failure

Definition at line 132 of file res_config_curl.c.

References ast_category_append(), ast_category_new_anonymous, ast_category_rename(), ast_config_new(), ast_custom_function_find(), ast_free, ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_strdup, ast_strlen_zero, ast_uri_decode(), ast_uri_encode(), ast_uri_http, ast_variable_append(), ast_variable_new, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, S_OR, strsep(), ast_variable::value, and var.

133 {
134  struct ast_str *query, *buffer;
135  char buf1[256], buf2[256];
136  const struct ast_variable *field;
137  char *stringp, *line, *pair, *key, *initfield = NULL;
138  int start = 1;
139  struct ast_variable *var = NULL;
140  struct ast_config *cfg = NULL;
141  struct ast_category *cat = NULL;
142 
143  if (!ast_custom_function_find("CURL")) {
144  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
145  return NULL;
146  }
147 
148  if (!(query = ast_str_thread_get(&query_buf, 16))) {
149  return NULL;
150  }
151 
152  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
153  return NULL;
154  }
155 
156  ast_str_set(&query, 0, "${CURL(%s/multi,", url);
157 
158  for (field = fields; field; field = field->next) {
159  if (start) {
160  char *op;
161  initfield = ast_strdup(field->name);
162  if ((op = strchr(initfield, ' ')))
163  *op = '\0';
164  }
165  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
166  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
167  ast_str_append(&query, 0, "%s%s=%s", !start ? "&" : "", buf1, buf2);
168  start = 0;
169  }
170 
171  ast_str_append(&query, 0, ")}");
172 
173  /* Do the CURL query */
174  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
175 
176  if (!(cfg = ast_config_new())) {
177  ast_free(initfield);
178  return NULL;
179  }
180 
181  /* Line oriented output */
182  stringp = ast_str_buffer(buffer);
183  while ((line = strsep(&stringp, "\r\n"))) {
184  if (ast_strlen_zero(line)) {
185  continue;
186  }
187 
189  if (!cat) {
190  continue;
191  }
192 
193  while ((pair = strsep(&line, "&"))) {
194  key = strsep(&pair, "=");
196  if (pair) {
198  }
199 
200  if (!strcasecmp(key, initfield) && pair) {
201  ast_category_rename(cat, pair);
202  }
203 
204  if (!ast_strlen_zero(key)) {
205  var = ast_variable_new(key, S_OR(pair, ""), "");
206  ast_variable_append(cat, var);
207  }
208  }
209  ast_category_append(cfg, cat);
210  }
211 
212  ast_free(initfield);
213 
214  return cfg;
215 }
void ast_uri_decode(char *s, struct ast_flags spec)
Decode URI, URN, URL (overwrite string)
Definition: main/utils.c:616
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
#define var
Definition: ast_expr2f.c:614
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define ast_strdup(str)
A wrapper for strdup()
Definition: astmm.h:243
#define NULL
Definition: resample.c:96
#define ast_strlen_zero(foo)
Definition: strings.h:52
#define ast_category_new_anonymous()
Create a nameless category that is not backed by a file.
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
void ast_category_rename(struct ast_category *cat, const char *name)
Definition: main/config.c:1362
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
#define ast_variable_new(name, value, filename)
struct ast_config * ast_config_new(void)
Create a new base configuration structure.
Definition: extconf.c:3276
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
#define ast_free(a)
Definition: astmm.h:182
void ast_variable_append(struct ast_category *category, struct ast_variable *variable)
Definition: extconf.c:1178
void ast_category_append(struct ast_config *config, struct ast_category *cat)
Appends a category to a config.
Definition: extconf.c:2835
char * strsep(char **str, const char *delims)
#define S_OR(a, b)
returns the equivalent of logic or for strings: first one if not empty, otherwise second one...
Definition: strings.h:79
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ reload_module()

static int reload_module ( void  )
static

Definition at line 604 of file res_config_curl.c.

References ast_config_destroy(), ast_config_load, ast_log, ast_variable_browse(), CONFIG_FLAG_NOREALTIME, CONFIG_STATUS_FILEINVALID, LOG_WARNING, name, ast_variable::name, ast_variable::next, NULL, pbx_builtin_setvar_helper(), ast_variable::value, and var.

Referenced by load_module().

605 {
607  struct ast_config *cfg;
608  struct ast_variable *var;
609 
610  if (!(cfg = ast_config_load("res_curl.conf", flags))) {
611  return 0;
612  } else if (cfg == CONFIG_STATUS_FILEINVALID) {
613  ast_log(LOG_WARNING, "res_curl.conf could not be parsed!\n");
614  return 0;
615  }
616 
617  if (!(var = ast_variable_browse(cfg, "globals")) && !(var = ast_variable_browse(cfg, "global")) && !(var = ast_variable_browse(cfg, "general"))) {
618  ast_log(LOG_WARNING, "[globals] not found in res_curl.conf\n");
619  ast_config_destroy(cfg);
620  return 0;
621  }
622 
623  for (; var; var = var->next) {
624  if (strncmp(var->name, "CURLOPT(", 8)) {
625  char name[256];
626  snprintf(name, sizeof(name), "CURLOPT(%s)", var->name);
627  pbx_builtin_setvar_helper(NULL, name, var->value);
628  } else {
630  }
631  }
632  ast_config_destroy(cfg);
633  return 0;
634 }
struct ast_variable * next
struct ast_variable * ast_variable_browse(const struct ast_config *config, const char *category_name)
Definition: extconf.c:1216
#define LOG_WARNING
Definition: logger.h:274
#define CONFIG_STATUS_FILEINVALID
unsigned int flags
Definition: utils.h:200
Structure for variables, used for configurations and for channel variables.
#define var
Definition: ast_expr2f.c:614
#define NULL
Definition: resample.c:96
#define ast_log
Definition: astobj2.c:42
#define ast_config_load(filename, flags)
Load a config file.
void ast_config_destroy(struct ast_config *config)
Destroys a config.
Definition: extconf.c:1290
static const char name[]
Definition: cdr_mysql.c:74
Structure used to handle boolean flags.
Definition: utils.h:199
int pbx_builtin_setvar_helper(struct ast_channel *chan, const char *name, const char *value)
Add a variable to the channel variable stack, removing the most recently set value for the same name...

◆ require_curl()

static int require_curl ( const char *  url,
const char *  unused,
va_list  ap 
)
static

Definition at line 464 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), ast_uri_http, LOG_ERROR, NULL, query_buf, result_buf, 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.

465 {
466  struct ast_str *query, *buffer;
467  char *elm, field[256];
468  int type, size, i = 0;
469 
470  if (!ast_custom_function_find("CURL")) {
471  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
472  return -1;
473  }
474 
475  if (!(query = ast_str_thread_get(&query_buf, 100))) {
476  return -1;
477  }
478 
479  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
480  return -1;
481  }
482 
483  ast_str_set(&query, 0, "${CURL(%s/require,", url);
484 
485  while ((elm = va_arg(ap, char *))) {
486  type = va_arg(ap, require_type);
487  size = va_arg(ap, int);
488  ast_uri_encode(elm, field, sizeof(field), ast_uri_http);
489  ast_str_append(&query, 0, "%s%s=%s%%3A%d",
490  i > 0 ? "&" : "",
491  field,
492  type == RQ_CHAR ? "char" :
493  type == RQ_INTEGER1 ? "integer1" :
494  type == RQ_UINTEGER1 ? "uinteger1" :
495  type == RQ_INTEGER2 ? "integer2" :
496  type == RQ_UINTEGER2 ? "uinteger2" :
497  type == RQ_INTEGER3 ? "integer3" :
498  type == RQ_UINTEGER3 ? "uinteger3" :
499  type == RQ_INTEGER4 ? "integer4" :
500  type == RQ_UINTEGER4 ? "uinteger4" :
501  type == RQ_INTEGER8 ? "integer8" :
502  type == RQ_UINTEGER8 ? "uinteger8" :
503  type == RQ_DATE ? "date" :
504  type == RQ_DATETIME ? "datetime" :
505  type == RQ_FLOAT ? "float" :
506  "unknown", size);
507  i++;
508  }
509 
510  ast_str_append(&query, 0, ")}");
511  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
512  return atoi(ast_str_buffer(buffer));
513 }
require_type
Types used in ast_realtime_require_field.
static const char type[]
Definition: chan_ooh323.c:109
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ store_curl()

static int store_curl ( const char *  url,
const char *  unused,
const struct ast_variable fields 
)
static

Execute an INSERT query.

Parameters
url
unused
fieldslist 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.

Return values
numberof rows affected
-1on failure

Definition at line 354 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), ast_uri_http, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, and ast_variable::value.

355 {
356  struct ast_str *query, *buffer;
357  char buf1[256], buf2[256];
358  const struct ast_variable *field;
359  char *stringp;
360  int start = 1, rowcount = -1;
361 
362  if (!ast_custom_function_find("CURL")) {
363  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
364  return -1;
365  }
366 
367  if (!(query = ast_str_thread_get(&query_buf, 1000))) {
368  return -1;
369  }
370 
371  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
372  return -1;
373  }
374 
375  ast_str_set(&query, 0, "${CURL(%s/store,", url);
376 
377  for (field = fields; field; field = field->next) {
378  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
379  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
380  ast_str_append(&query, 0, "%s%s=%s", !start ? "&" : "", buf1, buf2);
381  start = 0;
382  }
383 
384  ast_str_append(&query, 0, ")}");
385  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
386 
387  stringp = ast_str_buffer(buffer);
388  while (*stringp <= ' ') {
389  stringp++;
390  }
391  sscanf(stringp, "%30d", &rowcount);
392 
393  if (rowcount >= 0) {
394  return rowcount;
395  }
396 
397  return -1;
398 }
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 636 of file res_config_curl.c.

References ast_config_engine_deregister().

Referenced by load_module().

637 {
639 
640  return 0;
641 }
int ast_config_engine_deregister(struct ast_config_engine *del)
Deregister config engine.
Definition: main/config.c:3006
static struct ast_config_engine curl_engine

◆ update2_curl()

static int update2_curl ( const char *  url,
const char *  unused,
const struct ast_variable lookup_fields,
const struct ast_variable update_fields 
)
static

Definition at line 281 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), ast_uri_http, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, and ast_variable::value.

282 {
283  struct ast_str *query, *buffer;
284  char buf1[200], buf2[200];
285  const struct ast_variable *field;
286  char *stringp;
287  unsigned int start = 1;
288  int rowcount = -1;
289 
290  if (!ast_custom_function_find("CURL")) {
291  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
292  return -1;
293  }
294 
295  if (!(query = ast_str_thread_get(&query_buf, 1000)))
296  return -1;
297 
298  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
299  return -1;
300  }
301 
302  ast_str_set(&query, 0, "${CURL(%s/update?", url);
303 
304  for (field = lookup_fields; field; field = field->next) {
305  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
306  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
307  ast_str_append(&query, 0, "%s%s=%s", !start ? "" : "&", buf1, buf2);
308  start = 0;
309  }
310  ast_str_append(&query, 0, ",");
311  start = 1;
312 
313  for (field = update_fields; field; field = field->next) {
314  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
315  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
316  ast_str_append(&query, 0, "%s%s=%s", !start ? "" : "&", buf1, buf2);
317  start = 0;
318  }
319 
320  ast_str_append(&query, 0, ")}");
321  /* Proxies work, by setting CURLOPT options in the [globals] section of
322  * extensions.conf. Unfortunately, this means preloading pbx_config.so
323  * so that they have an opportunity to be set prior to startup realtime
324  * queries. */
325  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
326 
327  /* Line oriented output */
328  stringp = ast_str_buffer(buffer);
329  while (*stringp <= ' ') {
330  stringp++;
331  }
332  sscanf(stringp, "%30d", &rowcount);
333 
334  if (rowcount >= 0) {
335  return (int)rowcount;
336  }
337 
338  return -1;
339 }
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

◆ update_curl()

static int update_curl ( const char *  url,
const char *  unused,
const char *  keyfield,
const char *  lookup,
const struct ast_variable fields 
)
static

Execute an UPDATE query.

Parameters
url
unused
keyfieldwhere clause field
lookupvalue of field for where clause
fieldslist 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.

Return values
numberof rows affected
-1on failure

Definition at line 232 of file res_config_curl.c.

References ast_custom_function_find(), ast_log, ast_str_append(), ast_str_buffer(), ast_str_set(), ast_str_substitute_variables(), ast_str_thread_get(), ast_uri_encode(), ast_uri_http, buf1, buf2, LOG_ERROR, ast_variable::name, ast_variable::next, NULL, query_buf, result_buf, and ast_variable::value.

233 {
234  struct ast_str *query, *buffer;
235  char buf1[256], buf2[256];
236  const struct ast_variable *field;
237  char *stringp;
238  int start = 1, rowcount = -1;
239 
240  if (!ast_custom_function_find("CURL")) {
241  ast_log(LOG_ERROR, "func_curl.so must be loaded in order to use res_config_curl.so!!\n");
242  return -1;
243  }
244 
245  if (!(query = ast_str_thread_get(&query_buf, 16))) {
246  return -1;
247  }
248 
249  if (!(buffer = ast_str_thread_get(&result_buf, 16))) {
250  return -1;
251  }
252 
253  ast_uri_encode(keyfield, buf1, sizeof(buf1), ast_uri_http);
254  ast_uri_encode(lookup, buf2, sizeof(buf2), ast_uri_http);
255  ast_str_set(&query, 0, "${CURL(%s/update?%s=%s,", url, buf1, buf2);
256 
257  for (field = fields; field; field = field->next) {
258  ast_uri_encode(field->name, buf1, sizeof(buf1), ast_uri_http);
259  ast_uri_encode(field->value, buf2, sizeof(buf2), ast_uri_http);
260  ast_str_append(&query, 0, "%s%s=%s", !start ? "&" : "", buf1, buf2);
261  start = 0;
262  }
263 
264  ast_str_append(&query, 0, ")}");
265  ast_str_substitute_variables(&buffer, 0, NULL, ast_str_buffer(query));
266 
267  /* Line oriented output */
268  stringp = ast_str_buffer(buffer);
269  while (*stringp <= ' ') {
270  stringp++;
271  }
272  sscanf(stringp, "%30d", &rowcount);
273 
274  if (rowcount >= 0) {
275  return (int)rowcount;
276  }
277 
278  return -1;
279 }
struct ast_variable * next
char * ast_str_buffer(const struct ast_str *buf)
Returns the string buffer within the ast_str buf.
Definition: strings.h:714
Structure for variables, used for configurations and for channel variables.
char * ast_uri_encode(const char *string, char *outbuf, int buflen, struct ast_flags spec)
Turn text string to URI-encoded XX version.
Definition: main/utils.c:577
void ast_str_substitute_variables(struct ast_str **buf, ssize_t maxlen, struct ast_channel *chan, const char *templ)
int ast_str_append(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Append to a thread local dynamic string.
Definition: strings.h:1091
static struct ast_threadstorage buf2
#define NULL
Definition: resample.c:96
int ast_str_set(struct ast_str **buf, ssize_t max_len, const char *fmt,...)
Set a dynamic string using variable arguments.
Definition: strings.h:1065
#define ast_log
Definition: astobj2.c:42
static struct ast_threadstorage result_buf
struct ast_custom_function * ast_custom_function_find(const char *name)
Definition: ael_main.c:173
#define LOG_ERROR
Definition: logger.h:285
The descriptor of a dynamic string XXX storage will be optimized later if needed We use the ts field ...
Definition: strings.h:584
static struct ast_threadstorage buf1
const struct ast_flags ast_uri_http
Definition: main/utils.c:573
struct ast_str * ast_str_thread_get(struct ast_threadstorage *ts, size_t init_len)
Retrieve a thread locally stored dynamic string.
Definition: strings.h:861
static char url[512]
static struct ast_threadstorage query_buf

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Realtime Curl configuration" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "30ef0c93b36035ec78c9cfd712d36d9b" , .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .reload = reload_module, .load_pri = AST_MODPRI_REALTIME_DRIVER, .requires = "extconfig,res_curl,func_curl", }
static

Definition at line 659 of file res_config_curl.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 659 of file res_config_curl.c.

◆ curl_engine

struct ast_config_engine curl_engine
static

Definition at line 592 of file res_config_curl.c.

◆ query_buf

struct ast_threadstorage query_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_query_buf , .custom_init = NULL , }
static

◆ result_buf

struct ast_threadstorage result_buf = { .once = PTHREAD_ONCE_INIT , .key_init = __init_result_buf , .custom_init = NULL , }
static