X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fsvc_domain.pm;h=a9a2fd0ebbd540bf955ee1efdc3c72a58bc6dd0c;hp=b3b298b979e42edd47802a3a0acac95abfbda268;hb=23186f0338ec248d930c85db08cc997bca42525b;hpb=c2652bd1f1928b495e1dc5b4a43c46bffcc9022d diff --git a/FS/FS/svc_domain.pm b/FS/FS/svc_domain.pm index b3b298b97..a9a2fd0eb 100644 --- a/FS/FS/svc_domain.pm +++ b/FS/FS/svc_domain.pm @@ -1,16 +1,16 @@ package FS::svc_domain; use strict; -use vars qw( @ISA $whois_hack $conf $mydomain $smtpmachine - $tech_contact $from $to @nameservers @nameserver_ips @template - @mxmachines @nsmachines $soadefaultttl $soaemail $soaexpire $soamachine - $soarefresh $soaretry +use vars qw( @ISA $whois_hack $conf $smtpmachine + @defaultrecords $soadefaultttl $soaemail $soaexpire $soamachine + $soarefresh $soaretry $qshellmachine $nossh_hack ); use Carp; -use Mail::Internet; +use Mail::Internet 1.44; use Mail::Header; use Date::Format; use Net::Whois 1.0; +use Net::SSH; use FS::Record qw(fields qsearch qsearchs dbh); use FS::Conf; use FS::svc_Common; @@ -19,6 +19,7 @@ use FS::svc_acct; use FS::cust_pkg; use FS::cust_main; use FS::domain_record; +use FS::queue; @ISA = qw( FS::svc_Common ); @@ -26,28 +27,9 @@ 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"; - $tech_contact = $conf->config("$internic/tech_contact"); - $from = $conf->config("$internic/from"); - $to = $conf->config("$internic/to"); - my(@ns) = $conf->config("$internic/nameservers"); - @nameservers=map { - /^\s*\d+\.\d+\.\d+\.\d+\s+([^\s]+)\s*$/ - or die "Illegal line in $internic/nameservers"; - $1; - } @ns; - @nameserver_ips=map { - /^\s*(\d+\.\d+\.\d+\.\d+)\s+([^\s]+)\s*$/ - or die "Illegal line in $internic/nameservers!"; - $1; - } @ns; - @template = map { $_. "\n" } $conf->config("$internic/template"); - - @mxmachines = $conf->config('mxmachines'); - @nsmachines = $conf->config('nsmachines'); + @defaultrecords = $conf->config('defaultrecords'); $soadefaultttl = $conf->config('soadefaultttl'); $soaemail = $conf->config('soaemail'); $soaexpire = $conf->config('soaexpire'); @@ -55,6 +37,9 @@ $FS::UID::callback{'FS::domain'} = sub { $soarefresh = $conf->config('soarefresh'); $soaretry = $conf->config('soaretry'); + $qshellmachine = $conf->exists('qmailmachines') + ? $conf->config('shellmachine') + : ''; }; =head1 NAME @@ -131,15 +116,24 @@ in the same package, it is automatically used. Otherwise an error is returned. If any I configuration file exists, an SOA record is added to the domain_record table (see ). -If any machines are defined in the I configuration file, NS -records are added to the domain_record table (see L). +If any records are defined in the I configuration file, +appropriate 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). +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: -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. + [ -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 @@ -197,33 +191,19 @@ sub insert { return "couldn't insert SOA record for new domain: $error"; } - foreach my $nsmachine ( @nsmachines ) { - my $ns = new FS::domain_record { - 'svcnum' => $self->svcnum, - 'reczone' => '@', - 'recaf' => 'IN', - 'rectype' => 'NS', - 'recdata' => $nsmachine, - }; - my $error = $ns->insert; - if ( $error ) { - $dbh->rollback if $oldAutoCommit; - return "couldn't insert NS record for new domain: $error"; - } - } - - foreach my $mxmachine ( @mxmachines ) { - my $mx = new FS::domain_record { + foreach my $record ( @defaultrecords ) { + my($zone,$af,$type,$data) = split(/\s+/,$record,4); + my $domain_record = new FS::domain_record { 'svcnum' => $self->svcnum, - 'reczone' => '@', - 'recaf' => 'IN', - 'rectype' => 'MX', - 'recdata' => $mxmachine, + 'reczone' => $zone, + 'recaf' => $af, + 'rectype' => $type, + 'recdata' => $data, }; - my $error = $mx->insert; + my $error = $domain_record->insert; if ( $error ) { $dbh->rollback if $oldAutoCommit; - return "couldn't insert MX record for new domain: $error"; + return "couldn't insert record for new domain: $error"; } } @@ -231,6 +211,28 @@ 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, + ); + + my $queue = new FS::queue { + 'svcnum' => $self->svcnum, + 'job' => 'Net::SSH::ssh_cmd', + }; + $error = $queue->insert("root\@$qshellmachine", "[ -e $dir/.qmail-$qdomain-default ] || { touch $dir/.qmail-$qdomain-default; chown $uid:$gid $dir/.qmail-$qdomain-default; }" ); + + } + } + ''; #no error } @@ -241,6 +243,47 @@ 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 defined( $FS::Record::dbdef->table('svc_acct_sm') ) + && 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 } ); + + local $SIG{HUP} = 'IGNORE'; + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $error = $self->SUPER::delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + + foreach my $domain_record ( reverse $self->domain_record ) { + my $error = $domain_record->delete; + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return $error; + } + } +} + =item replace OLD_RECORD Replaces OLD_RECORD with this one in the database. If there is an error, @@ -292,9 +335,11 @@ sub check { my $x = $self->setfixed; return $x unless ref($x); - my $part_svc = $x; + #my $part_svc = $x; - my $error = $self->ut_numbern('catchall'); + my $error = $self->ut_numbern('svcnum') + || $self->ut_numbern('catchall') + ; return $error if $error; #hmm @@ -321,7 +366,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 ); } } } @@ -347,6 +392,26 @@ sub check { } +=item domain_record + +=cut + +sub domain_record { + my $self = shift; + + my %order = ( + SOA => 1, + NS => 2, + MX => 3, + CNAME => 4, + A => 5, + ); + + sort { $order{$a->rectype} <=> $order{$b->rectype} } + qsearch('domain_record', { svcnum => $self->svcnum } ); + +} + =item whois Returns the Net::Whois::Domain object (see L) for this domain, or @@ -377,115 +442,15 @@ Submits a registration email for this domain. =cut sub submit_internic { - my $self = shift; - - my $cust_pkg = qsearchs( 'cust_pkg', { 'pkgnum' => $self->pkgnum } ); - return unless $cust_pkg; - my $cust_main = qsearchs( 'cust_main', { 'custnum' => $cust_pkg->custnum } ); - return unless $cust_main; - - my %subs = ( - 'action' => $self->action, - 'purpose' => $self->purpose, - 'domain' => $self->domain, - 'company' => $cust_main->company - || $cust_main->getfield('first'). ' '. - $cust_main->getfield('last') - , - 'city' => $cust_main->city, - 'state' => $cust_main->state, - 'zip' => $cust_main->zip, - 'country' => $cust_main->country, - 'last' => $cust_main->getfield('last'), - 'first' => $cust_main->getfield('first'), - 'daytime' => $cust_main->daytime, - 'fax' => $cust_main->fax, - 'email' => $self->email, - 'tech_contact' => $tech_contact, - 'primary' => shift @nameservers, - 'primary_ip' => shift @nameserver_ips, - ); - - #yuck - my @xtemplate = @template; - my @body; - my $line; - OLOOP: while ( defined( $line = shift @xtemplate ) ) { - - if ( $line =~ /^###LOOP###$/ ) { - my(@buffer); - LOADBUF: while ( defined( $line = shift @xtemplate ) ) { - last LOADBUF if ( $line =~ /^###ENDLOOP###$/ ); - push @buffer, $line; - } - my %lubs = ( - 'address' => $cust_main->address2 - ? [ $cust_main->address1, $cust_main->address2 ] - : [ $cust_main->address1 ] - , - 'secondary' => [ @nameservers ], - 'secondary_ip' => [ @nameserver_ips ], - ); - LOOP: while (1) { - my @xbuffer = @buffer; - SUBLOOP: while ( defined( $line = shift @xbuffer ) ) { - if ( $line =~ /###(\w+)###/ ) { - #last LOOP unless my($lub)=shift@{$lubs{$1}}; - next OLOOP unless my $lub = shift @{$lubs{$1}}; - $line =~ s/###(\w+)###/$lub/e; - redo SUBLOOP; - } else { - push @body, $line; - } - } #SUBLOOP - } #LOOP - - } - - if ( $line =~ /###(\w+)###/ ) { - #$line =~ s/###(\w+)###/$subs{$1}/eg; - $line =~ s/###(\w+)###/$subs{$1}/e; - redo OLOOP; - } else { - push @body, $line; - } - - } #OLOOP - - my $subject; - if ( $self->action eq "M" ) { - $subject = "MODIFY DOMAIN ". $self->domain; - } elsif ( $self->action eq "N" ) { - $subject = "NEW DOMAIN ". $self->domain; - } else { - croak "submit_internic called with action ". $self->action; - } - - $ENV{SMTPHOSTS} = $smtpmachine; - $ENV{MAILADDRESS} = $from; - my $header = Mail::Header->new( [ - "From: $from", - "To: $to", - "Sender: $from", - "Reply-To: $from", - "Date: ". time2str("%a, %d %b %Y %X %z", time), - "Subject: $subject", - ] ); - - my($msg)=Mail::Internet->new( - 'Header' => $header, - 'Body' => \@body, - ); - - $msg->smtpsend or die "Can't send registration email"; #die? warn? - + #my $self = shift; + carp "submit_internic depreciated"; } =back =head1 VERSION -$Id: svc_domain.pm,v 1.15 2001-08-19 08:18:01 ivan Exp $ +$Id: svc_domain.pm,v 1.29 2002-05-22 18:44:01 ivan Exp $ =head1 BUGS