[Serusers] Creating CDRs from SERs accouning records
Erik
erik at infopact.nl
Thu Dec 1 09:48:16 CET 2005
That perl script gives me calls with negative duration :), is there any way to differenciate different calls from the acc table? I noticed that the
sip_callid is NOT unique to 1 call, a concat(from_tag, to_tag) isnt't unique for 1 call either, this realy makes normalising them a lot harder.
Kind regards,
Erik
Andres wrote:
> We wrote a little perl script just to do that. Takes all calls from ACC
> table and outputs them to CDRS table. Its simple and it works. Its
> free so use it whatever way you want.
>
> Andres.
>
> Frank Fischer wrote:
>
>> Hi all
>>
>> i'm looking for a free/opensource application that generates CDRs (not
>> XDRs, must not be rated) from the accounting data/events generated by
>> SER (i think this is usually called normalization). I think this would
>> have to be an application that is able to match INVITEs and BYEs and
>> form CDRs with call start timestamp, call duration and so on.
>>
>> I had a look at the list of accounting software on the iptel.org
>> website, but most of there applications are highly integrated
>> accounting/billing solutions, far more than what i need (and also most
>> of them seem to be commercial products). In the mailinglist archive i
>> only found some references to CDRTool which seems also to be
>> commercial. Obv. there must be a free version of CDRTool but neither
>> i'm sure whether it implements exactly what i need so i could "grab
>> it" for my own purposes nor could i find a place to download the free
>> version).
>>
>> Does anyone know if there is such a kind of application available? Or
>> any other idea how to deal with my requirements?
>>
>> Thanks a lot for your help
>> Frank
>>
>> ------------------------------------------------------------------------
>>
>> _______________________________________________
>> Serusers mailing list
>> serusers at lists.iptel.org
>> http://lists.iptel.org/mailman/listinfo/serusers
>>
>>
>
>
>
> ------------------------------------------------------------------------
>
> #!/usr/bin/perl
>
> #Script used to generate SER Billing Records, it will look for the first INVITE Message and match it to a BYE Message
> #that has the same CALLID
> #Input is taken from the ACC table
> #Output is witten to MySQL 'cdrs' table and file '$file_res'
> #MySQL Perl Module Available at: http://search.cpan.org/author/OYAMA/Net-MySQL-0.08/MySQL.pm
>
> #You can create the cdrs table by putting the following in a file and then feeding it to mysql like this:
> #mysql -p test < "filename"
> #-----------cut here--------------------
> #CREATE TABLE cdrs (
> #timestamp TIMESTAMP,
> #start_date VARCHAR(18),
> #end_date VARCHAR(18),
> #caller VARCHAR(50),
> #destination VARCHAR(50),
> #callid VARCHAR(50),
> #duration INT
> #);
> #--------------cut here------------------
> #Written by: Ricardo Villa (ricvil @ telesip.net)
> use Net::MySQL;
> use Time::Local;
>
> my $mysql = Net::MySQL->new(
> hostname => 'db.xxxx.net', # Default use UNIX socket
> database => 'ser',
> user => 'xxxxxx',
> password => 'xxxxxx'
> );
>
> my $mysql2 = Net::MySQL->new(
> hostname => 'db.xxxx.net', # Default use UNIX socket
> database => 'xxxxxxx',
> user => 'xxxxxxx',
> password => 'xxxxxxx'
> );
>
> $mysql->query(q{SELECT * FROM acc}); #Get Records from Accounting Table
> my $record_set = $mysql->create_record_iterator;
> while (my $record = $record_set->each) {
> $sip_method = $record->[3];
> $username = $record->[9];
> $to_uri = $record->[7];
> $sip_method = $record->[3];
> $sip_callid = $record->[8];
> $enddate = $record->[13];
> $timestamp = $record->[14];
> if ($sip_method eq "BYE") {&bye_match();};
> };
>
> &cleanup_acc();
>
> $mysql->close;
> $mysql2->close;
> exit;
> ###----------------------------------------------------------------------------------------------------
> ### Subroutines
> sub bye_match {
> $bye_query = "SELECT * FROM acc where sip_callid = '$sip_callid';";
>
> $mysql->query(
> $bye_query
> );
> my $record_set2 = $mysql->create_record_iterator;
> while (my $record2 = $record_set2->each) {
> $sip_method2 = $record2->[3];
> $username2 = $record2->[9];
> $to_uri2 = $record2->[7];
> $sip_method2 = $record2->[3];
> $sip_callid2 = $record2->[8];
> $startdate = $record2->[13];
> $timestamp2 = $record2->[14];
> if (($sip_callid eq $sip_callid2) & ($sip_method2 eq "INVITE")) {
> &input_processing();
>
>
> #Convert MySQL Timestamp to Variables
> $startstamp_year = substr($timestamp2,0,4);
> $startstamp_month_o = substr($timestamp2,4,2);
> $startstamp_month = substr($timestamp2,4,2)-1;
> $startstamp_day = substr($timestamp2,6,2);
> $startstamp_hour = substr($timestamp2,8,2);
> $startstamp_minute = substr($timestamp2,10,2);
> $startstamp_second = substr($timestamp2,12,2);
> $endstamp_year = substr($timestamp,0,4);
> $endstamp_month_o = substr($timestamp,4,2);
> $endstamp_month = substr($timestamp,4,2)-1;
> $endstamp_day = substr($timestamp,6,2);
> $endstamp_hour = substr($timestamp,8,2);
> $endstamp_minute = substr($timestamp,10,2);
> $endstamp_second = substr($timestamp,12,2);
> #End Conversion
> #Convert start and end times to seconds since 1970
> $startstamp = timelocal($startstamp_second,$startstamp_minute,$startstamp_hour,$startstamp_day,$startstamp_month,$startstamp_year);
> $startdate2 = "$startstamp_year-$startstamp_month_o-$startstamp_day $startstamp_hour:$startstamp_minute:$startstamp_second";
> $endstamp = timelocal($endstamp_second,$endstamp_minute,$endstamp_hour,$endstamp_day,$endstamp_month,$endstamp_year);
> $enddate2 = "$endstamp_year-$endstamp_month_o-$endstamp_day $endstamp_hour:$endstamp_minute:$endstamp_second";
> $call_duration = $endstamp-$startstamp;
> #print "Start = $startstamp_year $startstamp_month $startstamp_day $startstamp_hour $startstamp_minute $startstamp_second\n";
> &update_table;
> };
> };
> };
>
> sub input_processing {
> ($a_dest, $b_dest) = split(/sip:/,$to_uri2);
> ($a_dest) = split(/@/,$b_dest); #Isolate the Destination of the Call
> $to_uri2=$a_dest;
> }
>
> sub update_table {
> #Now Insert the Call Detail record into the Database
> $database_insert = "INSERT INTO cdrs (start_date, end_date, caller, destination, callid, duration) VALUES ('$startdate2', '$enddate2', '$username2', '$to_uri2', '$sip_callid2', $call_duration);";
> $mysql2->query(
> $database_insert
> );
> #and delete from ACC Table
> $database_delete = "DELETE FROM acc where sip_callid = '$sip_callid2';";
> $mysql->query(
> $database_delete
> );
> }
>
> sub cleanup_acc {
> #Delete all other garbage from ACC Table
> $database_delete = "DELETE FROM acc ";
> $mysql->query(
> $database_delete
> );
> }
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Serusers mailing list
> serusers at lists.iptel.org
> http://lists.iptel.org/mailman/listinfo/serusers
More information about the sr-users
mailing list