[freeside-devel] Possible Changes to svc_www.cgi and svc_www.pm

Stephen Bechard steve at destek.net
Sun Jun 23 07:36:04 PDT 2002


> > However, this updates the recnum and usersvc in the svc_www table, but
> > doesn't
> > put anything back in the queue to make the necessary changes on the
Remote
> > Server.
> > Is this not implemented yet?
>
> svc_www hasn't been moved over to the job queue yet; it's still trying to
> run ssh processes directly.
> http://pouncequick.420.am/rt/Ticket/Display.html?id=330

Seeing I don't know much about the job queue yet...
I have altered the svc_www.pm so that it will run the necessary ssh
processes
for delete and edit (replace($old)) to the remote $apachemachine and take
care
of the $apacheroot stuff.

I have also updated the man page part of it to reflect the changes. :)
I have tested it and all seems in order. Please let me know what do you
think?

--- /tarballs/freeside-1.4.0pre14/FS/FS/svc_www.pm    Mon Feb 11 14:38:58
2002
+++ /usr/local/lib/perl5/site_perl/5.005/FS/svc_www.pm  Sun Jun 23 10:29:48
2002
@@ -184,7 +184,21 @@

 =item delete

-Delete this record from the database.
+Delete this record from the database. If there is an error, returns the
error,
+otherwise returns false.
+
+If the configuration values (see L<FS::Conf>) I<apachemachine>, and
+I<apacheroot> exist, the command:
+
+  rm -Rf $apacheroot/$zone;
+  rm $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

@@ -192,9 +206,51 @@
   my $self = shift;
   my $error;

+  local $SIG{HUP} = 'IGNORE';
+  local $SIG{INT} = 'IGNORE';
+  local $SIG{QUIT} = 'IGNORE';
+  local $SIG{TERM} = 'IGNORE';
+  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;
+
+  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;
+  }
+
+  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",
+        "rm -Rf $apacheroot/$zone; ".
+        "rm $homedir/$zone"
+    );
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   '';
 }

@@ -203,15 +259,132 @@
 Replaces the OLD_RECORD with this one in the database.  If there is an
error,
 returns the error, otherwise returns false.

+If the configuration values (see L<FS::Conf>) I<apachemachine>, and
+I<apacheroot> exist, the command:
+
+    if username and zone change:
+
+      rm $old_homedir/$old_zone
+      mv $apacheroot/$old_zone $apacheroot/$new_zone
+      chown -R $new_username $apacheroot/$new_zone
+      ln -s $apacheroot/$new_zone $new_homedir/$new_zone
+
+    if only username change:
+
+      rm $old_homedir/$old_zone
+      chown -R $new_username $apacheroot/$new_zone
+      ln -s $apacheroot/$new_zone $new_homedir/$new_zone
+
+    if only zone change:
+
+      rm $old_homedir/$old_zone
+      mv $apacheroot/$old_zone $apacheroot/$new_zone
+      ln -s $apacheroot/$new_zone $new_homedir/$new_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 replace {
   my ( $new, $old ) = ( shift, shift );
   my $error;

+  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;
+
   $error = $new->SUPER::replace($old);
-  return $error if $error;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error if $error;
+  }

+  # Gathering the old Data
+  my $old_domain_record = qsearchs('domain_record', { 'recnum' =>
$old->recnum } );    # or die ?
+  my $old_zone = $old_domain_record->reczone;
+    # or die ?
+  unless ( $old_zone =~ /\.$/ ) {
+    my $old_dom_svcnum = $old_domain_record->svcnum;
+    my $old_svc_domain = qsearchs('svc_domain', { 'svcnum' =>
$old_dom_svcnum } );
+      # or die ?
+    $old_zone .= '.'. $old_svc_domain->domain;
+  }
+  my $old_svc_acct = qsearchs('svc_acct', { 'svcnum' => $old->usersvc } );
+    # or die ?
+  my $old_username = $old_svc_acct->username;
+    # or die ?
+  my $old_homedir = $old_svc_acct->dir;
+    # or die ?
+
+  # Gathering the new Data
+  my $new_domain_record = qsearchs('domain_record', { 'recnum' =>
$new->recnum } );    # or die ?
+  my $new_zone = $new_domain_record->reczone;
+    # or die ?
+  unless ( $new_zone =~ /\.$/ ) {
+    my $new_dom_svcnum = $new_domain_record->svcnum;
+    my $new_svc_domain = qsearchs('svc_domain', { 'svcnum' =>
$new_dom_svcnum } );
+      # or die ?
+    $new_zone .= '.'. $new_svc_domain->domain;
+  }
+  my $new_svc_acct = qsearchs('svc_acct', { 'svcnum' => $new->usersvc } );
+    # or die ?
+  my $new_username = $new_svc_acct->username;
+    # or die ?
+  my $new_homedir = $new_svc_acct->dir;
+    # or die ?
+
+  if ( $apachemachine
+       && $apacheroot
+       && $old_zone
+       && $old_username
+       && $old_homedir
+       && $new_zone
+       && $new_username
+       && $new_homedir
+       && ! $nossh_hack
+  ) {
+    # Now lets check which commands are necessary
+    if ( ($old_homedir ne $new_homedir)
+         && ($old_username ne $new_username)
+         && ($old_zone ne $new_zone)
+    ) {
+       ssh("root\@$apachemachine",
+           "rm $old_homedir/$old_zone;".
+           "mv $apacheroot/$old_zone $apacheroot/$new_zone; ".
+           "chown -R $new_username $apacheroot/$new_zone; ".
+           "ln -s $apacheroot/$new_zone $new_homedir/$new_zone"
+       );
+    } elsif ( ($old_homedir ne $new_homedir)
+         && ($old_username ne $new_username)
+    ) {
+       ssh("root\@$apachemachine",
+           "rm $old_homedir/$old_zone;".
+           "chown -R $new_username $apacheroot/$new_zone; ".
+           "ln -s $apacheroot/$new_zone $new_homedir/$new_zone"
+       );
+    } elsif ( ($old_zone ne $new_zone)
+    ) {
+       ssh("root\@$apachemachine",
+           "rm $old_homedir/$old_zone;".
+           "mv $apacheroot/$old_zone $apacheroot/$new_zone; ".
+           "ln -s $apacheroot/$new_zone $new_homedir/$new_zone"
+       );
+    }
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   '';
 }


Once I get more aquainted with the job queue I will try to convert it
into that syntax, but this works for me in the interum.

Enjoy,
Steve




More information about the freeside-devel mailing list