From: ivan Date: Mon, 20 Aug 2001 09:41:52 +0000 (+0000) Subject: dtrt when deleting accouts wrt forwards, catchalls & other references to X-Git-Tag: freeside_1_4_0pre11~426 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=c6708c86785662d8f0c12e23936bf7b1916f411c dtrt when deleting accouts wrt forwards, catchalls & other references to svc_acct records depreciate svc_acct_sm further; move qmail catchall handling to svc_domain --- diff --git a/FS/FS/svc_acct.pm b/FS/FS/svc_acct.pm index 42eb7d9ee..6551d94af 100644 --- a/FS/FS/svc_acct.pm +++ b/FS/FS/svc_acct.pm @@ -13,6 +13,8 @@ use Net::SSH qw(ssh); use FS::part_svc; use FS::svc_acct_pop; use FS::svc_acct_sm; +use FS::cust_main_invoice; +use FS::svc_domain; @ISA = qw( FS::svc_Common ); @@ -232,11 +234,21 @@ $username and $dir. sub delete { my $self = shift; - my $error; - return "Can't delete an account which has mail aliases pointed to it!" + return "Can't delete an account which has (svc_acct_sm) mail aliases!" if $self->uid && qsearch( 'svc_acct_sm', { 'domuid' => $self->uid } ); + return "Can't delete an account which is a (svc_forward) source!" + if qsearch( 'svc_forward', { 'srcsvc' => $self->svcnum } ); + + return "Can't delete an account which is a (svc_forward) destination!" + if qsearch( 'svc_forward', { 'dstsvc' => $self->svcnum } ); + + return "Can't delete an account with (svc_www) web service!" + if qsearch( 'svc_www', { 'usersvc' => $self->usersvc } ); + + # what about records in session ? + local $SIG{HUP} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; local $SIG{QUIT} = 'IGNORE'; @@ -244,8 +256,43 @@ sub delete { local $SIG{TSTP} = 'IGNORE'; local $SIG{PIPE} = 'IGNORE'; - $error = $self->SUPER::delete; - return $error if $error; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + foreach my $cust_main_invoice ( + qsearch( 'cust_main_invoice', { 'dest' => $self->svcnum } ) + ) { + my %hash = $cust_main_invoice->hash; + $hash{'dest'} = $self->email; + my $new = new FS::cust_main_invoice \%hash; + my $error = $new->replace($cust_main_invoice); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + foreach my $svc_domain ( + qsearch( 'svc_domain', { 'catchall' => $self->svcnum } ) + ) { + my %hash = new FS::svc_domain->hash; + $hash{'catchall'} = ''; + my $new = new FS::svc_domain \%hash; + my $error = $new->replace($svc_domain); + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } + + my $error = $self->SUPER::delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + $dbh->commit or die $dbh->errstr if $oldAutoCommit; my( $username, $dir ) = ( $self->username, @@ -574,7 +621,7 @@ sub email { =head1 VERSION -$Id: svc_acct.pm,v 1.24 2001-08-19 15:53:34 jeff Exp $ +$Id: svc_acct.pm,v 1.25 2001-08-20 09:41:52 ivan Exp $ =head1 BUGS diff --git a/FS/FS/svc_acct_sm.pm b/FS/FS/svc_acct_sm.pm index 8cec60b69..7615c211d 100644 --- a/FS/FS/svc_acct_sm.pm +++ b/FS/FS/svc_acct_sm.pm @@ -13,12 +13,12 @@ use FS::svc_domain; @ISA = qw( FS::svc_Common ); #ask FS::UID to run this stuff for us later -$FS::UID::callback{'FS::svc_acct_sm'} = sub { - $conf = new FS::Conf; - $shellmachine = $conf->exists('qmailmachines') - ? $conf->config('shellmachine') - : ''; -}; +#$FS::UID::callback{'FS::svc_acct_sm'} = sub { +# $conf = new FS::Conf; +# $shellmachine = $conf->exists('qmailmachines') +# ? $conf->config('shellmachine') +# : ''; +#}; =head1 NAME @@ -45,10 +45,15 @@ FS::svc_acct_sm - Object methods for svc_acct_sm records $error = $record->cancel; +=head1 WARNING + +FS::svc_acct_sm is B. This class is only included for migration +purposes. See L. + =head1 DESCRIPTION -An FS::svc_acct object represents a virtual mail alias. FS::svc_acct inherits -from FS::Record. The following fields are currently supported: +An FS::svc_acct_sm object represents a virtual mail alias. FS::svc_acct_sm +inherits from FS::Record. The following fields are currently supported: =over 4 @@ -83,16 +88,16 @@ the error, otherwise returns false. The additional fields pkgnum and svcpart (see L) should be defined. An FS::cust_svc record will be created and inserted. -If the configuration values (see L) shellmachine and qmailmachines -exist, and domuser is `*' (meaning a catch-all mailbox), the command: - - [ -e $dir/.qmail-$qdomain-default ] || { - touch $dir/.qmail-$qdomain-default; - chown $uid:$gid $dir/.qmail-$qdomain-default; - } - -is executed on shellmachine via ssh (see L). -This behaviour can be surpressed by setting $FS::svc_acct_sm::nossh_hack true. + #If the configuration values (see L) shellmachine and qmailmachines + #exist, and domuser is `*' (meaning a catch-all mailbox), the command: + # + # [ -e $dir/.qmail-$qdomain-default ] || { + # touch $dir/.qmail-$qdomain-default; + # chown $uid:$gid $dir/.qmail-$qdomain-default; + # } + # + #is executed on shellmachine via ssh (see L). + #This behaviour can be surpressed by setting $FS::svc_acct_sm::nossh_hack true. =cut @@ -124,18 +129,18 @@ sub insert { $error = $self->SUPER::insert; return $error if $error; - my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } ); - my $svc_acct = qsearchs( 'svc_acct', { 'uid' => $self->domuid } ); - my ( $uid, $gid, $dir, $domain ) = ( - $svc_acct->uid, - $svc_acct->gid, - $svc_acct->dir, - $svc_domain->domain, - ); - my $qdomain = $domain; - $qdomain =~ s/\./:/g; #see manpage for 'dot-qmail': EXTENSION ADDRESSES - ssh("root\@$shellmachine","[ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }") - if ( ! $nossh_hack && $shellmachine && $dir && $self->domuser eq '*' ); + #my $svc_domain = qsearchs( 'svc_domain', { 'svcnum' => $self->domsvc } ); + #my $svc_acct = qsearchs( 'svc_acct', { 'uid' => $self->domuid } ); + #my ( $uid, $gid, $dir, $domain ) = ( + # $svc_acct->uid, + # $svc_acct->gid, + # $svc_acct->dir, + # $svc_domain->domain, + #); + #my $qdomain = $domain; + #$qdomain =~ s/\./:/g; #see manpage for 'dot-qmail': EXTENSION ADDRESSES + #ssh("root\@$shellmachine","[ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }") + # if ( ! $nossh_hack && $shellmachine && $dir && $self->domuser eq '*' ); ''; #no error @@ -233,7 +238,7 @@ sub check { =head1 VERSION -$Id: svc_acct_sm.pm,v 1.3 2001-04-22 01:56:15 ivan Exp $ +$Id: svc_acct_sm.pm,v 1.4 2001-08-20 09:41:52 ivan Exp $ =head1 BUGS @@ -243,6 +248,8 @@ The $recref stuff in sub check should be cleaned up. =head1 SEE ALSO +L + L, L, L, L, L, L, L, L, L, L, schema.html from the base documentation. diff --git a/FS/FS/svc_domain.pm b/FS/FS/svc_domain.pm index b3b298b97..06186049b 100644 --- a/FS/FS/svc_domain.pm +++ b/FS/FS/svc_domain.pm @@ -1,7 +1,7 @@ package FS::svc_domain; use strict; -use vars qw( @ISA $whois_hack $conf $mydomain $smtpmachine +use vars qw( @ISA $whois_hack $conf $smtpmachine $tech_contact $from $to @nameservers @nameserver_ips @template @mxmachines @nsmachines $soadefaultttl $soaemail $soaexpire $soamachine $soarefresh $soaretry @@ -11,6 +11,7 @@ use Mail::Internet; use Mail::Header; use Date::Format; use Net::Whois 1.0; +use Net::SSH qw(ssh); use FS::Record qw(fields qsearch qsearchs dbh); use FS::Conf; use FS::svc_Common; @@ -26,7 +27,6 @@ use FS::domain_record; $FS::UID::callback{'FS::domain'} = sub { $conf = new FS::Conf; - $mydomain = $conf->config('domain'); $smtpmachine = $conf->config('smtpmachine'); my($internic)="/registries/internic"; @@ -55,6 +55,9 @@ $FS::UID::callback{'FS::domain'} = sub { $soarefresh = $conf->config('soarefresh'); $soaretry = $conf->config('soaretry'); + $qshellmachine = $conf->exists('qmailmachines') + ? $conf->config('shellmachine') + : ''; }; =head1 NAME @@ -137,9 +140,20 @@ records are added to the domain_record table (see L). If any machines are defined in the I configuration file, MX records are added to the domain_record table (see L). -Any problems adding FS::domain_record records will emit warnings, but will -not return errors from this method. If your configuration files are correct -you shouln't have any problems. +If a machine is defined in the I configuration value, the +I configuration file exists, and the I field points +to an an account with a home directory (see L), the command: + + [ -e $dir/.qmail-$qdomain-defualt ] || { + touch $dir/.qmail-$qdomain-default; + chown $uid:$gid $dir/.qmail-$qdomain-default; + } + +is executed on shellmachine via ssh (see L). +This behaviour can be supressed by setting $FS::svc_domain::nossh_hack true. + +a machine is defined +in the =cut @@ -231,6 +245,21 @@ sub insert { $dbh->commit or die $dbh->errstr if $oldAutoCommit; + if ( $qshellmachine && $self->catchall && ! $nossh_hack ) { + my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $self->catchall } ) + or warn "WARNING: inserted unknown catchall: ". $self->catchall; + if ( $svc_acct && $svc_acct->dir ) { + my $qdomain = $self->domain; + $qdomain =~ s/\./:/g; #see manpage for 'dot-qmail': EXTENSION ADDRESSES + my ( $uid, $gid, $dir ) = ( + $svc_acct->uid, + $svc_acct->gid, + $svc_acct->dir, + ); + ssh("root\@$qshellmachine", "[ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }"); + } + } + ''; #no error } @@ -241,6 +270,23 @@ error, otherwise returns false. The corresponding FS::cust_svc record will be deleted as well. +=cut + +sub delete { + my $self = shift; + + return "Can't delete a domain which has accounts!" + if qsearch( 'svc_acct', { 'domsvc' => $self->svcnum } ); + + return "Can't delete a domain with (svc_acct_sm) mail aliases!" + if qsearch('svc_acct_sm', { 'domsvc' => $self->svcnum } ); + + return "Can't delete a domain with (domain_record) zone entries!" + if qsearch('domain_record', { 'svcnum' => $self->svcnum } ); + + $self->SUPER::delete; +} + =item replace OLD_RECORD Replaces OLD_RECORD with this one in the database. If there is an error, @@ -321,7 +367,7 @@ sub check { } elsif ( scalar(@svc_acct) > 1 ) { return "More than one account in package ". $pkgnum. ": specify admin contact email"; } else { - $self->email($svc_acct[0]->username. '@'. $mydomain); + $self->email($svc_acct[0]->email ); } } } @@ -485,7 +531,7 @@ sub submit_internic { =head1 VERSION -$Id: svc_domain.pm,v 1.15 2001-08-19 08:18:01 ivan Exp $ +$Id: svc_domain.pm,v 1.16 2001-08-20 09:41:52 ivan Exp $ =head1 BUGS diff --git a/FS/FS/svc_forward.pm b/FS/FS/svc_forward.pm index db9180dbf..b82ed2b85 100644 --- a/FS/FS/svc_forward.pm +++ b/FS/FS/svc_forward.pm @@ -1,12 +1,13 @@ package FS::svc_forward; use strict; -use vars qw( @ISA $nossh_hack $conf $shellmachine @qmailmachines @vpopmailmachines); +use vars qw( @ISA $nossh_hack $conf $shellmachine @qmailmachines + @vpopmailmachines ); +use Net::SSH qw(ssh); +use FS::Conf; use FS::Record qw( fields qsearch qsearchs ); use FS::svc_Common; use FS::cust_svc; -use Net::SSH qw(ssh); -use FS::Conf; use FS::svc_acct; use FS::svc_domain; @@ -15,11 +16,15 @@ use FS::svc_domain; #ask FS::UID to run this stuff for us later $FS::UID::callback{'FS::svc_forward'} = sub { $conf = new FS::Conf; - $shellmachine = $conf->exists('qmailmachines') - ? $conf->config('shellmachine') - : ''; + if ( $conf->exists('qmailmachines') ) { + $shellmachine = $conf->config('shellmachine') + } else { + $shellmachine = ''; + } if ( $conf->exists('vpopmailmachines') ) { @vpopmailmachines = $conf->config('vpopmailmachines'); + } else { + @vpopmailmachines = (); } }; @@ -234,7 +239,7 @@ sub check { =head1 VERSION -$Id: svc_forward.pm,v 1.3 2001-08-19 15:53:35 jeff Exp $ +$Id: svc_forward.pm,v 1.4 2001-08-20 09:41:52 ivan Exp $ =head1 BUGS