RT# 82942 Replace DBI->connect() with FS::DBI->connect()
[freeside.git] / FS / bin / freeside-sqlradius-reset
index 95b7ef2..225de15 100755 (executable)
-#!/usr/bin/perl -Tw
+#!/usr/bin/perl -w
 
 use strict;
+use vars qw( $opt_n );
+use Getopt::Std;
+use FS::DBI;
 use FS::UID qw(adminsuidsetup);
 use FS::Record qw(qsearch qsearchs);
 use FS::part_export;
-use FS::svc_acct;
+#use FS::svc_acct;
 use FS::cust_svc;
 
+getopts("n");
+
 my $user = shift or die &usage;
 adminsuidsetup $user;
 
 #my $machine = shift or die &usage;
 
 my @exports = ();
-if ( @_ ) {
-  foreach my $exportnum ( @_ ) {
-    foreach my $exporttype (qw( sqlradius sqlradius_withdomain )) {
+if ( @ARGV ) {
+  foreach my $exportnum ( @ARGV ) {
+    foreach my $exporttype (qw( sqlradius sqlradius_withdomain phone_sqlradius broadband_sqlradius )) {
     push @exports, qsearch('part_export', { exportnum  => $exportnum,
                                             exporttype => $exporttype, } );
     }
   }
  } else {
   @exports = qsearch('part_export', { exporttype=>'sqlradius' } );
-  push @exports, qsearch('part_export', { exporttype=>'sqlradius_withdomain' } );
+  push @exports, qsearch('part_export', { exporttype=>'sqlradius_withdomain' } ); 
 }
 
-foreach my $export ( @exports ) {
-  my $icradius_dbh = DBI->connect(
-    map { $export->option($_) } qw( datasrc username password )
-  ) or die $DBI::errstr;
-  for my $table (qw( radcheck radreply usergroup )) {
-    my $sth = $icradius_dbh->prepare("DELETE FROM $table");
-    $sth->execute or die "Can't reset $table table: ". $sth->errstr;
+unless ( $opt_n ) {
+  foreach my $export ( @exports ) {
+    my $icradius_dbh = FS::DBI->connect(
+      map { $export->option($_) } qw( datasrc username password )
+    ) or die $FS::DBI::errstr;
+    my $usergroup = $export->option('usergroup') || 'usergroup';
+    my @attr_tables;
+    @attr_tables = qw( radgroupcheck radgroupreply )
+      if $export->option('export_attrs');
+    for my $table (qw( radcheck radreply ), $usergroup, @attr_tables) {
+      my $sth = $icradius_dbh->prepare("DELETE FROM $table");
+      $sth->execute or die "Can't reset $table table: ". $sth->errstr;
+    }
+    $icradius_dbh->disconnect;
   }
-  $icradius_dbh->disconnect;
 }
 
-foreach my $export ( @exports ) {
+use FS::svc_Common;
+$FS::svc_Common::overlimit_missing_cust_svc_nonfatal_kludge = 1;
+$FS::svc_Common::overlimit_missing_cust_svc_nonfatal_kludge = 1;
 
-  #my @svcparts = map { $_->svcpart } $export->export_svc;
+# this is the same across all exports, for now
+my @radius_attrs = qsearch('radius_attr', {});
 
-  my @svc_acct =
-    map { qsearchs('svc_acct', { 'svcnum' => $_->svcnum } ) }
-      map { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
-        grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
-          $export->export_svc;
+foreach my $export ( @exports ) {
 
-  foreach my $svc_acct ( @svc_acct ) {
+  #my @svcparts = map { $_->svcpart } $export->export_svc;
+  my $overlimit_groups = $export->option('overlimit_groups');
+
+  my @svc_x =
+    map  { $_->svc_x }
+    #map  { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
+    #grep { qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) }
+    #     $export->export_svc;
+    map  { @{ $_->[1] } }
+    grep { scalar( @{ $_->[1] } ) }
+    map  { [ $_, [ qsearch('cust_svc', { 'svcpart' => $_->svcpart } ) ] ] }
+         $export->export_svc;
+
+
+  foreach my $svc_x ( @svc_x ) {
+
+    #$svc_x->check; #set any fixed usergroup so it'll export even if all
+    #               #svc_acct records don't have the group yet
+    #more efficient?
+    my $x = $svc_x->setfixed( $svc_x->_fieldhandlers);
+    unless ( ref($x) ) {
+      warn "WARNING: can't set fixed usergroups for svcnum ". $svc_x->svcnum.
+           "\n";
+    } 
+
+    if ($overlimit_groups && $svc_x->overlimit) {
+      $svc_x->usergroup( &{ $svc_x->_fieldhandlers->{'usergroup'} }
+                          ($svc_x, $overlimit_groups)
+                       );
+    }
 
     #false laziness with FS::svc_acct::insert (like it matters)
-    my $error = $export->export_insert($svc_acct);
+    my $error = $export->export_insert($svc_x);
     die $error if $error;
 
   }
+
+  if ( $export->option('export_attrs') ) {
+    foreach my $attr (@radius_attrs) {
+      my $error = $export->export_attr_insert($attr);
+      die $error if $error;
+    }
+  }
 }
 
 sub usage {
@@ -65,7 +111,7 @@ freeside-sqlradius-reset - Command line interface to reset and recreate RADIUS S
 
 =head1 SYNOPSIS
 
-  freeside-sqlradius-reset username [ EXPORTNUM, ... ]
+  freeside-sqlradius-reset [ -n ] username [ EXPORTNUM, ... ]
 
 =head1 DESCRIPTION
 
@@ -75,11 +121,13 @@ specified, for all sqlradius and sqlradius_withdomain exports.
 
 B<username> is a username added by freeside-adduser.
 
+The B<-n> option, if supplied, supresses the deletion of the existing data in
+the tables.
+
 =head1 SEE ALSO
 
 L<freeside-reexport>, L<FS::part_export>, L<FS::part_export::sqlradius>
 
 =cut
 
-
-
+1;