From 842df85f746a2e1b961d6c9e3a8c5cc3678ae6dd Mon Sep 17 00:00:00 2001 From: ivan Date: Tue, 11 Sep 2001 03:15:58 +0000 Subject: [PATCH] cyrus support --- FS/FS/cust_main.pm | 28 +------- FS/FS/svc_acct.pm | 151 ++++++++++++++++++++++++++++++++++++++----- FS/bin/freeside-queued | 2 + README.1.4.0pre2-3 | 2 + httemplate/docs/config.html | 2 +- httemplate/docs/export.html | 6 ++ httemplate/edit/part_svc.cgi | 4 +- 7 files changed, 152 insertions(+), 43 deletions(-) diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm index e4f55cf27..633c6e3da 100644 --- a/FS/FS/cust_main.pm +++ b/FS/FS/cust_main.pm @@ -1,7 +1,3 @@ -#this is so kludgy i'd be embarassed if it wasn't cybercash's fault -package main; -use vars qw($paymentserversecret $paymentserverport $paymentserverhost); - package FS::cust_main; use strict; @@ -66,15 +62,6 @@ $FS::UID::callback{'FS::cust_main'} = sub { die "CCMckLib3_2::InitConfig fatal error: $errmsg\n"; } $processor='cybercash3.2'; - } elsif ( $conf->exists('cybercash2') ) { - require CCLib; - #qw(sendmserver); - ( $main::paymentserverhost, - $main::paymentserverport, - $main::paymentserversecret, - $xaction, - ) = $conf->config('cybercash2'); - $processor='cybercash2'; } elsif ( $conf->exists('business-onlinepayment') ) { ( $bop_processor, $bop_login, @@ -1082,7 +1069,7 @@ sub collect { $self->paydate =~ /^\d{2}(\d{2})[\/\-](\d+)[\/\-]\d+$/; my $exp = "$2/$1"; - if ( $processor =~ /^cybercash/ ) { + if ( $processor eq 'cybercash3.2' ) { #fix exp. date for cybercash #$self->paydate =~ /^(\d+)\/\d*(\d{2})$/; @@ -1112,16 +1099,7 @@ sub collect { ); my %result; - if ( $processor eq 'cybercash2' ) { - $^W=0; #CCLib isn't -w safe, ugh! - %result = &CCLib::sendmserver(@full_xaction); - $^W=1; - } elsif ( $processor eq 'cybercash3.2' ) { - %result = &CCMckDirectLib3_2::SendCC2_1Server(@full_xaction); - } else { - $dbh->rollback if $oldAutoCommit; - return "Unknown real-time processor $processor"; - } + %result = &CCMckDirectLib3_2::SendCC2_1Server(@full_xaction); #if ( $result{'MActionCode'} == 7 ) { #cybercash smps v.1.1.3 #if ( $result{'action-code'} == 7 ) { #cybercash smps v.2.1 @@ -1683,7 +1661,7 @@ sub append_fuzzyfiles { =head1 VERSION -$Id: cust_main.pm,v 1.30 2001-09-11 00:08:18 ivan Exp $ +$Id: cust_main.pm,v 1.31 2001-09-11 03:15:58 ivan Exp $ =head1 BUGS diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index fa055cfff..926a9d344 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -4,6 +4,7 @@ use strict; use vars qw( @ISA $nossh_hack $conf $dir_prefix @shells $usernamemin $usernamemax $passwordmin $username_letter $username_letterfirst $shellmachine $useradd $usermod $userdel $mydomain + $cyrus_server $cyrus_admin_user $cyrus_admin_pass @saltset @pw_set); use Carp; use FS::Conf; @@ -16,6 +17,7 @@ use FS::svc_acct_sm; use FS::cust_main_invoice; use FS::svc_domain; use FS::raddb; +use FS::queue; @ISA = qw( FS::svc_Common ); @@ -52,6 +54,15 @@ $FS::UID::callback{'FS::svc_acct'} = sub { $username_letter = $conf->exists('username-letter'); $username_letterfirst = $conf->exists('username-letterfirst'); $mydomain = $conf->config('domain'); + if ( $conf->exists('cyrus') ) { + ($cyrus_server, $cyrus_admin_user, $cyrus_admin_pass) = + $conf->config('cyrus'); + eval "use Cyrus::IMAP::Admin;" + } else { + $cyrus_server = ''; + $cyrus_admin_user = ''; + $cyrus_admin_pass = ''; + } }; @saltset = ( 'a'..'z' , 'A'..'Z' , '0'..'9' , '.' , '/' ); @@ -151,7 +162,8 @@ defined. An FS::cust_svc record will be created and inserted. If the configuration value (see L) shellmachine exists, and the username, uid, and dir fields are defined, the command(s) specified in -the shellmachine-useradd configuration are exectued on shellmachine via ssh. +the shellmachine-useradd configuration are added to the job queue (see +L and L) to be exectued on shellmachine via ssh. This behaviour can be surpressed by setting $FS::svc_acct::nossh_hack true. If the shellmachine-useradd configuration file does not exist, @@ -166,6 +178,8 @@ is the default instead. Otherwise the contents of the file are treated as a double-quoted perl string, with the following variables available: $username, $uid, $gid, $dir, and $shell. +(TODOC: cyrus config file, L and L) + =cut sub insert { @@ -179,6 +193,12 @@ sub insert { local $SIG{TSTP} = 'IGNORE'; local $SIG{PIPE} = 'IGNORE'; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $amount = 0; + $error = $self->check; return $error if $error; @@ -196,7 +216,10 @@ sub insert { ; $error = $self->SUPER::insert; - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } my( $username, $uid, $gid, $dir, $shell ) = ( $self->username, @@ -206,12 +229,54 @@ sub insert { $self->shell, ); if ( $username && $uid && $dir && $shellmachine && ! $nossh_hack ) { - ssh("root\@$shellmachine", eval qq("$useradd") ); + my $queue = new FS::queue { 'job' => 'Net::SSH::ssh' }; + $error = $queue->insert("root\@$shellmachine", eval qq("$useradd") ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } } + if ( $cyrus_server ) { + my $queue = new FS::queue { 'job' => 'FS::svc_acct::cyrus_insert' }; + $error = $queue->insert($self->username, $self->quota); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; #no error } +sub cyrus_insert { + my( $username, $quota ) = + + my $client = Cyrus::IMAP::Admin->new($cyrus_server); + $client->authenticate( + -user => $cyrus_admin_user, + -mechanism => "login", + -password => $cyrus_admin_pass + ); + + my $rc = $client->create("user.$username"); + my $error = $client->error; + die $error if $error; + + $rc = $client->setacl("user.$username", $username => 'all' ); + $error = $client->error; + die $error if $error; + + if ( $quota ) { + $rc = $client->setquota("user.$username", 'STORAGE' => $quota ); + $error = $client->error; + die $error if $error; + } + + 1; +} + =item delete Deletes this account from the database. If there is an error, returns the @@ -221,7 +286,8 @@ The corresponding FS::cust_svc record will be deleted as well. If the configuration value (see L) shellmachine exists, the command(s) specified in the shellmachine-userdel configuration file are -executed on shellmachine via ssh. This behavior can be surpressed by setting +added to the job queue (see L and L) to be executed +on shellmachine via ssh. This behavior can be surpressed by setting $FS::svc_acct::nossh_hack true. If the shellmachine-userdel configuration file does not exist, @@ -236,6 +302,8 @@ is the default instead. Otherwise the contents of the file are treated as a double-quoted perl string, with the following variables available: $username and $dir. +(TODOC: cyrus config file) + =cut sub delete { @@ -298,19 +366,54 @@ sub delete { return $error; } - $dbh->commit or die $dbh->errstr if $oldAutoCommit; - my( $username, $dir ) = ( $self->username, $self->dir, ); if ( $username && $shellmachine && ! $nossh_hack ) { - ssh("root\@$shellmachine", eval qq("$userdel") ); + my $queue = new FS::queue { 'job' => 'Net::SSH::ssh' }; + $error = $queue->insert("root\@$shellmachine", eval qq("$userdel") ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } + + } + + if ( $cyrus_server ) { + my $queue = new FS::queue { 'job' => 'FS::svc_acct::cyrus_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; ''; } +sub cyrus_delete { + my( $username ) = shift; + + my $client = Cyrus::IMAP::Admin->new($cyrus_server); + $client->authenticate( + -user => $cyrus_admin_user, + -mechanism => "login", + -password => $cyrus_admin_pass + ); + + my $rc = $client->setacl("user.$username", $cyrus_admin_user => 'all' ); + my $error = $client->error; + die $error if $error; + + $rc = $client->delete("user.$username"); + $error = $client->error; + die $error if $error; + + 1; +} + =item replace OLD_RECORD Replaces OLD_RECORD with this one in the database. If there is an error, @@ -318,9 +421,10 @@ returns the error, otherwise returns false. If the configuration value (see L) shellmachine exists, and the dir field has changed, the command(s) specified in the shellmachine-usermod -configuraiton file are executed on shellmachine via ssh. This behavior can +configuraiton file are added to the job queue (see L and +L) to be executed on shellmachine via ssh. This behavior can be surpressed by setting $FS::svc-acct::nossh_hack true. If the -shellmachine-userdel configuration file does not exist or is empty, : +shellmachine-userdel configuration file does not exist or is empty, [ -d $old_dir ] && mv $old_dir $new_dir || ( chmod u+t $old_dir; @@ -332,8 +436,8 @@ shellmachine-userdel configuration file does not exist or is empty, : rm -rf $old_dir ) -is executed on shellmachine via ssh. This behaviour can be surpressed by -setting $FS::svc_acct::nossh_hack true. +is the default. This behaviour can be surpressed by setting +$FS::svc_acct::nossh_hack true. =cut @@ -347,6 +451,9 @@ sub replace { return "Can't change uid!" if $old->uid != $new->uid; + return "can't change username using Cyrus" + if $cyrus_server && $old->username ne $new->username; + #change homdir when we change username $new->setfield('dir', '') if $old->username ne $new->username; @@ -357,8 +464,15 @@ sub replace { local $SIG{TSTP} = 'IGNORE'; local $SIG{PIPE} = 'IGNORE'; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + $error = $new->SUPER::replace($old); - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error if $error; + } my ( $old_dir, $new_dir, $uid, $gid ) = ( $old->getfield('dir'), @@ -367,9 +481,15 @@ sub replace { $new->getfield('gid'), ); if ( $old_dir && $new_dir && $old_dir ne $new_dir && ! $nossh_hack ) { - ssh("root\@$shellmachine", eval qq("$usermod") ); + my $queue = new FS::queue { 'job' => 'Net::SSH::ssh' }; + $error = $queue->insert("root\@$shellmachine", eval qq("$usermod") ); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "queueing job (transaction rolled back): $error"; + } } + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; #no error } @@ -638,7 +758,7 @@ sub email { =head1 VERSION -$Id: svc_acct.pm,v 1.33 2001-09-07 20:26:33 ivan Exp $ +$Id: svc_acct.pm,v 1.34 2001-09-11 03:15:58 ivan Exp $ =head1 BUGS @@ -654,7 +774,8 @@ counterintuitive. =head1 SEE ALSO L, L, L, L, -L, L, L, L, L, +L, L, L, L), +L, L, L, schema.html from the base documentation. =cut diff --git a/FS/bin/freeside-queued b/FS/bin/freeside-queued index 8ed989683..098e33f54 100644 --- a/FS/bin/freeside-queued +++ b/FS/bin/freeside-queued @@ -13,6 +13,8 @@ use FS::queue; # no autoloading just yet use FS::cust_main; +use FS::svc_acct; +use Net::SSH; my $pid_file = '/var/run/freeside-queued.pid'; diff --git a/README.1.4.0pre2-3 b/README.1.4.0pre2-3 index 1de2a547f..c8d99905e 100644 --- a/README.1.4.0pre2-3 +++ b/README.1.4.0pre2-3 @@ -1,5 +1,7 @@ the following is necessary to upgrade from 1.4.0pre2 to pre3 or later. +install the perl modules and httemplate as per install.html or upgrade8.html + CREATE TABLE part_svc_column ( columnnum int primary key, svcpart int not null, diff --git a/httemplate/docs/config.html b/httemplate/docs/config.html index deae044d2..ac7752e07 100644 --- a/httemplate/docs/config.html +++ b/httemplate/docs/config.html @@ -40,8 +40,8 @@ All further configuration files and directories are located in
  • business-onlinepayment - Business::OnlinePayment support, at least three lines: processor, login, and password. An optional fourth line specifies the action. Optional additional lines are passed to Business::OnlinePayment as %processor_options.
  • bsdshellmachines - Your BSD flavored shell (and mail) machines, one per line. This enables export of `/etc/passwd' and `/etc/master.passwd'.
  • countrydefault - Default two-letter country code (if not supplied, the default is `US') -
  • cybercash2 - CyberCash v2 support, four lines: paymentserverhost, paymentserverport, paymentserversecret, and transaction type (`mauthonly' or `mauthcapture'). CCLib.pm is required.
  • cybercash3.2 - CyberCash v3.2 support. Two lines: the full path and name of your merchant_conf file, and the transaction type (`mauthonly' or `mauthcapture'). CCMckLib3_2.pm, CCMckDirectLib3_2.pm and CCMckErrno3_2 are required. +
  • cyrus
  • - Integration with Cyrus IMAP Server, three lines: IMAP server, admin username, and admin password. Cyrus::IMAP::Admin should be installed locally and the connection to the server secured.
  • deletecustomers - The existance of this file will enable customer deletions. Be very careful! Deleting a customer will remove all traces that this customer ever existed! It should probably only be used when auditing a legacy database. Normally, you cancel all of a customers' packages if they cancel service.
  • disable_customer_referrals - The existance of this file will disable new customer-to-customer referrals in the web interface.
  • domain - Your domain name. diff --git a/httemplate/docs/export.html b/httemplate/docs/export.html index 7f3a07118..c7410a923 100755 --- a/httemplate/docs/export.html +++ b/httemplate/docs/export.html @@ -20,6 +20,12 @@ it is reccommended that you replicate the data to an external RADIUS machine rat
  • Account deletion - The command(s) specified in the shellmachine-userdel configuration file are executed on shellmachine via ssh. If this file does not exist, userdel $username is the default. If the file exists but is empty, rm -rf $dir is the default instead. Otherwise the contents of the file are treated as a double-quoted perl string, with the following variables available: $username and $dir.
  • Account modification - If a user's home directory changes, the command(s) specified in the shellmachine-usermod configuration file are execute on shellmachine via ssh. If this file does not exist or is empty, [ -d $old_dir ] && mv $old_dir $new_dir || ( chmod u+t $old_dir; mkdir $new_dir; cd $old_dir; find . -depth -print | cpio -pdm $new_dir; chmod u-t $new_dir; chown -R $uid.$gid $new_dir; rm -rf $old_dir ) is the default. Otherwise the contents of the file are treated as a double-quoted perl string, with the following variables available: $old_dir, $new_dir, $uid and $gid. +
  • svc_acct.pm - Cyrus IMAP Server integration, enabled by the cyrus configuration file +
      +
    • Account creation - (Cyrus::IMAP::Admin should be installed locally) +
    • Account deletion - (Cyrus::IMAP::Admin should be installed locally) +
    • Account modification - (not yet implemented) +
  • bin/svc_acct_sm.export will create Qmail rcpthosts, recipientmap and virtualdomains files and Sendmail virtusertable and sendmail.cw files in the /usr/local/etc/freeside/export.datasrc directory. Using the appropriate configuration files, you can export these files to your remote machines unattemded:
    • qmailmachines - recipientmap, virtualdomains and rcpthosts are copied to the /var/qmail/control directory on the remote machine. Note: If you imported qmail configuration files, run the generated /usr/local/etc/freeside/export.datasrc/virtualdomains.FIX on a machine with your user home directories before exporting qmail configuration files. diff --git a/httemplate/edit/part_svc.cgi b/httemplate/edit/part_svc.cgi index c0a789667..0deed7b99 100755 --- a/httemplate/edit/part_svc.cgi +++ b/httemplate/edit/part_svc.cgi @@ -1,4 +1,4 @@ - + <% my $part_svc; if ( $cgi->param('error') ) { #error @@ -107,7 +107,7 @@ my %defs = ( 'slipip' => 'IP address (Set to fixed and blank to disable dialin, or, set a value to be exported to RADIUS Framed-IP-Address. Use the special value 0e0 [zero e zero] to enable export to RADIUS without a Framed-IP-Address.)', 'popnum' => qq!POP number!, 'username' => 'Username', - 'quota' => '(unimplemented)', + 'quota' => '', '_password' => 'Password', 'gid' => 'GID (when blank, defaults to UID)', 'shell' => 'Shell (all service definitions should have a default or fixed shell that is present in the shells configuration file)', -- 2.11.0