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__