Differences between revisions 5 and 6
Revision 5 as of 2008-07-04 20:38:37
Size: 6254
Editor: ChrisPepper
Comment:
Revision 6 as of 2009-09-20 22:13:31
Size: 6254
Editor: localhost
Comment: converted to 1.6 markup
No differences found!

############################
#      Host Settings       #
############################
<IfModule !mod_perl.c>
        # let's throw and error
        please enable mod_perl!
</IfModule>

<IfModule mod_perl.c>
        # Required Modules
        <IfDefine DAV>
            LoadModule dav_module modules/mod_dav.so
            LoadModule dav_fs_module modules/mod_dav_fs.so
            DAVLockDB logs/davlock
        </IfDefine>

        <IfDefine FTP>
                LoadModule ftp_module modules/mod_ftp.so
                FTPLimitDBFile logs/ftpd.db
                FTPOptions CheckMaxClients ShowUnAuthorizedFiles
                FTPLimitLoginUser 10
                LogFormat    "%{%b %e %H:%M:%S %Y}t %T %a %B %U %M %F %d %W %u %S %Z %Y" ftp_log
        </IfDefine>     

        # Listening Sockets
        Listen 80
        NameVirtualHost *:80
        <IfDefine DAV>
                Listen 81
                NameVirtualHost *:81
        </IfDefine>

        <IfDefine FTP>
                Listen 21 ftp
                AcceptFilter ftp none
                NameVirtualHost *:21
        </IfDefine>

        <Perl>
                # database configuration
                my %dbcfg = (
                        server          => 'localhost',
                        database        => 'httpd',
                        user            => 'apache',
                        pass            => 'wRu3REfr'
                );
                my %host = (
                        http_tmpl       => '/srv/httpd/conf/templates/http.tmpl',
                        dav_tmpl        => '/srv/httpd/conf/templates/webdav.tmpl',
                        ftp_tmpl        => '/srv/httpd/conf/templates/ftp.tmpl',
                        path            => '/srv/hosts'
                );

                # modules
                use strict;
                use warnings;
                use DBI;                                        # DBI + DBD MySQL Driver
                use Apache2::PerlSections;      # Apache2::PerlSection is needed for add_config

                # read templates
                open(TMPL, $host{'http_tmpl'}) or die "Can't read http template";
                $host{'http_tmpl'} = '';
                while (<TMPL>){
                        chomp;
                        $host{'http_tmpl'} = $host{'http_tmpl'} . $_ . "\n";
                }
                close(TMPL);

                open(TMPL, $host{'dav_tmpl'}) or die "Can't read dav template";
                $host{'dav_tmpl'} = '';
                while (<TMPL>){
                        chomp;
                        $host{'dav_tmpl'} = $host{'dav_tmpl'} . $_ . "\n";
                }
                close(TMPL);

                open(TMPL, $host{'ftp_tmpl'}) or die "Can't read ftp template";
                $host{'ftp_tmpl'} = '';
                while (<TMPL>){
                        chomp;
                        $host{'ftp_tmpl'} = $host{'ftp_tmpl'} . $_ . "\n";
                }
                close(TMPL);

                # apache server hook
                my $srv = Apache2::PerlSections->server();
                
                # database connection
                my $dbh = DBI->connect(
                        'DBI:mysql:'.$dbcfg{'database'}.':'.$dbcfg{'server'}, 
                        $dbcfg{'user'}, 
                        $dbcfg{'pass'}
                );

                if(not $dbh){
            print "Can't connect to mysql server!\n";
            die $DBI::errstr;
                }
                
                # fetch hosts
                my $hosts = $dbh->prepare(q{
                        SELECT hosts.id, name, IF( ISNULL( configuration), '', configuration) configuration, webdav, ftp, cgi, ssi, php                  
                        FROM hosts
                        LEFT JOIN configuration ON (configuration.id = hosts.id)
                        WHERE enabled = 1
                        ORDER BY hosts.id ASC;
                }) or die $dbh->errstr;

                # generate vhosts
                $hosts->execute;
                while ( (my $id,my $name,my $cfg,my $bDAV,my $bFTP,my $bCGI,my $bSSI,my $bPHP) = $hosts->fetchrow_array() ) {
                        # generate aditional configuration
                        if ($bSSI == 1) {
                                my $ssi = ''; 
                                $ssi = $ssi . "\t<IfModule mod_include.c>\n";
                        $ssi = $ssi . "\t\tAddType text/html .shtml .shtm\n";
                        $ssi = $ssi . "\t\tAddOutputFilter INCLUDES .shtml  .shtm\n";
                $ssi = $ssi . "\t</IfModule>\n";
                                $cfg = $ssi . $cfg;
                        }       

                        if ($bCGI == 1) {
                                my $cgi = ''; 
                                $cgi = $cgi . "\tScriptAlias /cgi-bin/ \"%host_dir%/%name%/cgi-bin/\"\n";
                        $cgi = $cgi . "\t<Directory \"%host_dir%/%name%/cgi-bin\">\n";
                $cgi = $cgi . "\t\tAllowOverride None\n";
                $cgi = $cgi . "\t\tOptions None\n";
                $cgi = $cgi . "\t\tOrder allow,deny\n";
                $cgi = $cgi . "\t\tAllow from all\n";
                $cgi = $cgi . "\t</Directory>\n";

                                $cgi = $cgi . "\t<IfModule mod_cgi.c>\n";
                        $cgi = $cgi . "\t\tAddHandler cgi-script .cgi .pl\n";
                $cgi = $cgi . "\t</IfModule>\n";
                $cgi = $cgi . "\t<IfModule mod_cgid.c>\n";
                $cgi = $cgi . "\t\tAddHandler cgi-script .cgi .pl\n";
                $cgi = $cgi . "\t</IfModule>\n";
                                $cfg = $cgi . $cfg;
                        }       

                        if ($bPHP == 1) {
                                my $php = ''; 
                                $php = $php . "\t<IfModule mod_php5.c>\n";
                        $php = $php . "\t\tAddHandler application/x-httpd-php .php\n";
                        $php = $php . "\t\tAddHandler application/x-httpd-php-source .phps\n";
                $php = $php . "\t</IfModule>\n";
                                $cfg = $php . $cfg;
                        }       
                        
                        # get aliases
                        my $aliases = '';
                        my $alias = $dbh->prepare(q{
                                SELECT alias
                                FROM aliases
                                WHERE id = ?;
                }) or die $dbh->errstr;
                        $alias->execute($id);                   
                        
                        while ( (my $n) = $alias->fetchrow_array() ) {
                                $aliases = $aliases . " " . $n;
                        }
                        
                        if ($aliases ne '') {
                                $aliases = "ServerAlias" . $aliases;
                        }
                        
                        # validate documentroot
                        if(!-d "$host{'path'}/$name"){
                mkdir("$host{'path'}/$name", 0755);
                mkdir("$host{'path'}/$name/_sys", 0755);
                mkdir("$host{'path'}/$name/_sys/logs", 0755);
                mkdir("$host{'path'}/$name/_sys/tmp", 0755); #for php temp directory
                mkdir("$host{'path'}/$name/_sys/sessions", 0755); #for php sessions directory
                mkdir("$host{'path'}/$name/httpdocs", 0755);
                mkdir("$host{'path'}/$name/cgi-bin", 0755);                     
                                system('chown -R apache:apache "'.$host{'path'}.'/'.$name.'"');
                        }                       

                        # create vhost
                        my $vhost = $host{'http_tmpl'};
                        if ($bDAV == 1) {
                                $vhost = $vhost . "\n" . $host{'dav_tmpl'};
                        }
                        if ($bFTP == 1) {
                                $vhost = $vhost . "\n" . $host{'ftp_tmpl'};
                        }
                        $vhost =~ s/%id%/$id/g;                 
                        $vhost =~ s/%cfg%/$cfg/g;                       
                        $vhost =~ s/%host_dir%/$host{'path'}/g;                 
                        $vhost =~ s/%name%/$name/g;                     
                        $vhost =~ s/%aliases%/$aliases/g;                       

                        $vhost =~ s/%db_server%/$dbcfg{'server'}/g;                     
                        $vhost =~ s/%db_name%/$dbcfg{'database'}/g;                     
                        $vhost =~ s/%db_user%/$dbcfg{'user'}/g;                 
                        $vhost =~ s/%db_pass%/$dbcfg{'pass'}/g;                                                 
                        
                        # push vhosts to apache
                        $srv->add_config([split /\n/, $vhost]);                 
                        
                        # debugging
                        #print "----" . $name . "----\n";
                        #print $vhost;
                }

                # cleanup
                $dbh->disconnect();
    </Perl>
</IfModule>

ApacheVirtualHostMysql/hosts.conf (last edited 2009-09-20 22:13:31 by localhost)