Thomas: Perl-Script zum anlegen Virtueller Hosts

Beitrag lesen

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&auml;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&ouml;scht.";
        }
        else {
            print "Der Virtuelle Host <strong>$vh_name_actdeactdest</strong> konnte nicht gel&ouml;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);