############################ # 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>