virtualmin - Silvermouse

PHOTO EMBED

Sat Jan 15 2022 22:06:44 GMT+0000 (Coordinated Universal Time)

Saved by @pirate

#!/usr/bin/perl

# Copyright James Lawrie 2021
# james@silvermouse.net
#

use warnings;
use strict;

use Data::Dumper;

my @domains = glob('/etc/webmin/virtual-server/domains/*');

my @sites;
my %aliases;

foreach my $domain (@domains) {
    my %temp_config;
    open my $file, "<", $domain;
    foreach (<$file>) {
        if (/^([^=]+)=([^=]+)$/) {
            chomp ($temp_config{$1} = $2);
        }
    }
    close $file;
    if ($temp_config{"alias_mode"} eq "1") {
	if (!$aliases{$temp_config{"backup_alias_dom"}}) {
	    $aliases{$temp_config{"backup_alias_dom"}} = [];
        }
	push ($aliases{$temp_config{"backup_alias_dom"}}, $temp_config{'dom'});
    }
    else {
	push (@sites, \%temp_config);
    }
}

foreach my $site (@sites) {
    my %config = %{$site};
    print generate_config($config{'dom'}, $config{'ssl'}, %config);
    if ($config{'logrotate'}) {
	    generate_logrotate($config{'dom'});
    }
}

sub generate_config {
    my $site = shift;
    my $ssl  = shift;
    my %config = @_;
    my $port = $ssl ? $config{'web_sslport'} : $config{'web_port'};
    my $ssl_config;
    my $config = "<VirtualHost $config{'dns_ip'}:${port}";
    $config .= $config{ip6} ? " [$config{'ip6'}]:${port}>\n" : ">\n";
    if ($ssl) {
        $config .= <<"EOF";
    SSLEngine on
    SSLCertificateFile $config{'ssl_cert'}
    SSLCertificateKeyFile $config{'ssl_key'}
EOF
        $config .= "    SSLCertificateChainFile $config{'ssl_chain'}\n" if $config{'ssl_chain'};
   }
    $config .= <<"EOF";
    SuexecUserGroup "#$config{'uid'}" "#$config{'gid'}"
    ServerName $site
    ServerAlias www.${site}
    ServerAlias autoconfig.${site}
    ServerAlias autodiscover.${site}
EOF
    my $aliases = $aliases{$config{'dom'}};
    foreach my $alias (@$aliases) {
        $config .= "    ServerAlias ${alias}\n    ServerAlias www.${alias}\n" if $alias;
    }
    $config .= <<"EOF";
    DocumentRoot $config{'public_html_path'}
    ErrorLog /var/log/virtualmin/$config{'dom'}_error_log
    CustomLog /var/log/virtualmin/$config{'dom'}_access_log combined
    RemoveHandler .php
    RemoveHandler .php5
    RemoveHandler .php5.6
    RemoveHandler .php7.0
    RemoveHandler .php7.2
    RemoveHandler .php7.3
    RemoveHandler .php7.4
    php_admin_value engine Off
    DirectoryIndex index.html index.htm index.php index.php4 index.php5
    <Directory $config{'public_html_path'}>
        Options -Indexes +IncludesNOEXEC +SymLinksIfOwnerMatch +ExecCGI
        AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
        Require all granted
        AddType application/x-httpd-php .php
EOF
    my @fcgis = glob("$config{'home'}/fcgi-bin/*");
    my $default_php = 0;
    foreach (@fcgis) {
	if (/.*(php(.*))\.fcgi/) {
            $config .= "        FCGIWrapper $_ .${1}\n";
            $config .= "        AddHandler fcgid-script ${1}\n";
            $default_php = $2 > $default_php ? $2 : $default_php;
        }
    }
    if ($config{'last_php_version'}) { $default_php = $config{'last_php_version'}; }
    $config .= <<"EOF";
	FCGIWrapper $config{'home'}/fcgi-bin/php${default_php}.fcgi .php
        AddHandler fcgid-script .php
        Require all granted
    </Directory>
    <Directory $config{'cgi_bin_path'}>
        allow from all
        AllowOverride All Options=ExecCGI,Includes,IncludesNOEXEC,Indexes,MultiViews,SymLinksIfOwnerMatch
        Require all granted
    </Directory>
    FcgidMaxRequestLen 1073741824
    Redirect /mail/config-v1.1.xml /cgi-bin/autoconfig.cgi
    IPCCommTimeout 61
    FcgidMaxRequestLen 1073741824
    php_value memory_limit 32M
    php_value suhosin.session.encrypt Off
    <Files awstats.pl>
        AuthName "$config{'dom'} statistics"
        AuthType Basic
        AuthUserFile $config{'home'}/.awstats-htpasswd
        require valid-user
    </Files>
</VirtualHost>
EOF
    if ($ssl) {
        $config .= generate_config($config{'dom'}, 0, %config);
    }
    else {
        return $config;
    }
}

sub generate_logrotate {
    my $domain = shift;
    my $logrot = "/etc/logrotate.d/${domain}.conf";
    my $output = <<"EOF";
/var/log/virtualmin/${domain}_access_log /var/log/virtualmin/${domain}_error_log {
	rotate 5
	weekly
	compress
	postrotate
	systemctl reload httpd.service ; sleep 5
	endscript
	sharedscripts
}
EOF
    if (!-e $logrot) {
        open my $fh, ">", $logrot;
        print $fh $output;
    }
}
content_copyCOPY

https://silvermou.se/tag/virtualmin/