X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fsvc_domain.pm;h=58c6423c376662ecdcc58fad4f978d49e007b42f;hb=148727c4b03abc9b73149c101afcc4f3fff57a73;hp=4d4db5ad874a7606bfe5bdc7928875b2691bdf95;hpb=5bd5f206a77cf975515d955119d4dff7764a2d8c;p=freeside.git diff --git a/FS/FS/svc_domain.pm b/FS/FS/svc_domain.pm index 4d4db5ad8..58c6423c3 100644 --- a/FS/FS/svc_domain.pm +++ b/FS/FS/svc_domain.pm @@ -1,17 +1,18 @@ 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 + $soarefresh $soaretry $qshellmachine $nossh_hack ); use Carp; use Mail::Internet; use Mail::Header; use Date::Format; use Net::Whois 1.0; -use FS::Record qw(fields qsearch qsearchs); +use Net::SSH qw(ssh); +use FS::Record qw(fields qsearch qsearchs dbh); use FS::Conf; use FS::svc_Common; use FS::cust_svc; @@ -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 @@ -93,6 +96,8 @@ FS::svc_Common. The following fields are currently supported: =item domain +=item catchall - optional svcnum of an svc_acct record, designating an email catchall account. + =back =head1 METHODS @@ -135,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 @@ -152,6 +168,10 @@ sub insert { local $SIG{TSTP} = 'IGNORE'; local $SIG{PIPE} = 'IGNORE'; + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + $error = $self->check; return $error if $error; @@ -159,13 +179,20 @@ sub insert { if qsearchs( 'svc_domain', { 'domain' => $self->domain } ); my $whois = $self->whois; - return "Domain in use (see whois)" - if ( $self->action eq "N" && $whois ); - return "Domain not found (see whois)" - if ( $self->action eq "M" && ! $whois ); + if ( $self->action eq "N" && ! $whois_hack && $whois ) { + $dbh->rollback if $oldAutoCommit; + return "Domain in use (see whois)"; + } + if ( $self->action eq "M" && ! $whois ) { + $dbh->rollback if $oldAutoCommit; + return "Domain not found (see whois)"; + } $error = $self->SUPER::insert; - return $error if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } $self->submit_internic unless $whois_hack; @@ -175,13 +202,16 @@ sub insert { 'reczone' => '@', 'recaf' => 'IN', 'rectype' => 'SOA', - 'recdata' => "$soamachine $soaemail ( ". time2str("%Y%m%e", time). "00 ". - "$soarefresh $soarety $soaexpire $soadefaultttl )" + 'recdata' => "$soamachine $soaemail ( ". time2str("%Y%m%d", time). "00 ". + "$soarefresh $soaretry $soaexpire $soadefaultttl )" }; $error = $soa->insert; - warn "WARNING: couldn't insert SOA record for new domain: $error" if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "couldn't insert SOA record for new domain: $error"; + } - foreach $nsmachine ( @nsmachines ) { + foreach my $nsmachine ( @nsmachines ) { my $ns = new FS::domain_record { 'svcnum' => $self->svcnum, 'reczone' => '@', @@ -190,25 +220,45 @@ sub insert { 'recdata' => $nsmachine, }; my $error = $ns->insert; - warn "WARNING: couldn't insert NS record for new domain: $error" - if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "couldn't insert NS record for new domain: $error"; + } } - foreach $mxmachine ( @mxmachines ) { + foreach my $mxmachine ( @mxmachines ) { my $mx = new FS::domain_record { 'svcnum' => $self->svcnum, 'reczone' => '@', 'recaf' => 'IN', - 'rectype' => 'mx', + 'rectype' => 'MX', 'recdata' => $mxmachine, }; my $error = $mx->insert; - warn "WARNING: couldn't insert MX record for new domain: $error" - if $error; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "couldn't insert MX record for new domain: $error"; + } } } + $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 } @@ -220,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, @@ -268,11 +335,15 @@ Sets any fixed values; see L. sub check { my $self = shift; - my $error; my $x = $self->setfixed; return $x unless ref($x); - my $part_svc = $x; + #my $part_svc = $x; + + my $error = $self->ut_numbern('svcnum') + || $self->ut_numbern('catchall') + ; + return $error if $error; #hmm my $pkgnum; @@ -298,7 +369,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 ); } } } @@ -317,6 +388,9 @@ sub check { $recref->{action} =~ /^(M|N)$/ or return "Illegal action"; $recref->{action} = $1; + my $svc_acct = qsearchs( 'svc_acct', { 'svcnum' => $recref->{catchall} } ); + return "Unknown catchall" unless $svc_acct || ! $recref->{catchall}; + $self->ut_textn('purpose'); } @@ -459,7 +533,7 @@ sub submit_internic { =head1 VERSION -$Id: svc_domain.pm,v 1.5 2000-02-03 05:16:52 ivan Exp $ +$Id: svc_domain.pm,v 1.20 2001-09-06 20:41:59 ivan Exp $ =head1 BUGS @@ -476,7 +550,7 @@ The $recref stuff in sub check should be cleaned up. =head1 SEE ALSO L, L, L, L, -L, L, L, L, L, +L, L, L, L, L, schema.html from the base documentation, config.html from the base documentation.