diff options
| author | ivan <ivan> | 2002-03-24 14:29:00 +0000 | 
|---|---|---|
| committer | ivan <ivan> | 2002-03-24 14:29:00 +0000 | 
| commit | 7dc23049c25d316da196647a8be1d74dfc09a02a (patch) | |
| tree | 9ad875d5463e34e228f910ec919930e9ca8b10de /FS | |
| parent | 74e64d70361848f089aad9a7881c2af9caf6e479 (diff) | |
ICRADIUS groups all done!  UI and provisioning.  closes: Bug#362
fix some bugs in the export and add queue_dangerous_controls option too
Diffstat (limited to 'FS')
| -rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
| -rw-r--r-- | FS/FS/part_export.pm | 96 | ||||
| -rw-r--r-- | FS/FS/queue.pm | 13 | ||||
| -rw-r--r-- | FS/FS/radius_usergroup.pm | 130 | ||||
| -rw-r--r-- | FS/FS/svc_acct.pm | 31 | 
5 files changed, 253 insertions, 24 deletions
| diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 645dbf1c4..2bc5e24c0 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -836,6 +836,13 @@ httemplate/docs/config.html      'type'        => 'checkbox',    }, +  { +    'key'         => 'queue_dangerous_controls', +    'section'     => 'UI', +    'description' => 'Enable queue modification controls on account pages and for new jobs.  Unless you are a developer working on new export code, you should probably leave this off to avoid causing provisioning problems.', +    'type'        => 'checkbox', +  }, +  );  1; diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 9aedd9f7a..eabcedec1 100644 --- a/FS/FS/part_export.pm +++ b/FS/FS/part_export.pm @@ -383,6 +383,22 @@ sub export_delete {    $self->_export_delete(@_);  } +#fallbacks providing useful error messages intead of infinite loops +sub _export_insert { +  my $self = shift; +  return "_export_insert: unknown export type ". $self->exporttype; +} + +sub _export_replace { +  my $self = shift; +  return "_export_replace: unknown export type ". $self->exporttype; +} + +sub _export_delete { +  my $self = shift; +  return "_export_delete: unknown export type ". $self->exporttype; +} +  =back  =cut @@ -474,10 +490,22 @@ use vars qw(@ISA);  sub _export_insert {    my($self, $svc_acct) = (shift, shift); -  $self->sqlradius_queue( $svc_acct->svcnum, 'insert', -    'reply', $svc_acct->username, $svc_acct->radius_reply ); -  $self->sqlradius_queue( $svc_acct->svcnum, 'insert', -    'check', $svc_acct->username, $svc_acct->radius_check ); + +  foreach my $table (qw(reply check)) { +    my $method = "radius_$table"; +    my %attrib = $svc_acct->$method; +    next unless keys %attrib; +    my $error = $self->sqlradius_queue( $svc_acct->svcnum, 'insert', +      $table, $svc_acct->username, %attrib ); +    return $error if $error; +  } +  my @groups = $svc_acct->radius_groups; +  if ( @groups ) { +    my $error = $self->sqlradius_queue( $svc_acct->svcnum, 'usergroup_insert', +      $svc_acct->username, @groups ); +    return $error if $error; +  } +  '';  }  sub _export_replace { @@ -512,6 +540,30 @@ sub _export_replace {      }    } +  # (sorta) false laziness with FS::svc_acct::replace +  my @oldgroups = @{$old->usergroup}; #uuuh +  my @newgroups = $new->radius_groups; +  my @delgroups = (); +  foreach my $oldgroup ( @oldgroups ) { +    if ( grep { $oldgroup eq $_ } @newgroups ) { +      @newgroups = grep { $oldgroup ne $_ } @newgroups; +      next; +    } +    push @delgroups, $oldgroup; +  } + +  if ( @delgroups ) { +    my $error = $self->sqlradius_queue( $new->svcnum, 'usergroup_delete', +      $new->username, @delgroups ); +    return $error if $error; +  } + +  if ( @newgroups ) { +    my $error = $self->sqlradius_queue( $new->svcnum, 'usergroup_insert', +      $new->username, @newgroups ); +    return $error if $error; +  } +    '';  } @@ -544,8 +596,8 @@ sub sqlradius_insert { #subroutine, not method        "UPDATE rad$replycheck SET Value = ? WHERE UserName = ? AND Attribute = ?"    ) or die $dbh->errstr;      my $i_sth = $dbh->prepare(        "INSERT INTO rad$replycheck ( id, UserName, Attribute, Value ) ". -        "VALUES ( ?, ?, ?, ? )" ) -      or die $dbh->errstr; +        "VALUES ( ?, ?, ?, ? )" +    ) or die $dbh->errstr;      $u_sth->execute($attributes{$attribute}, $username, $attribute) > 0        or $i_sth->execute( '', $username, $attribute, $attributes{$attribute} )          or die "can't insert into rad$replycheck table: ". $i_sth->errstr; @@ -553,10 +605,38 @@ sub sqlradius_insert { #subroutine, not method    $dbh->disconnect;  } +sub sqlradius_usergroup_insert { #subroutine, not method +  my $dbh = sqlradius_connect(shift, shift, shift); +  my( $username, @groups ) = @_; + +  my $sth = $dbh->prepare(  +    "INSERT INTO usergroup ( id, UserName, GroupName ) VALUES ( ?, ?, ? )" +  ) or die $dbh->errstr; +  foreach my $group ( @groups ) { +    $sth->execute( '', $username, $group ) +      or die "can't insert into groupname table: ". $sth->errstr; +  } +  $dbh->disconnect; +} + +sub sqlradius_usergroup_delete { #subroutine, not method +  my $dbh = sqlradius_connect(shift, shift, shift); +  my( $username, @groups ) = @_; + +  my $sth = $dbh->prepare(  +    "DELETE FROM usergroup ( id, UserName, GroupName ) VALUES ( ?, ?, ? )" +  ) or die $dbh->errstr; +  foreach my $group ( @groups ) { +    $sth->execute( '', $username, $group ) +      or die "can't delete from groupname table: ". $sth->errstr; +  } +  $dbh->disconnect; +} +  sub sqlradius_rename { #subroutine, not method    my $dbh = sqlradius_connect(shift, shift, shift);    my($new_username, $old_username) = @_; -  foreach my $table (qw(radreply radcheck)) { +  foreach my $table (qw(radreply radcheck usergroup )) {      my $sth = $dbh->prepare("UPDATE $table SET Username = ? WHERE UserName = ?")        or die $dbh->errstr;      $sth->execute($new_username, $old_username) @@ -583,7 +663,7 @@ sub sqlradius_delete { #subroutine, not method    my $dbh = sqlradius_connect(shift, shift, shift);    my $username = shift; -  foreach my $table (qw( radcheck radreply )) { +  foreach my $table (qw( radcheck radreply usergroup )) {      my $sth = $dbh->prepare( "DELETE FROM $table WHERE UserName = ?" );      $sth->execute($username)        or die "can't delete from $table table: ". $sth->errstr; diff --git a/FS/FS/queue.pm b/FS/FS/queue.pm index 7a38a6eef..e5369cf82 100644 --- a/FS/FS/queue.pm +++ b/FS/FS/queue.pm @@ -1,8 +1,10 @@  package FS::queue;  use strict; -use vars qw( @ISA @EXPORT_OK ); +use vars qw( @ISA @EXPORT_OK $conf );  use Exporter; +use FS::UID; +use FS::Conf;  use FS::Record qw( qsearch qsearchs dbh );  #use FS::queue;  use FS::queue_arg; @@ -11,6 +13,10 @@ use FS::cust_svc;  @ISA = qw(FS::Record);  @EXPORT_OK = qw( joblisting ); +$FS::UID::callback{'FS::queue'} = sub { +  $conf = new FS::Conf; +}; +  =head1 NAME  FS::queue - Object methods for queue records @@ -255,7 +261,8 @@ END      my $date = time2str( "%a %b %e %T %Y", $queue->_date );      my $status = $queue->status;      $status .= ': '. $queue->statustext if $queue->statustext; -    if ( ! $noactions && $status =~ /^failed/ || $status =~ /^locked/ ) { +    if ( $conf->exists('queue_dangerous_controls') +         || ( ! $noactions && $status =~ /^failed/ || $status =~ /^locked/ ) ) {        $status .=          qq! ( <A HREF="$p/misc/queue.cgi?jobnum=$jobnum&action=new">retry</A> |!.          qq! <A HREF="$p/misc/queue.cgi?jobnum=$jobnum&action=del">remove</A> )!; @@ -298,7 +305,7 @@ END  =head1 VERSION -$Id: queue.pm,v 1.8 2002-03-23 16:16:00 ivan Exp $ +$Id: queue.pm,v 1.9 2002-03-24 14:29:00 ivan Exp $  =head1 BUGS diff --git a/FS/FS/radius_usergroup.pm b/FS/FS/radius_usergroup.pm new file mode 100644 index 000000000..647621d28 --- /dev/null +++ b/FS/FS/radius_usergroup.pm @@ -0,0 +1,130 @@ +package FS::radius_usergroup; + +use strict; +use vars qw( @ISA ); +use FS::Record qw( qsearch qsearchs ); +use FS::svc_acct; + +@ISA = qw(FS::Record); + +=head1 NAME + +FS::radius_usergroup - Object methods for radius_usergroup records + +=head1 SYNOPSIS + +  use FS::radius_usergroup; + +  $record = new FS::radius_usergroup \%hash; +  $record = new FS::radius_usergroup { 'column' => 'value' }; + +  $error = $record->insert; + +  $error = $new_record->replace($old_record); + +  $error = $record->delete; + +  $error = $record->check; + +=head1 DESCRIPTION + +An FS::radius_usergroup object links an account (see L<FS::svc_acct>) with a +RADIUS group.  FS::radius_usergroup inherits from FS::Record.  The following +fields are currently supported: + +=over 4 + +=item usergroupnum - primary key + +=item svcnum - Account (see L<FS::svc_acct>). + +=item groupname - group name + +=back + +=head1 METHODS + +=over 4 + +=item new HASHREF + +Creates a new record.  To add the record to the database, see L<"insert">. + +Note that this stores the hash reference, not a distinct copy of the hash it +points to.  You can ask the object for a copy with the I<hash> method. + +=cut + +# the new method can be inherited from FS::Record, if a table method is defined + +sub table { 'radius_usergroup'; } + +=item insert + +Adds this record to the database.  If there is an error, returns the error, +otherwise returns false. + +=cut + +#inherited from FS::Record + +=item delete + +Delete this record from the database. + +=cut + +#inherited from FS::Record + +=item replace OLD_RECORD + +Replaces the OLD_RECORD with this one in the database.  If there is an error, +returns the error, otherwise returns false. + +=cut + +#inherited from FS::Record + +=item check + +Checks all fields to make sure this is a valid record.  If there is +an error, returns the error, otherwise returns false.  Called by the insert +and replace methods. + +=cut + +sub check { +  my $self = shift; + +  $self->ut_numbern('usergroupnum') +    || $self->ut_number('svcnum') +    || $self->ut_foreign_key('svcnum','svc_acct','svcnum') +    || $self->ut_text('groupname') +  ; +} + +=item svc_acct + +Returns the account associated with this record (see L<FS::svc_acct>). + +=cut + +sub svc_acct { +  my $self = shift; +  qsearchs('svc_acct', { svcnum => $self->svcnum } ); +} + +=back + +=head1 BUGS + +Don't let 'em get you down. + +=head1 SEE ALSO + +L<svc_acct>, L<FS::Record>, schema.html from the base documentation. + +=cut + +1; + diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index a3e97f74c..197eec1b5 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -257,8 +257,6 @@ sub insert {    local $FS::UID::AutoCommit = 0;    my $dbh = dbh; -  my $amount = 0; -    $error = $self->check;    return $error if $error; @@ -587,6 +585,8 @@ sub delete {      }    } +  my $part_svc = $self->cust_svc->part_svc; +    my $error = $self->SUPER::delete;    if ( $error ) {      $dbh->rollback if $oldAutoCommit; @@ -595,7 +595,7 @@ sub delete {    #new-style exports!    unless ( $noexport_hack ) { -    foreach my $part_export ( $self->cust_svc->part_svc->part_export ) { +    foreach my $part_export ( $part_svc->part_export ) {        my $error = $part_export->export_delete($self);        if ( $error ) {          $dbh->rollback if $oldAutoCommit; @@ -791,34 +791,34 @@ sub replace {    }    $old->usergroup( [ $old->radius_groups ] ); -    if ( $new->usergroup ) { - -    foreach my $groupname ( @{$old->usergroup} ) { -      if ( grep { $groupname eq $_ } @{$new->usergroup} ) { -        $new->usergroup( [ grep { $groupname ne $_ } @{$new->usergroup} ] ); +    #(sorta) false laziness with FS::part_export::sqlradius::_export_replace +    my @newgroups = @{$new->usergroup}; +    foreach my $oldgroup ( @{$old->usergroup} ) { +      if ( grep { $oldgroup eq $_ } @newgroups ) { +        @newgroups = grep { $oldgroup ne $_ } @newgroups;          next;        }        my $radius_usergroup = qsearchs('radius_usergroup', {          svcnum    => $old->svcnum, -        groupname => $groupname, +        groupname => $oldgroup,        } );        my $error = $radius_usergroup->delete;        if ( $error ) {          $dbh->rollback if $oldAutoCommit; -        return "error deleting radius_usergroup $groupname: $error"; +        return "error deleting radius_usergroup $oldgroup: $error";        }      } -    foreach my $groupname ( @{$new->usergroup} ) { +    foreach my $newgroup ( @newgroups ) {        my $radius_usergroup = new FS::radius_usergroup ( {          svcnum    => $new->svcnum, -        groupname => $groupname, +        groupname => $newgroup,        } );        my $error = $radius_usergroup->insert;        if ( $error ) {          $dbh->rollback if $oldAutoCommit; -        return "error adding radius_usergroup $groupname: $error"; +        return "error adding radius_usergroup $newgroup: $error";        }      } @@ -1072,6 +1072,11 @@ sub check {    return $x unless ref($x);    my $part_svc = $x; +  if ( $part_svc->part_svc_column('usergroup')->columnflag eq "F" ) { +    $self->usergroup( +      [ split(',', $part_svc->part_svc_column('usergroup')->columnvalue) ] ); +  } +    my $error = $self->ut_numbern('svcnum')                || $self->ut_number('domsvc')    ; | 
