[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