summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormark <mark>2011-12-26 22:17:52 +0000
committermark <mark>2011-12-26 22:17:52 +0000
commit0642c1b5d97d0987491424736054c1abc9d579b1 (patch)
treee2c66068b5bd5fc58fa1e44346e6ecbb4569af22
parent897ec63b7df26ab49439c251584d02e5ea72e031 (diff)
import sqlradius attributes on upgrade, #15017
-rw-r--r--FS/FS/part_export.pm6
-rw-r--r--FS/FS/part_export/sqlradius.pm85
2 files changed, 91 insertions, 0 deletions
diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm
index 4b60953..45773e0 100644
--- a/FS/FS/part_export.pm
+++ b/FS/FS/part_export.pm
@@ -473,6 +473,12 @@ sub _upgrade_data { #class method
$error = $opt->replace;
die $error if $error;
}
+ # pass downstream
+ my %exports_in_use;
+ $exports_in_use{ref $_} = 1 foreach qsearch('part_export', {});
+ foreach (keys(%exports_in_use)) {
+ $_->_upgrade_exporttype(%opts) if $_->can('_upgrade_exporttype');
+ }
}
#=item exporttype2svcdb EXPORTTYPE
diff --git a/FS/FS/part_export/sqlradius.pm b/FS/FS/part_export/sqlradius.pm
index 7d0edd6..752bf12 100644
--- a/FS/FS/part_export/sqlradius.pm
+++ b/FS/FS/part_export/sqlradius.pm
@@ -1136,6 +1136,91 @@ sub sqlradius_group_replace {
}
###
+# class method to fetch groups/attributes from the sqlradius install on upgrade
+###
+
+sub _upgrade_exporttype {
+ # do this only if the radius_attr table is empty
+ local $FS::radius_attr::noexport_hack = 1;
+ my $class = shift;
+ return if qsearch('radius_attr', {});
+
+ foreach my $self ($class->all_sqlradius) {
+ my $error = $self->import_attrs;
+ die "exportnum ".$self->exportnum.":\n$error\n" if $error;
+ }
+ return;
+}
+
+sub import_attrs {
+ my $self = shift;
+ my $dbh = sqlradius_connect( map $self->option($_),
+ qw( datasrc username password ) );
+ my $usergroup = $self->option('usergroup') || 'usergroup';
+ my $error;
+ warn "Importing RADIUS groups and attributes from ".$self->option('datasrc').
+ "\n";
+
+ # map out existing groups and attrs
+ my %attrs_of;
+ my %groupnum_of;
+ foreach my $radius_group ( qsearch('radius_group', {}) ) {
+ $attrs_of{$radius_group->groupname} = +{
+ map { $_->attrname => $_ } $radius_group->radius_attr
+ };
+ $groupnum_of{$radius_group->groupname} = $radius_group->groupnum;
+ }
+
+ # get groupnames from radgroupcheck and radgroupreply
+ my $sql = '
+SELECT groupname, attribute, op, value, \'C\' FROM radgroupcheck
+UNION
+SELECT groupname, attribute, op, value, \'R\' FROM radgroupreply';
+ foreach my $row ( @{ $dbh->selectall_arrayref($sql) } ) {
+ my ($groupname, $attrname, $op, $value, $attrtype) = @$row;
+ warn "$groupname.$attrname\n";
+ if ( !exists($groupnum_of{$groupname}) ) {
+ my $radius_group = new FS::radius_group {
+ 'groupname' => $groupname,
+ 'priority' => 1,
+ };
+ $error = $radius_group->insert;
+ return "error inserting group $groupname: $error" if $error;
+ $attrs_of{$groupname} = {};
+ $groupnum_of{$groupname} = $radius_group->groupnum;
+ }
+
+ my $a = $attrs_of{$groupname};
+ my $old = $a->{$attrname};
+ my $new;
+
+ if ( defined $old ) {
+ # replace
+ $new = new FS::radius_attr {
+ $old->hash,
+ 'op' => $op,
+ 'value' => $value,
+ };
+ $error = $new->replace($old);
+ return "error modifying attr $attrname: $error" if $error;
+ }
+ else {
+ $new = new FS::radius_attr {
+ 'groupnum' => $groupnum_of{$groupname},
+ 'attrname' => $attrname,
+ 'attrtype' => $attrtype,
+ 'op' => $op,
+ 'value' => $value,
+ };
+ $error = $new->insert;
+ return "error inserting attr $attrname: $error" if $error;
+ }
+ $attrs_of{$groupname}->{$attrname} = $new;
+ } #foreach $row
+ return;
+}
+
+###
#class methods
###