[Freeswitch-svn] [commit] r4145 - in freeswitch/branches/cparker/src/mod/event_handlers: mod_cdr mod_cdr_radius
Freeswitch SVN
cparker at freeswitch.org
Wed Feb 7 11:09:36 EST 2007
Author: cparker
Date: Wed Feb 7 11:09:35 2007
New Revision: 4145
Added:
freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.cpp
freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.h
Removed:
freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr_radius/
Modified:
freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/Makefile
Log:
Added the mod_cdr radius instance, removed unused mod_cdr_radius directory
Modified: freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/Makefile
==============================================================================
--- freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/Makefile (original)
+++ freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/Makefile Wed Feb 7 11:09:35 2007
@@ -1,14 +1,35 @@
+<<<<<<< .mine
+
+=======
+>>>>>>> .r4141
#CFLAGS += -DSWITCH_QUEUE_ENHANCED
+<<<<<<< .mine
+=======
#LDFLAGS += -lcurl
+>>>>>>> .r4141
CPPCC = g++
OBJS=cdrcontainer.o basecdr.o baseregistry.o pddcdr.o csvcdr.o xmlcdr.o sqlitecdr.o
+<<<<<<< .mine
+# uncomment to build radiuscdr
+OBJS += radiuscdr.o
+LDFLAGS += -lfreeradius-client
+
+# uncomment to build mysqlcdr
+#OBJS += mysqlcdr.o
+#CFLAGS += $(shell mysql_config --include)
+#LDFLAGS += $(shell mysql_config --libs)
+
+#
+
+=======
ifneq ($(shell which mysql_config),)
CFLAGS += $(shell mysql_config --include)
LDFLAGS += $(shell mysql_config --libs)
OBJS += mysqlcdr.o
endif
+>>>>>>> .r4141
all: depends $(OBJS) $(MODNAME).$(DYNAMIC_LIB_EXTEN)
depends:
@@ -17,7 +38,6 @@
$(CPPCC) $(CFLAGS) -fPIC -c $(MODNAME).cpp -o $(MODNAME).o
$(CPPCC) $(SOLINK) -o $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(MODNAME).o $(OBJS) $(LDFLAGS)
-
%.o: %.cpp
$(CPPCC) -Wall -Werror -fPIC $(CFLAGS) -c -o $@ $<
Added: freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.cpp
==============================================================================
--- (empty file)
+++ freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.cpp Wed Feb 7 11:09:35 2007
@@ -0,0 +1,343 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application Call Detail Recorder module
+ * Copyright 2006, Author: Yossi Neiman of Cartis Solutions, Inc. <freeswitch AT cartissolutions.com>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application Call Detail Recorder module
+ *
+ * The Initial Developer of the Original Code is
+ * Yossi Neiman <freeswitch AT cartissolutions.com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Yossi Neiman <freeswitch AT cartissolutions.com> - Original CDR Class interface
+ * Chris Parker <cparker AT segv.org> - RADIUS CDR subclass
+ *
+ * Description: This C++ source file describes the RADIUS CDR class that handles processing CDRs to a
+ * RADIUS Server.
+ *
+ * This is the standard CSV module, and has a list of predefined variables to log out which can be
+ * added to, but never have the default ones removed. If you want to use one that allows you to explicity
+ * set all data variables to be logged and in what order, then this is not the class you want to use, and
+ * one will be coming in the future to do just that.
+ *
+ * radiuscdr.cpp
+ *
+ */
+
+#include <switch.h>
+#include "radiuscdr.h"
+#include <string>
+
+RadiusCDR::RadiusCDR() : BaseCDR()
+{
+ memset(formattedcallstartdate,0,100);
+ memset(formattedcallanswerdate,0,100);
+ memset(formattedcallenddate,0,100);
+}
+
+RadiusCDR::RadiusCDR(switch_mod_cdr_newchannel_t *newchannel) : BaseCDR(newchannel)
+{
+ memset(formattedcallstartdate,0,100);
+ memset(formattedcallanswerdate,0,100);
+ memset(formattedcalltransferdate,0,100);
+ memset(formattedcallenddate,0,100);
+
+ if(newchannel != 0)
+ {
+ switch_time_exp_t tempcallstart, tempcallanswer, tempcalltransfer, tempcallend;
+ memset(&tempcallstart,0,sizeof(tempcallstart));
+ memset(&tempcalltransfer,0,sizeof(tempcalltransfer));
+ memset(&tempcallanswer,0,sizeof(tempcallanswer));
+ memset(&tempcallend,0,sizeof(tempcallend));
+ convert_time(&tempcallstart, callstartdate);
+ convert_time(&tempcallanswer, callanswerdate);
+ convert_time(&tempcalltransfer, calltransferdate);
+ convert_time(&tempcallend, callenddate);
+
+ // Format the times
+ apr_size_t retsizecsd, retsizecad, retsizectd, retsizeced; //csd == callstartdate, cad == callanswerdate, ced == callenddate, ceff == callenddate_forfile
+ char format[] = "%Y-%m-%d %H:%M:%S";
+ switch_strftime(formattedcallstartdate,&retsizecsd,sizeof(formattedcallstartdate),format,&tempcallstart);
+ switch_strftime(formattedcallanswerdate,&retsizecad,sizeof(formattedcallanswerdate),format,&tempcallanswer);
+ switch_strftime(formattedcalltransferdate,&retsizectd,sizeof(formattedcalltransferdate),format,&tempcalltransfer);
+ switch_strftime(formattedcallenddate,&retsizeced,sizeof(formattedcallenddate),format,&tempcallend);
+
+ if(chanvars_fixed_list.size() > 0)
+ process_channel_variables(chanvars_fixed_list,newchannel->channel);
+
+ if(chanvars_supp_list.size() > 0)
+ process_channel_variables(chanvars_supp_list,chanvars_fixed_list,newchannel->channel,repeat_fixed_in_supp);
+ }
+}
+
+RadiusCDR::~RadiusCDR()
+{
+
+}
+
+std::string RadiusCDR::display_name = "RadiusCDR - The RADIUS CDR logger";
+bool RadiusCDR::activated=0;
+bool RadiusCDR::connectionstate=0;
+bool RadiusCDR::logchanvars=0;
+std::list<std::string> RadiusCDR::chanvars_supp_list;
+std::list<std::string> RadiusCDR::chanvars_fixed_list;
+bool RadiusCDR::repeat_fixed_in_supp=0;
+modcdr_time_convert_t RadiusCDR::convert_time = switch_time_exp_lt;
+//char RadiusCDR::formattedcallstartdate[100] = "";
+//char RadiusCDR::formattedcallanswerdate[100] = "";
+//char RadiusCDR::formattedcalltransferdate[100] = "";
+//char RadiusCDR::formattedcallenddate[100] = "";
+char RadiusCDR::path_radiusclient_conf[255] = "";
+rc_handle *RadiusCDR::rh = NULL;
+char RadiusCDR::accounting_server1[255] = "";
+int RadiusCDR::accounting_port1 = 1813;
+char RadiusCDR::accounting_secret1[255] = "";
+//char RadiusCDR::accounting_server2 = "";
+//int RadiusCDR::accounting_port2 = 1813;
+//char RadiusCDR::accounting_secret2 = "";
+
+void RadiusCDR::connect(switch_xml_t& cfg, switch_xml_t& xml, switch_xml_t& settings, switch_xml_t& param)
+{
+ switch_console_printf(SWITCH_CHANNEL_LOG, "[RadiusCDR] connect() - Loading configuration file.\n");
+ activated = 0; // Set it as inactive initially
+
+ if ((settings = switch_xml_child(cfg, "radiuscdr")))
+ {
+ int count_config_params = 0; // Need to make sure all params are set before we load
+ for (param = switch_xml_child(settings, "param"); param; param = param->next)
+ {
+ char *var = (char *) switch_xml_attr_soft(param, "name");
+ char *val = (char *) switch_xml_attr_soft(param, "value");
+
+ if (!strcmp(var, "radiuscdr_conf"))
+ {
+ if(val != 0) {
+ strncpy(path_radiusclient_conf,val,strlen(val));
+ count_config_params++;
+ }
+ }
+
+ else if (!strcmp(var, "acct_server1"))
+ {
+ if(val != 0) {
+ strncpy(accounting_server1,val,strlen(val));
+ }
+ }
+ else if (!strcmp(var, "acct_port1"))
+ {
+ if(val != 0)
+ accounting_port1 = atoi(val);
+ }
+ else if (!strcmp(var, "acct_secret1"))
+ {
+ if(val != 0) {
+ strncpy(accounting_secret1,val,strlen(val));
+ }
+ }
+ else if (!strcmp(var, "chanvars_supp"))
+ {
+ if(val != 0)
+ {
+ std::string unparsed;
+ unparsed = val;
+ if(unparsed.size() > 0)
+ {
+ bool fixed = 0;
+ parse_channel_variables_xconfig(unparsed,chanvars_supp_list,fixed);
+ logchanvars=1;
+ }
+ }
+ }
+
+ else if (!strcmp(var, "chanvars_fixed"))
+ {
+ if(val != 0)
+ {
+ std::string unparsed;
+ unparsed = val;
+ if(unparsed.size() > 0)
+ {
+ bool fixed = 1;
+ parse_channel_variables_xconfig(unparsed,chanvars_fixed_list,fixed);
+ logchanvars=1;
+ }
+ }
+ }
+ }
+
+ if( count_config_params > 0 &&
+ (accounting_server1 != NULL && accounting_secret1 != NULL))
+ {
+ if ((rh = rc_read_config(path_radiusclient_conf)) == NULL) {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed to initialize radius config\n");
+ } else if (rc_read_dictionary(rh, rc_conf_str(rh, "dictionary")) != 0) {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed to initialize radius dictionary\n");
+ } else {
+ activated = 1;
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] activated\n");
+ }
+ } else {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR]You did not specify the minimum parameters for using this module. You must specify at least one radius server to send records to.\n");
+ }
+ }
+}
+
+bool RadiusCDR::process_record()
+{
+ bool retval = 0;
+ UINT4 client_port = 0;
+ UINT4 status_type = PW_STATUS_STOP;
+ VALUE_PAIR *send = NULL;
+// VALUE_PAIR *vp = NULL;
+// DICT_VALUE *dval = NULL;
+
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Processing Record: %s to %s\n", src, dst);
+
+ if (rc_avpair_add(rh, &send, PW_ACCT_STATUS_TYPE, &status_type, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding Acct-Status-Type: to %d\n", status_type);
+ return -1;
+ }
+ if (rc_avpair_add(rh, &send, PW_ACCT_SESSION_ID, myuuid, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding Acct-Session-ID: to %s\n", myuuid);
+ return -1;
+ }
+ if (rc_avpair_add(rh, &send, PW_USER_NAME, src, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding User-Name: to %s\n", src);
+ return -1;
+ }
+ if (rc_avpair_add(rh, &send, PW_CALLED_STATION_ID, dst, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding Called-Station-ID: to %s\n", dst);
+ return -1;
+ }
+ if (rc_avpair_add(rh, &send, PW_CALLING_STATION_ID, src, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding Calling-Station-ID: to %s\n", src);
+ return -1;
+ }
+ if (rc_avpair_add(rh, &send, PW_ACCT_SESSION_TIME, &billusec, -1, 0) == NULL)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Failed adding Acct-Session-Time: to %d\n", billusec);
+ return -1;
+ }
+
+ // Format the call record and proceed from here...
+ //callstartdate
+ //formattedcallstartdate << "\",\"";
+ //callanswerdate << "\",\"";
+ //formattedcallanswerdate << "\",\"";
+ //calltransferdate << "\",\"";
+ //formattedcalltransferdate << "\",\"";
+ //callenddate << "\",\"";
+ //formattedcallenddate << "\",\"";
+ //hangupcause_text << "\",\"";
+ //hangupcause << "\",\"";
+ //clid << "\",\"";
+
+
+ //originated << "\",\"";
+ //dialplan << "\",\"";
+ //myuuid << "\",\"";
+ //destuuid << "\",\"";
+ //src << "\",\"";
+ //dst << "\",\"";
+ //srcchannel << "\",\"";
+ //dstchannel << "\",\"";
+ //ani << "\",\"";
+ //aniii << "\",\"";
+ //network_addr << "\",\"";
+ //lastapp << "\",\"";
+ //lastdata << "\",\"";
+ //billusec << "\",\"";
+ //disposition << "\",\"";
+ //amaflags << "\"";
+
+ // Now to process chanvars, fixed ones first
+ //if(chanvars_fixed.size() > 0 )
+ //{
+ // std::list<std::pair<std::string,std::string> >::iterator iItr, iEnd;
+ // for(iItr = chanvars_fixed.begin(), iEnd = chanvars_fixed.end(); iItr != iEnd; iItr++)
+ // //",\"" << iItr->second << "\"";
+ //}
+
+ //if(chanvars_supp.size() > 0 )
+ //{
+ // std::map<std::string,std::string>::iterator iItr,iEnd;
+ // for(iItr = chanvars_supp.begin(), iEnd = chanvars_supp.end() ; iItr != iEnd; iItr++)
+ // //",\"" << iItr->first << "=" << iItr->second << "\"";
+ //}
+ //std::endl;
+
+ if(rc_acct(rh, client_port, send) == OK_RC)
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Accounting OK: %s to %s\n", src, dst);
+ retval = 1;
+ }
+ else
+ {
+ switch_console_printf(SWITCH_CHANNEL_LOG,"[RadiusCDR] Accounting Failed: %s to %s\n", src, dst);
+ retval = -1;
+ }
+ rc_avpair_free(send);
+ return retval;
+}
+
+bool RadiusCDR::is_activated()
+{
+ return activated;
+}
+
+void RadiusCDR::tempdump_record()
+{
+
+}
+
+void RadiusCDR::reread_tempdumped_records()
+{
+
+}
+
+std::string RadiusCDR::get_display_name()
+{
+ return display_name;
+}
+
+void RadiusCDR::disconnect()
+{
+ activated = 0;
+ logchanvars = 0;
+ repeat_fixed_in_supp = 0;
+ chanvars_fixed_list.clear();
+ chanvars_supp_list.clear();
+ switch_console_printf(SWITCH_CHANNEL_LOG,"Shutting down RadiusCDR... Done!\n");
+}
+
+AUTO_REGISTER_BASECDR(RadiusCDR);
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c++
+ * indent-tabs-mode:nil
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
+ */
Added: freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.h
==============================================================================
--- (empty file)
+++ freeswitch/branches/cparker/src/mod/event_handlers/mod_cdr/radiuscdr.h Wed Feb 7 11:09:35 2007
@@ -0,0 +1,92 @@
+/*
+ * FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application Call Detail Recorder module
+ * Copyright 2006, Author: Yossi Neiman of Cartis Solutions, Inc. <freeswitch AT cartissolutions.com>
+ *
+ * Version: MPL 1.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is FreeSWITCH Modular Media Switching Software Library / Soft-Switch Application Call Detail Recorder module
+ *
+ * The Initial Developer of the Original Code is
+ * Yossi Neiman <freeswitch AT cartissolutions.com>
+ * Portions created by the Initial Developer are Copyright (C)
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *
+ * Yossi Neiman <freeswitch AT cartissolutions.com>
+ * Chris Parker <cparker AT segv.org>
+ *
+ * Description: This C++ header file describes the RadiusCDR class.
+ *
+ * radiuscdr.h
+ *
+ */
+
+#include "baseregistry.h"
+#include <switch.h>
+#include <list>
+#include <freeradius-client.h>
+
+#ifndef RADIUSCDR
+#define RADIUSCDR
+
+class RadiusCDR : public BaseCDR {
+ public:
+ RadiusCDR();
+ RadiusCDR(switch_mod_cdr_newchannel_t *newchannel);
+ //RadiusCDR(const RadiusCDR& copyFrom);
+ virtual ~RadiusCDR();
+ virtual bool process_record();
+ virtual void connect(switch_xml_t& cfg, switch_xml_t& xml, switch_xml_t& settings, switch_xml_t& param); // connect and disconnect need to be static because we're persisting connections until shutdown
+ virtual void disconnect();
+ virtual bool is_activated();
+ virtual void tempdump_record();
+ virtual void reread_tempdumped_records();
+ virtual std::string get_display_name();
+
+ private:
+ static std::string display_name;
+ static bool activated; // Is this module activated?
+ static bool connectionstate; // What is the status of the connection?
+ static bool logchanvars;
+ static std::list<std::string> chanvars_fixed_list; // Normally this would be used, but not in this class
+ static std::list<std::string> chanvars_supp_list; // This will hold the list for all chanvars here
+ static bool repeat_fixed_in_supp;
+ static modcdr_time_convert_t convert_time;
+ char formattedcallstartdate[100];
+ char formattedcallanswerdate[100];
+ char formattedcalltransferdate[100];
+ char formattedcallenddate[100];
+ // radius vars
+ static char path_radiusclient_conf[255];
+ static rc_handle *rh;
+ static char accounting_server1[255];
+ static int accounting_port1;
+ static char accounting_secret1[255];
+ //static char accounting_server2[255];
+ //static int accounting_port2;
+ //static char accounting_secret2[255];
+};
+
+#endif
+
+/* For Emacs:
+ * Local Variables:
+ * mode:c++
+ * indent-tabs-mode:nil
+ * tab-width:4
+ * c-basic-offset:4
+ * End:
+ * For VIM:
+ * vim:set softtabstop=4 shiftwidth=4 tabstop=4 expandtab:
+ */
More information about the Freeswitch-svn
mailing list