From e4388387dcd23701294438b468ad60b92d61f34d Mon Sep 17 00:00:00 2001 From: mark Date: Mon, 26 Dec 2011 22:18:04 +0000 Subject: [PATCH] import sqlradius attributes on upgrade, #15017 --- FS/FS/part_export.pm | 6 +++ FS/FS/part_export/sqlradius.pm | 85 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 4b60953cf..45773e097 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 7d0edd65c..752bf12a2 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 ### -- 2.11.0