diff options
| -rw-r--r-- | FS/FS/part_export.pm | 6 | ||||
| -rw-r--r-- | FS/FS/part_export/sqlradius.pm | 85 | 
2 files changed, 91 insertions, 0 deletions
| 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  ### | 
