RADIUS groups for svc_broadband, #14695
[freeside.git] / FS / FS / part_export / broadband_sqlradius.pm
diff --git a/FS/FS/part_export/broadband_sqlradius.pm b/FS/FS/part_export/broadband_sqlradius.pm
new file mode 100644 (file)
index 0000000..ae0876d
--- /dev/null
@@ -0,0 +1,100 @@
+package FS::part_export::broadband_sqlradius;
+
+use strict;
+use vars qw($DEBUG @ISA %options %info $conf);
+use Tie::IxHash;
+use FS::Conf;
+use FS::Record qw( dbh str2time_sql ); #qsearch qsearchs );
+use FS::part_export::sqlradius qw(sqlradius_connect);
+
+FS::UID->install_callback(sub { $conf = new FS::Conf });
+
+@ISA = qw(FS::part_export::sqlradius);
+
+$DEBUG = 0;
+
+tie %options, 'Tie::IxHash',
+  'datasrc'  => { label=>'DBI data source ' },
+  'username' => { label=>'Database username' },
+  'password' => { label=>'Database password' },
+  'usergroup'=> { label   => 'Group table',
+                  type    => 'select',
+                  options => [qw( radusergroup usergroup )],
+                },
+# session report doesn't currently know about this export anyway
+#  'hide_ip' => {
+#    type  => 'checkbox',
+#    label => 'Hide IP address on session reports',
+#  },
+  'mac_as_password' => { 
+    type => 'checkbox',
+    default => '1',
+    label => 'Use MAC address as password',
+  },
+  'radius_password' => { label=>'Fixed password' },
+  'ip_addr_as' => { label => 'Send IP address as',
+                    default => 'Framed-IP-Address' },
+;
+
+%info = (
+  'svc'      => 'svc_broadband',
+  'desc'     => 'Real-time export to SQL-backed RADIUS (such as FreeRadius) for broadband services',
+  'options'  => \%options,
+  'nas'      => 'Y',
+  'notes'    => <<END,
+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>.
+<br><br>
+
+This export is for broadband service access control based on MAC address.  
+For a more typical RADIUS export, see sqlradius.
+<br><br>
+
+See the
+<a href="http://search.cpan.org/dist/DBI/DBI.pm#connect">DBI documentation</a>
+and the
+<a href="http://search.cpan.org/search?mode=module&query=DBD%3A%3A">documentation for your DBD</a>
+for the exact syntax of a DBI data source.
+
+END
+);
+
+sub rebless { shift; }
+
+sub export_username {
+  my($self, $svc_broadband) = (shift, shift);
+  $svc_broadband->mac_addr;
+}
+
+sub radius_reply {
+  my($self, $svc_broadband) = (shift, shift);
+  my %reply;
+  if (  length($self->option('ip_addr_as',1)) 
+    and length($svc_broadband->ip_addr) ) {
+    $reply{$self->option('ip_addr_as')} = $svc_broadband->ip_addr;
+  }
+  %reply;
+}
+
+sub radius_check {
+  my($self, $svc_broadband) = (shift, shift);
+  my $password_attrib = $conf->config('radius-password') || 'Password';
+  my %check;
+  if ( $self->option('mac_as_password') ) {
+    $check{$password_attrib} = $svc_broadband->mac_addr; #formatting?
+  }
+  elsif ( length( $self->option('radius_password',1)) ) {
+    $check{$password_attrib} = $self->option('radius_password');
+  }
+  %check;
+}
+
+sub _export_suspend {}
+sub _export_unsuspend {}
+
+sub update_svc {} #do nothing
+
+1;
+