Hallo Forum, ich bin neu hier und habe eine Frage an Euch. Wir haben ein Perl-Script (unter Debian 4.0 und Apache 2.2.3 und perl, v5.8.8 ) wo wir über das Webinterface virtuelle Hosts (anlegen, löschen und deaktivieren) verändern können. Das läuft auch unter dem o.g. System einwandfrei. Nun wollen wir das Script unter: Debian 6.0 - Apache/2.2.16 perl, v5.10.1 zum laufen bringen, aber es funktioniert nicht, d.h. virtuelle Hosts werden zwar angelegt und können gelöscht werden, aber aktiviert und deaktiviert funktioniert leider nicht. Ich weis leider nicht weiter....
hier das Script welches unter folgenden Rechten läuft: -rwsr-xr-T 1 root htadmin 9986 11. Feb 14:32 vh10.pl
#!/usr/bin/perl -wU
use strict;
use CGI;
use CGI::Carp qw(fatalsToBrowser);
use File::Find;
use File::Path;
$ENV{"PATH"} = "/bin:/usr/bin:/usr/sbin:/sbin";
# pfad- und prüfvariablen
my $APACHE_CONFIG = "/etc/apache2";
my $APACHE_VIRTUAL_HOSTS_ENABLED = "/etc/apache2/sites-enabled/";
my $APACHE_VIRTUAL_HOSTS_AVAILABLE = "/etc/apache2/sites-available/";
my $WEBROOT = "/var/www/";
my $APACHE_LOG = "/var/log/apache2/";
my $APACHE_LOG_VACCESS = "/var/log/apache2/vaccess.log";
my $fail = "";
my $vh_temp = "";
# kopf der html-ausgabe
print "Content-type: text/html\n\n";
print <<END_OF_HTML1;
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head><title>sdvweb - Verwaltung Virtual Hosts</title></head>
<body bgcolor="#ffffe0">
<div align="center">
<h2>sdvweb</h2>
<hr>
END_OF_HTML1
# prozedur zur anzeige der virtuellen hosts und des aktuellen status
sub list() {
print <<END_OF_HTML2;
<table border=1>
<form action="#" method="post">
<tr><td><strong>Virtual-Host:</strong></td></tr>
<tr><td><input type="text" name="vh">.xxx-yyy.de</td>
<td><input type="submit" name="action" value="create"></td>
<td><input type="submit" name="action" value="list"></td></tr>
</form>
<br>
END_OF_HTML2
# einlesen der existierenden hosts
opendir(DIR, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
my @vh_hosts_temp = readdir(DIR);
closedir(DIR);
my @vh_hosts = sort(@vh_hosts_temp);
# prüfen des status der existierenden hosts (aktiviert oder deaktiviert) und anzeige des entsprechenden auswahlbutton
foreach (@vh_hosts) {
# die elemente "." und ".." vom verzeichnis einlesen werden ignoriert
if ($_ !~ /^\./ ) {
# variablenzuweisung für suchprozedur "check"
$vh_temp = $_;
# prozeduraufruf "check" zum durchsuchen des angegebenen pfades (/etc/apache2/sites-enabled) nach dateiname $vh_temp
find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
# anzeige des button deactivate wenn hoststatus = aktiviert
if ($fail == 1) {
print <<END_OF_HTML3;
<form action="#" method="post">
<tr><td>$_</td>
<td><input type="submit" name="action" value="deactivate"></td>
<td><input type="submit" name="action" value="destroy"></td>
<input type="hidden" name="vh_temp" value="$_">
<input type="hidden" name="vh_name_actdeactdest" value="$_"></tr>
</form>
END_OF_HTML3
}
# anzeige des button activate wenn hoststatus = deaktiviert
else {
print <<END_OF_HTML4;
<form action="#" method="post">
<tr bgcolor="red"><td>$_</td>
<td><input type="submit" name="action" value="activate"></td>
<td><input type="submit" name="action" value="destroy"></td>
<input type="hidden" name="vh_temp" value="$_">
<input type="hidden" name="vh_name_actdeactdest" value="$_"></tr>
</form>
END_OF_HTML4
}
}
}
print "</table></form>";
}
my $cgi = new CGI;
#print "action#".$cgi->param('action')."#<br>";
#print "vh_name_x#".$cgi->param('vh_name_actdeactdest')."#<br>";
#print "vh#".$cgi->param('vh')."#<br>";
my $action = $cgi->param('action');
# notwendige variablen zum erstellen eines host (prozedur create)
my $vh_name_short = $cgi->param('vh') || "";
my $vh_name_create = $vh_name_short.".xxx-yyy.de";
my $vh_folder_create = $WEBROOT.$vh_name_create;
my $vh_config_create = $APACHE_VIRTUAL_HOSTS_AVAILABLE.$vh_name_create;
my $vh_log = $APACHE_LOG.$vh_name_create.".log";
# notwendige variablen zum aktivieren/deaktivieren/löschen eines host (prozedur activate, deactivate, destroy)
my $vh_name_actdeactdest = $cgi->param('vh_name_actdeactdest');
my $vh_folder_actdeactdest = $WEBROOT.$vh_name_actdeactdest;
my $vh_config_actdeactdest = $APACHE_VIRTUAL_HOSTS_AVAILABLE.$vh_name_actdeactdest;
# prozedur zur erstellung eines neuen host
sub create() {
$vh_temp = $vh_name_create;
find (\&check, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
# wenn angegebener name des host noch nicht existiert, nicht leer ist und nur aus buchstaben, ziffern, unter- und bindestrich besteht wird dieser angelegt
if ($fail == 0 && $vh_name_short ne "" && $vh_name_short !~ /[^a-zA-Z0-9_-]/) {
# erstellung verzeichnisse
mkdir ($vh_folder_create,0775);
mkdir ($vh_folder_create."_cgi-bin",0775);
# mit schreibrechten für die gruppe, separat weil es mit mkdir nicht funktioniert
chmod (0775,$vh_folder_create);
chmod (0775,$vh_folder_create."_cgi-bin");
# verzeichnisse werden dem nutzer www-data und der gruppe htadmin zugeordnet
chown (33,1002,$vh_folder_create);
chown (33,1002,$vh_folder_create."_cgi-bin");
# erstellen der konfigdatei für neuen host in /etc/apache2/sites-available
open (VHCONF, ">$vh_config_create");
# die konfigdatei gehört nutzer root und gruppe root
chown (0,0,$vh_config_create);
# und wird mit inhalt gefüllt
print VHCONF <<END_OF_VH;
<VirtualHost *:80>
ServerName $vh_name_create
ServerAlias $vh_name_short
ServerAdmin webadmin\@xxx-yyy.de
DocumentRoot $vh_folder_create
ScriptAlias /cgi-bin/ $vh_folder_create\_cgi-bin/
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
CustomLog $vh_log vcombined
CustomLog $APACHE_LOG_VACCESS vcombined
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile $APACHE_CONFIG\/ssl/apache.crt
SSLCertificateKeyFile $APACHE_CONFIG\/ssl/apache.key
ServerName $vh_name_create
ServerAlias $vh_name_short
ServerAdmin webadmin\@xxx-yyy.de
DocumentRoot $vh_folder_create
ScriptAlias /cgi-bin/ $vh_folder_create\_cgi-bin/
<Directory />
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
CustomLog $vh_log vcombined
CustomLog $APACHE_LOG_VACCESS vcombined
</VirtualHost>
END_OF_VH
# neuer host wird aktiviert
my $ensite = qx (/usr/sbin/a2ensite $vh_name_create);
print "Ensite: ".$ensite;
# wenn die beiden zuvor angelegten verzeichnisse existieren und die ausgabe des aktivierungsbefehls "installed" enthält wurde der host erfolgreich angelegt und aktiviert
if (-e $vh_folder_create && -e $vh_folder_create."_cgi-bin" && $ensite =~ /Enabling/) {
print "Der Virtual Host <strong>$vh_name_create</strong> wurde erfolgreich angelegt.";
}
else {
print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_create</strong> konnte nicht angelegt werden.</font>";
}
}
else {
print "<font color='red'>Fehler: Der Virtual Host <strong>$vh_name_create</strong> existiert bereits oder der Name ist unzulässig.</font>";
}
# prozeduraufruf "list" am ende jeder prozedur zur anzeige aller hosts
list();
}
# prozedur zum aktivieren eines existierenden host
sub activate() {
$vh_temp = $vh_name_actdeactdest;
print "Vor schleife:". $vh_name_actdeactdest;
find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
# nur wenn datei $vh_temp in /etc/apache2/sites-enabled nicht existiert
print "Ergebnis:". $fail;
if ($fail == 0) {
print "Vor enable:". $vh_name_actdeactdest;
my $ensite = qx (/usr/sbin/a2ensite $vh_name_actdeactdest);
print "Variable ensite:". $ensite;
if ($ensite =~ /Enabling/) {
print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich aktiviert.";
qx ("/etc/init.d/apache2 reload");
}
else {
print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht aktiviert werden.</font>";
}
}
else {
print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
}
list();
}
# prozedur zum deaktivieren eines existierenden host
sub deactivate() {
$vh_temp = $vh_name_actdeactdest;
find (\&check, $APACHE_VIRTUAL_HOSTS_ENABLED);
# nur wenn datei $vh_temp in /etc/apache2/sites-enabled existiert
if ($fail == 1) {
my $dissite = qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
if ($dissite =~ /disabled/) {
print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich deaktiviert.";
qx ("/etc/init.d/apache2 reload");
}
else {
print "<font color='red'>Fehler: Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht deaktiviert werden.</font>";
}
}
else {
print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
}
list();
}
# prozedur zum löschen eines existierenden host
sub destroy() {
$vh_temp = $vh_name_actdeactdest;
find (\&check, $APACHE_VIRTUAL_HOSTS_AVAILABLE);
# nur wenn datei $vh_temp in /etc/apache2/sites-available existiert
if ($fail == 1) {
# deaktivieren des host
my $dissite = qx (/usr/sbin/a2dissite $vh_name_actdeactdest);
# löschen der konfigdatei und webverzeichnisse
unlink ($vh_config_actdeactdest);
rmtree ($vh_folder_actdeactdest);
rmtree ($vh_folder_actdeactdest."_cgi-bin");
# wenn konfigdatei und webverzeichnisse nicht mehr existieren host gelöscht
if (! -e $vh_folder_actdeactdest && ! -e $vh_folder_actdeactdest."_cgi-bin" && ! -e $vh_config_actdeactdest) {
print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> wurde erfolgreich gelöscht.";
}
else {
print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht gelöscht werden.";
}
qx (/etc/init.d/apache2 reload);
}
else {
print "<font color='red'>Der Virtual Host <strong>$vh_name_actdeactdest</strong> existiert nicht.</font>";
}
list();
}
sub check {
return ($fail = 1) if (-e $vh_temp);
return ($fail = 0) if (! -e $vh_temp);
}
# mögliche aktionen
if ($action eq "" || $action eq "list") {
list(); }
elsif ($action eq "create") {
create(); }
elsif ($action eq "activate") {
activate(); }
elsif ($action eq "deactivate") {
deactivate(); }
elsif ($action eq "destroy") {
destroy(); }
# ende der html-ausgabe
print <<END_OF_HTML5;
</div>
</body>
</html>
END_OF_HTML5
exit;
# neustart des apache-prozesses
qx (/etc/init.d/apache2 restart);