rewrite CDRs for forwarded Asterisk calls to be billable, RT#3196
authorivan <ivan>
Tue, 24 Feb 2009 08:41:35 +0000 (08:41 +0000)
committerivan <ivan>
Tue, 24 Feb 2009 08:41:35 +0000 (08:41 +0000)
FS/FS/Schema.pm
FS/FS/cdr.pm
FS/bin/freeside-cdrrewrited [new file with mode: 0644]
init.d/freeside-init

index e8ab6bf..d59270b 100644 (file)
@@ -2014,12 +2014,15 @@ sub tables_hashref {
         #NULL, done (or something)
         'freesidestatus', 'varchar',   'NULL',     32,   '', '', 
 
+        #NULL, done (or something)
+        'freesiderewritestatus', 'varchar',   'NULL',     32,   '', '', 
+
         'cdrbatch', 'varchar', 'NULL', $char_d, '', '',
 
       ],
       'primary_key' => 'acctid',
       'unique' => [],
-      'index' => [ [ 'calldate' ], [ 'src' ], [ 'dst' ], [ 'charged_party' ], [ 'accountcode' ], [ 'freesidestatus' ], [ 'cdrbatch' ], ],
+      'index' => [ [ 'calldate' ], [ 'src' ], [ 'dst' ], [ 'charged_party' ], [ 'accountcode' ], [ 'freesidestatus' ], [ 'freesiderewritestatus' ], [ 'cdrbatch' ], ],
     },
 
     'cdr_calltype' => {
index dc94bcf..8307b28 100644 (file)
@@ -130,6 +130,8 @@ following fields are currently supported:
 
 =item freesidestatus - NULL, done (or something)
 
+=item freesiderewritestatus - NULL, done (or something)
+
 =item cdrbatch
 
 =back
@@ -228,6 +230,7 @@ sub check {
 #    || $self->ut_numbern('upstream_rateid')
 #    || $self->ut_numbern('svcnum')
 #    || $self->ut_textn('freesidestatus')
+#    || $self->ut_textn('freesiderewritestatus')
 #  ;
 #  return $error if $error;
 
diff --git a/FS/bin/freeside-cdrrewrited b/FS/bin/freeside-cdrrewrited
new file mode 100644 (file)
index 0000000..d827ef7
--- /dev/null
@@ -0,0 +1,118 @@
+#!/usr/bin/perl -w
+
+use strict;
+use vars qw( $conf );
+use FS::Daemon ':all'; #daemonize1 drop_root daemonize2 myexit logfile sig*
+use FS::UID qw( adminsuidsetup );
+use FS::Record qw( qsearch ); #qsearchs);
+#use FS::cdr;
+#use FS::cust_pkg;
+#use FS::queue;
+
+my $user = shift or die &usage;
+
+#daemonize1('freeside-sprepaidd', $user); #keep unique pid files w/multi installs
+daemonize1('freeside-cdrrewrited');
+
+drop_root();
+
+adminsuidsetup($user);
+
+logfile( "%%%FREESIDE_LOG%%%/cdrrewrited-log.". $FS::UID::datasrc );
+
+daemonize2();
+
+$conf = new FS::Conf;
+
+die "not running; cdr-asterisk_forward_rewrite conf is off\n"
+  unless _shouldrun();
+
+#--
+
+my $domestic_prefix = 1; #hmm, global config?
+
+while (1) {
+
+  #hmm... don't want to do an expensive search with an ever-growing bunch
+  # of unprocessed CDRs during the month... better to mark them all as
+  # rewritten "skipped", i.e. why we're a daemon in the first place
+  # instead of just doing this search like normal CDRs
+
+  my $found = 0;
+  foreach my $cdr ( 
+    qsearch( {
+      'table'     => 'cdr',
+      'extra_sql' => 'FOR UPDATE',
+      'hashref'   => {},
+      'extra_sql' => 'WHERE freesidestatus IS NULL'.
+                     ' AND freesiderewritestatus IS NULL'.
+                     ' LIMIT 1024', #arbitrary, but don't eat too much memory
+    } )
+  ) {
+
+    $found = 1;
+
+    if ( $cdr->dstchannel =~ /^Local\/($domestic_prefix)?(\d+)/i
+         && $2 ne $cdr->dst
+       )
+    {
+
+      my $dst = $2;
+
+      warn "dst ". $cdr->dst. " does not match dstchannel $dst ".
+           "(". $cdr->dstchannel. "); rewriting CDR as a forwarded call";
+
+      $cdr->charged_party($cdr->dst);
+      $cdr->dst($dst);
+      $cdr->amaflags(2);
+
+      $cdr->freesiderewritestatus('asterisk_forward');
+
+    } else {
+      $cdr->freesiderewritestatus('skipped')
+    }
+
+    my $error = $cdr->replace;
+
+    if ( $error ) {
+      warn "WARNING: error rewriting CDR (will retry in 30 seconds):".
+           " $error\n";
+      sleep 30; #i dunno, wait and see if the database comes back?
+    }
+
+  }
+
+  myexit() if sigterm() || sigint();
+  #sleep 1 unless $found;
+  sleep 5 unless $found;
+
+}
+
+#--
+
+sub _shouldrun {
+  $conf->exists('cdr-asterisk_forward_rewrite');
+}
+
+sub usage { 
+  die "Usage:\n\n  freeside-cdrrewrited user\n";
+}
+
+=head1 NAME
+
+freeside-cdrrewrited - Real-time daemon for CDR rewriting
+
+=head1 SYNOPSIS
+
+  freeside-cdrrewrited
+
+=head1 DESCRIPTION
+
+Runs continuously, searches for CDRs and does forwarded-call rewriting if
+the "cdr-asterisk_forward_rewrite" option is enabled.
+
+=head1 SEE ALSO
+
+=cut
+
+1;
index 2f9d5d5..c9bcebe 100644 (file)
@@ -29,6 +29,10 @@ case "$1" in
         freeside-prepaidd $QUEUED_USER
         echo "done."
 
+        echo -n "Starting freeside-cdrrewrited: "
+        freeside-cdrrewrited $QUEUED_USER
+        echo "done."
+
         echo -n "Starting freeside-cdrd: "
         freeside-cdrd $QUEUED_USER
         echo "done."
@@ -67,6 +71,12 @@ case "$1" in
           echo "done."
         fi
 
+        if [ -e /var/run/freeside-cdrrewrited.pid ]; then
+          echo -n "Stopping freeside-cdrrewrited: "
+          kill `cat /var/run/freeside-cdrrewrited.pid`
+          echo "done."
+        fi
+
         if [ -e /var/run/freeside-selfservice-server.$SELFSERVICE_USER.pid ]
         then
           echo -n "Stopping (old) freeside-selfservice-server: "