File: //usr/local/share/hostingplatform/scripts/__generateApacheVHOST
#!/usr/bin/env php
<?php
if(!isset($argv[1])) {
print "Please specify hostingpackage name.\n";
exit;
}
$packagename = $argv[1];
if($packagename && strlen($packagename)) {
$db = new SQLite3("/var/local/hostingplatform/db.sqlite");
$db->query("PRAGMA foreign_keys = ON");
$packagename = $db->escapeString($packagename);
$package_query = "SELECT * FROM hosting WHERE packagename = '$packagename'";
$package_result = $db->query($package_query);
$package = $package_result->fetchArray(SQLITE3_ASSOC);
$server_settings_query = "SELECT setting, value FROM server_settings WHERE setting IN ('hostname','phpmyadmin_redirect','apache_http_port','apache_https_port') ORDER BY setting";
$server_settings_result = $db->query($server_settings_query);
$server_settings = array();
while($server_settings_data = $server_settings_result->fetchArray(SQLITE3_ASSOC)) {
$server_settings[$server_settings_data["setting"]] = $server_settings_data["value"];
}
// Defining default Apache ports for HTTP / HTTPS
if(empty($server_settings["apache_http_port"])) {
$server_settings["apache_http_port"] = 80;
}
if(empty($server_settings["apache_https_port"])) {
$server_settings["apache_https_port"] = 443;
}
$domains_query = "SELECT hosting_domains.domainname as domainname,
hosting_domains.domainname as alias,
hosting_domains.operationmode as operationmode,
hosting_domains.platform as platform,
coalesce(hosting_domains.ipv4,'*') as ipv4,
coalesce(hosting_domains.ipv6,'*') as ipv6
FROM hosting_domains
WHERE hosting_domains.packagename = '$packagename'
UNION
SELECT hosting_domains.domainname as domainname,
domain_aliases.alias,
domain_aliases.operationmode as operationmode,
hosting_domains.platform as platfor,
coalesce(hosting_domains.ipv4,'*') as ipv4,
coalesce(hosting_domains.ipv6,'*') as ipv6
FROM domain_aliases
JOIN hosting_domains ON domain_aliases.domain = hosting_domains.domainname
WHERE hosting_domains.packagename = '$packagename'
ORDER BY
hosting_domains.domainname";
$result = $db->query($domains_query);
$num_rows = 0;
while($data = $result->fetchArray(SQLITE3_ASSOC)) {
$num_rows++;
}
if($num_rows) {
$vhost = "# Auto generated VHOST configuration for Hostingpackage $packagename\n";
while($data = $result->fetchArray(SQLITE3_ASSOC)) {
$vhost .= "\n";
for($i = 0; $i < strlen($data["alias"]) + 4; $i++) {
$vhost .= "#";
}
$vhost .= "\n# " . $data["alias"] . " #\n";
for($i = 0; $i < strlen($data["alias"]) + 4; $i++) {
$vhost .= "#";
}
$vhost .= "\n\n";
if($data["operationmode"] == "http" || $data["operationmode"] == "mixed") {
if($data["ipv4"] != "*" && $data["ipv6"] != "*") {
$vhost .= " <VirtualHost";
if($data["ipv4"] != "*") {
$vhost .= " " . $data["ipv4"] . ":" . $server_settings["apache_http_port"];
}
if($data["ipv6"] != "*") {
$vhost .= " [" . $data["ipv6"] . "]:" . $server_settings["apache_http_port"];
}
$vhost .= ">\n";
}
else {
$vhost .= "<VirtualHost *:" . $server_settings["apache_http_port"] . ">\n";
}
$vhost .= " ServerAdmin support@resellerdns.nl\n\n";
$vhost .= " ServerName " . $data["alias"] . "\n";
$vhost .= " ServerAlias www." . $data["alias"] . "\n";
$vhost .= "\n";
$vhost .= " DocumentRoot /home/" . $packagename . "/" . $data["domainname"] . "/\n";
if(isset($server_settings["phpmyadmin_redirect"]) && $server_settings["phpmyadmin_redirect"] == 1 && isset($server_settings["hostname"])) {
$vhost .= " Redirect permanent /phpmyadmin https://" . $server_settings["hostname"] . "/phpmyadmin\n";
}
$vhost .= " <Directory />\n";
$vhost .= " Options FollowSymLinks\n";
$vhost .= " AllowOverride None\n";
$vhost .= " </Directory>\n\n";
$vhost .= " <Directory /home/" . $packagename . "/" . $data["domainname"] . ">\n";
$vhost .= " Options MultiViews IncludesNoExec ExecCGI FollowSymlinks Includes\n";
$vhost .= " AllowOverride FileInfo AuthConfig Limit Indexes Options=All,MultiViews\n";
$vhost .= " Require all granted\n";
$vhost .= " </Directory>\n\n";
$vhost .= " ErrorLog /var/log/apache2/hostingpackages/" . $packagename . "/" . $data["alias"] . "-error.log\n";
$vhost .= " LogLevel warn\n";
$vhost .= " CustomLog /var/log/apache2/hostingpackages/" . $packagename . "/" . $data["alias"] . "-access.log combined\n\n";
$vhost .= " AccessFileName .htaccess\n\n";
$vhost .= " Protocols h2 http/1.1\n\n";
$vhost .= " AddDefaultCharset utf-8\n";
if(!empty($data["platform"])) {
if($data["platform"] == "python") {
// Python WSGI configuration
$vhost .= " WSGIDaemonProcess http-" . $data["alias"] . " display-name=" . $data["alias"] . " processes=2 threads=15 user=" . $packagename . " group=" . $packagename . "\n";
$vhost .= " AddHandler wsgi-script .wsgi\n";
$vhost .= " WSGIProcessGroup http-" . $data["alias"] . "\n";
}
else {
$vhost .= " <IfModule proxy_fcgi_module>\n";
$vhost .= " <IfModule setenvif_module>\n";
$vhost .= " SetEnvIfNoCase ^Authorization\$ \"(.+)\" HTTP_AUTHORIZATION=\$1\n";
$vhost .= " </IfModule>\n\n";
$vhost .= " <FilesMatch \".+\\.ph(?:ar|p|tml)\$\">\n";
## $vhost .= " ProxyFCGISetEnvIf \"true\" SCRIPT_FILENAME \"/" . $data["domainname"] . "/%{reqenv:SCRIPT_NAME}\"\n"; ## CHROOT Future ##
$vhost .= " SetHandler \"proxy:unix:/run/php/php" . $data["platform"] . "-fpm-" . $packagename . ".sock|fcgi://localhost\"\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " <FilesMatch \".+\\.phps\$\">\n";
$vhost .= " Require all denied\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " <FilesMatch \"^\\.ph(?:ar|p|ps|tml)\$\">\n";
$vhost .= " Require all denied\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " </IfModule>\n\n";
}
$vhost .= " <IfModule mod_rewrite.c>\n";
$vhost .= " RewriteEngine On\n";
$vhost .= " RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f\n";
$vhost .= " RewriteCond %{REQUEST_URI} ^/.well-known/\n";
$vhost .= " RewriteRule ^(.*)\$ https://" . $server_settings["hostname"] . "\$1 [P]\n";
$vhost .= " SSLProxyEngine On\n";
$vhost .= " </IfModule>\n";
}
$vhost .= " </VirtualHost>\n";
}
if($data["operationmode"] == "redirect") {
if($data["ipv4"] != "*" && $data["ipv6"] != "*") {
$vhost .= "<VirtualHost";
if($data["ipv4"] != "*") {
$vhost .= " " . $data["ipv4"] . ":" . $server_settings["apache_http_port"];
}
if($data["ipv6"] != "*") {
$vhost .= " [" . $data["ipv6"] . "]:" . $server_settings["apache_http_port"];
}
$vhost .= ">\n";
}
else {
$vhost .= "<VirtualHost *:" . $server_settings["apache_http_port"] . ">\n";
}
$vhost .= " ServerAdmin support@resellerdns.nl\n\n";
$vhost .= " ServerName " . $data["alias"] . "\n";
$vhost .= "\n";
$vhost .= " Redirect permanent / https://" . $data["alias"] . "/\n";
$vhost .= "</VirtualHost>\n\n";
if($data["ipv4"] != "*" && $data["ipv6"] != "*") {
$vhost .= "<VirtualHost";
if($data["ipv4"] != "*") {
$vhost .= " " . $data["ipv4"] . ":" . $server_settings["apache_http_port"];
}
if($data["ipv6"] != "*") {
$vhost .= " [" . $data["ipv6"] . "]:" . $server_settings["apache_http_port"];
}
$vhost .= ">\n";
}
else {
$vhost .= "<VirtualHost *:" . $server_settings["apache_http_port"] . ">\n";
}
$vhost .= " ServerAdmin support@resellerdns.nl\n\n";
$vhost .= " ServerName www." . $data["alias"] . "\n";
$vhost .= "\n";
$vhost .= " Redirect permanent / https://www." . $data["alias"] . "/\n";
$vhost .= "</VirtualHost>\n\n";
}
$domainpreview_check = substr($data["alias"], stripos($data["alias"], ".") + 1);
if(($data["ipv4"] != "*" || $data["ipv6"] != "*") &&
($data["operationmode"] == "https" || $data["operationmode"] == "mixed" || $data["operationmode"] == "redirect") &&
((is_readable("/etc/ssl/certs/" . $packagename . "-" . $data["alias"] . ".pem") && is_readable("/etc/ssl/private/" . $packagename . "-" . $data["alias"] . ".key")) ||
(is_readable("/etc/ssl/certs/" . $domainpreview_check . ".pem") && is_readable("/etc/ssl/private/" . $domainpreview_check . ".key")))) {
$vhost .= "<IfModule mod_ssl.c>\n";
$vhost .= " <VirtualHost";
if($data["ipv4"] != "*") {
$vhost .= " " . $data["ipv4"] . ":" . $server_settings["apache_https_port"];
}
if($data["ipv6"] != "*") {
$vhost .= " [" . $data["ipv6"] . "]:" . $server_settings["apache_https_port"];
}
$vhost .= ">\n";
$vhost .= " ServerAdmin support@resellerdns.nl\n\n";
$vhost .= " ServerName " . $data["alias"] . "\n";
$vhost .= " ServerAlias www." . $data["alias"] . "\n";
$vhost .= "\n";
$vhost .= " DocumentRoot /home/" . $packagename . "/" . $data["domainname"] . "/\n";
if(isset($server_settings["phpmyadmin_redirect"]) && $server_settings["phpmyadmin_redirect"] == 1 && isset($server_settings["hostname"])) {
$vhost .= " Redirect permanent /phpmyadmin https://" . $server_settings["hostname"] . "/phpmyadmin\n";
}
$vhost .= " <Directory />\n";
$vhost .= " Options FollowSymLinks\n";
$vhost .= " AllowOverride None\n";
$vhost .= " </Directory>\n\n";
$vhost .= " <Directory /home/" . $packagename . "/" . $data["domainname"] . ">\n";
$vhost .= " Options MultiViews IncludesNoExec ExecCGI FollowSymlinks Includes\n";
$vhost .= " AllowOverride FileInfo AuthConfig Limit Indexes Options=All,MultiViews\n";
$vhost .= " Require all granted\n";
$vhost .= " </Directory>\n\n";
$vhost .= " ErrorLog /var/log/apache2/hostingpackages/" . $packagename . "/" . $data["alias"] . "-error.log\n";
$vhost .= " LogLevel warn\n";
$vhost .= " CustomLog /var/log/apache2/hostingpackages/" . $packagename . "/" . $data["alias"] . "-access.log combined\n\n";
$vhost .= " AccessFileName .htaccess\n\n";
$vhost .= " Protocols h2 http/1.1\n\n";
$vhost .= " AddDefaultCharset utf-8\n";
$vhost .= " SSLEngine on\n";
if(is_readable("/etc/ssl/certs/" . $packagename . "-" . $data["alias"] . ".pem") && is_readable("/etc/ssl/private/" . $packagename . "-" . $data["alias"] . ".key")) {
$vhost .= " SSLCertificateFile /etc/ssl/certs/" . $packagename . "-" . $data["alias"] . ".pem\n";
$vhost .= " SSLCertificateKeyFile /etc/ssl/private/" . $packagename . "-" . $data["alias"] . ".key\n\n";
}
elseif(is_readable("/etc/ssl/certs/" . $domainpreview_check . ".pem") && is_readable("/etc/ssl/private/" . $domainpreview_check . ".key")) {
$vhost .= " SSLCertificateFile /etc/ssl/certs/" . $domainpreview_check . ".pem\n";
$vhost .= " SSLCertificateKeyFile /etc/ssl/private/" . $domainpreview_check . ".key\n\n";
}
$vhost .= " Header always set Strict-Transport-Security \"max-age=31536000; preload\"\n";
if(!empty($data["platform"])) {
if($data["platform"] == "python") {
// Python WSGI configuration
$vhost .= " WSGIDaemonProcess https-" . $data["alias"] . " display-name=" . $data["alias"] . " processes=2 threads=15 user=" . $packagename . " group=" . $packagename . "\n";
$vhost .= " AddHandler wsgi-script .wsgi\n";
$vhost .= " WSGIProcessGroup https-" . $data["alias"] . "\n";
}
else {
$vhost .= " <IfModule proxy_fcgi_module>\n";
$vhost .= " <IfModule setenvif_module>\n";
$vhost .= " SetEnvIfNoCase ^Authorization\$ \"(.+)\" HTTP_AUTHORIZATION=\$1\n";
$vhost .= " </IfModule>\n\n";
$vhost .= " <FilesMatch \".+\\.ph(?:ar|p|tml)\$\">\n";
## $vhost .= " ProxyFCGISetEnvIf \"true\" SCRIPT_FILENAME \"/" . $data["domainname"] . "/%{reqenv:SCRIPT_NAME}\"\n"; ## CHROOT Future ##
$vhost .= " SetHandler \"proxy:unix:/run/php/php" . $data["platform"] . "-fpm-" . $packagename . ".sock|fcgi://localhost\"\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " <FilesMatch \".+\\.phps\$\">\n";
$vhost .= " Require all denied\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " <FilesMatch \"^\\.ph(?:ar|p|ps|tml)\$\">\n";
$vhost .= " Require all denied\n";
$vhost .= " </FilesMatch>\n";
$vhost .= " </IfModule>\n\n";
}
}
$vhost .= " <IfModule mod_rewrite.c>\n";
$vhost .= " RewriteEngine On\n";
$vhost .= " RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f\n";
$vhost .= " RewriteCond %{REQUEST_URI} ^/.well-known/\n";
$vhost .= " RewriteRule ^(.*)\$ https://" . $server_settings["hostname"] . "\$1 [P]\n";
$vhost .= " SSLProxyEngine On\n";
$vhost .= " </IfModule>\n";
$vhost .= " </VirtualHost>\n";
$vhost .= "</IfModule>\n";
}
}
file_put_contents("/etc/apache2/sites-available/" . $packagename . ".conf", $vhost);
shell_exec("/usr/sbin/a2ensite " . escapeshellcmd($packagename));
}
else {
shell_exec("/usr/sbin/a2dissite " . escapeshellcmd($packagename));
}
shell_exec(dirname(__FILE__) . "/__reloadApache");
}
?>