Hi All,

   I've been developing a little mod_perl Apache::Registery script that builds 
VirtualHosts and NamedVirtualhost's based on pre-generated text files.  The code works 
wonderfully... when it actually works.  For some reason I usually need to start Apache 
4-5 times before it actually "sticks" and starts.  There are no error messages, no 
cores/segfaults, just a usualy httpd started.   I've read about using TieHash in the 
O'Reilly book, but I'm hazy on implementing it, so I haven't.  My gut feeling is that 
that is the problem.  If someone would look at the code and tell me wtf is going 
wrong...  BTW: this is my first Apache::Registry proggie. 
   What it does, is read in a text file (.domains) that's in the following format:  
<ip>:<domain name>:<port>:<quota>
And for subsequent namevirtualhosts <domain name>:<quota>

One other weirdness.. when I startup Apache, I get a bunch of "unreferenced and 
undefined" warnings.  Those are evident in the ServerConfig.pm below.

IF this is a TiexHash issue, could someone show me a good example of using it with the 
following code? 

Thanks!
Alex

Brace yourselves (from httpd.conf):
-----
<Perl>
#!perl

use Apache::PerlSections();

my $clientdir = "/home/clients";
my $sslclientdir = "/home/clients-ssl";
my $logdir = "/data/logs";
my $ssllogdir = "/data/logs-ssl";
my $domainfile = "$clientdir" . "/" . ".domains";


        open DOMAINS, "$domainfile" || die "Cannot open $domainfile!";

my @maindoms;

        my $line;
        while($line=<DOMAINS>){
        chomp($line);
        if($line){ push @maindoms,$line; }
        }

        close DOMAINS;

my $locuser; my $crap;
my $ip; my $domain; my $port;
        foreach my $toplvl(@maindoms){
                ($ip,$domain,$port,$crap) = split(":",$toplvl,4);
                ($locuser,$crap) = split(/\./,$domain,2);
print STDERR "foreach: $ip:$domain:$port with user+group: $locuser [$crap]\n";
                if($port eq "80"){
print STDERR "foreach: port = 80\n";
                        unless (-d "$logdir/$domain"){
                                mkdir "$logdir/$domain", 0755;
                                print STDERR "foreach: mkdir: $logdir/$domain\n";
                        }
                        unless (-d "$clientdir/$domain"){
                         my $line="cp -Rf /home/defaults/ $clientdir/$domain/";
                                mkdir "$clientdir/$domain", 0755;
                                require File::NCopy;
                        File::NCopy::copy("/home/defaults/*","$clientdir/$domain");
                        File::NCopy::copy("/home/defaults/.*","$clientdir/$domain");
print STDERR "foreach: cp: $clientdir/$domain\n";
                        }
#                       chown -R "$uid:$gid" "$clientdir/$domain";
                } elsif($port eq "443"){
print STDERR "foreach: port = 443\n";
                        unless (-d "$ssllogdir/$domain"){
                                mkdir "$ssllogdir/$domain", 0755;
                                print STDERR "foreach: mkdir: $ssllogdir/$domain\n";
                        }
                        unless (-d "$sslclientdir/$domain"){
                        my $line="cp -Rf /home/defaults/ $sslclientdir/$domain/";
                        #system($line);
                        mkdir "$sslclientdir/$domain", 0755;
                        require File::NCopy;
                        File::NCopy::copy("/home/defaults/*","$sslclientdir/$domain");

print STDERR "foreach: cp: $sslclientdir/$domain\n";
#                       chown -R "$uid:$gid" "$clientdir/$domain";
                        }
                } else {
                        print STDERR "No port specified in domains file!\n";
                }

print STDERR "Building Virtual Host for $domain at $ip\n";
        $NameVirtualHost[++$#NameVirtualHost] = $ip;
        $VirtualHost{$ip}[++$#VirtualHost] = {

                ServerName => "$domain",
                ServerAdmin => "webmaster\@$domain",
                ServerAlias => "www.$domain",
                DocumentRoot => "$clientdir/$domain",
                CustomLog => "$logdir/$domain/access_log combined",
                ErrorLog => "$clientdir/$domain/error_log",
               Directory => {
                       "$clientdir/$domain" => {
                               Options => 'All ExecCGI',
                               AllowOverride => 'All',
                       },
                       "$clientdir/$domain/cgi-bin" => {
                               AllowOverride => 'None',
                               Options => 'ExecCGI',
                               SetHandler => 'cgi-script',
                       },
               },
                ScriptAlias => "/cgi-bin/ $clientdir/$domain/cgi-bin/",
        };  #End VirtualHost

print STDERR "VirtualHost $ip\n";

        if(-f "$clientdir/$domain/.domains"){
                open PIGGY, "$clientdir/$domain/.domains" || die "Weird piggy error.";
                my $pline; my $lcrap;
                my @piggys;
                $crap = "";
                while($lcrap=<PIGGY>){
                        ($pline,$lcrap) = split(":",$lcrap,2);
                        chomp($pline);
                        push @piggys,$pline;
                }
                        close PIGGY;

                foreach $pline (@piggys){
print STDERR "Piggy: $pline @ $ip master: $domain\n";
                unless (-d "$clientdir/$domain/$pline"){
print STDERR "Piggy: mkdir: $clientdir/$domain/$pline\n";
                        mkdir "$clientdir/$domain/$pline", 0755;
                }

                unless (-d "$logdir/$domain/$pline"){
print STDERR "Piggy: mkdir: $logdir/$domain/$pline\n";
                        mkdir "$logdir/$domain/$pline", 0755;
                }
print STDERR "Piggy: Making virt $domain\n";
                        $VirtualHost{$ip}[++$#VirtualHost] = {

                                ServerName => "$pline",
                                ServerAdmin => "webmaster\@$pline",
                                ServerAlias => "www.$pline $pline",
                                ServerPath => "/$pline",
                                DocumentRoot => "$clientdir/$domain/$pline",
                                CustomLog => "$logdir/$domain/$pline/access_log 
combined",
                                ErrorLog => "$clientdir/$domain/$pline/error_log",
                               Directory => {
                                       "$clientdir/$domain/$pline" => {
                                               Options => 'All ExecCGI',
                                               AllowOverride => 'All',
                                       },
                               "$clientdir/$domain/$pline/cgi-bin" => {
                                                AllowOverride => 'None',
                                       Options => 'ExecCGI',
                                       SetHandler => 'cgi-script',
                               },
                               },
                               ScriptAlias => "/cgi-bin/ 
$clientdir/$domain/$pline/cgi-bin/",
                        };  #End VirtualHost

print STDERR "Piggy: Made virt for $pline\n";

print STDERR "Piggy: end foreach\n";
                } #End piggy foreach


print STDERR "Piggy: end.\n";
        } #End Piggy



print STDERR "foreach: end.\n";
        }  #End of foreach loop for main domains

close FTP;
print STDERR "Proftpd: closed.\n";

Apache::PerlSections->store("/opt/apache_1.3.12/conf/ServerConfig.pm");
#print STDERR Apache::PerlSections->dump();

print STDERR "Config Saved.\n";
__END__
</Perl>
—---
ServerConfig.pm contains:

package Apache::ReadConfig;
#scalars:

#arrays:

@VirtualHost = (
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef,
  undef
);

@NameVirtualHost = (
  '209.11.10.53'
);

#hashes:

%VirtualHost = (
  '209.11.10.53' => [
    {
      'ServerAdmin' => '[EMAIL PROTECTED]',
      'ServerName' => 'surfvariety.com',
      'ServerAlias' => 'www.surfvariety.com',
      'DocumentRoot' => '/home/clients/surfvariety.com',
      'ErrorLog' => '/home/clients/surfvariety.com/error_log',
      'CustomLog' => '/data/logs/surfvariety.com/access_log combined',
      'ScriptAlias' => '/cgi-bin/ /home/clients/surfvariety.com/cgi-bin/'
    },
    {
      'ServerAdmin' => '[EMAIL PROTECTED]',
      'ServerAlias' => 'www.dlfnyc.com dlfnyc.com',
      'DocumentRoot' => '/home/clients/surfvariety.com/dlfnyc.com',
      'ServerPath' => '/dlfnyc.com',
      'ServerName' => 'dlfnyc.com',
      'ErrorLog' => '/home/clients/surfvariety.com/dlfnyc.com/error_log',
      'CustomLog' => '/data/logs/surfvariety.com/dlfnyc.com/access_log combined',
      'ScriptAlias' => '/cgi-bin/ /home/clients/surfvariety.com/dlfnyc.com/cgi-bin/'
    },
    {
      'ServerAdmin' => '[EMAIL PROTECTED]',
      'ServerAlias' => 'www.toxicpop.com toxicpop.com',
      'DocumentRoot' => '/home/clients/surfvariety.com/toxicpop.com',
      'ServerPath' => '/toxicpop.com',
      'ServerName' => 'toxicpop.com',
      'ErrorLog' => '/home/clients/surfvariety.com/toxicpop.com/error_log',
      'CustomLog' => '/data/logs/surfvariety.com/toxicpop.com/access_log combined',
      'ScriptAlias' => '/cgi-bin/ /home/clients/surfvariety.com/toxicpop.com/cgi-bin/'
    }
 ]
);

1;
__END__

Reply via email to