X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpart_export.pm;h=eabcedec19b14d15395fe9271dc0cdc814273053;hb=f38abb144955686f880a528ed6fe4c9c5453517b;hp=3f184be070c4cb65f926e8c2f7d5c9082d3f8221;hpb=b159f42fa3f48cc2ca3b43773e7661e17d2fb072;p=freeside.git diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm index 3f184be07..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 { @@ -505,8 +533,34 @@ sub _export_replace { } my @del = grep { !exists $new{$_} } keys %old; - my $error = $self->sqlradius_queue( $new->svcnum, 'sqlradius_attrib_delete', - $table, $new->username, @del ); + if ( @del ) { + my $error = $self->sqlradius_queue( $new->svcnum, 'attrib_delete', + $table, $new->username, @del ); + return $error if $error; + } + } + + # (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; } @@ -542,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; @@ -551,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) @@ -581,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;