From: ivan Date: Tue, 11 Sep 2001 13:10:22 +0000 (+0000) Subject: transactional job-queued icradius/freeradius export X-Git-Tag: freeside_1_4_0pre11~340 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=e9eba9d8d429675865a49af7008f3bdcca5ccb92 transactional job-queued icradius/freeradius export --- diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index d7dbcfaf2..74a5f311a 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -6,6 +6,7 @@ use vars qw( @ISA $nossh_hack $conf $dir_prefix @shells $usernamemin $username_noperiod $shellmachine $useradd $usermod $userdel $mydomain $cyrus_server $cyrus_admin_user $cyrus_admin_pass + $icradius_dbh @saltset @pw_set); use Carp; use FS::Conf; @@ -65,6 +66,12 @@ $FS::UID::callback{'FS::svc_acct'} = sub { $cyrus_admin_user = ''; $cyrus_admin_pass = ''; } + if ( $conf->exists('icradius_secrets') ) { + $icradius_dbh = DBI->connect($conf->config('icradius_secrets')) + or die $DBI::errstr; + } else { + $icradius_dbh = ''; + } }; @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' ); @@ -247,6 +254,17 @@ sub insert { return "queueing job (transaction rolled back): $error"; } } + if ( $icradius_dbh ) { + my $queue = new FS::queue { 'job' => 'FS::svc_acct::icradius_rc_insert' }; + $error = $queue->insert( $self->username, + $self->_password, + $self->radius_check + ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } + } $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; #no error @@ -275,13 +293,43 @@ sub cyrus_insert { warn "cyrus_insert: setacl user.$username, $username => all\n"; $rc = $client->setacl("user.$username", $username => 'all' ); $error = $client->error; - die $error if $error; + die "cyrus_insert: error setacl user.$username: $error" if $error; if ( $quota ) { warn "cyrus_insert: setquota user.$username, STORAGE => $quota\n"; $rc = $client->setquota("user.$username", 'STORAGE' => $quota ); $error = $client->error; - die $error if $error; + die "cyrus_insert: error setquota user.$username: $error" if $error; + } + + 1; +} + +sub icradius_rc_insert { + my( $username, $password, %radcheck ) = @_; + + my $sth = $icradius_dbh->prepare( + "INSERT INTO radcheck ( id, UserName, Attribute, Value ) VALUES ( ". + join(", ", map { $icradius_dbh->quote($_) } ( + '', + $username, + "Password", + $password, + ) ). " )" + ); + $sth->execute or die "can't insert into radcheck table: ". $sth->errstr; + + foreach my $attribute ( keys %radcheck ) { + my $sth = $icradius_dbh->prepare( + "INSERT INTO radcheck ( id, UserName, Attribute, Value ) VALUES ( ". + join(", ", map { $icradius_dbh->quote($_) } ( + '', + $username, + $attribute, + $radcheck{$attribute}, + ) ). " )" + ); + $sth->execute or die "can't insert into radcheck table: ". $sth->errstr; } 1; @@ -398,6 +446,14 @@ sub delete { return "queueing job (transaction rolled back): $error"; } } + if ( $icradius_dbh ) { + my $queue = new FS::queue { 'job' => 'FS::svc_acct::icradius_rc_delete' }; + $error = $queue->insert( $self->username ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } + } $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; @@ -424,6 +480,18 @@ sub cyrus_delete { 1; } +sub icradius_rc_delete { + my $username = shift; + + my $sth = $icradius_dbh->prepare( + 'DELETE FROM radcheck WHERE UserName = ?' + ); + $sth->execute($username) + or die "can't delete from radcheck table: ". $sth->errstr; + + 1; +} + =item replace OLD_RECORD Replaces OLD_RECORD with this one in the database. If there is an error, @@ -771,7 +839,7 @@ sub email { =head1 VERSION -$Id: svc_acct.pm,v 1.37 2001-09-11 12:06:57 ivan Exp $ +$Id: svc_acct.pm,v 1.38 2001-09-11 13:10:22 ivan Exp $ =head1 BUGS