untested code to suck in CDRs in from VoIP RADIUS exports, RT#4100
authorivan <ivan>
Fri, 24 Oct 2008 02:54:07 +0000 (02:54 +0000)
committerivan <ivan>
Fri, 24 Oct 2008 02:54:07 +0000 (02:54 +0000)
FS/FS/part_export/phone_sqlradius.pm
FS/FS/part_export/sqlradius.pm
FS/bin/freeside-sqlradius-radacctd

index b93fe8c..eb867a2 100644 (file)
@@ -2,7 +2,7 @@ package FS::part_export::phone_sqlradius;
 
 use vars qw(@ISA $DEBUG %info );
 use Tie::IxHash;
 
 use vars qw(@ISA $DEBUG %info );
 use Tie::IxHash;
-use FS::Record; #qw( dbh qsearch qsearchs str2time_sql );
+use FS::Record qw( dbh str2time_sql ); #qsearch qsearchs );
 #use FS::part_export;
 use FS::part_export::sqlradius;
 #use FS::svc_phone;
 #use FS::part_export;
 use FS::part_export::sqlradius;
 #use FS::svc_phone;
@@ -88,5 +88,73 @@ sub _export_unsuspend {}
 
 #probably harmless that we ->can('usage_sessions').... ?
 
 
 #probably harmless that we ->can('usage_sessions').... ?
 
+#we want to feed these into CDRs, not update svc_acct records
+sub update_svc {
+  my $self = shift;
+
+  my $fdbh = dbh;
+  my $dbh = sqlradius_connect( map $self->option($_),
+                                   qw( datasrc username password ) );
+
+  my $str2time = str2time_sql( $dbh->{Driver}->{Name} );
+
+
+
+  my @fields = qw( radacctid username realm acctsessiontime );
+
+  my @param = ();
+  my $where = '';
+
+  my $sth = $dbh->prepare("
+    SELECT RadAcctId, UserName, AcctSessionTime,
+           $str2time AcctStartTime),  $str2time AcctStopTime), 
+           CallingStationID, CalledStationID
+      FROM radacct
+      WHERE FreesideStatus IS NULL
+        AND AcctStopTime != 0
+  ") or die $dbh->errstr;
+  $sth->execute() or die $sth->errstr;
+
+  while ( my $row = $sth->fetchrow_arrayref ) {
+    my( $RadAcctId, $UserName, $AcctSessionTime,
+        $AcctStartTime, $AcctStopTime, 
+        $CallingStationID, $CalledStationID,
+      )= @$row;
+    warn "processing record: ".
+         "$RadAcctId ($UserName for ${AcctSessionTime}s"
+      if $DEBUG;
+
+    my $oldAutoCommit = $FS::UID::AutoCommit; # can't undo side effects, but at
+    local $FS::UID::AutoCommit = 0;           # least we can avoid over counting
+
+    my $cdr = new FS::cdr {
+      'src'           => $CallingStationID,
+      'charged_party' => $UserName,
+      'dst'           => $CalledStationID,
+      'startdate'     => $AcctStartTime,
+      'enddate'       => $AcctStopTime,
+      'duration'      => $AcctStopTime - $AcctStartTime,
+      'billsec'       => $AcctSessionTime,
+    };
+
+    my $errinfo = "for RADIUS detail RadAcctID $RadAcctId ".
+                  "(UserName $UserName)";
+
+    my $error = $cdr->insert;
+    my $status = $error ? 'skipped' : 'done';
+
+    warn "setting FreesideStatus to $status $errinfo\n" if $DEBUG; 
+    my $psth = $dbh->prepare("UPDATE radacct
+                                SET FreesideStatus = ?
+                                WHERE RadAcctId = ?"
+    ) or die $dbh->errstr;
+    $psth->execute($status, $RadAcctId) or die $psth->errstr;
+
+    $fdbh->commit or die $fdbh->errstr if $oldAutoCommit;
+
+  }
+
+}
+
 1;
 
 1;
 
index fca6e09..87c5739 100644 (file)
@@ -672,7 +672,7 @@ sub usage_sessions {
 
 =cut
 
 
 =cut
 
-sub update_svc_acct {
+sub update_svc {
   my $self = shift;
 
   my $conf = new FS::Conf;
   my $self = shift;
 
   my $conf = new FS::Conf;
@@ -706,7 +706,7 @@ sub update_svc_acct {
 
     $UserName = lc($UserName) unless $conf->exists('username-uppercase');
 
 
     $UserName = lc($UserName) unless $conf->exists('username-uppercase');
 
-    my %search = ( 'username' => $UserName );
+    #my %search = ( 'username' => $UserName );
 
     my $extra_sql = '';
     if ( ref($self) =~ /withdomain/ ) { #well...
 
     my $extra_sql = '';
     if ( ref($self) =~ /withdomain/ ) { #well...
@@ -799,7 +799,7 @@ sub all_sqlradius {
 
   my @part_export = ();
   push @part_export, qsearch('part_export', { 'exporttype' => $_ } )
 
   my @part_export = ();
   push @part_export, qsearch('part_export', { 'exporttype' => $_ } )
-    foreach qw(sqlradius sqlradius_withdomain radiator);
+    foreach qw( sqlradius sqlradius_withdomain radiator phone_sqlradius );
   @part_export;
 }
 
   @part_export;
 }
 
index 4c5c11a..7b2d04d 100644 (file)
@@ -32,8 +32,8 @@ daemonize2();
 
 my @part_export = FS::part_export::sqlradius->all_sqlradius_withaccounting();
 
 
 my @part_export = FS::part_export::sqlradius->all_sqlradius_withaccounting();
 
-die "no sqlradius, sqlradius_withdomain or radiator exports without".
-    " ignore_accounting"
+die "no sqlradius, sqlradius_withdomain, radiator or phone_sqlradius exports".
+    " without ignore_accounting"
   unless @part_export;
 
 while (1) {
   unless @part_export;
 
 while (1) {
@@ -55,7 +55,7 @@ while (1) {
       adminsuidsetup($user); #get our own db handle
 
       until ( sigint || sigterm ) {
       adminsuidsetup($user); #get our own db handle
 
       until ( sigint || sigterm ) {
-        $part_export->update_svc_acct();
+        $part_export->update_svc();
         sleep 1;
       }
 
         sleep 1;
       }