[Asterisk-code-review] This patch adds a beanstalk CDR backend. (asterisk[master])
Nir Simionovich (GreenfieldTech - Israel)
asteriskteam at digium.com
Mon Oct 16 14:55:00 CDT 2017
Nir Simionovich (GreenfieldTech - Israel) has uploaded this change for review. ( https://gerrit.asterisk.org/6818
Change subject: This patch adds a beanstalk CDR backend.
......................................................................
This patch adds a beanstalk CDR backend.
Beanstalkd is a simple to use job queue. It provides a means to
create multiple job queues called "tubes". Each tube can store
multiple jobs, with varying priorities with the queue. Queue
processing is available via a simple TCP socket or via well defined
libraries, avaialble at
https://github.com/kr/beanstalkd/wiki/client-libraries
At the same time, I cleaned up some minor syntax correction inside
cdr_manager.c, per remarks by Corey Farrel
Change-Id: I44e7eb208f19520e939d3fcab403f4ec20370b61
---
M cdr/cdr_beanstalkd.c
M cdr/cdr_manager.c
M configs/samples/cdr_beanstalkd.conf.sample
M configure.ac
4 files changed, 81 insertions(+), 46 deletions(-)
git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/18/6818/1
diff --git a/cdr/cdr_beanstalkd.c b/cdr/cdr_beanstalkd.c
index e70b047..5ec6e64 100644
--- a/cdr/cdr_beanstalkd.c
+++ b/cdr/cdr_beanstalkd.c
@@ -1,7 +1,9 @@
/*
* Asterisk -- An open source telephony toolkit.
*
- * Copyright (C) 2004 - 2005
+ * Copyright (C) 2017
+ *
+ * Nir Simionovich <nirs at greenfieldtech.net>
*
* See http://www.asterisk.org for more information about
* the Asterisk project. Please do not directly contact
@@ -176,6 +178,7 @@
#include "asterisk/manager.h"
#include "asterisk/config.h"
#include "asterisk/pbx.h"
+#include "asterisk/json.h"
#define DATE_FORMAT "%Y-%m-%d %T"
#define CONF_FILE "cdr_beanstalkd.conf"
@@ -199,7 +202,7 @@
static int beanstalk_put(struct ast_cdr *cdr);
static int load_config(int reload) {
- char *cat = NULL;
+ char *cat;
struct ast_config *cfg;
struct ast_variable *v;
struct ast_flags config_flags = {reload ? CONFIG_FLAG_FILEUNCHANGED : 0};
@@ -238,24 +241,23 @@
if (!strcasecmp(cat, "general")) {
v = ast_variable_browse(cfg, cat);
while (v) {
- if (!strcasecmp(v->name, "enabled"))
- newenablecdr = ast_true(v->value);
if (!newenablecdr) {
- enablecdr = newenablecdr;
- return 0;
+ if (!strcasecmp(v->name, "enabled")) {
+ newenablecdr = ast_true(v->value);
+ }
+ } else {
+ if (!strcasecmp(v->name, "host")) {
+ bs_host = ast_strdup(v->value);
+ } else if (!strcasecmp(v->name, "port")) {
+ bs_port = atoi(v->value);
+ } else if (!strcasecmp(v->name, "tube")) {
+ bs_tube = ast_strdup(v->value);
+ } else if (!strcasecmp(v->name, "priority")) {
+ priority = atoi(v->value);
+ }
+ v = v->next;
}
-
- if (!strcasecmp(v->name, "host"))
- bs_host = ast_strdup(v->value);
- if (!strcasecmp(v->name, "port"))
- bs_port = atoi(v->value);
- if (!strcasecmp(v->name, "tube"))
- bs_tube = ast_strdup(v->value);
- if (!strcasecmp(v->name, "priority"))
- priority = atoi(v->value);
-
- v = v->next;
}
}
ast_log(LOG_NOTICE, "Added beanstalkd server %s at port %d with tube %s", bs_host, bs_port, bs_tube);
@@ -279,16 +281,20 @@
static int beanstalk_put(struct ast_cdr *cdr) {
struct ast_tm timeresult;
- char strStartTime[80] = "";
- char strAnswerTime[80] = "";
- char strEndTime[80] = "";
+ char strStartTime[80];
+ char strAnswerTime[80];
+ char strEndTime[80];
char buf[CUSTOM_FIELDS_BUF_SIZE];
- char cdr_buffer[BEANSTALK_JOB_SIZE];
+ char *cdr_buffer;
+ int bs_id;
+ int bs_socket;
+ struct ast_json *t_cdr_json;
- if (!enablecdr)
+ if (!enablecdr) {
return 0;
+ }
- int bs_id, bs_socket = bs_connect(bs_host, bs_port);
+ bs_socket = bs_connect(bs_host, bs_port);
if (bs_use(bs_socket, bs_tube) != BS_STATUS_OK) {
ast_log(LOG_ERROR, "Connection to Beanstalk tube %s @ %s:%d had failed", bs_tube, bs_host, bs_port);
@@ -307,7 +313,7 @@
ast_strftime(strEndTime, sizeof(strEndTime), DATE_FORMAT, &timeresult);
buf[0] = '\0';
- cdr_buffer[0] = '\0';
+ //cdr_buffer[0] = '\0';
ast_rwlock_rdlock(&customfields_lock);
if (customfields && ast_str_strlen(customfields)) {
@@ -322,6 +328,30 @@
}
ast_rwlock_unlock(&customfields_lock);
+ t_cdr_json = ast_json_pack("{s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:s, s:i, s:i, s:s, s:s, s:s, s:s, s:s}",
+ "AccountCode", S_OR(cdr->accountcode, ""),
+ "Source", S_OR(cdr->src, ""),
+ "Destination", S_OR(cdr->dst, ""),
+ "DestinationContext", S_OR(cdr->dcontext, ""),
+ "CallerID", S_OR(cdr->clid, ""),
+ "Channel", S_OR(cdr->channel, ""),
+ "DestinationChannel", S_OR(cdr->dstchannel, ""),
+ "LastApplication", S_OR(cdr->lastapp, ""),
+ "LastData", S_OR(cdr->lastdata, ""),
+ "StartTime", S_OR(strStartTime, ""),
+ "AnswerTime", S_OR(strAnswerTime, ""),
+ "EndTime", S_OR(strEndTime, ""),
+ "Duration", cdr->duration,
+ "Billsec", cdr->billsec,
+ "Disposition", S_OR(ast_cdr_disp2str(cdr->disposition), ""),
+ "AMAFlags", S_OR(ast_channel_amaflags2string(cdr->amaflags), ""),
+ "UniqueID", S_OR(cdr->uniqueid, ""),
+ "UserField", S_OR(cdr->userfield, ""),
+ "CustomFields", S_OR(buf, ""));
+
+ cdr_buffer = ast_json_dump_string(t_cdr_json);
+
+ /*
snprintf(cdr_buffer, BEANSTALK_JOB_SIZE,
"{ \"AccountCode\": \"%s\", \"Source\": \"%s\", \"Destination\": \"%s\", \"DestinationContext\": \"%s\", "
"\"CallerID\": \"%s\", \"Channel\": \"%s\", \"DestinationChannel\": \"%s\", \"LastApplication\": \"%s\", "
@@ -333,13 +363,15 @@
cdr->duration, cdr->billsec, ast_cdr_disp2str(cdr->disposition),
ast_channel_amaflags2string(cdr->amaflags), cdr->uniqueid, cdr->userfield, buf
);
+ */
bs_id = bs_put(bs_socket, priority, BEANSTALK_JOB_DELAY, BEANSTALK_JOB_TTR, cdr_buffer, strlen(cdr_buffer));
- if (bs_id > 0)
+ if (bs_id > 0) {
ast_log(LOG_NOTICE, "Successfully created job %d with %s\n", bs_id, cdr_buffer);
- else
+ } else {
ast_log(LOG_ERROR, "CDR job creation failed for %s\n", cdr_buffer);
+ }
bs_disconnect(bs_socket);
return 0;
@@ -350,8 +382,9 @@
return -1;
}
- if (customfields)
+ if (customfields) {
ast_free(customfields);
+ }
return 0;
}
@@ -374,10 +407,10 @@
}
AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "Asterisk Beanstalkd CDR Backend",
-.support_level = AST_MODULE_SUPPORT_CORE,
-.load = load_module,
-.unload = unload_module,
-.reload = reload,
-.load_pri = AST_MODPRI_CDR_DRIVER,
+ .support_level = AST_MODULE_SUPPORT_CORE,
+ .load = load_module,
+ .unload = unload_module,
+ .reload = reload,
+ .load_pri = AST_MODPRI_CDR_DRIVER,
);
diff --git a/cdr/cdr_manager.c b/cdr/cdr_manager.c
index 3f0cc6b..af0c372 100644
--- a/cdr/cdr_manager.c
+++ b/cdr/cdr_manager.c
@@ -273,13 +273,14 @@
static int manager_log(struct ast_cdr *cdr)
{
struct ast_tm timeresult;
- char strStartTime[80] = "";
- char strAnswerTime[80] = "";
- char strEndTime[80] = "";
+ char strStartTime[80];
+ char strAnswerTime[80];
+ char strEndTime[80];
char buf[CUSTOM_FIELDS_BUF_SIZE];
- if (!enablecdr)
+ if (!enablecdr) {
return 0;
+ }
ast_localtime(&cdr->start, &timeresult, NULL);
ast_strftime(strStartTime, sizeof(strStartTime), DATE_FORMAT, &timeresult);
@@ -340,8 +341,9 @@
return -1;
}
- if (customfields)
+ if (customfields) {
ast_free(customfields);
+ }
return 0;
}
diff --git a/configs/samples/cdr_beanstalkd.conf.sample b/configs/samples/cdr_beanstalkd.conf.sample
index 368ac6c..557f857 100644
--- a/configs/samples/cdr_beanstalkd.conf.sample
+++ b/configs/samples/cdr_beanstalkd.conf.sample
@@ -3,17 +3,18 @@
;
; Beanstalkd is a simple job queue server, that is highly versatile and simple to use.
; Beanstalkd includes the capability of using multiple queues at the same time, with priorities.
+;
[general]
enabled = no
-host = 127.0.0.1 ; Specify the remote IP address of the Beanstalkd server
-port = 11300 ; Specify the remote PORT of the the Beanstalkd server
-tube = asterisk-cdr ; Specify the default CDR job queue to use
-priority = 99 ; Specify the default job priority for the queue. This parameter is useful when building
- ; platform with multiple Asterisk servers, that are used for different functions. For example,
- ; none billable CDR records can be inserted with a priority of 99, while billable ones be
- ; inserted with a priority of 1
+;host = 127.0.0.1 ; Specify the remote IP address of the Beanstalkd server
+;port = 11300 ; Specify the remote PORT of the the Beanstalkd server
+;tube = asterisk-cdr ; Specify the default CDR job queue to use
+;priority = 99 ; Specify the default job priority for the queue. This parameter is useful when building
+ ; platform with multiple Asterisk servers, that are used for different functions. For example,
+ ; none billable CDR records can be inserted with a priority of 99, while billable ones be
+ ; inserted with a priority of 1
diff --git a/configure.ac b/configure.ac
index 618ff8d..1ca64c8 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2171,8 +2171,7 @@
AST_EXT_LIB_CHECK([BLUETOOTH], [bluetooth], [ba2str], [bluetooth/bluetooth.h])
-AST_EXT_LIB_CHECK([BEA
-NSTALK], [beanstalk], [bs_version], [beanstalk.h])
+AST_EXT_LIB_CHECK([BEANSTALK], [beanstalk], [bs_version], [beanstalk.h])
# possible places for oss definitions
AST_EXT_LIB_CHECK([OSS], [ossaudio], [], [linux/soundcard.h])
--
To view, visit https://gerrit.asterisk.org/6818
To unsubscribe, visit https://gerrit.asterisk.org/settings
Gerrit-Project: asterisk
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I44e7eb208f19520e939d3fcab403f4ec20370b61
Gerrit-Change-Number: 6818
Gerrit-PatchSet: 1
Gerrit-Owner: Nir Simionovich (GreenfieldTech - Israel) <nirs at greenfieldtech.net>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-code-review/attachments/20171016/cc875cd7/attachment-0001.html>
More information about the asterisk-code-review
mailing list