[commit] r5116 - freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr
Author: cparker Date: Wed May 9 16:46:31 2007 New Revision: 5116 Added: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/Makefile.am freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h Removed: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/Makefile Modified: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c Log: Updated build params, and initial compilation fixes Added: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/Makefile.am ============================================================================== --- (empty file) +++ freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/Makefile.am Wed May 9 16:46:31 2007 @@ -0,0 +1,33 @@ +AM_CFLAGS = $(SWITCH_AM_CFLAGS) +AM_CPPFLAGS = $(SWITCH_AM_CXXFLAGS) +AM_LDFLAGS = $(SWITCH_AM_LDFLAGS) +#we should set all these vars from configure, no reason to have these in each Makefile.am +LIBTOOL = echo "`link=\`echo $@|grep .la;echo $@|grep .so;echo $@|grep .dll\`;if test -n "$$link"; then echo Creating $@;fi`";`if test -z "$(VERBOSE)" ; \ +then echo $(SHELL) $(switch_builddir)/quiet_libtool ;else echo $(SHELL) $(switch_builddir)/libtool; fi` +AM_MAKEFLAGS=`test -n "$(VERBOSE)" || echo -s` +# Dirty trick to override the link output +LIBS+=> $(MODNAME).log || error="yes";if test -n "$(VERBOSE)" -o "$$error" = "yes";then cat $(MODNAME).log;fi;if test "$$error" = "yes";then exit 1;fi + +moddir=$(prefix)/mod + +MODNAME=mod_radius_cdr +mod_LTLIBRARIES = mod_radius_cdr.la +mod_radius_cdr_la_SOURCES = mod_radius_cdr.c +mod_radius_cdr_la_CFLAGS = $(AM_CFLAGS) -l +mod_radius_cdr_la_CPPFLAGS = $(AM_CPPFLAGS) +mod_radius_cdr_la_LIBADD=$(switch_builddir)/libfreeswitch.la +mod_radius_cdr_la_LDFLAGS=-module -avoid-version -no-undefined -export-symbols-regex ^switch_module_.*$ -rpath $(PREFIX)/$(libdir) + +mod_radius_cdr_la_LDFLAGS += -lfreeradius-client + +#Override the linstall target so we just install the .so/.dylib + +install-data-am: $(DESTDIR)$(PREFIX)/$(moddir)/$(MODNAME).$(DYNAMIC_LIB_EXTEN) + +$(DESTDIR)$(PREFIX)/$(moddir)/$(MODNAME).$(DYNAMIC_LIB_EXTEN): $(MODNAME).la + @echo installing $(MODNAME).$(DYNAMIC_LIB_EXTEN) + @if [ -f .libs/$(MODNAME).$(DYNAMIC_LIB_EXTEN) ] ; then \ + $(LIBTOOL) --mode=install $(INSTALL) .libs/$(MODNAME).$(DYNAMIC_LIB_EXTEN) $(DESTDIR)$(PREFIX)/$(moddir) >/dev/null ; \ + else \ + $(LIBTOOL) --mode=install $(INSTALL) $(MODNAME).$(DYNAMIC_LIB_EXTEN) $(DESTDIR)$(PREFIX)/$(moddir) >/dev/null ; \ + fi Modified: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c ============================================================================== --- freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c (original) +++ freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.c Wed May 9 16:46:31 2007 @@ -32,82 +32,47 @@ #include <sys/stat.h> #include <switch.h> #include <freeradius-client.h> +#include "mod_radius_cdr.h" static const char modname[] = "mod_radius_cdr"; static rc_handle *rad_config; +static char cf[] = "mod_radius_cdr.conf"; +static char dictionary[PATH_MAX]; +static char * timeout; /* 5 */ +static char * retries; /* 3 */ static switch_status_t my_on_hangup(switch_core_session_t *session) { switch_xml_t cdr; - - if (switch_ivr_generate_radius_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) { + int retval = 0; + VALUE_PAIR *send = NULL; + UINT4 client_port = 0; + UINT4 status_type = PW_STATUS_STOP; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Generating Data!\n"); - } - - return SWITCH_STATUS_SUCCESS; -} - -static switch_status_t load_config(void) -{ - switch_status_t status = SWITCH_STATUS_SUCCESS; - switch_xml_t cfg, xml, settings, param; - char *cf = "radius_cdr.conf.xml"; - /* Config Variables and Defaults */ - char dictionary[PATH_MAX] = "/usr/local/freeswitch/conf/radius/dictionary"; - int num_servers = 0; - char *timeout = NULL; - char *retries = NULL; - - if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); - return SWITCH_STATUS_TERM; - } + char src[] = "8475551212"; + char *uuid_str; - rad_config = rc_new(); - if (rad_config == NULL) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "initialization of radius_cdr_config structure failed\n"); - return SWITCH_STATUS_TERM; - } - timeout = "5"; - retries = "3"; + if (switch_ivr_generate_xml_cdr(session, &cdr) == SWITCH_STATUS_SUCCESS) { + /*switch_channel_t *channel = switch_core_session_get_channel(session);*/ + uuid_str = switch_core_session_get_uuid(session); - if ((settings = switch_xml_child(cfg, "settings"))) { - 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"); + rad_config = rc_new(); - if (!strcmp(var, "acctserver")) { - if (num_servers < SERVER_MAX) { - if (rc_add_config(rad_config, var, val, cf, 0) != 0) { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "failed setting %s = %s failed\n", var, val); - rc_destroy(rad_config); - return SWITCH_STATUS_TERM; - } - num_servers++; - } else { - switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, - "you can only specify %d radius servers, ignoring excess server entry\n", SERVER_MAX); - } - } - else if (!strcmp(var, "dictionary")) { - strncpy(dictionary,val,PATH_MAX-1); - } - else if (!strcmp(var, "radius_timeout")) { - timeout = strdup(val); - } - else if (!strcmp(var, "radius_retries")) { - retries = strdup(val); - } + if (rad_config == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing rc_handle!\n"); + return SWITCH_STATUS_TERM; + switch_xml_free(cdr); } - } - switch_xml_free(xml); + rad_config = rc_config_init(rad_config); - if(num_servers > 0) { + if (rad_config == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "[mod_radius_cdr] Error initializing radius config!\n"); + rc_destroy(rad_config); + switch_xml_free(cdr); + return SWITCH_STATUS_TERM; + } if (rc_add_config(rad_config, "dictionary", dictionary, cf, 0) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, @@ -115,12 +80,14 @@ rc_destroy(rad_config); return SWITCH_STATUS_TERM; } + if (rc_add_config(rad_config, "radius_timeout", timeout, cf, 0) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed setting radius_timeout = %s failed\n", timeout); rc_destroy(rad_config); return SWITCH_STATUS_TERM; } + if (rc_add_config(rad_config, "radius_timeout", timeout, cf, 0) != 0) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed setting radius_retries = %s failed\n", retries); @@ -151,9 +118,100 @@ } } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error Generating Data!\n"); + return SWITCH_STATUS_TERM; + } + + /* Create the radius packet */ + + /* Set Status Type */ + if (rc_avpair_add(rad_config, &send, PW_ACCT_STATUS_TYPE, &status_type, -1, 0) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str); + rc_destroy(rad_config); + return SWITCH_STATUS_TERM; + } + + if (rc_avpair_add(rad_config, &send, PW_ACCT_SESSION_ID, uuid_str, -1, 0) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Acct-Session-ID: %s\n", uuid_str); + rc_destroy(rad_config); + return SWITCH_STATUS_TERM; + } + + /* Add VSA */ + if (rc_avpair_add(rad_config, &send, PW_FS_SRC, src, -1, PW_FS_PEC) == NULL) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "failed adding Freeswitch-Src: %s\n", src); + rc_destroy(rad_config); + return SWITCH_STATUS_TERM; + } + + if(rc_acct(rad_config, client_port, send) == OK_RC) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "RADIUS Accounting OK\n"); + retval = SWITCH_STATUS_SUCCESS; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "RADIUS Accounting Failed\n"); + retval = SWITCH_STATUS_TERM; + } + rc_avpair_free(send); + + return(retval); +} + +static switch_status_t load_config(void) +{ + switch_xml_t cfg, xml, settings, param; + + /* Config Variables and Defaults */ + /*char *cf = "radius_cdr.conf.xml";*/ + /*char dictionary[PATH_MAX] = "/usr/local/freeswitch/conf/radius/dictionary";*/ + /*char *timeout = NULL;*/ + /*char *retries = NULL;*/ + + int num_servers = 0; + + timeout = "5"; + retries = "3"; + + if (!(xml = switch_xml_open_cfg(cf, &cfg, NULL))) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "open of %s failed\n", cf); + return SWITCH_STATUS_TERM; + } + + if ((settings = switch_xml_child(cfg, "settings"))) { + 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, "acctserver")) { + if (num_servers < SERVER_MAX) { + if (rc_add_config(rad_config, var, val, cf, 0) != 0) { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "failed setting %s = %s failed\n", var, val); + rc_destroy(rad_config); + return SWITCH_STATUS_TERM; + } + num_servers++; + } else { + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, + "you can only specify %d radius servers, ignoring excess server entry\n", SERVER_MAX); + } + } + else if (!strcmp(var, "dictionary")) { + strncpy(dictionary,val,PATH_MAX-1); + } + else if (!strcmp(var, "radius_timeout")) { + timeout = strdup(val); + } + else if (!strcmp(var, "radius_retries")) { + retries = strdup(val); + } + } + } + + switch_xml_free(xml); + + if(num_servers < 1) { switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "you must specify at least 1 radius server\n"); - rc_destroy(rad_config); return SWITCH_STATUS_TERM; } Added: freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h ============================================================================== --- (empty file) +++ freeswitch/branches/cparker/src/mod/event_handlers/mod_radius_cdr/mod_radius_cdr.h Wed May 9 16:46:31 2007 @@ -0,0 +1,59 @@ +/* + * 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 + * Chris Parker <cparker AT segv.org> + * Portions created by the Initial Developer are Copyright (C) + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * + * Chris Parker <cparker AT segv.org> + * + * Description: Contains definitions and structs used by the radius cdr module. + * + * mod_radius_cdr.h + * + */ + +#ifndef MODRADIUSCDR +#define MODRADIUSCDR + +#define PW_FS_PEC 27880 + +#define PW_FS_AVPAIR 1 +#define PW_FS_CLID 2 +#define PW_FS_DIALPLAN 3 +#define PW_FS_SRC 4 +#define PW_FS_DST 5 +#define PW_FS_SRC_CHANNEL 6 +#define PW_FS_DST_CHANNEL 7 +#define PW_FS_ANI 8 +#define PW_FS_ANIII 9 +#define PW_FS_LASTAPP 10 +#define PW_FS_LASTDATA 11 +#define PW_FS_DISPOSITION 12 +#define PW_FS_HANGUPCAUSE 13 +#define PW_FS_BILLUSEC 15 +#define PW_FS_AMAFLAGS 16 +#define PW_FS_CALLSTARTDATE 20 +#define PW_FS_CALLANSWERDATE 21 +#define PW_FS_CALLTRANSFERDATE 22 +#define PW_FS_CALLENDDATE 23 + +#endif
participants (1)
-
Freeswitch SVN