real-time! text radius export
authorivan <ivan>
Mon, 1 Jul 2002 09:15:56 +0000 (09:15 +0000)
committerivan <ivan>
Mon, 1 Jul 2002 09:15:56 +0000 (09:15 +0000)
FS/FS/part_export/textradius.pm

index 9a0468f..691753f 100644 (file)
@@ -1,33 +1,37 @@
 package FS::part_export::textradius;
 
 package FS::part_export::textradius;
 
-use vars qw(@ISA);
+use vars qw(@ISA $prefix);
+use Fcntl qw(:flock);
+use FS::UID qw(datasrc);
 use FS::part_export;
 
 @ISA = qw(FS::part_export);
 
 use FS::part_export;
 
 @ISA = qw(FS::part_export);
 
+$prefix = "/usr/local/etc/freeside/export.";
+
 sub rebless { shift; }
 
 sub _export_insert {
   my($self, $svc_acct) = (shift, shift);
   $err_or_queue = $self->textradius_queue( $svc_acct->svcnum, 'insert',
 sub rebless { shift; }
 
 sub _export_insert {
   my($self, $svc_acct) = (shift, shift);
   $err_or_queue = $self->textradius_queue( $svc_acct->svcnum, 'insert',
-    $svc_acct->username, $svc_acct->_password );
+    $svc_acct->username, $svc_acct->radius_check, '-', $svc_acct->radius_reply);
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
 sub _export_replace {
   my( $self, $new, $old ) = (shift, shift, shift);
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
 sub _export_replace {
   my( $self, $new, $old ) = (shift, shift, shift);
-  #return "can't change username with textradius"
-  #  if $old->username ne $new->username;
+  return "can't (yet?) change username with textradius"
+    if $old->username ne $new->username;
   #return '' unless $old->_password ne $new->_password;
   #return '' unless $old->_password ne $new->_password;
-  $err_or_queue = $self->textradius_queue( $new->svcnum,
-    'replace', $new->username, $new->_password );
+  $err_or_queue = $self->textradius_queue( $new->svcnum, 'insert',
+    $new->username, $new->radius_check, '-', $new->radius_reply);
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
 sub _export_delete {
   my( $self, $svc_acct ) = (shift, shift);
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
 sub _export_delete {
   my( $self, $svc_acct ) = (shift, shift);
-  $err_or_queue = $self->textradius_queue( $svc_acct->svcnum,
-    'delete', $svc_acct->username );
+  $err_or_queue = $self->textradius_queue( $svc_acct->svcnum, 'delete',
+    $svc_acct->username );
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
   ref($err_or_queue) ? '' : $err_or_queue;
 }
 
@@ -38,13 +42,113 @@ sub textradius_queue {
     'svcnum' => $svcnum,
     'job'    => "FS::part_export::textradius::textradius_$method",
   };
     'svcnum' => $svcnum,
     'job'    => "FS::part_export::textradius::textradius_$method",
   };
-  $queue->insert( @_ ) or $queue;
+  $queue->insert(
+    $self->option('user'),
+    $self->machine,
+    $self->option('users'),
+    @_,
+  ) or $queue;
 }
 
 sub textradius_insert { #subroutine, not method
 }
 
 sub textradius_insert { #subroutine, not method
+  my( $user, $host, $users, $username, @attributes ) = @_;
+
+  #silly arg processing
+  my($att, @check);
+  push @check, $att while ($att=shift @attributes) ne '-';
+  my %check = @check;
+  my %reply = @attributes;
+
+  my $file = textradius_download($user, $host, $users);
+
+  eval "use RADIUS::UserFile;";
+  die $@ if $@;
+
+  my $userfile = new RADIUS::UserFile(
+    File        => $file,
+    Who         => [ $username ],
+    Check_Items => [ keys %check ],
+  ) or die "error parsing $file";
+
+  $userfile->remove($username);
+  $userfile->add(
+    Who        => $username,
+    Attributes => { %check, %reply },
+    Comment    => 'user added by Freeside',
+  ) or die "error adding to $file";
+
+  $userfile->update( Who => [ $username ] )
+    or die "error updating $file";
+
+  textradius_upload($user, $host, $users);
+
 }
 }
-sub textradius_replace { #subroutine, not method
-}
+
 sub textradius_delete { #subroutine, not method
 sub textradius_delete { #subroutine, not method
+  my( $user, $host, $users, $username ) = @_;
+
+  my $file = textradius_download($user, $host, $users);
+
+  eval "use RADIUS::UserFile;";
+  die $@ if $@;
+
+  my $userfile = new RADIUS::UserFile(
+    File        => $file,
+    Who         => [ $username ],
+  ) or die "error parsing $file";
+
+  $userfile->remove($username);
+
+  $userfile->update( Who => [ $username ] )
+    or die "error updating $file";
+
+  textradius_upload($user, $host, $users);
+}
+
+sub textradius_download {
+  my( $user, $host, $users ) = @_;
+
+  my $dir = $prefix. datasrc;
+  mkdir $dir, 0700 or die $! unless -d $dir;
+  $dir .= "/$host";
+  mkdir $dir, 0700 or die $! unless -d $dir;
+
+  my $dest = "$dir/users";
+
+  eval "use File::Rsync;";
+  die $@ if $@;
+  my $rsync = File::Rsync->new({ rsh => 'ssh' });
+
+  open(LOCK, "+>>$dest.lock")
+    and flock(LOCK,LOCK_EX)
+      or die "can't open $dest.lock: $!";
+
+  $rsync->exec( {
+    src  => "$user\@$host:$users",
+    dest => $dest,
+  } );
+
+  $dest;
+}
+
+sub textradius_upload {
+  my( $user, $host, $users ) = @_;
+
+  my $dir = $prefix. datasrc. "/$host";
+
+  eval "use File::Rsync;";
+  die $@ if $@;
+  my $rsync = File::Rsync->new({
+    rsh => 'ssh',
+    #dry_run => 1,
+  });
+  $rsync->exec( {
+    src  => "$dir/users",
+    dest => "$user\@$host:$users",
+  } );
+
+  flock(LOCK,LOCK_UN);
+  close LOCK;
+
 }
 
 }