package FS::svc_www;
use strict;
-use vars qw(@ISA $conf $apacheroot $apachemachine $nossh_hack );
+use vars qw(@ISA $conf $apacheip);
#use FS::Record qw( qsearch qsearchs );
-use FS::Record qw( qsearchs );
+use FS::Record qw( qsearchs dbh );
use FS::svc_Common;
use FS::cust_svc;
use FS::domain_record;
use FS::svc_acct;
-use FS::SSH qw(ssh);
+use FS::svc_domain;
@ISA = qw( FS::svc_Common );
#ask FS::UID to run this stuff for us later
$FS::UID::callback{'FS::svc_www'} = sub {
$conf = new FS::Conf;
- $apacheroot = $conf->config('apacheroot');
- $apachemachine = $conf->config('apachemachine');
+ $apacheip = $conf->config('apacheip');
};
=head1 NAME
=item svcnum - primary key
-=item recnum - DNS `A' record corresponding to this web virtual host. (see L<FS::domain_record))
+=item recnum - DNS `A' record corresponding to this web virtual host. (see L<FS::domain_record>)
=item usersvc - account (see L<FS::svc_acct>) corresponding to this web virtual host.
The additional fields pkgnum and svcpart (see L<FS::cust_svc>) should be
defined. An FS::cust_svc record will be created and inserted.
-If the configuration values (see L<FS::Conf>) I<apachemachine>, and
-I<apacheroot> exist, the command:
-
- mkdir $apacheroot/$zone;
- chown $username $apacheroot/$zone;
- ln -s $apacheroot/$zone $homedir/$zone
-
-I<$zone> is the DNS A record pointed to by I<recnum>
-I<$username> is the username pointed to by I<usersvc>
-I<$homedir> is that user's home directory
-
-is executed on I<apachemachine> via ssh. This behaviour can be surpressed by
-setting $FS::svc_www::nossh_hack true.
-
=cut
sub insert {
my $self = shift;
- my $error;
- $error = $self->SUPER::insert;
+ my $error = $self->check;
return $error if $error;
- my $domain_record = qsearchs('domain_record', { 'recnum' => $self->recnum } ); # or die ?
- my $zone = $domain_record->reczone;
- # or die ?
- unless ( $zone =~ /\.$/ ) {
- my $dom_svcnum = $domain_record->svcnum;
- my $svc_domain = qsearchs('svc_domain', { 'svcnum' => $dom_svcnum } );
- # or die ?
- $zone .= $svc_domain->domain;
+ 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;
+
+ #if ( $self->recnum =~ /^([\w\-]+|\@)\.(([\w\.\-]+\.)+\w+)$/ ) {
+ if ( $self->recnum =~ /^([\w\-]+|\@)\.(\d+)$/ ) {
+ my( $reczone, $domain_svcnum ) = ( $1, $2 );
+ unless ( $apacheip ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "Configuration option apacheip not set; can't autocreate A record";
+ #"for $reczone". $svc_domain->domain;
+ }
+ my $domain_record = new FS::domain_record {
+ 'svcnum' => $domain_svcnum,
+ 'reczone' => $reczone,
+ 'recaf' => 'IN',
+ 'rectype' => 'A',
+ 'recdata' => $apacheip,
+ };
+ $error = $domain_record->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ $self->recnum($domain_record->recnum);
}
- my $svc_acct = qsearchs('svc_acct', { 'svcnum' => $self->usersvc } );
- # or die ?
- my $username = $svc_acct->username;
- # or die ?
- my $homedir = $svc_acct->dir;
- # or die ?
-
- if ( $apachemachine
- && $apacheroot
- && $zone
- && $username
- && $homedir
- && ! $nossh_hack
- ) {
- ssh("root\@$apachemachine",
- "mkdir $apacheroot/$zone; ".
- "chown $username $apacheroot/$zone; ".
- "ln -s $apacheroot/$zone $homedir/$zone"
- );
+ $error = $self->SUPER::insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
}
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
}
=item check
-Checks all fields to make sure this is a valid example. If there is
+Checks all fields to make sure this is a valid web virtual host. If there is
an error, returns the error, otherwise returns false. Called by the insert
and repalce methods.
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_number('recnum')
+# || $self->ut_number('recnum')
|| $self->ut_number('usersvc')
;
return $error if $error;
- return "Unknown recnum: ". $self->recnum
- unless qsearchs('domain_record', { 'recnum' => $self->recnum } );
+ if ( $self->recnum =~ /^(\d+)$/ ) {
+
+ $self->recnum($1);
+ return "Unknown recnum: ". $self->recnum
+ unless qsearchs('domain_record', { 'recnum' => $self->recnum } );
+
+ } elsif ( $self->recnum =~ /^([\w\-]+|\@)\.(([\w\.\-]+\.)+\w+)$/ ) {
+
+ my( $reczone, $domain ) = ( $1, $2 );
+
+ my $svc_domain = qsearchs( 'svc_domain', { 'domain' => $domain } )
+ or return "unknown domain $domain (recnum $1.$2)";
+
+ my $domain_record = qsearchs( 'domain_record', {
+ 'reczone' => $reczone,
+ 'svcnum' => $svc_domain->svcnum,
+ });
+
+ if ( $domain_record ) {
+ $self->recnum($domain_record->recnum);
+ } else {
+ #insert will create it
+ #$self->recnum("$reczone.$domain");
+ $self->recnum("$reczone.". $svc_domain->svcnum);
+ }
+
+ } else {
+ return "Illegal recnum: ". $self->recnum;
+ }
return "Unknown usersvc (svc_acct.svcnum): ". $self->usersvc
unless qsearchs('svc_acct', { 'svcnum' => $self->usersvc } );
- ''; #no error
+ $self->SUPER::check;
+
}
-=back
+=item domain_record
-=head1 VERSION
+Returns the FS::domain_record record for this web virtual host's zone (see
+L<FS::domain_record>).
-$Id: svc_www.pm,v 1.2 2000-03-01 08:13:59 ivan Exp $
+=cut
-=head1 BUGS
+sub domain_record {
+ my $self = shift;
+ qsearchs('domain_record', { 'recnum' => $self->recnum } );
+}
-=head1 SEE ALSO
+=item svc_acct
-L<FS::svc_Common>, L<FS::Record>, L<FS::domain_record>, L<FS::cust_svc>,
-L<FS::part_svc>, L<FS::cust_pkg>, schema.html from the base documentation.
+Returns the FS::svc_acct record for this web virtual host's owner (see
+L<FS::svc_acct>).
+
+=cut
-=head1 HISTORY
+sub svc_acct {
+ my $self = shift;
+ qsearchs('svc_acct', { 'svcnum' => $self->usersvc } );
+}
+
+=back
-$Log: svc_www.pm,v $
-Revision 1.2 2000-03-01 08:13:59 ivan
-compilation bugfixes
+=head1 BUGS
-Revision 1.1 2000/02/03 05:16:52 ivan
-beginning of DNS and Apache support
+=head1 SEE ALSO
+L<FS::svc_Common>, L<FS::Record>, L<FS::domain_record>, L<FS::cust_svc>,
+L<FS::part_svc>, L<FS::cust_pkg>, schema.html from the base documentation.
=cut