add native Radiator export
authorivan <ivan>
Tue, 9 Aug 2005 21:38:59 +0000 (21:38 +0000)
committerivan <ivan>
Tue, 9 Aug 2005 21:38:59 +0000 (21:38 +0000)
Changes.1.5.8
FS/FS/part_export/radiator.pm [new file with mode: 0644]
FS/FS/part_export/sqlradius.pm
FS/FS/part_export/sqlradius_withdomain.pm
FS/t/part_export-radiator.t [new file with mode: 0644]

index 9551d68..e69cf92 100644 (file)
@@ -4,3 +4,4 @@
 - move cust_pkg search (httemplate/search/cust_pkg.cgi) to new template
 - add active/suspended/cancelled customer packages to agent browse
 - add export to everyone.net outsource mail service
+- add native Radiator export
diff --git a/FS/FS/part_export/radiator.pm b/FS/FS/part_export/radiator.pm
new file mode 100644 (file)
index 0000000..8f4a929
--- /dev/null
@@ -0,0 +1,146 @@
+package FS::part_export::radiator;
+
+use vars qw(@ISA %info);
+use Tie::IxHash;
+use FS::part_export::sqlradius;
+
+tie my %options, 'Tie::IxHash', %FS::part_export::sqlradius::options;
+
+%info = (
+  'svc'      => 'svc_acct',
+  'desc'     => 'Real-time export to RADIATOR',
+  'options'  => \%options,
+  'nodomain' => '',
+  'notes' => <<'END',
+Real-time export of the <b>radusers</b> table to any SQL database in
+<a href="http://www.open.com.au/radiator/">Radiator</a>-native format.
+To setup accounting, see the RADIATOR documentation for hooks to update
+a standard <b>radacct</b> table.
+END
+);
+
+@ISA = qw(FS::part_export::sqlradius); #for regular sqlradius accounting
+
+#sub export_username {
+#  my($self, $svc_acct) = (shift, shift);
+#  $svc_acct->email;
+#}
+
+sub _export_insert {
+  my( $self, $svc_acct ) = (shift, shift);
+
+  $self->radiator_queue(
+    $svc_acct->svcnum,
+    'insert',
+    $self->_radiator_hash($svc_acct),
+  );
+}
+
+sub _export_replace {
+  my( $self, $new, $old ) = (shift, shift, shift);
+
+#  return "can't (yet) change domain with radiator export"
+#    if $old->domain ne $new->domain;
+#  return "can't (yet) change username with radiator export"
+#    if $old->username ne $new->username;
+
+  $self->radiator_queue(
+    $new->svcnum,
+    'replace',
+    $self->export_username($old),
+    $self->_radiator_hash($new),
+  );
+}
+
+sub _export_delete {
+  my( $self, $svc_acct ) = (shift, shift);
+
+  $self->radiator_queue(
+    $svc_acct->svcnum,
+    'delete',
+    $self->export_username($svc_acct),
+  );
+}
+
+sub _radiator_hash {
+  my( $self, $svc_acct ) = @_;
+  my %hash = (
+    'username'  => $self->export_username($svc_acct),
+    'pass_word' => $svc_acct->_password,
+    'fullname'  => $svc_acct->finger,
+    map { my $method = "radius_$_"; $_ => $svc_acct->$method(); }
+        qw( framed_filter_id framed_mtu framed_netmask framed_protocol
+            framed_routing login_host login_service login_tcp_port )
+  );
+  $hash{timeleft} = $svc_acct->seconds
+    if $svc_acct->seconds =~ /^\d+$/;
+  $hash{staticaddress} = $svc_acct->slipip
+    if $svc_acct->slipip =~ /^[\d\.]+$/; # and $self->slipip ne '0.0.0.0';
+
+  %hash;
+}
+
+sub radiator_queue {
+  my( $self, $svcnum, $method ) = (shift, shift, shift);
+  my $queue = new FS::queue {
+    'svcnum' => $svcnum,
+    'job'    => "FS::part_export::radiator::radiator_$method",
+  };
+  $queue->insert(
+    $self->option('datasrc'),
+    $self->option('username'),
+    $self->option('password'),
+    @_,
+  ); # or $queue;
+}
+
+sub radiator_insert { #subroutine, not method
+  my $dbh = radiator_connect(shift, shift, shift);
+  my %hash = @_;
+
+  my $sth = $dbh->prepare(
+    'INSERT INTO radusers ( '. join(', ', keys %hash ). ' ) '.
+      'VALUES ( '. join(', ', map '?', keys %hash ). ' ) '
+  ) or die $dbh->errstr;
+  $sth->execute( values %hash )
+    or die $sth->errstr;
+
+  $dbh->disconnect;
+
+}
+
+sub radiator_replace { #subroutine, not method
+  my $dbh = radiator_connect(shift, shift, shift);
+  my ( $old_username, %hash ) = @_;
+
+  my $sth = $dbh->prepare(
+    'UPDATE radusers SET '. join(', ', map " $_ = ?", keys %hash ).
+      ' WHERE username = ?'
+  ) or die $dbh->errstr;
+  $sth->execute( values(%hash), $old_username )
+    or die $sth->errstr;
+
+  $dbh->disconnect;
+}
+
+sub radiator_delete { #subroutine, not method
+  my $dbh = radiator_connect(shift, shift, shift);
+  my ( $username ) = @_;
+
+  my $sth = $dbh->prepare(
+    'DELETE FROM radusers WHERE username = ?'
+  ) or die $dbh->errstr;
+  $sth->execute( $username )
+    or die $sth->errstr;
+
+  $dbh->disconnect;
+}
+
+
+sub radiator_connect {
+  #my($datasrc, $username, $password) = @_;
+  #DBI->connect($datasrc, $username, $password) or die $DBI::errstr;
+  DBI->connect(@_) or die $DBI::errstr;
+}
+
+1;
index 772da12..10bccb0 100644 (file)
@@ -34,10 +34,10 @@ tie %options, 'Tie::IxHash',
 ;
 
 $notes1 = <<'END';
-Real-time export of radcheck, radreply and usergroup tables to any SQL database
-for <a href="http://www.freeradius.org/">FreeRADIUS</a>,
-<a href="http://radius.innercite.com/">ICRADIUS</a>
-or <a href="http://www.open.com.au/radiator/">Radiator</a>.  
+Real-time export of <b>radcheck</b>, <b>radreply</b> and <b>usergroup</b>
+tables to any SQL database for
+<a href="http://www.freeradius.org/">FreeRADIUS</a>
+or <a href="http://radius.innercite.com/">ICRADIUS</a>.
 END
 
 $notes2 = <<'END';
@@ -66,7 +66,7 @@ END
 
 %info = (
   'svc'      => 'svc_acct',
-  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator)',
+  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS)',
   'options'  => \%options,
   'nodomain' => 'Y',
   'notes'    => $notes1.
index 6130e5e..e5a7151 100644 (file)
@@ -8,7 +8,7 @@ tie my %options, 'Tie::IxHash', %FS::part_export::sqlradius::options;
 
 %info = (
   'svc'      => 'svc_acct',
-  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS, Radiator) with realms',
+  'desc'     => 'Real-time export to SQL-backed RADIUS (FreeRADIUS, ICRADIUS) with realms',
   'options'  => \%options,
   'nodomain' => '',
   'notes' => $FS::part_export::sqlradius::notes1.
diff --git a/FS/t/part_export-radiator.t b/FS/t/part_export-radiator.t
new file mode 100644 (file)
index 0000000..546e9de
--- /dev/null
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::part_export::radiator;
+$loaded=1;
+print "ok 1\n";