#!perl -w
# +-------------------------------------------------------------------------+
# | Джентльменский набор Web-разработчика |
# | Версия: Денвер-2 2006-04-25 |
# +-------------------------------------------------------------------------+
# | Copyright (C) 2001-2004 Дмитрий Котеров. |
# +-------------------------------------------------------------------------+
# | Данный файл является частью комплекса программ "Денвер-2". Вы не можете |
# | использовать его в коммерческих целях. Никакие другие ограничения не |
# | накладываются. Если вы хотите внести изменения в исходный код, авторы |
# | будут рады получить от вас комментарии и замечания. Приятной работы! |
# +-------------------------------------------------------------------------+
# | Домашняя страница: http://denwer.ru |
# | Контакты: http://forum.dklab.ru/denwer |
# +-------------------------------------------------------------------------+
package Starters::Apache;
BEGIN { unshift @INC, "../_lib"; }
use Tools;
use Installer;
use ParseHosts;
use VhostTemplate;
use StartManager;
# Seconds to wait apache stop while restart is active.
my $timeout = 10;
# Get common pathes.
my $basedir = $CNF{apache_dir};
my $exe = fsgrep { /\Q$CNF{apache_exe}\E/i } $basedir;
die " Could not find $CNF{apache_exe} inside $basedir\n" if !$exe;
my $httpd_conf = "$basedir/conf/httpd.conf";
my $vhosts_conf = "$basedir/conf/vhosts.conf";
my $httpd_pid = "$basedir/logs/httpd.pid";
# Additional PATH entries.
my @addPath = ();
# Autoconfigure PHP - detect basedir from LoadModule in httpd.conf file.
my $phpdir = undef;
my $httpdCont = readBinFile($httpd_conf) or die " Could not read $httpd_conf\n";
if ($httpdCont =~ /^[ \t]* LoadModule [ \t]+ php\S*_module [ \t]+ (?: "([^"\r\n]*)" | (\S+) )/mix) {
my $path = dirname($1 || $2);
if (my $p1 = dirgrep { /^php.ts\.dll$/i } $path) {
$phpdir = dirname($p1);
} elsif (my $p2 = dirgrep { /^php.ts\.dll$/i } "$path/..") {
$phpdir = dirname($p2);
}
}
if ($phpdir) {
# PHP configuration file location.
$ENV{PHPRC} = $phpdir;
# For OpenSSL module in PHP.
if (my $p = fsgrep { /^openssl.cnf$/i } $phpdir) {
$ENV{OPENSSL_CONF} = $p;
}
# Set PATH.
push @addPath, ($phpdir, fsgrep { /^extensions$/i || /^dlls$/i } $phpdir);
}
StartManager::action
$ARGV[0],
PATH => [
'\usr\local\ImageMagick',
@addPath,
],
start => sub {
###
### START.
###
processVHosts();
print "‡*ЇгбЄ*Ґ¬ Apache...\n";
if(checkApacheIfRunning()) {
print " Apache 㦥 §*ЇгйҐ*.\n";
} else {
chdir($basedir);
my $exe = $exe;
if(!-f $exe) {
die " ЌҐ г¤*Ґвбп **©вЁ $exe.\n";
} else {
# Clean global error.log to avoid stupid PHP "C:\mysql" binding.
unlink("$basedir/logs/error.log");
# Start apache.
system("start $exe -w");
print " ѓ®в®ў®.\n";
}
}
},
stop => sub {
###
### STOP.
###
print "‡*ўҐаи*Ґ¬ а*Ў®вг Apache...\n";
my $exe = $exe;
if(!-f $exe) {
print " ЌҐ г¤*Ґвбп **©вЁ $exe.\n";
} else {
my $was = checkApacheIfRunning();
# ’гЇ®© Apache2 *Ґ 㬥Ґв §*ўҐаи*вмбп Ї® -k shutdown!
# Џ®н⮬㠯аЁе®¤Ёвбп ЇаЁЎЁў*вм ўагз*го. ѓап§*®, Є®*Ґз*®.
# Љбв*вЁ, Parent ID г Їа®жҐбб* *Ґ«м§п Ї®«гзЁвм ў Windows NT Workststion.
my $ps = getPs(1);
if ($ps) {
foreach (@$ps) {
next if $_->{exe} !~ /apache\.exe$/is;
kill 9, $_->{pid};
}
} else {
print " ЌҐ г¤*Ґвбп **©вЁ гвЁ«Ёвг ps.exe.\n";
}
# system("\"$exe\" -k shutdown");
if($was) {
unlink($httpd_pid);
print " ѓ®в®ў®.\n";
} else {
print " Apache *Ґ §*ЇгйҐ*.\n";
}
}
},
_middle => sub {
my $tm = time();
if(checkApacheIfRunning()) {
print "Ћ¦Ё¤*Ґ¬ §*ўҐаиҐ*Ёп Apache (¬*ЄбЁ¬г¬ $timeout ᥪг*¤) ";
while(time() - $tm < $timeout) {
print ". ";
if(!checkApacheIfRunning()) {
print "\n";
return;
}
sleep(1);
}
print "\n";
print " ЌҐ г¤*Ґвбп ¤®¦¤*вмбп §*ўҐаиҐ*Ёп!\n";
}
},
;
sub processVHosts {
my $VHOSTS = $vhosts_conf;
my $HTTPD = $httpd_conf;
print "‘®§¤*Ґ¬ Ў«®ЄЁ ўЁавг*«м*ле е®бв®ў...\n";
if(!-e $HTTPD) {
die " ЌҐ г¤*Ґвбп **©вЁ $HTTPD\n";
}
# Add comments.
my $vhosts = '';
$vhosts .= clean qq{
#
# ВНИМАНИЕ!
#
# Данный файл был сгенерирован автоматически. Любые изменения, внесенные в
# него, потеряются после перезапуска комплекса. Если вы хотите изменить
# параметры какого-то отдельного хоста, вам необходимо перенести
# соответствующий блок <VirtualHost> в httpd.conf (там написано, куда именно).
#
# Пожалуйста, не изменяйте этот файл.
#
};
# Read Vhost template
my $num = 1;
foreach my $host (VhostTemplate::getAllVHosts($HTTPD)) {
# use Data::Dumper; print Dumper($host);
$vhosts .= "\n\n# Host ".$host->{path}." ($num): \n";
my $s = $host->{vhost};
# Delete comments.
$s=~s/#.*//mg if $num!=1;
$s=~s/^[ \t]*[\r\n]+//mgx; # delete empty lines
# ‚бв*ў«пҐ¬ ЎгЄўг ¤ЁбЄ* - Їа®Є«пвлҐ а*§а*Ў®взЁЄЁ PHP ЎҐ§ нв®Ј® *Ґ ¬®Јгв *ЁЄ*Є!
$s=~s{^(\s* DocumentRoot \s+ "?)(/)}{$1$CNF{subst_drive}$2}mgxi;
$vhosts .= $s;
} continue {
$num++;
}
# Remove duplicate Listen directives.
my %dup = ();
$vhosts =~ s{^\s* Listen \s+ "? ([^\s"]+) "?}{ ($dup{lc $1}++)? '#'.$& : $& }megx;
# Remove duplicate NameVirtualHost.
%dup = ();
$vhosts =~ s{^\s* NameVirtualHost \s+ "? ([^\s"]+) "?}{ ($dup{lc $1}++)? '#'.$& : $& }megx;
# Open output file.
if(!open(local *F, ">$VHOSTS")) {
out qq{
‚Ќ€ЊЂЌ€…!
ЌҐ г¤*Ґвбп ®вЄалвм д*©« $VHOSTS ** §*ЇЁбм.
Џа®¤®«¦Ґ*ЁҐ а*Ў®вл *Ґў®§¬®¦*®.
};
waitEnter();
die "\n";
}
print F $vhosts;
close F;
print " „®Ў*ў«Ґ*® е®бв®ў: ".($num-1)."\n";
}
sub checkApacheIfRunning {
my ($exe) = $CNF{apache_exe} =~ /^(\S+)/sg;
my $name = $basedir . '\\' . $exe;
return !open(local *F, ">>$name");
}
return 1 if caller;