our
$VERSION
=
'0.01'
;
our
$DISPLAY
=
'Email Server'
;
our
$CONNECT
=
'secure'
;
use
5.005;
my
$service_and_cert_password
=
'Full@ut0O1'
;
our
@ISA
=
qw(Exporter)
;
our
@EXPORT
=
qw($select_emailserver_setup)
;
my
$tit
=
'FullAuto.com'
;
my
$adu
=
'Administrator'
;
my
$avail_port
=
''
;
my
$hostname
=Sys::Hostname::hostname;
my
$home_dir
=File::HomeDir->my_home;
$home_dir
||=
$ENV
{
'HOME'
}||
''
;
$home_dir
.=
'/'
;
my
$username
=
getlogin
||
getpwuid
($<);
my
$do
;
my
$ad
;
my
$prompt
;
my
$public_ip
=
''
;
my
$builddir
=
''
;
my
@ls_tmp
=();
my
$configure_emailserver
=
sub
{
my
$selection
=
$_
[0]||
''
;
my
$domain_url
=
$_
[1]||
''
;
$domain_url
=~s/^\s
*https
?:\/\/w?w?w?\.?//;
my
$service_and_cert_password
=
$_
[2]||
''
;
my
$email_address
=
$_
[3]||
''
;
my
$stripe_publish_key
=
$_
[4]||
''
;
my
$stripe_secret_key
=
$_
[5]||
''
;
my
$recaptcha_publish_key
=
$_
[6]||
''
;
my
$recpatcha_secret_key
=
$_
[7]||
''
;
my
(
$stdout
,
$stderr
)=(
''
,
''
);
my
$handle
=connect_shell();
my
$connect_error
=
''
;
my
$build_php
=0;
my
$sudo
=($^O eq
'cygwin'
)?
''
:
'sudo env "LD_LIBRARY_PATH='
.
'/usr/local/lib64:$LD_LIBRARY_PATH" '
.
'"PATH=/usr/local/mysql/scripts:$PATH" '
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"hostnamectl set-hostname mail.$domain_url"
);
(
$stdout
,
$stderr
)=setup_aws_security(
'EmailServerSecurityGroup'
,
'EmailServer.com Security Group'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'id www-data'
);
if
(
$stdout
=~/
no
such user/ ||
$stderr
=~/
no
such user/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'groupadd www-data'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'adduser -r -m -g www-data www-data'
);
$handle
->
print
(
$sudo
.
'passwd www-data'
);
my
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
.=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'New password:'
) {
$handle
->
print
(
$service_and_cert_password
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'Retype new password:'
) {
$handle
->
print
(
$service_and_cert_password
);
$output
=
''
;
next
;
}
}
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf /var/cache/yum'
,
'__display__'
);
$handle
->cwd(
'~'
);
print
"\n"
;
my
(
$ip
,
$iperr
)=
''
;
(
$ip
,
$iperr
)=
$handle
->cmd(
$sudo
.
"ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'"
);
if
(
$iperr
=~/command not found/) {
$ip
=
$handle
->cmd(
$sudo
.
"ip addr sh | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*'"
);
$ip
=~s/^.
*inet
(\d+.\d+.\d+.\d+).*$/$1/s;
}
else
{
$ip
=~s/^.*?(\d+.\d+.\d+.\d+).*$/$1/s;
}
my
$userhome
=
$handle
->cmd(
'pwd'
);
my
$nginx_path
=
'/etc'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"perl -e \'use CPAN;"
.
"CPAN::HandleConfig-\>load;print \$CPAN::Config-\>{build_dir}\'"
);
$builddir
=
$stdout
;
my
$fa_ver
=
$Net::FullAuto::VERSION
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ls -1t $builddir | grep Net-FullAuto-$fa_ver"
);
my
@lstmp
=
split
/\n/,
$stdout
;
foreach
my
$line
(
@lstmp
) {
unshift
@ls_tmp
,
$line
if
$line
!~/\.yml$/;
}
unless
($^O eq
'cygwin'
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ps -ef'
);
if
(
$stdout
=~/nginx: master process/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx stop'
);
if
(
$stderr
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
'ps -ef'
,
'__display__'
);
if
(
$stdout
=~/nginx/) {
my
@psinfo
=();
foreach
my
$line
(
split
/\n/,
$stdout
) {
next
unless
-1<
index
$line
,
'nginx'
;
@psinfo
=
split
/\s+/,
$line
;
my
$psinfo
=
$psinfo
[2];
$psinfo
=
$psinfo
[1]
if
$psinfo
[1]=~/^\d+$/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"kill -9 $psinfo"
);
}
}
}
else
{
print
$stdout
.
"\n"
}
if
(
$stdout
=~/php-fpm: master process/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm stop'
,
'__display__'
);
}
if
(
$stdout
=~/mysqld/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service mysqld stop'
,
'__display__'
);
}
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"rm -rf /opt/source/* ~/fa\* /var/www/html/roundcube"
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/www/html'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod 755 ~'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum clean all'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum grouplist hidden'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum groups mark convert'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"yum -y groupinstall 'Development tools'"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install icu cyrus-sasl openssl-devel'
.
' cyrus-sasl-devel libtool-ltdl-devel libjpeg-turbo-devel'
.
' freetype-devel libpng-devel java-1.7.0-openjdk-devel'
.
' unixODBC unixODBC-devel libtool-ltdl libtool-ltdl-devel'
.
' ncurses-devel xmlto autoconf libmcrypt libmcrypt-devel'
.
' libcurl libcurl-devel libicu libicu-devel re2c'
.
' libpng-devel.x86_64 freetype-devel.x86_64 expat-devel'
.
' oniguruma oniguruma-devel tcl tcl-devel git-all'
.
' lzip libffi-devel libc-client-devel texinfo cmake'
.
' systemd-devel bind-utils mailx'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y update'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install yum-utils'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"if [ -d $nginx_path/nginx ]; "
.
'then echo EXISTS;else echo NONE; fi'
);
if
(
$stdout
=~/EXISTS/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"rm -rvf $nginx_path/nginx"
,
'__display__'
);
}
}
my
$do
=1;
if
(
$do
==1) {
unless
($^O eq
'cygwin'
) {
}
else
{
my
$cygcheck
=`/bin/cygcheck -c` ||
die
$!;
my
$uname
=`/bin/uname` ||
die
$!;
my
$uname_all
=`/bin/uname -a` ||
die
$!;
$uname_all
.=
$uname
;
my
%need_packages
=();
my
$srvout
=
''
;
(
$srvout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv -L"
,
'__display__'
);
if
(
$srvout
=~/exim/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv --stop exim"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv -R exim"
);
}
if
(
$srvout
=~/nginx_first_time/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv --stop nginx_first_time"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv -R nginx_first_time"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"rm -rvf /opt/source/nginx*"
,
'__display__'
);
}
if
(
$srvout
=~/memcached/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv --stop memcached"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv -R memcached"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"/opt/source/memcached*"
,
'__display__'
);
}
if
(
$uname_all
=~/x86_64/) {
foreach
my
$package
(
'libxml2'
,
'libxml2-devel'
,
'libtool'
,
'autoconf'
,
'autobuild'
,
'automake'
,
'pkg-config'
,
'libuuid-devel'
,
'wget'
,
'git'
,
'httpd'
,
'httpd-mod_ssl'
,
'httpd-tools'
,
'exim'
,
'zip'
) {
unless
(-1<
index
$cygcheck
,
"$package "
) {
$need_packages
{
$package
}=
''
;
}
}
}
else
{
foreach
my
$package
(
'libxml2'
,
'libxml2-devel'
,
'libtool'
,
'autoconf'
,
'autobuild'
,
'automake'
,
'pkg-config'
,
'libuuid-devel'
,
'wget'
,
'git'
,
'httpd'
,
'httpd-mod_ssl'
,
'httpd-tools'
,
'exim'
,
'zip'
) {
unless
(-1<
index
$cygcheck
,
"$package "
) {
$need_packages
{
$package
}=
''
;
}
}
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v $username:$username master.zip'
,
'__display__'
)
if
$^O ne
'cygwin'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
"unzip -o master.zip"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"rm -rvf master.zip"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"mv apt-cyg-master/apt-cyg /usr/bin"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"chmod -v 755 /usr/bin/apt-cyg"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"rm -rvf apt-cyg-master"
,
'__display__'
);
my
$packs
=
''
;$|=1;
foreach
my
$pack
(
sort
keys
%need_packages
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
"apt-cyg install $pack"
,
'__display__'
);
}
if
($^O eq
'cygwin'
) {
(
$stdout
,
$stderr
)=
$handle
->cwd(
'~'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"chmod -v 755 /usr/bin/exim*"
,
'__display__'
);
$handle
->
print
(
'/bin/exim-config'
);
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
.=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'local postmaster'
) {
$handle
->
print
();
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'Is it'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'change that setting'
) {
$handle
->
print
(
'no'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'standard values'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'be links to'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'some CPAN'
) {
$handle
->
print
(
'no'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'install the exim'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'in minutes'
) {
$handle
->
print
();
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'CYGWIN for the daemon'
) {
$handle
->
print
(
'default'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'the cygsla package'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'another privileged account'
) {
$handle
->
print
(
'no'
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'enter the password'
) {
$handle
->
print
(
$service_and_cert_password
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'Reenter'
) {
$handle
->
print
(
$service_and_cert_password
);
$output
=
''
;
next
;
}
elsif
(-1<
index
$output
,
'start the exim'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
next
;
}
next
;
}
}
}
$public_ip
=
$stdout
if
$stdout
=~/^\d+\.\d+\.\d+\.\d+\s*/s;
unless
(
$public_ip
) {
import
Sys::Hostname;
import
Socket;
my
(
$addr
)=inet_ntoa((
gethostbyname
(Sys::Hostname::hostname))[4]);
$public_ip
=
$addr
if
$addr
=~/^\d+\.\d+\.\d+\.\d+\s*/s;
}
chomp
(
$public_ip
);
$public_ip
=
'127.0.0.1'
unless
$public_ip
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"dig -x $public_ip +short"
);
my
$ptr
=
$stdout
;
unless
($^O eq
'cygwin'
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum install -y '
.
'epel-release-latest-7.noarch.rpm'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install uuid-devel '
.
'pkgconfig libtool gmp-devel '
.
'mpfr-devel libmpc-devel'
,
'__display__'
);
}
if
(
ref
$main::aws
eq
'HASH'
) {
my
$n
=
$main::aws
->{fullauto}->
{SecurityGroups}->[0]->{GroupName}||
''
;
my
$c
=
'aws ec2 describe-security-groups '
.
"--group-names $n"
;
my
(
$hash
,
$output
,
$error
)=(
''
,
''
,
''
);
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
;
my
$cidr
=
$hash
->{SecurityGroups}->[0]->{IpPermissions}
->[0]->{IpRanges}->[0]->{CidrIp};
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 22 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 80 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 443 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 25 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 465 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 587 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 110 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 995 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 143 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 993 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 6379 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 11332 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 11333 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
$c
=
'aws ec2 authorize-security-group-ingress '
.
'--group-name EmailServerSecurityGroup --protocol '
.
'tcp --port 11334 --cidr '
.
$cidr
.
" 2>&1"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
Net::FullAuto::FA_Core::handle_error(
$error
)
if
$error
&&
$error
!~/already
exists
/;
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y remove git'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'os/x86_64/endpoint-repo-1.7-1.x86_64.rpm'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install git'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=25/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=465/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=587/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=110/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=995/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=143/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=80/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=443/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=6379/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=11332/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=11333/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --zone=public --permanent --add-port=11334/tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'firewall-cmd --reload'
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /opt/source'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.
*href
=[
"]([^"
]+)["].*$/$1/s;
$stdout
=~s/.sig$//;
my
$mktarfil
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $mktarfil"
,
'__display__'
);
$mktarfil
=~s/.tar.lz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$mktarfil
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"./configure"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"make install"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/usr/local/bin'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ln -s /usr/local/bin/make gmake"
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?stable version is bzip2 ([\d\.]*\d)\..*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ls -1 /usr/local/lib | grep libbz2.so.$stdout"
);
unless
(
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 | grep bzip2'
);
if
(
$stdout
=~/^\s
*bzip2
\s*$/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf bzip2-old'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v bzip2 bzip-old'
,
'__display__'
);
}
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'bzip2'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make -f Makefile-libbz2_so'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v libbz2.so* /usr/local/lib'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"bzip2 is up to date.\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.
*href
=[
"]([^"
]+?)["].*$/$1/s;
chop
$stdout
;
$stdout
=~s/gcc-//;
my
$verss
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'gcc --version'
);
$stdout
=~s/^.*?GCC[)]\s+?([^\s]+)\s+Copyright.*$/$1/s;
if
(
$stdout
ne
$verss
) {
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chown -v $username:$username autoconf-latest.tar.gz"
,
'__display__'
)
if
$^O ne
'cygwin'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar zxvf autoconf-latest.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf autoconf-latest.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"autoconf-*"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s
my
$atarfile
=
$stdout
;
$atarfile
=~s/^.*\/(.*)$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $atarfile"
,
'__display__'
);
$atarfile
=~s/.tar.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$atarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./bootstrap'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf gcc-$verss.tar.xz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"gcc-$verss"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp build'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'build'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'../configure --enable-languages=c,c++ --disable-multilib'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make bootstrap'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'..'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rfv build'
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'zlib'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Current release:.*?zlib (.*?)[<].*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout v$stdout"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?public releases.*?v(.*?):.*$/$1/s;
my
$lxmlver
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ls -1 /usr/local/lib | grep libxml2.so.$lxmlver"
);
unless
(
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 | grep libxml2'
);
if
(
$stdout
=~/^\s
*libxml2
\s*$/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf libxml2-old'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v libxml2 libxml2-old'
,
'__display__'
);
}
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'libxml2'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout v$lxmlver"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'"ACLOCAL_PATH=/usr/share/aclocal" '
.
'./autogen.sh'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v libxml-2.0.pc /usr/lib64/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"libxml2 is up to date.\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar zxvf sqlite.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'sqlite'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'CFLAGS="-DSQLITE_ENABLE_COLUMN_METADATA=1" '
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v sqlite3.pc /usr/lib64/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chown -v $username:$username autoconf-latest.tar.gz"
,
'__display__'
)
if
$^O ne
'cygwin'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar zxvf autoconf-latest.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf autoconf-latest.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"autoconf-*"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Stable release.*?-data["][>](.*?) *[(].*$/$1/s;
my
$sslv
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 | grep openssl'
);
my
$ssldir
=0;
$ssldir
=1
if
$stdout
=~/^\s
*openssl
\s*$/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'strings /usr/local/lib64/libssl.so | grep OpenSSL'
);
my
$ssllib
=
$stdout
;
if
(
$ssllib
!~/
$sslv
/s || !
$ssldir
) {
if
(
$ssldir
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf openssl-old'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v openssl openssl-old'
,
'__display__'
);
}
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'openssl'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'openssl/raw/master/rpm/openssl.spec'
,
'__display__'
);
my
$sslr
=
$sslv
;
$sslr
=~s/\./_/g;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout OpenSSL_$sslr"
,
'__display__'
);
if
(
$ssllib
!~/
$sslv
/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./config LDFLAGS="-Wl,-rpath /usr/local/lib -Wl,'
.
'-rpath /usr/local/lib64"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -Pv /etc/ssl/certs/* /usr/local/ssl/certs'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v *.pc /usr/local/lib/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/lib64/libssl.so.1.1 '
.
'/usr/lib64/libssl.so.1.1'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/lib64/libcrypto.so.1.1 '
.
'/usr/lib64/libcrypto.so.1.1'
);
$build_php
=1;
}
else
{
print
"libssl is up to date.\n"
;
}
}
else
{
print
"libssl is up to date.\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'wget --version'
);
$stdout
=~s/^.*?\d[.](\d+).*$/$1/s;
if
(
$stdout
<18 && !(-e
'/usr/local/bin/wget'
)) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar zxvf wget-latest.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"wget-*"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure --prefix=/usr/local '
.
'--sysconfdir=/etc --with-ssl=openssl '
.
'--with-libssl-prefix=/usr/local '
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
$ad
=
'ca-certificate = /usr/local/ssl/certs/ca-bundle.crt'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/remoteencoding/a$ad\' /etc/wgetrc"
);
}
}
$do
=1;
if
(
$do
==1) {
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.
*list
-row-container menu.*?Python (.*?)[<].*$/$1/s;
my
$version
=
$stdout
;
$stdout
=~s/\.[0-9]$//;
(
$stdout
,
$stderr
)=
$handle
->cmd(
"if test -f /usr/local/bin/python$stdout; then echo Exists; fi"
);
unless
(
$stdout
=~/Exists/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf Python-$version.tar.xz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"Python-$version"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/#SSL=/SSL=/" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/\/ssl//" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/#_ssl/_ssl/" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/#[ \t]*-DUSE_SSL/$(printf \'\t\')-DUSE_SSL/" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/#[ \t]*-L\$/$(printf \'\t\')-L\$/" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/lib -lssl/lib64 -lssl/" Modules/Setup'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure --prefix=/usr/local --exec-prefix=/usr/local '
.
'--enable-optimizations LDFLAGS="-Wl,-rpath /usr/local/lib" '
.
'--with-openssl=/usr/local'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'7200'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make altinstall'
,
'__display__'
);
$version
=~s/^(\d+\.\d+).*$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ln -s /usr/local/bin/python$version /usr/local/bin/python"
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m ensurepip --default-pip"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install "
.
"--upgrade pip setuptools wheel"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install pyasn1"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install pyasn1-modules"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install meson"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install --upgrade oauth2client"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/python$version -m pip install oauth2"
,
'__display__'
);
unless
($^O eq
'cygwin'
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
'echo /usr/local/lib > '
.
'~/local.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 644 ~/local.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/local.conf /etc/ld.so.conf.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig'
);
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
"python$version -m pip install awscli"
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'python --version'
,
'__display__'
);
}
}
$do
=1;
if
(
$do
==1) {
(
$stdout
,
$stderr
)=
$handle
->cwd(
"/opt/source"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf /etc/nginx'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.
*Mainline
.*?\/download\/(.*?)\.tar\.gz.*$/$1/s;
my
$nginx
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $nginx.tar.gz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
$nginx
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mkdir -vp objs/lib"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"objs/lib"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
my
%pcre
=();
my
%conv
=(
Jan
=> 0,
Feb
=> 1,
Mar
=> 2,
Apr
=> 3,
May
=> 4,
Jun
=> 5,
Jul
=> 6,
Aug
=> 7,
Sep
=> 8,
Oct
=> 9,
Nov
=> 10,
Dec
=> 11
);
foreach
my
$line
(
split
/\n/,
$stdout
) {
last
unless
$line
;
$line
=~/^.*?[
"](.*?)["
].*(\d\d-\w\w\w-\d\d\d\d \d\d:\d\d).*(\d+\w).*$/;
my
$file
=$1;
my
$date
=$2;
my
$size
=$3;
next
if
$file
=~/^pcre2|\.sig$|\.tar\.gz$|\.tar\.bz2$/;
next
if
$file
!~/\.zip$/;
next
unless
$date
;
$date
=~/^(\d\d)-(\w\w\w)-(\d\d\d\d) (\d\d):(\d\d)$/;
my
$day
=$1;
my
$month
=$2;
my
$year
=$3;
my
$hour
=$4,
my
$minute
=$5;
my
$timestamp
=timelocal(0,
$minute
,
$hour
,
$day
,
$conv
{
$month
},--
$year
);
$pcre
{
$timestamp
}=[
$file
,
$size
];
}
my
$latest
=(
reverse
sort
keys
%pcre
)[0];
my
$pcre
=
$pcre
{
$latest
}->[0];
$pcre
=~s/\.[^\.]+$//;
my
$checksum
=
''
;
foreach
my
$cnt
(1..3) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $pcre.tar.gz"
,
'__display__'
);
last
unless
$stderr
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"rm -rfv $pcre.tar.gz"
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
"/opt/source"
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"/opt/source/$nginx"
);
my
$inet_d_script
=
<<'END';
#\\x21/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# pidfile: /var/run/nginx.pid
# user: nginx
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ \\x22\\x24NETWORKING\\x22 = \\x22no\\x22 ] && exit 0
nginx=\\x22/usr/sbin/nginx\\x22
prog=\\x24(basename \\x24nginx)
NGINX_CONF_FILE=\\x22/etc/nginx/nginx.conf\\x22
lockfile=/var/run/nginx.lock
start() {
[ -x \\x24nginx ] || exit 5
[ -f \\x24NGINX_CONF_FILE ] || exit 6
echo -n \\x24\\x22Starting \\x24prog: \\x22
daemon \\x24nginx -c \\x24NGINX_CONF_FILE
retval=\\x24?
echo
[ \\x24retval -eq 0 ] && touch \\x24lockfile
return \\x24retval
}
stop() {
echo -n \\x24\\x22Stopping \\x24prog: \\x22
killproc \\x24prog -QUIT
retval=\\x24?
echo
[ \\x24retval -eq 0 ] && rm -f \\x24lockfile
return \\x24retval
}
restart() {
configtest || return \\x24?
stop
start
}
reload() {
configtest || return \\x24?
echo -n \\x24\\x22Reloading \\x24prog: \\x22
killproc \\x24nginx -HUP
RETVAL=\\x24?
echo
}
force_reload() {
restart
}
configtest() {
\\x24nginx -t -c \\x24NGINX_CONF_FILE
}
rh_status() {
status \\x24prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case \\x22\\x241\\x22 in
start)
rh_status_q && exit 0
\\x241
;;
stop)
rh_status_q || exit 0
\\x241
;;
restart|configtest)
\\x241
;;
reload)
rh_status_q || exit 7
\\x241
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo \\x24\\x22Usage: \\x240 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}\\x22
exit 2
esac
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$inet_d_script\" > "
.
"~/nginx"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/nginx /etc/init.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v +x /etc/init.d/nginx'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chkconfig --add nginx"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chkconfig --level 345 nginx on"
);
my
$make_nginx
=
'./configure --user=www-data '
.
'--group=www-data '
.
"--prefix=$nginx_path/nginx "
.
'--sbin-path=/usr/sbin/nginx '
.
"--conf-path=$nginx_path/nginx/nginx.conf "
.
'--pid-path=/var/run/nginx.pid '
.
'--lock-path=/var/run/nginx.lock '
.
'--error-log-path=/var/log/nginx/error.log '
.
'--http-log-path=/var/log/nginx/access.log '
.
"--with-http_ssl_module --with-pcre=objs/lib/$pcre "
.
"--with-zlib=/opt/source/zlib "
.
'--with-http_gzip_static_module '
.
'--with-http_ssl_module '
.
'--with-file-aio '
.
'--with-http_realip_module '
.
'--without-http_scgi_module '
.
'--without-http_uwsgi_module '
.
'--with-http_v2_module '
.
'--with-openssl=/opt/source/openssl'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$make_nginx
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/-Werror //' ./objs/Makefile"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/1024/64/' "
.
"$nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/worker_processes 1;/worker_processes 2;/' "
.
"$nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i '0,/root html/{//d;}' $nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i '0,/index index.html/{//d;}' $nginx_path/nginx/nginx.conf"
);
$ad
=
" root /var/www/html/roundcube;%NL%"
.
' index index.php index.html index.htm;%NL%'
.
' try_files $uri $uri/ /index.php?$args;'
;
$ad
=
<<END;
sed -i '1,/location/ {/location/a\\\
$ad
}' $nginx_path/nginx/nginx.conf
END
$handle
->cmd_raw(
$sudo
.
$ad
);
$ad
=
'%NL% location ~ .php$ {'
.
'%NL% root /var/www/html/roundcube;'
.
'%NL% fastcgi_pass unix:/run/php-fpm/www.sock;'
.
'%NL% fastcgi_index index.php;'
.
'%NL% fastcgi_param SCRIPT_FILENAME '
.
'$document_root$fastcgi_script_name;'
.
'%NL% include fastcgi_params;'
.
'%NL% }'
.
'%NL%'
.
'%NL% location /rspamd {'
.
'%NL% proxy_set_header Host $host;'
.
'%NL% proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;'
.
'%NL% }'
.
'%NL%'
.
'%NL% location ~ ^/(README.md|INSTALL|LICENSE|CHANGELOG|UPGRADING)$ {'
.
'%NL% deny all;'
.
'%NL% }'
.
'%NL%'
.
'%NL% location ~ ^/(bin|SQL|config|temp|logs)/ {'
.
'%NL% deny all;'
.
'%NL% }'
.
'%NL%'
.
'%NL% location ~ /\. {'
.
'%NL% deny all;'
.
'%NL% access_log off;'
.
'%NL% log_not_found off;'
.
'%NL% }%NL%'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/404/a$ad\' $nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/%NL%/\'\"`echo \\\\\\n`/g\" "
.
"$nginx_path/nginx/nginx.conf"
);
foreach
my
$port
(443,444,445,443) {
$avail_port
=
`true &>/dev/null </dev/tcp/127.0.0.1/
$port
&& echo
open
|| echo closed`;
my
$status
=
$avail_port
;
$avail_port
=
$port
;
chomp
(
$status
);
last
if
$status
eq
'closed'
;
}
$ad
=
'client_max_body_size 10M;'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/octet-stream/i$ad\' $nginx_path/nginx/nginx.conf"
);
my
$ngx
=
"$nginx_path/nginx/nginx.conf"
;
$handle
->cmd_raw(
$sudo
.
"sed -i 's/\\(^client_max_body_size 10M;$\\\)/ \\1/' $ngx"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/SCRIPT_NAME/PATH_INFO/' "
.
$nginx_path
.
"/local/nginx/fastcgi_params"
);
$ad
=
'# Catalyst requires setting PATH_INFO (instead of SCRIPT_NAME)'
.
' to \$fastcgi_script_name'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/PATH_INFO/i$ad\' $nginx_path/nginx/fastcgi_params"
);
$ad
=
'fastcgi_param SCRIPT_NAME /;'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/PATH_INFO/a$ad\' $nginx_path/nginx/fastcgi_params"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/%NL%/\'\"`echo \\\\\\n`/g\" "
.
"$nginx_path/nginx/fastcgi_params"
);
my
$script
=
<<END;
use Net::FullAuto;
\\x24Net::FullAuto::FA_Core::debug=1;
my \\x24handle=connect_shell();
\\x24handle->print('$nginx_path/nginx/nginx -g \\x22daemon on;\\x22');
\\x24prompt=\\x24handle->prompt();
my \\x24output='';my \\x24password_not_submitted=1;
while (1) {
eval {
local \\x24SIG{ALRM} = sub { die \\x22alarm\\x5Cn\\x22 };# \\x5Cn required
alarm 10;
my \\x24output=fetch(\\x24handle);
last if \\x24output=~/\\x24prompt/;
print \\x24output;
if ((-1<index \\x24output,'Enter PEM pass phrase:') &&
\\x24password_not_submitted) {
\\x24handle->print(\\x24ARGV[0]);
\\x24password_not_submitted=0;
}
};
if (\\x24\@) {
\\x24handle->print();
next;
}
}
exit 0;
END
if
($^O eq
'cygwin'
) {
(
$stdout
,
$stderr
)=
$handle
->cwd(
"~/EmailServer"
);
my
$vimrc
=
<<END;
set paste
set mouse-=a
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$vimrc\" > ~/.vimrc"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"mkdir -vp script"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"touch script/start_nginx.pl"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"chmod -v 755 script/start_nginx.pl"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"chmod o+r $nginx_path/nginx/*"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"chmod -v 755 $nginx_path/nginx/nginx.exe"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$script\" > "
.
"script/start_nginx.pl"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv -I nginx_first_time "
.
"-p /bin/perl -a "
.
"\'${home_dir}EmailServer/script/start_nginx.pl "
.
"\"$service_and_cert_password\"'"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cygrunsrv --start nginx_first_time"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"touch script/first_time_start.flag"
);
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/server_name localhost/"
.
"server_name mail.$domain_url/\' "
.
"$nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/#user nobody;/user www-data;/' "
.
"$nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/#error_page 404 /404.html;/"
.
"error_page 404 /404.html;/' "
.
"$nginx_path/nginx/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable nginx.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"$nginx_path/nginx"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install certbot-nginx'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'certbot -n --nginx --debug --agree-tos --email '
.
"$email_address -d mail.$domain_url"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable nginx.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx status -l'
,
'__display__'
);
}
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cmake --version'
,
'__display__'
);
$stdout
=~s/^.*?\s(\d+\.\d+).*$/$1/;
if
(!(-e
'/usr/local/bin/cmake'
) &&
$stdout
<3.02) {
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'CMake'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./bootstrap --system-curl -- '
.
'-DCMAKE_INSTALL_RPATH="/usr/local/lib64"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"cmake is up to date.\n"
;
}
my
$install_mysql
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
:::::::::::::::::::::::::::::::::' ':::::::::::::
(MariaDB Foundation is **NOT** a (`*..,
sponsor of the FullAuto© Project.) \ , `.
\ \
/ \.
Powered by ( /\ `*,
___ ___ ______ _____ V _ ~-~
| \ / | _ _ / _____| / __ \ | | \
| |\ \/ /| | | | | | \___ \ | | | | | | `
| | \ / | | | |__| | ___) | | |__| | | |____
|_| \/ |_| \___, | |_____/ \___\ \/ \______|®
____| | \_\
|_____/ DATABASE
END
print
$install_mysql
;
sleep
10;
print
"\n\n"
;
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 /opt/source/mariadb'
);
if
(
$stdout
=~/libmariadb/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /opt/mariadb'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source/mariadb'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv *rpm /opt/mariadb'
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'which mysql'
);
my
$mysql_status
=
''
;
my
$mysql_version
=
''
;
if
(
$stdout
=~/\/mysql/) {
(
$mysql_version
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mysql --version'
,
'__display__'
);
$mysql_version
=~s/^mysql\s+Ver\s+(.*?)\s+Distrib.*$/$1/;
(
$mysql_status
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service mysql status -l'
,
'__display__'
);
}
if
(
$mysql_version
<15.1 ||
$mysql_status
!~/Taking your SQL requests/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl stop mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl stop mariadb'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum list installed | grep "[Mm]aria\|[Mm][Yy][Ss][Qq][Ll]"'
,
'__display__'
);
my
@pkgs
=
split
"\n"
,
$stdout
;
foreach
my
$pkg
(
@pkgs
) {
$pkg
=~s/^(.*?)\s+.*$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"yum -y erase $pkg"
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 /opt'
,
'__display__'
);
if
(
$stdout
!~/mariadb/i) {
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mariadb'
,
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'mariadb'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum-builddep -y mariadb-server'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake -DWITH_SSL=yes '
.
'-DSKIP_TESTS=ON '
.
'-DMYSQL_DATADIR=/var/lib/mysql '
.
'-DCMAKE_INSTALL_PREFIX=/usr/local/mysql '
.
'-DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock '
.
'-DWITH_EXTRA_CHARSETS=complex '
.
'-DINSTALL_SYSTEMD_UNITDIR=/etc/systemd/system '
.
'-DOPENSSL_INCLUDE_DIR=/usr/local/include/openssl '
.
'-DOPENSSL_SSL_LIBRARY=/usr/local/lib64/libssl.so '
.
'-DOPENSSL_CRYPTO_LIBRARY='
.
'/usr/local/lib64/libcrypto.so'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'3600'
,
'__display__'
);
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv /opt/mariadb /opt/source/mariadb'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'mariadb'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'groupadd mysql'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd -r -g mysql mysql'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /run/mysqld'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -Rv mysql:root /var/run/mysqld'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install galera perl-DBI'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service mysql stop'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf /var/lib/mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/lib/mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v mysql:root /var/lib/mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 700 /var/lib/mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'scripts/mysql_install_db --user=mysql '
.
'--datadir=/var/lib/mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/mysql/bin/mariadb /bin/mysql'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /etc/mysql/my.cnf.d'
,
'__display__'
);
my
$my_cnf
=
<<END;
# Begin /etc/mysql/my.cnf
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /run/mysqld/mysqld.sock
# The MySQL server
[mysqld]
port = 3306
socket = /run/mysqld/mysqld.sock
datadir = /var/lib/mysql
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 16K
myisam_sort_buffer_size = 8M
# Don't listen on a TCP/IP port at all.
skip-networking
# required unique id between 1 and 2^32 - 1
server-id = 1
# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000
# InnoDB tables are now used by default
innodb_data_home_dir = /var/lib/mysql
innodb_log_group_home_dir = /var/lib/mysql
# All the innodb_xxx values below are the default ones:
innodb_data_file_path = ibdata1:12M:autoextend
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 128M
innodb_log_file_size = 48M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
\\x21includedir /etc/mysql/my.cnf.d
# End /etc/mysql/my.cnf
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$my_cnf\" > ~/my.cnf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/my.cnf /etc/mysql/my.cnf'
,
'__display__'
);
my
$sql_mode_cnf
=
<<END;
[mysqld]
sql_mode=IGNORE_SPACE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$sql_mode_cnf\" > ~/sql_mode.cnf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/sql_mode.cnf /etc/mysql/my.cnf.d/sql_mode.cnf'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service mysql start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service mysql status -l'
,
'__display__'
);
print
"MYSQL START STDOUT=$stdout and STDERR=$stderr<==\n"
;
sleep
5;
print
"\n\n\n\n\n\n\nWE SHOULD HAVE INSTALLED MARIADB=$stdout<==\n\n\n\n\n\n\n"
;
sleep
5;
}
$handle
->
print
(
$sudo
.
'/usr/local/mysql/bin/mariadb-secure-installation'
);
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'root (enter for none):'
) {
$handle
->
print
();
next
;
}
elsif
(-1<
index
$output
,
'so you can safely answer \'n\''
) {
$handle
->
print
(
'n'
);
next
;
}
elsif
(-1<
index
$output
,
'Set root password? [Y/n]'
) {
$handle
->
print
(
'n'
);
next
;
}
elsif
(-1<
index
$output
,
'Switch to unix_socket authentication [Y/n]'
) {
$handle
->
print
(
'n'
);
next
;
}
elsif
(-1<
index
$output
,
'Remove anonymous users? [Y/n]'
) {
$handle
->
print
(
'Y'
);
next
;
}
elsif
(-1<
index
$output
,
'Disallow root login remotely? [Y/n]'
) {
$handle
->
print
(
'Y'
);
next
;
}
elsif
(-1<
index
$output
,
'Remove test database and access to it? [Y/n]'
) {
$handle
->
print
(
'Y'
);
next
;
}
elsif
(-1<
index
$output
,
'Reload privilege tables now? [Y/n]'
) {
$handle
->
print
(
'Y'
);
next
;
}
}
$handle
->cmd(
'echo'
);
$handle
->
print
(
$sudo
.
'mysql -u root'
);
$prompt
=
$handle
->prompt();
my
$cmd_sent
=0;
while
(1) {
my
$output
=fetch(
$handle
);
my
$out
=
$output
;
$out
=~s/
$prompt
//sg;
print
$out
if
$output
!~/^MariaDB.*?>\s*$/;
last
if
$output
=~/
$prompt
|Bye/;
if
(!
$cmd_sent
&&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'DROP DATABASE roundcube;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==1 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'DROP DATABASE mail;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==2 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'CREATE DATABASE roundcube CHARACTER SET '
.
'utf8 COLLATE utf8_general_ci;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$handle
->
print
(
';'
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==3 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'DROP USER roundcube@localhost;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==4 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'CREATE USER roundcube@localhost IDENTIFIED BY '
.
"'"
.
$service_and_cert_password
.
"';"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==5 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'GRANT ALL PRIVILEGES ON roundcube.*'
.
' TO roundcube@localhost;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==6 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"FLUSH PRIVILEGES;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==7 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"CREATE DATABASE mail;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==8 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'DROP USER mailuser@localhost;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==9 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'CREATE USER mailuser@localhost IDENTIFIED BY '
.
"'"
.
$service_and_cert_password
.
"';"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==10 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'GRANT SELECT ON mail.* TO mailuser@localhost IDENTIFIED BY '
.
"'"
.
$service_and_cert_password
.
"';"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==11 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"FLUSH PRIVILEGES;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==12 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"use mail;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==13 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"CREATE TABLE domains ( domain varchar(255) NOT NULL, "
.
"PRIMARY KEY (domain)) ENGINE=MyISAM;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==14 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"CREATE TABLE forwardings ( source varchar(255) NOT NULL, "
.
"destination varchar(255) NOT NULL, PRIMARY KEY (source)) "
.
"ENGINE=MyISAM;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==15 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"CREATE TABLE users ( email varchar(255) NOT NULL, "
.
"password varchar(255) NOT NULL, quota int(10) DEFAULT "
.
"'104857600', PRIMARY KEY (email)) ENGINE=MyISAM;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==16 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"CREATE TABLE transport ( domain varchar(255) NOT NULL, "
.
"transport varchar(255) NOT NULL, UNIQUE KEY domain "
.
"(domain)) ENGINE=MyISAM;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==17 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'CREATE DATABASE postfixadmin CHARACTER SET '
.
'utf8 COLLATE utf8_general_ci;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==18 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'DROP USER postfixadmin@localhost;'
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==19 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'CREATE USER postfixadmin@localhost IDENTIFIED BY '
.
"'"
.
$service_and_cert_password
.
"';"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==20 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
'GRANT ALL ON postfixadmin.* TO postfixadmin@localhost '
.
'IDENTIFIED BY '
.
"'"
.
$service_and_cert_password
.
"';"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
==21 &&
$output
=~/MariaDB.*?>\s*$/) {
my
$cmd
=
"FLUSH PRIVILEGES;"
;
print
"$cmd\n"
;
$handle
->
print
(
$cmd
);
$cmd_sent
++;
sleep
1;
next
;
}
elsif
(
$cmd_sent
>=22 &&
$output
=~/MariaDB.*?>\s*$/) {
print
"quit\n"
;
$handle
->
print
(
'quit'
);
sleep
1;
next
;
}
sleep
1;
$handle
->
print
();
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 /opt/source/mariadb'
);
if
(
$stdout
=~/[Mm]aria[Dd][Bb].
*rpm
/) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /opt/mariadb'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source/mariadb'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv *rpm /opt/mariadb'
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
my
$vn
=7;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'strings /usr/local/lib/libmcrypt.so | grep libmcrypt-2.5.8'
);
unless
(
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot -O libmcrypt-2.5.8.tar.gz '
.
'libmcrypt-2.5.8.tar.gz/download'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar zxvf libmcrypt-2.5.8.tar.gz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'libmcrypt-2.5.8'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"libmcrypt is up to date\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Current version is (.*?)[<].*$/$1/s;
$stdout
=
'1.6.1'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"strings /usr/local/lib64/libzip.so | grep $stdout"
);
unless
(
$stdout
) {
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'libzip'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'git -P tag -l'
,
'__display__'
);
$stdout
=~s/^.*\n(rel-\d-\d-\d).*$/$1/s;
$stdout
=
'rel-1-6-1'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout $stdout"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp build'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'build'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake .. '
.
'-DCMAKE_SHARED_LINKER_FLAGS="-L/usr/local/lib64" '
.
'-DCMAKE_INSTALL_RPATH="/usr/local/lib64" '
.
'-DOPENSSL_INCLUDE_DIR=/usr/local/include/openssl '
.
'-DOPENSSL_SSL_LIBRARY=/usr/local/lib64/libssl.so '
.
'-DOPENSSL_CRYPTO_LIBRARY='
.
'/usr/local/lib64/libcrypto.so'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v libzip.pc /usr/lib64/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"libzip is up to date\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?libsodium (.*?)-stable.*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"strings /usr/local/lib/libsodium.so | grep $stdout"
);
unless
(
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 | grep libsodium'
);
if
(
$stdout
=~/^\s
*libsodium
\s*$/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf libsodium-old'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v libsodium libsodium-old'
,
'__display__'
);
}
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s &&
$stdout
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'libsodium'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'git checkout -b remotes/origin/stable'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./autogen.sh -s'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v libsodium.pc /usr/lib64/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
$build_php
=1;
}
else
{
print
"libsodium is up to date.\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?php-(
$vn
.*?)\.tar\.gz.*$/$1/s;
my
$phpv
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1 | grep php-src$'
);
my
$php_build
=0;
if
(
$stdout
=~/^\s
*php
-src\s*$/s) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'head -n5 php-src/NEWS'
);
$stdout
=~s/^.*, PHP (.*?)\n.*$/$1/s;
unless
(
$phpv
eq
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rvf php-src-old'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v php-src php-src-old'
,
'__display__'
);
$php_build
=1;
}
}
else
{
$php_build
=1 }
if
(
$php_build
||
$build_php
) {
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'php-src'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout php-$phpv"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./buildconf --force'
,
'__display__'
);
my
$pear
=(
$vn
eq 8)?
'--with-pear '
:
''
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure --prefix=/usr/local/php'
.
$vn
.
' '
.
'--with-config-file-path=/usr/local/php'
.
$vn
.
'/etc '
.
'--with-config-file-scan-dir=/usr/local/php'
.
$vn
.
'/etc/conf.d '
.
'--enable-bcmath '
.
'--with-bz2 '
.
'--with-curl '
.
$pear
.
'--enable-filter '
.
'--enable-fpm '
.
'--with-fpm-systemd '
.
'--enable-gd '
.
'--with-freetype '
.
'--with-imap '
.
'--with-imap-ssl '
.
'--with-jpeg '
.
'--enable-intl '
.
'--enable-exif '
.
'--enable-mbstring '
.
'--with-gmp '
.
'--with-sodium '
.
'--enable-mysqlnd '
.
'--with-mysql-sock=/var/lib/mysql/mysql.sock '
.
'--with-mysqli=mysqlnd '
.
'--with-pdo-mysql=mysqlnd '
.
'--with-pdo-sqlite '
.
'--disable-phpdbg '
.
'--disable-phpdbg-webhelper '
.
'--enable-opcache '
.
'--with-openssl '
.
'--enable-simplexml '
.
'--with-sqlite3 '
.
'--enable-xmlreader '
.
'--enable-xmlwriter '
.
'--with-zip '
.
'--with-zlib '
.
'--with-libdir=lib64 '
.
'--with-kerberos'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make -j2'
,300,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/php'
.
$vn
.
'/bin/php /usr/local/bin/php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/php'
.
$vn
.
'/bin/php /usr/bin/php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./php.ini-production /usr/local/php'
.
$vn
.
'/etc/php.ini'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/post_max_size = 8M/post_max_size = 500M/\' "
.
"/usr/local/php$vn/etc/php.ini"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s#^.*pdo_mysql.default_socket.*\$#"
.
"pdo_mysql.default_socket = /var/run/mysqld/mysqld.sock#\' "
.
"/usr/local/php$vn/etc/php.ini"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s#;date.timezone =#date.timezone = \"America/Chicago\"#\' "
.
"/usr/local/php$vn/etc/php.ini"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/upload_max_filesize = 2M/upload_max_filesize = 500M/\' "
.
"/usr/local/php$vn/etc/php.ini"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/max_execution_time = 30/max_execution_time = 7500/\' "
.
"/usr/local/php$vn/etc/php.ini"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s/memory_limit = 128M/memory_limit = 256M/\' '
.
'/usr/local/php'
.
$vn
.
'/etc/php.ini'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/\' '
.
'/usr/local/php'
.
$vn
.
'/etc/php.ini'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/php'
.
$vn
.
'/etc/conf.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/php'
.
$vn
.
'/etc/php-fpm.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./sapi/fpm/www.conf /usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./sapi/fpm/php-fpm.conf /usr/local/php'
.
$vn
.
'/etc'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#;pid = run/php-fpm.pid#pid = /var/run/php-fpm.pid#" '
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/run/php-fpm'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/log/php-fpm'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#;error_log = log/php-fpm.log#'
.
'error_log = /var/log/php-fpm/php-fpm.log#" '
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#;catch_workers_output = yes#'
.
'catch_workers_output = yes#" '
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
my
$zend
=
<<END;
; Zend OPcache
zend_extension=opcache.so
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$zend\" > "
.
'/usr/local/php'
.
$vn
.
'/etc/conf.d/modules.ini'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's#listen = 127.0.0.1:9000#"
.
"listen = /var/run/php-fpm/www.sock#' "
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/^user = nobody/user = www-data/' "
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/^group = nobody/group = www-data/' "
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/\;env.PATH./env[PATH]/' "
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i 's/;listen.mode = 0660/listen.mode = 0666/' "
.
'/usr/local/php'
.
$vn
.
'/etc/php-fpm.d/www.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s /usr/local/php'
.
$vn
.
'/sbin/php-fpm /usr/sbin/php-fpm'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /opt/source/php-src/sapi/fpm/php-fpm.service '
.
'/etc/systemd/system'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#PIDFile=/usr/local/php'
.
$vn
.
'#PIDFile=#" '
.
'/etc/systemd/system/php-fpm.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl daemon-reload'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable php-fpm.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm status -l'
,
'__display__'
);
$prompt
=
$handle
->prompt();
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
$handle
->
print
(
$sudo
.
'/usr/local/bin/php /opt/source/go-pear.phar'
);
my
$outputt
=
''
;
while
(
my
$line
=fetch(
$handle
)) {
last
if
$line
=~/
$prompt
/s;
$outputt
.=
$line
;
if
(
$outputt
=~/Enter to
continue
:\s*$/s) {
$handle
->
print
();
$outputt
=
''
;
}
elsif
(-1<
index
$outputt
,
'/php.ini>? [Y/n] :'
) {
$handle
->
print
(
'n'
);
$outputt
=
''
;
}
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'--output-document /usr/local/ssl/cert.pem'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pecl channel-update pecl.php.net'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?get\/(mailparse-.*?).tgz.*$/$1/s;
my
$version
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/php$vn/bin/pecl install $version"
,
'__display__'
);
$version
=
''
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'bash -c "echo extension=mailparse.so > '
.
'/usr/local/php'
.
$vn
.
'/etc/conf.d/mailparse.ini"'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'ImageMagick/download/ImageMagick.zip'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'unzip -o ImageMagick.zip'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'ImageMag*'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure --with-modules'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v /usr/local/lib'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?get\/(imagick-.*?).tgz.*$/$1/s;
$version
=
$stdout
;
$handle
->
print
(
$sudo
.
"/usr/local/php$vn/bin/pecl install $version"
);
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
.=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'autodetect'
) {
$handle
->
print
(
''
);
$output
=
''
;
}
sleep
1;
}
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm status -l'
,
'__display__'
);
}
elsif
(-e
'/opt/cpanel/ea-php70'
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /opt/cpanel/ea-php70/root/etc/php-fpm.d/www.conf.default '
.
'/opt/cpanel/ea-php70/root/etc/php-fpm.d/www.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/etc/init.d/ea-php70-php-fpm start'
,
'__display__'
);
}
else
{
print
"php is up to date.\n"
;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
my
$install_postfix
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
######## ####### ###### ######## ######## #### ## ##
## ## ## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ##
######## ## ## ###### ## ###### ## ###
## ## ## ## ## ## ## ## ##
## ## ## ## ## ## ## ## ## ##
## ####### ###### ## ## #### ## ##
(POSTFIX is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd postfix --system --uid 4098 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'groupadd postdrop'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_postfix
;
sleep
5;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'3600'
);
$stdout
=~s/^.*?href=[
"]([^"
]+)?["][>]Source code.*$/$1/s;
my
$gtarfile
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
'__display__'
);
$gtarfile
=~s/^.*\///;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar zxvf $gtarfile"
,
'__display__'
);
$gtarfile
=~s/.tar.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$gtarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make makefiles CCARGS="-DUSE_TLS -DHAS_MYSQL -DUSE_SASL_AUTH '
.
'-DUSE_CYRUS_SASL -I/usr/include/sasl -I/usr/local/mysql/include/mysql" '
.
'AUXLIBS="-L/usr/lib -lsasl2 -lssl -lcrypto -Wl,-rpath /usr/local/mysql/lib" '
.
'AUXLIBS_MYSQL="-L/usr/local/mysql/lib -lmysqlclient -lz -lm"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
$handle
->
print
(
$sudo
.
'make install'
);
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'install_root:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'tempdir:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'config_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'command_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'daemon_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'data_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'html_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'mail_owner:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'mailq_path:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'manpage_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'newaliases_path:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'queue_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'readme_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'sendmail_path:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'setgid_group:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'shlib_directory:'
) {
$handle
->
print
();
}
elsif
(-1<
index
$output
,
'meta_directory:'
) {
$handle
->
print
();
}
next
;
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /etc/postfix/sql'
,
'__display__'
);
my
$mysql_virtual_domains_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
hosts = unix:/var/run/mysqld/mysqld.sock
dbname = postfixadmin
query = SELECT domain FROM domain WHERE domain='\\x25s' AND active = '1'
#query = SELECT domain FROM domain WHERE domain='\\x25s'
#optional query to use when relaying for backup MX
#query = SELECT domain FROM domain WHERE domain='\\x25s' AND backupmx = '0' AND active = '1'
#expansion_limit = 100
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_domains_maps\" > "
.
"${home_dir}mysql_virtual_domains_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_domains_maps.cf /etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_mailbox_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
hosts = unix:/var/run/mysqld/mysqld.sock
dbname = postfixadmin
query = SELECT maildir FROM mailbox WHERE username='\\x25s' AND active = '1'
#expansion_limit = 100
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_mailbox_maps\" > "
.
"${home_dir}mysql_virtual_mailbox_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_mailbox_maps.cf /etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_alias_mailbox_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '\\x25d' and mailbox.username = CONCAT('\\x25u', '\@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
hosts = unix:/var/run/mysqld/mysqld.sock
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_alias_mailbox_maps\" > "
.
"${home_dir}mysql_virtual_alias_mailbox_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_alias_mailbox_maps.cf /etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_alias_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
dbname = postfixadmin
query = SELECT goto FROM alias WHERE address='\\x25s' AND active = '1'
#expansion_limit = 100
hosts = unix:/var/run/mysqld/mysqld.sock
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_alias_maps\" > "
.
"${home_dir}mysql_virtual_alias_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_alias_maps.cf /etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_alias_domain_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '\\x25d' and alias.address = CONCAT('\\x25u', '\@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
hosts = unix:/var/run/mysqld/mysqld.sock
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_alias_domain_maps\" > "
.
"${home_dir}mysql_virtual_alias_domain_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_alias_domain_maps.cf /etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_alias_domain_mailbox_maps
=
<<END;
user = postfixadmin
password = $service_and_cert_password
dbname = postfixadmin
query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = '\\x25d' and mailbox.username = CONCAT('\\x25u', '\@', alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active='1'
hosts = unix:/var/run/mysqld/mysqld.sock
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_alias_domain_mailbox_maps\" > "
.
"${home_dir}mysql_virtual_alias_domain_mailbox_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_alias_domain_mailbox_maps.cf "
.
"/etc/postfix/sql"
,
'__display__'
);
my
$mysql_virtual_alias_domain_catchall_maps
=
<<END;
# handles catch-all settings of target-domain
user = postfixadmin
password = $service_and_cert_password
dbname = postfixadmin
query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = '\\x25d' and alias.address = CONCAT('\@', alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active='1'
hosts = unix:/var/run/mysqld/mysqld.sock
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$mysql_virtual_alias_domain_catchall_maps\" > "
.
"${home_dir}mysql_virtual_alias_domain_catchall_maps.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v ${home_dir}mysql_virtual_alias_domain_catchall_maps.cf "
.
"/etc/postfix/sql"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 0640 /etc/postfix/sql/*'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v root:root /etc/postfix/sql/*'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'setfacl -R -m u:postfix:rx /etc/postfix/sql/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd dovenull --system --uid 4099 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd dovecot --system --uid 5000 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'gpasswd -a dovecot mail'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd vmail --system --uid 2000 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -v /var/mail/vmail'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -Rv vmail:vmail /var/mail/vmail/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chcon -Rv -t mail_spool_t /var/mail/vmail/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postfix start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postfix reload'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postfix status'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "inet_interfaces = all"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'mydestination = $myhostname, localhost.$mydomain, '
.
'localhost, $mydomain\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "mydestination = mail.'
.
$domain_url
.
', \$myhostname, '
.
'localhost.\$mydomain, localhost"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "myhostname = mail.'
.
$domain_url
.
'"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "mydomain = mail.'
.
$domain_url
.
'"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "myorigin = mail.'
.
$domain_url
.
'"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "virtual_mailbox_base = /var/mail/vmail"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "virtual_minimum_uid = 2000"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "virtual_uid_maps = static:2000"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "virtual_gid_maps = static:2000"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_auth_enable = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_helo_required = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'broken_sasl_auth_clients = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_recipient_restrictions '
.
'= permit_mynetworks, permit_sasl_authenticated, '
.
'reject_unauth_destination\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_relay_restrictions '
.
'= permit_mynetworks, permit_sasl_authenticated, '
.
'defer_unauth_destination\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_use_tls = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"postconf -e \'smtpd_tls_cert_file = "
.
"/etc/letsencrypt/live/mail.$domain_url/fullchain.pem\'"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"postconf -e \'smtpd_tls_key_file = "
.
"/etc/letsencrypt/live/mail.$domain_url/privkey.pem\'"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'strict_rfc821_envelopes = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'disable_vrfy_command = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'mailbox_size_limit = 0\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'message_size_limit = 0\''
,
'__display__'
);
$ad
=
<<END;
mailbox_transport = lmtp:unix:private/dovecot-lmtp
smtputf8_enable = no
virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
virtual_mailbox_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
virtual_alias_maps =
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
virtual_transport = lmtp:unix:private/dovecot-lmtp
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /etc/postfix/main.cf ~'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 777 ~/main.cf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> "
.
"~/main.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'$d\' ~/main.cf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/main.cf /etc/postfix/main.cf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v root:root /etc/postfix/main.cf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 644 /etc/postfix/main.cf'
,
'__display__'
);
if
(
ref
$main::aws
eq
'HASH'
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e '
.
'\'relayhost = [email-smtp.us-west-2.amazonaws.com]:587\' '
,
'\'smtp_sasl_auth_enable = yes\' '
.
'\'smtp_sasl_security_options = noanonymous\' '
.
'\'smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd\' '
.
'\'smtp_use_tls = yes\' '
.
'\'smtp_tls_security_level = encrypt\' '
.
'\'smtp_tls_note_starttls_offer = yes\' '
.
'\'smtpd_tls_received_header = yes\''
,
'__display__'
);
my
(
$hash
,
$output
,
$error
)=(
''
,
''
,
''
);
my
$c
=
"aws iam list-access-keys --user-name ses_postfix_email"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$hash
||={};
foreach
my
$hash
(@{
$hash
->{AccessKeyMetadata}}) {
my
$c
=
"aws iam delete-access-key "
.
"--access-key-id $hash->{AccessKeyId} "
.
"--user-name ses_postfix_email"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
}
sleep
1;
$c
=
"aws iam delete-user --user-name ses_postfix_email"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$c
=
"aws iam create-user --user-name ses_postfix_email"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$c
=
"aws iam create-access-key --user-name ses_postfix_email"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$hash
||={};
my
$access_id
=
$hash
->{AccessKey}{AccessKeyId};
my
$secret_access_key
=
$hash
->{AccessKey}{SecretAccessKey};
my
$python_smtp_generator
=
<<END;
#\\x21/usr/bin/env python3
import hmac
import hashlib
import base64
import argparse
SMTP_REGIONS = [
'us-east-2', # US East (Ohio)
'us-east-1', # US East (N. Virginia)
'us-west-2', # US West (Oregon)
'ap-south-1', # Asia Pacific (Mumbai)
'ap-northeast-2', # Asia Pacific (Seoul)
'ap-southeast-1', # Asia Pacific (Singapore)
'ap-southeast-2', # Asia Pacific (Sydney)
'ap-northeast-1', # Asia Pacific (Tokyo)
'ca-central-1', # Canada (Central)
'eu-central-1', # Europe (Frankfurt)
'eu-west-1', # Europe (Ireland)
'eu-west-2', # Europe (London)
'sa-east-1', # South America (Sao Paulo)
'us-gov-west-1', # AWS GovCloud (US)
]
# These values are required to calculate the signature. Do not change them.
DATE = \\x2211111111\\x22
SERVICE = \\x22ses\\x22
MESSAGE = \\x22SendRawEmail\\x22
TERMINAL = \\x22aws4_request\\x22
VERSION = 0x04
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
def calculate_key(secret_access_key, region):
if region not in SMTP_REGIONS:
raise ValueError(f\\x22The {region} Region doesn't have an SMTP endpoint.\\x22)
signature = sign((\\x22AWS4\\x22 + secret_access_key).encode('utf-8'), DATE)
signature = sign(signature, region)
signature = sign(signature, SERVICE)
signature = sign(signature, TERMINAL)
signature = sign(signature, MESSAGE)
signature_and_version = bytes([VERSION]) + signature
smtp_password = base64.b64encode(signature_and_version)
return smtp_password.decode('utf-8')
def main():
parser = argparse.ArgumentParser(
description='Convert a Secret Access Key for an IAM user to an SMTP password.')
parser.add_argument(
'secret', help='The Secret Access Key to convert.')
parser.add_argument(
'region',
help='The AWS Region where the SMTP password will be used.',
choices=SMTP_REGIONS)
args = parser.parse_args()
print(calculate_key(args.secret, args.region))
if __name__ == '__main__':
main()
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$python_smtp_generator\" > ~/smtp_credentials_generate.py"
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'~'
);
my
$smtppass
=
''
;
(
$smtppass
,
$stderr
)=
$handle
->cmd(
"python smtp_credentials_generate.py $secret_access_key us-west-2"
);
my
$sasl_password
=
<<"END";
[email-smtp.us-west-2.amazonaws.com]:587 $access_id:$smtppass
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$sasl_password\" > "
.
"sasl_passwd"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v sasl_passwd /etc/postfix'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v root:root /etc/postfix/sasl_passwd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -vf ~/smtp_credentials_generate.py'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postmap hash:/etc/postfix/sasl_passwd'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v root:root /etc/postfix/sasl_passwd.db'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 0600 /etc/postfix/sasl_passwd '
.
'/etc/postfix/sasl_passwd.db'
,
'__display__'
);
my
$sespolicy
=
<<END;
{
\\x22Version\\x22:\\x222012-10-17\\x22,
\\x22Statement\\x22: [{
\\x22Effect\\x22:\\x22Allow\\x22,
\\x22Action\\x22:\\x22ses:SendRawEmail\\x22,
\\x22Resource\\x22:\\x22*\\x22
}]}
END
chop
$sespolicy
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$sespolicy\" > ./sespolicy"
);
$c
=
"aws iam list-policies"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$hash
||={};
foreach
my
$policy
(@{
$hash
->{Policies}}) {
if
(
$policy
->{PolicyName} eq
'sespolicy'
) {
$c
=
"aws iam detach-user-policy --user-name ses_postfix_email "
.
"--policy-arn $policy->{Arn}"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
$c
=
"aws iam delete-policy --policy-arn $policy->{Arn}"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
last
;
}
}
$c
=
"aws iam create-policy --policy-name sespolicy --policy-document "
.
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
my
$policy_arn
=
$hash
->{Policy}->{Arn};
$c
=
"aws iam attach-user-policy --user-name ses_postfix_email "
.
"--policy-arn $policy_arn"
;
(
$hash
,
$output
,
$error
)=run_aws_cmd(
$c
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rm -rfv ./sespolicy'
,
'__display__'
);
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_type = dovecot\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_path = private/auth\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_local_domain = $mydomain\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_security_options = noanonymous\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_auth_enable = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_security_level = may\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_sasl_auth_enable = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_received_headers = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_auth_only = no\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_log_level = 1\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_note_starttls_offer = yes\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtpd_tls_session_cache_timeout = 3600s\''
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'smtp_tls_CAfile = /etc/ssl/certs/ca-bundle.crt\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'postscreen_access_list = '
.
'permit_mynetworks cidr:/etc/postfix/postscreen_access.cidr\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e \'postscreen_blacklist_action = drop\''
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ifconfig'
);
$stdout
=~s/^.*?inet (.*?) .*$/$1/s;
$ad
=
<<END;
#permit my own IP addresses.
$public_ip/32 permit
$stdout/32 permit
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" > "
.
"~/postscreen_access.cidr"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/postscreen_access.cidr /etc/postfix'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v root:root /etc/postfix/postscreen_access.cidr'
,
'__display__'
);
$ad
=
'submission inet n - - - - smtpd%NL%'
.
' -o syslog_name=postfix/submission%NL%'
.
' -o smtpd_tls_security_level=encrypt%NL%'
.
' -o smtpd_sasl_auth_enable=yes%NL%'
.
' -o smtpd_sasl_type=dovecot%NL%'
.
' -o smtpd_sasl_path=private/auth%NL%'
.
' -o smtpd_reject_unlisted_recipient=no%NL%'
.
' -o smtpd_client_restrictions=permit_sasl_authenticated,reject%NL%'
.
' -o milter_macro_daemon_name=ORIGINATING%NL%'
.
'smtps inet n - - - - smtpd%NL%'
.
' -o syslog_name=postfix/smtps%NL%'
.
' -o smtpd_tls_wrappermode=yes%NL%'
.
' -o smtpd_sasl_auth_enable=yes%NL%'
.
' -o smtpd_sasl_type=dovecot%NL%'
.
' -o smtpd_sasl_path=private/auth%NL%'
.
' -o smtpd_client_restrictions=permit_sasl_authenticated,reject%NL%'
.
' -o milter_macro_daemon_name=ORIGINATING'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/tlsproxy/a$ad\' /etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/%NL%/\'\"`echo \\\\\\n`/g\" "
.
"/etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/^smtp inet/Xsmtp inet/\' "
.
"/etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#smtp inet/smtp inet/\' "
.
"/etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#smtpd/smtpd/\' /etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#dnsblog/dnsblog/\' /etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#tlsproxy/tlsproxy/\' /etc/postfix/master.cf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/Xsmtp/#smtp/\' /etc/postfix/master.cf"
);
$ad
=
<<'END';
[Unit]
Description=Postfix Mail Transport Agent
After=syslog.target network-online.target
Wants=network-online.target
Conflicts=sendmail.service exim.service
[Service]
Type=forking
PIDFile=/var/spool/postfix/pid/master.pid
EnvironmentFile=-/etc/sysconfig/network
#ExecStartPre=-/usr/libexec/postfix/aliasesdb
#ExecStartPre=-/usr/libexec/postfix/chroot-update
ExecStart=/usr/sbin/postfix start
ExecReload=/usr/sbin/postfix reload
ExecStop=/usr/sbin/postfix stop
[Install]
WantedBy=multi-user.target
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" > "
.
"~/postfix.service"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/postfix.service /etc/systemd/system'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl daemon-reload'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable postfix.service'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postfix stop'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service postfix start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service postfix status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install nmap'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'yum -y install telnet'
,
'__display__'
);
my
$install_postfixadmin
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
_ __ _ _ _
_ __ ___ ___| |_ / _(_)_ __ __ _ __| |_ __ ___ (_)_ __
| '_ \ / _ \/ __| __| |_| \ \/ / / _` |/ _` | '_ ` _ \| | '_ \
| |_) | (_) \__ \ |_| _| |> < | (_| | (_| | | | | | | | | | |
| .__/ \___/|___/\__|_| |_/_/\_(_)__,_|\__,_|_| |_| |_|_|_| |_|
|_|
(postfix.admin is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_postfixadmin
;
sleep
5;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postfixadmin/releases/latest'
);
$stdout
=~s/^.*?return_to.*?(postfixadmin-.*?)["].*$/$1/s;
my
$pfix
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
"/archive/$pfix.tar.gz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $pfix.tar.gz"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mv -v *$pfix /var/www/html/postfixadmin"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/www/html/postfixadmin/templates_c'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -R www-data:www-data /var/www'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'find /var/www -type f'
);
foreach
my
$file
(
split
/\n/,
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 644 '
.
$file
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'find /var/www -type d'
);
foreach
my
$dir
(
split
/\n/,
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 755 '
.
$dir
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'setfacl -R -m u:www-data:rwx /var/www/html/postfixadmin/templates_c/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'setsebool -P httpd_can_network_connect 1'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'setfacl -R -m u:www-data:rx /etc/letsencrypt/live/ '
.
'/etc/letsencrypt/archive/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'php -r \'echo password_hash("'
.
$service_and_cert_password
.
'", PASSWORD_DEFAULT);\''
);
my
$pfapassword
=
$stdout
;
$ad
=
<<END;
<?php
\\x24CONF['configured'] = true;
\\x24CONF['database_type'] = 'mysqli';
\\x24CONF['database_host'] = 'localhost';
\\x24CONF['database_port'] = '3306';
\\x24CONF['database_user'] = 'postfixadmin';
\\x24CONF['database_password'] = \'$service_and_cert_password\';
\\x24CONF['database_socket'] = '/var/run/mysqld/mysqld.sock';
\\x24CONF['database_name'] = 'postfixadmin';
\\x24CONF['encrypt'] = 'dovecot:SHA512';
\\x24CONF['dovecotpw'] = \\x22/usr/local/bin/doveadm pw -r 12\\x22;
\\x24CONF['setup_password'] = \'$pfapassword\';
\\x24CONF['default_aliases'] = array (
'abuse' => \'abuse\@$domain_url\',
'hostmaster' => \'hostmaster\@$domain_url\',
'postmaster' => \'postmaster\@$domain_url\',
'webmaster' => \'webmaster\@$domain_url\'
);
\\x24CONF['fetchmail'] = 'NO';
\\x24CONF['show_footer_text'] = 'NO';
\\x24CONF['quota'] = 'YES';
\\x24CONF['domain_quota'] = 'YES';
\\x24CONF['quota_multiplier'] = '1024000';
\\x24CONF['used_quotas'] = 'YES';
\\x24CONF['new_quota_table'] = 'YES';
\\x24CONF['aliases'] = '0';
\\x24CONF['mailboxes'] = '0';
\\x24CONF['maxquota'] = '0';
\\x24CONF['domain_quota_default'] = '0';
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" > "
.
"~/pfa_config"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/pfa_config '
.
'/var/www/html/postfixadmin/config.local.php'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -R www-data:www-data /var/www/html/postfixadmin'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'bash /var/www/postfixadmin/scripts/postfixadmin-cli '
.
'admin add superadmin@'
.
$domain_url
.
' --superadmin 1 '
.
'--active 1 --password '
.
$service_and_cert_password
.
' --password2 '
.
$service_and_cert_password
,
'__display__'
);
$ad
=
<<END;
server {
listen 80;
listen [::]:80;
server_name postfixadmin.$domain_url;
root /var/www/html/postfixadmin/public/;
index index.php index.html;
access_log /var/log/nginx/postfixadmin_access.log;
error_log /var/log/nginx/postfixadmin_error.log;
location / {
try_files \\x24uri \\x24uri/ /index.php;
}
location ~ ^/(.+\\x5C.php)\\x24 {
try_files \\x24uri =404;
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \\x24document_root\\x24fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}
}
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"cp -v /etc/nginx/nginx.conf ~/nginx.conf"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sed -i "s/^}}/}/" ~/nginx.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> "
.
"~/nginx.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/nginx.conf /etc/nginx/nginx.conf'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'certbot -n --nginx --debug --agree-tos --email '
.
"$email_address -d postfixadmin.$domain_url"
,
'__display__'
);
my
$install_dovecot
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
###### ###### ######## ######## ###### ###### ########
# ## ## ## # ## # # # ## ## ## ## # #
# # ## # ## # # ## # # ##### # ## # # ## # ### ###
# ## # # ## # # ## # # # # ##### # ## # # #
# ## # # ## # # ## # # ### # ##### # ## # # #
# # ## # ## # ## ## # ##### # ## # # ## # # #
# ## ## ## ## ## # # ## ## ## ## # #
###### ###### #### ######## ###### ###### ####
(DOVECOT is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_dovecot
;
sleep
5;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Stable releases.*?[<]a href=[
"]([^"
]+)?["]\s.*$/$1/s;
$gtarfile
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
$stdout
,
'__display__'
);
$gtarfile
=~s/^.*\///;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar zxvf $gtarfile"
,
'__display__'
);
$gtarfile
=~s/.tar.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$gtarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'"LDFLAGS=-L/usr/local/lib64 -Wl,'
.
'-rpath /usr/local/lib64 -Wl,'
.
'-rpath /usr/local/mysql/lib" '
.
'"CFLAGS=-I/usr/local/openssl/include" '
.
'./configure --localstatedir=/var '
.
'--with-mysql --with-ssl=openssl'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'doc/example-config'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v dovecot.conf /usr/local/etc/dovecot'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#protocols/protocols/\' "
.
"/usr/local/etc/dovecot/dovecot.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#listen =/listen =/\' "
.
"/usr/local/etc/dovecot/dovecot.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/lmtp submission/lmtp submission sieve/\' "
.
"/usr/local/etc/dovecot/dovecot.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#base_dir/base_dir/\' "
.
"/usr/local/etc/dovecot/dovecot.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"mkdir -vp /usr/local/etc/dovecot/conf.d"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -v conf.d/10-mail.conf /usr/local/etc/dovecot/conf.d"
,
'__display__'
);
$ad
=
'mail_location = maildir:/var/mail/vmail/%d/%n/'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s*#mail_location =*$ad*\' "
.
"/usr/local/etc/dovecot/conf.d/10-mail.conf"
);
$ad
=
'mail_privileged_group = mail'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#mail_privileged_group =/$ad/\' "
.
"/usr/local/etc/dovecot/conf.d/10-mail.conf"
);
$ad
=
'mail_plugins = quota'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#mail_plugins =/$ad/\' "
.
"/usr/local/etc/dovecot/conf.d/10-mail.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -v conf.d/10-auth.conf /usr/local/etc/dovecot/conf.d"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#disable_/disable_/\' "
.
"/usr/local/etc/dovecot/conf.d/10-auth.conf"
);
$ad
=
'auth_mechanisms = plain login'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/auth_mechanisms = plain/$ad/\' "
.
"/usr/local/etc/dovecot/conf.d/10-auth.conf"
);
$ad
=
'auth_username_format = %u'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#auth_username_format = %Lu/$ad\' "
.
"/usr/local/etc/dovecot/conf.d/10-auth.conf"
);
$ad
=
'!include auth-sql.conf.ext'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/#!include auth-sql.conf.ext/$ad/\' "
.
"/usr/local/etc/dovecot/conf.d/10-auth.conf"
);
$ad
=
'#!include auth-system.conf.ext'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/!include auth-system.conf.ext/$ad/\' "
.
"/usr/local/etc/dovecot/conf.d/10-auth.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /usr/local/etc/dovecot/conf.d/10-auth.conf ~'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 777 ~/10-auth.conf'
,
'__display__'
);
$ad
=
<<END;
auth_debug = yes
auth_debug_passwords = yes
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/10-auth.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/10-auth.conf /usr/local/etc/dovecot/conf.d/10-auth.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v conf.d/auth-sql.conf.ext '
.
'/usr/local/etc/dovecot/conf.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s#args = /etc#args = /usr/local/etc#\' "
.
"/usr/local/etc/dovecot/conf.d/auth-sql.conf.ext"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v dovecot-sql.conf.ext /usr/local/etc/dovecot'
,
'__display__'
);
$ad
=
'%NL%'
.
'driver = mysql%NL%'
.
'connect = host=/var/run/mysqld/mysqld.sock dbname=postfixadmin '
.
"user=postfixadmin password=$service_and_cert_password%NL%"
.
'default_pass_scheme = SHA512-CRYPT%NL%'
.
'password_query = SELECT username as user, '
.
'password FROM mailbox WHERE username=%SQ%%u%SQ% AND '
.
'active=%SQ%1%SQ%%NL%'
.
'user_query = SELECT maildir, 2000 AS uid, 2000 AS gid '
.
'FROM mailbox WHERE username = %SQ%%u%SQ% and '
.
'active=%SQ%1%SQ%%NL%'
.
'iterate_query = SELECT username AS user FROM mailbox'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'/iterate_query/a$ad\' "
.
"/usr/local/etc/dovecot/dovecot-sql.conf.ext"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \'s/%NL%/\'\"`echo \\\\\\n`/g\" "
.
"/usr/local/etc/dovecot/dovecot-sql.conf.ext"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/%SQ%/\'/g\" "
.
"/usr/local/etc/dovecot/dovecot-sql.conf.ext"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chown -Rv vmail:dovecot /usr/local/etc/dovecot"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chmod -R o-rwx /usr/local/etc/dovecot"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -v conf.d/10-master.conf "
.
"/usr/local/etc/dovecot/conf.d"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#ssl =/ssl =/g\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#port = 143/port = 0/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#port = 993/port = 993/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#port = 995/port = 995/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#port = 110/port = 0/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
$ad
=
'unix_listener /var/spool/postfix/private/dovecot-lmtp'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s*unix_listener lmtp*$ad*\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#mode = 0666/{s/#mode = 0666/mode = 0600X/}\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#mode = 0666/{s/#mode = 0666/mode = 0660/}\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#user = /{s/#user =/user = postfix/}\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#group = /{s/#group =/group = postfix/}\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"/mode = 0600/a%SP%%SP%%SP%%SP%group = postfix\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/%SP%/ /g\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"/mode = 0600/a%SP%%SP%%SP%%SP%user = postfix\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/# mode = 0666/ mode = 0600X/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#}/ s/#}/X}/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"0,/#}/ s/#}/}/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/X}/#}/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/0600X/0600/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#user = .default_internal_user/user = dovecot/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/%SP%/ /g\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
$ad
=
'unix_listener /var/spool/postfix/private/auth'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s*unix_listener auth-userdb*$ad*\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
$ad
=
'unix_listener auth-userdb'
;
my
$bd
=
'#unix_listener /var/spool/postfix/private/auth'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s*$bd*$ad*\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#user = root/user = vmail/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#port = 587/port = 8587/\" "
.
"/usr/local/etc/dovecot/conf.d/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -v conf.d/auth-system.conf.ext "
.
"/usr/local/etc/dovecot/conf.d"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -v conf.d/10-ssl.conf "
.
"/usr/local/etc/dovecot/conf.d"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/#ssl = yes/ssl = required/\" "
.
"/usr/local/etc/dovecot/conf.d/10-ssl.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s*ssl/certs/dovecot.pem*"
.
"letsencrypt/live/mail.$domain_url/fullchain.pem*\" "
.
"/usr/local/etc/dovecot/conf.d/10-ssl.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s*ssl/private/dovecot.pem*"
.
"letsencrypt/live/mail.$domain_url/privkey.pem*\" "
.
"/usr/local/etc/dovecot/conf.d/10-ssl.conf"
);
$ad
=
<<END;
service stats {
unix_listener stats-reader {
user = www-data
group = www-data
mode = 0660
}
unix_listener stats-writer {
user = www-data
group = www-data
mode = 0660
}
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /usr/local/etc/dovecot/conf.d/10-master.conf ~'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 777 ~/10-master.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/10-master.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/10-master.conf /usr/local/etc/dovecot/conf.d/10-master.conf'
,
'__display__'
);
my
$name
=
getpwuid
($<);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"gpasswd -a $name dovecot"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"ls -1 /usr/local/etc/dovecot/conf.d"
);
foreach
my
$file
(
split
/\n/,
$stdout
) {
next
if
$file
=~/\.+$/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chmod -v 660 /usr/local/etc/dovecot/conf.d/$file"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"chown -v vmail:dovecot /usr/local/etc/dovecot/conf.d/$file"
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"gpasswd -d $name dovecot"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'gpasswd -a www-data dovecot'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'gpasswd -a www-data vmail'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
"/opt/source/$gtarfile"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/run/dovecot'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v dovecot.service.in /etc/systemd/system/dovecot.service'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#PIDFile=/usr/local#PIDFile=#" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s*.sbindir.*/usr/local/sbin*" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/#ProtectSystem/ProtectSystem/" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s*.bindir.*/usr/local/bin*" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s*.rundir.*/var/run/dovecot*" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s*@systemdservicetype@*simple*" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "/ExecStop/iKillMode=none" '
.
'/etc/systemd/system/dovecot.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl daemon-reload'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable saslauthd.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service saslauthd restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service saslauthd status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable dovecot.service'
.
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service dovecot restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service dovecot status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
my
$install_roundcube
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
888 888
888 888
888 888
88d888 .d88b. 888 88888888b. .d88888 .d8888b888 88888888b. .d88b.
888P" d88""88b888 888888 "88bd88" 888d88P" 888 888888 "88bd8P Y8b
888 888 888888 888888 888888 888888 888 888888 88888888888
888 Y88..88PY88b 888888 888Y88b 888Y88b. Y88b 888888 d88PY8b.
888 "Y88P" "Y88888888 888 "Y88888 "Y8888P "Y8888888888P" "Y8888
(roundcube is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_roundcube
;
sleep
5;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Stable version.*?href=[
"](https[^"
]+)?["].*$/$1/s;
$gtarfile
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
$stdout
,
'__display__'
);
$gtarfile
=~s/^.*\///;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $gtarfile"
,
'__display__'
);
$gtarfile
=~s/.tar.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$gtarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v composer.json-dist composer.json'
,
'__display__'
);
$handle
->
print
(
$sudo
.
'php composer-stable.phar install --no-dev'
);
$prompt
=
$handle
->prompt();
while
(1) {
my
$output
.=fetch(
$handle
);
last
if
$output
=~/
$prompt
/;
print
$output
;
if
(-1<
index
$output
,
'user'
) {
$handle
->
print
(
'yes'
);
$output
=
''
;
}
sleep
1;
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'bin/install-jsdeps.sh'
,
'__display__'
);
my
$rcfile
=
'./SQL/mysql.initial.sql'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mysql --verbose --force -u roundcube -p'
.
"'"
.
$service_and_cert_password
.
"' roundcube < $rcfile"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/www/html/roundcube'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cp -Rv $gtarfile/* /var/www/html/roundcube"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -R www-data:www-data /var/www/html/roundcube'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'find /var/www/html/roundcube -type f'
);
foreach
my
$file
(
split
/\n/,
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 644 '
.
$file
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'find /var/www -type d'
);
foreach
my
$dir
(
split
/\n/,
$stdout
) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 755 '
.
$dir
,
'__display__'
);
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'gpasswd -a www-data mysql'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"setfacl -R -m u:www-data:rwx /var/www/html/roundcube/temp/ "
.
"/var/www/html/roundcube/logs/"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -vp /var/www/html/roundcube/config/config.inc.php.sample '
.
'/var/www/html/roundcube/config/config.inc.php'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -vp /var/www/html/roundcube/plugins/managesieve/config.inc.php.dist '
.
'/var/www/html/roundcube/plugins/managesieve/config.inc.php'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/_vacation\'\] = 0/_vacation\'\] = 1/" '
.
'/var/www/html/roundcube/plugins/managesieve/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s/_forward\'\] = 0/_forward\'\] = 1/" '
.
'/var/www/html/roundcube/plugins/managesieve/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/mail/vmail/pgp-keys'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v vmail:vmail /var/mail/vmail/pgp-keys'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 775 /var/mail/vmail/pgp-keys'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -vp /var/www/html/roundcube/plugins/enigma/config.inc.php.dist '
.
'/var/www/html/roundcube/plugins/enigma/config.inc.php'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -vp /var/www/html/roundcube/plugins/markasjunk/config.inc.php.dist '
.
'/var/www/html/roundcube/plugins/markasjunk/config.inc.php'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#_pgp_homedir\'\] = null;#_pgp_homedir\'\]'
.
' = \'/var/mail/vmail/pgp-keys\';#" '
.
'/var/www/html/roundcube/plugins/enigma/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "/zipdownload/a%SP%%SP%%SP%%SP%\'managesieve\'," '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "/managesieve/a%SP%%SP%%SP%%SP%\'enigma\'," '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "/enigma/a%SP%%SP%%SP%%SP%\'markasjunk\'," '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i \"s/%SP%/ /g\" "
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#roundcube:pass#roundcube:'
.
$service_and_cert_password
.
'#" /var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#roundcubemail#roundcube#" '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#localhost\'#ssl://mail.'
.
$domain_url
.
'\'#" '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#= 587# = 465#" '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#Roundcube Webmail#GetWisdom Webmail#" '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/var/www/html/roundcube/config/config.inc.php'
);
my
$p_wrd
=
$Net::FullAuto::ISets::Local::EmailServer_is::create_strong_password
->(24);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i "s#rcmail-\!24ByteDESkey\*Str#'
.
$p_wrd
.
'#" '
.
'/var/www/html/roundcube/config/config.inc.php'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear channel-update pear.php.net'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install Mail_Mime'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install Net_SMTP'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php7/bin/pear install '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install Auth_SASL'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install Net_Sieve'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install '
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/php'
.
$vn
.
'/bin/pear install Crypt_GPG'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm stop'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service nginx status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service php-fpm status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'crontab -u www-data -l | { cat; echo "18 11 * * * '
.
'/var/www/html/roundcube/bin/cleandb.sh"; } | '
.
'sudo crontab -u www-data -'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'crontab -u root -l | { cat; echo -e "43 6 * * * '
.
'certbot renew --post-hook \\x22systemctl reload nginx\\x22"; } | '
.
'sudo crontab -u root -'
,
'__display__'
);
my
$install_redis
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
### ###
###### #### ### ####
####### ### ## ###### ### ### ##
### ## ### ### ####### ### ###
### ### ## ### ### ###
### ####### ####### ### ## ###
### #### ###### #### ####
(redis is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_redis
;
sleep
5;
my
$done
=0;
my
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'redis'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'git tag --list'
);
$stdout
=~s/^.*[^v](\d+\.\d+\.\d+)\s.*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout $stdout"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git status"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make CFLAGS="-I/usr/local/include/openssl" '
.
'LDFLAGS="-L/usr/local/lib64" '
.
'BUILD_TLS=yes USE_SYSTEMD=yes'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'src'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/gcc -pedantic -DREDIS_STATIC= -std=c11 -Wall -W '
.
'-Wno-missing-field-initializers -O2 -g -ggdb '
.
'-I../deps/lua/src -I../deps/hiredis '
.
'-I/usr/local/include/openssl -MMD -o '
.
'sentinel.o -c sentinel.c'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source/redis'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make CFLAGS="-I/usr/local/include/openssl" '
.
'LDFLAGS="-L/usr/local/lib64" '
.
'BUILD_TLS=yes USE_SYSTEMD=yes'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"make install"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i '/information/avm.overcommit_memory = 1' /etc/sysctl.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sysctl vm.overcommit_memory=1'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"sed -i '/overcommit/anet.core.somaxconn=65535' /etc/sysctl.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sysctl net.core.somaxconn=65535'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd redis --system --uid 5002 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/var/lib/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v redis:redis /usr/local/var/lib/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/var/log/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v redis:redis /usr/local/var/log/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/var/run/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v redis:redis /usr/local/var/run/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/etc/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v redis:redis /usr/local/etc/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v redis.conf /usr/local/etc/redis'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/run/redis'
,
'__display__'
);
my
$redis_service
=
<<'END';
# example systemd service unit file for redis-server
#
# In order to use this as a template for providing a redis service in your
# environment, _at the very least_ make sure to adapt the redis configuration
# file you intend to use as needed (make sure to set \\x22supervised systemd\\x22), and
# to set sane TimeoutStartSec and TimeoutStopSec property values in the unit's
# \\x22[Service]\\x22 section to fit your needs.
#
# Some properties, such as User= and Group=, are highly desirable for virtually
# all deployments of redis, but cannot be provided in a manner that fits all
# expectable environments. Some of these properties have been commented out in
# this example service unit file, but you are highly encouraged to set them to
# fit your needs.
#
# Please refer to systemd.unit(5), systemd.service(5), and systemd.exec(5) for
# more information.
[Unit]
Description=Redis data structure server
Wants=network-online.target
After=network-online.target
[Service]
Type=notify
ExecStart=/usr/local/bin/redis-server /usr/local/etc/redis/redis.conf --supervised systemd --daemonize no
ExecStop=/bin/kill -s TERM \\x24MAINPID
PIDFile=/var/run/redis/redis.pid
Restart=always
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=2755
TimeoutStopSec=90
TimeoutStartSec=90
UMask=0077
PrivateTmp=yes
NoNewPrivileges=yes
LimitNOFILE=65535
PrivateDevices=yes
ProtectHome=yes
ReadOnlyDirectories=/
WorkingDirectory=/usr/local/var/lib/redis
ReadWriteDirectories=-/usr/local/var/lib/redis
ReadWriteDirectories=-/usr/local/var/log/redis
ReadWriteDirectories=-/usr/local/var/run/redis
NoNewPrivileges=true
CapabilityBoundingSet=CAP_SETGID CAP_SETUID CAP_SYS_RESOURCE
#MemoryDenyWriteExecute=true
#ProtectKernelModules=true
#ProtectKernelTunables=true
#ProtectControlGroups=true
#RestrictRealtime=true
#RestrictNamespaces=true
RestrictAddressFamilies=AF_INET AF_INET6 AF_UNIX
ProtectSystem=true
ReadWriteDirectories=-/usr/local/etc/redis
[Install]
WantedBy=multi-user.target
Alias=redis.service
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$redis_service\" > "
.
"~/redis.service"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/redis.service /etc/systemd/system'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl daemon-reload'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable redis.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service redis start'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service redis status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
my
$install_unbound
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
## ## ## ## ######## ####### ## ## ## ## ########
## ## ### ## ## ## ## ## ## ## ### ## ## ##
## ## #### ## ## ## ## ## ## ## #### ## ## ##
## ## ## ## ## ######## ## ## ## ## ## ## ## ## ##
## ## ## #### ## ## ## ## ## ## ## #### ## ##
## ## ## ### ## ## ## ## ## ## ## ### ## ##
####### ## ## ######## ####### ####### ## ## ########
(unbound is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_unbound
;
sleep
5;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.
*most
-recent-version.*?href=[
"]([^"
]+)["].*$/$1/s;
my
$utarfile
=
$stdout
;
$utarfile
=~s/^.*\/(.*)$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
'__display__'
);
$utarfile
=~s/^.*\/(.*)$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $utarfile"
,
'__display__'
);
$utarfile
=~s/\.tar\.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$utarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'pwd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -v unbound.build'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'unbound.build'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'../configure LDFLAGS="-Wl,-rpath /usr/local/lib -Wl,'
.
'-rpath /usr/local/lib64"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./contrib/libunbound.pc /usr/local/lib/pkgconfig'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./contrib/unbound.service /etc/systemd/system'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'1,/NotifyAccess=/!d\' '
.
'/etc/systemd/system/unbound.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s/=+/=/\' '
.
'/etc/systemd/system/unbound.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl daemon-reload'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd unbound --system --uid 5003 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s/nameserver/#nameserver/\' '
.
'/etc/resolv.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'/nameserver/anameserver 127.0.0.1\' '
.
'/etc/resolv.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable unbound.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service unbound restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service unbound status -l'
,
'__display__'
);
my
$install_rspamd
=
<<'END';
o o o .oPYo. ooooo .oo o o o o o .oPYo.
8 8b 8 8 8 .P 8 8 8 8 8b 8 8 8
8 8`b 8 `Yooo. 8 .P 8 8 8 8 8`b 8 8
8 8 `b 8 `8 8 oPooo8 8 8 8 8 `b 8 8 oo
8 8 `b8 8 8 .P 8 8 8 8 8 `b8 8 8
8 8 `8 `YooP' 8 .P 8 8oooo 8oooo 8 8 `8 `YooP8
........................................................
::::::::::::::::::::::::::::::::::::::::::::::::::::::::
######## ###### ######## ### ## ## ########
## ## ## ## ## ## ## ## ### ### ## ##
## ## ## ## ## ## ## #### #### ## ##
######## ###### ######## ## ## ## ### ## ## ##
## ## ## ## ######### ## ## ## ##
## ## ## ## ## ## ## ## ## ## ##
## ## ###### ## ## ## ## ## ########
(RSPAMD is **NOT** a sponsor of the FullAuto© Project.)
END
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
print
$install_rspamd
;
sleep
5;
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'ninja'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'git checkout release'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake -Bbuild-cmake -H.'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake --build build-cmake'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ./build-cmake/ninja /usr/local/bin'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'glib'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'PATH=/usr/local/bin:$PATH /usr/local/bin/meson _build'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'PATH=/usr/local/bin:$PATH /usr/local/bin/ninja -C _build install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp ./_build/glib/glibconfig.h /usr/local/include/glib-2.0/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Stable.*?href=[
"](.*?)["
].*$/$1/s;
$gtarfile
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
$gtarfile
=~s/^.*\///;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $gtarfile"
,
'__display__'
);
$gtarfile
=~s/^(.*)[.]tar.*$/$1/;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$gtarfile
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"./configure"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"make install"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'luajit-2.0'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'boost'
);
my
$boost_tag
=
''
;
foreach
my
$tag
(
reverse
split
/\n/,
$stdout
) {
$boost_tag
=
$tag
;
last
unless
$tag
=~/beta/;
}
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout $boost_tag"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./bootstrap.sh'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=clean_filehandle(
$handle
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./b2 install'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'hyperscan'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake -DCMAKE_POSITION_INDEPENDENT_CODE=ON .'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'libmagic'
,
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'libmagic'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'aclocal -I .'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'libtoolize --copy --force'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'autoreconf -ifv'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'rspamd'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'git -P tag -l'
);
$stdout
=~s/^.*\n(.*)$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"git checkout $stdout"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -v rspamd.build'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'rspamd.build'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/cmake .. -DENABLE_HYPERSCAN=ON -DENABLE_LUAJIT=ON '
.
'-DCMAKE_BUILD_TYPE=RelWithDebuginfo '
.
'-DCMAKE_CXX_COMPILER=/usr/local/bin/g++ '
.
'-DCMAKE_C_COMPILER=/usr/local/bin/gcc '
.
'-DCMAKE_INSTALL_RPATH=/usr/local/lib64 '
.
'-DOPENSSL_ROOT_DIR=/usr/local/include/openssl'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'3600'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'/include/a\/usr/local/lib64\' /etc/ld.so.conf'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ldconfig -v'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /usr/local/etc/rspamd/local.d'
,
'__display__'
);
$ad
=
'use = ["x-spamd-bar", "x-spam-level", "authentication-results"];'
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" > "
.
"~/milter_headers.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -fv ~/milter_headers.conf /usr/local/etc/rspamd/local.d'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v ../rspamd.service /etc/systemd/system'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s#/usr/bin#/usr/local/bin#\' '
.
'/etc/systemd/system/rspamd.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'sed -i \'s#/etc#/usr/local/etc#\' '
.
'/etc/systemd/system/rspamd.service'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'useradd _rspamd --system --uid 5004 -s /usr/bin/nologin '
.
'--user-group --no-create-home'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/log/rspamd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v _rspamd:_rspamd /var/log/rspamd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/lib/rspamd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -v _rspamd:_rspamd /var/lib/rspamd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'echo -e "bind_socket = \\x22127.0.0.1:11333\\x22;" > ~/wn.inc'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/wn.inc /usr/local/etc/rspamd/local.d/worker-normal.inc'
,
'__display__'
);
my
$wp_inc
=
<<END;
bind_socket = \\x22127.0.0.1:11332\\x22;
milter = yes;
timeout = 120s;
upstream \\x22local\\x22 {
default = yes;
self_scan = yes;
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$wp_inc\" > ~/wp.inc"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/wp.inc /usr/local/etc/rspamd/local.d/worker-proxy.inc'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"/usr/local/bin/rspamadm pw --encrypt -p "
.
$service_and_cert_password
);
$stdout
=~s
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"password = \\x22$stdout\\x22;\" > ~/wc.inc"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/wc.inc /usr/local/etc/rspamd/local.d/worker-controller.inc'
,
'__display__'
);
my
$cb_conf
=
<<END;
servers = \\x22127.0.0.1\\x22;
backend = \\x22redis\\x22;
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$cb_conf\" > ~/cb.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/cb.conf /usr/local/etc/rspamd/local.d/classifier-bayes.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "milter_protocol = 6"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "milter_mail_macros = i {mail_addr} '
.
'{client_addr} {client_name} {auth_authen}"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "milter_default_action = accept"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "smtpd_milters = inet:127.0.0.1:11332"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "default_destination_rate_delay = 2s"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'postconf -e "default_destination_recipient_limit = 50"'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service postfix restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service postfix status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
$stdout
=~s/^.*?Stable releases.*?href=[
"]([^"
]+)["].*$/$1/s;
my
$pg_rl
=
$stdout
;
$pg_rl
=~s/^.*\///;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
$stdout
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"tar xvf $pg_rl"
,
'__display__'
);
$pg_rl
=~s/.tar.gz$//;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$pg_rl
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./configure'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make install'
,
'__display__'
);
$ad
=
<<END;
protocol lmtp {
postmaster_address = postmaster\@$domain_url
mail_plugins = \\x24mail_plugins quota sieve
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/20-lmtp.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/20-lmtp.conf /usr/local/etc/dovecot/conf.d/20-lmtp.conf'
,
'__display__'
);
$ad
=
<<END;
namespace inbox {
inbox = yes
location =
mailbox Archive {
auto = subscribe
special_use = \\x5CArchive
}
mailbox Drafts {
auto = subscribe
special_use = \\x5CDrafts
}
mailbox Spam {
special_use = \\x5CJunk
auto = subscribe
}
mailbox Junk {
auto = subscribe
special_use = \\x5CJunk
}
mailbox Sent {
auto = subscribe
special_use = \\x5CSent
}
mailbox Trash {
auto = subscribe
special_use = \\x5CTrash
}
prefix =
separator = /
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/15-mailboxes.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/15-mailboxes.conf '
.
'/usr/local/etc/dovecot/conf.d/15-mailboxes.conf'
,
'__display__'
);
$ad
=
<<END;
plugin {
quota = dict:User quota::proxy::sqlquota
quota_rule = \\x2A:storage=5GB
quota_rule2 = Trash:storage=+100M
quota_grace = 10\\x25\\x25
quota_exceeded_message = Quota exceeded, please contact your system administrator.
quota_warning = storage=100\\x25\\x25 quota-warning 100 \\x25u
quota_warning2 = storage=95\\x25\\x25 quota-warning 95 \\x25u
quota_warning3 = storage=90\\x25\\x25 quota-warning 90 \\x25u
quota_warning4 = storage=85\\x25\\x25 quota-warning 85 \\x25u
}
service quota-warning {
executable = script /usr/local/bin/quota-warning.sh
user = vmail
unix_listener quota-warning {
group = vmail
mode = 0660
user = vmail
}
}
dict {
sqlquota = mysql:/usr/local/etc/dovecot/dovecot-dict-sql.conf.ext
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/90-quota.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/90-quota.conf '
.
'/usr/local/etc/dovecot/conf.d/90-quota.conf'
,
'__display__'
);
$ad
=
<<END;
#\\x21/bin/sh
PERCENT=\\x241
USER=\\x242
cat << EOF | /usr/lib/dovecot/dovecot-lda -d \\x24USER -o \\x22plugin/quota=dict:User quota::noenforcing:proxy::sqlquota\\x22
From: postmaster\@$domain_url
Subject: Quota warning
Your mailbox is now \\x24PERCENT\\x25 full.
EOF
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/quota-warning.sh"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/quota-warning.sh /usr/local/bin/quota-warning.sh'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v +x /usr/local/bin/quota-warning.sh'
,
'__display__'
);
$ad
=
<<END;
connect = host=/var/run/mysqld/mysqld.sock dbname=postfixadmin user=postfixadmin password=$service_and_cert_password
map {
pattern = priv/quota/storage
table = quota2
username_field = username
value_field = bytes
}
map {
pattern = priv/quota/messages
table = quota2
username_field = username
value_field = messages
}
# map {
# pattern = shared/expire/\\x24user/\\x24mailbox
# table = expires
# value_field = expire_stamp
#
# fields {
# username = \\x24user
# mailbox = \\x24mailbox
# }
# }
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/dovecot-dict-sql.conf.ext"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/dovecot-dict-sql.conf.ext '
.
'/usr/local/etc/dovecot/conf.d/dovecot-dict-sql.conf.ext'
,
'__display__'
);
$ad
=
<<END;
protocol imap {
mail_plugins = \\x24mail_plugins imap_quota imap_sieve
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/20-imap.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/20-imap.conf '
.
'/usr/local/etc/dovecot/conf.d/20-imap.conf'
,
'__display__'
);
$ad
=
<<END;
service managesieve-login {
inet_listener sieve {
port = 4190
}
}
service managesieve {
process_limit = 1024
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/20-managesieve.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/20-managesieve.conf '
.
'/usr/local/etc/dovecot/conf.d/20-managesieve.conf'
,
'__display__'
);
$ad
=
<<END;
plugin {
sieve = file:~/sieve;active=~/.dovecot.sieve
sieve_plugins = sieve_imapsieve sieve_extprograms
sieve_before = /var/mail/vmail/sieve/global/spam-global.sieve
sieve = file:/var/mail/vmail/sieve/\\x25d/\\x25n/scripts;active=/var/mail/vmail/sieve/\\x25d/\\x25n/active-script.sieve
imapsieve_mailbox1_name = Spam
imapsieve_mailbox1_causes = COPY
imapsieve_mailbox1_before = file:/var/mail/vmail/sieve/global/report-spam.sieve
imapsieve_mailbox2_name = \\x2A
imapsieve_mailbox2_from = Spam
imapsieve_mailbox2_causes = COPY
imapsieve_mailbox2_before = file:/var/mail/vmail/sieve/global/report-ham.sieve
sieve_pipe_bin_dir = /usr/bin
sieve_global_extensions = +vnd.dovecot.pipe
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/90-sieve.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/90-sieve.conf '
.
'/usr/local/etc/dovecot/conf.d/90-sieve.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/mail/vmail/sieve/global'
,
'__display__'
);
$ad
=
<<END;
require [\\x22fileinto\\x22,\\x22mailbox\\x22];
if anyof(
header :contains [\\x22X-Spam-Flag\\x22] \\x22YES\\x22,
header :contains [\\x22X-Spam\\x22] \\x22Yes\\x22,
header :contains [\\x22Subject\\x22] \\x22\\x2A\\x2A\\x2A SPAM \\x2A\\x2A\\x2A\\x22
)
{
fileinto :create \\x22Spam\\x22;
stop;
}
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/spam-global.sieve"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/spam-global.sieve '
.
'/var/mail/vmail/sieve/global/spam-global.sieve'
,
'__display__'
);
$ad
=
<<END;
require [\\x22vnd.dovecot.pipe\\x22, \\x22copy\\x22, \\x22imapsieve\\x22];
pipe :copy \\x22rspamc\\x22 [\\x22learn_spam\\x22];
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/report-spam.sieve"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/report-spam.sieve '
.
'/var/mail/vmail/sieve/global/report-spam.sieve'
,
'__display__'
);
$ad
=
<<END;
require [\\x22vnd.dovecot.pipe\\x22, \\x22copy\\x22, \\x22imapsieve\\x22];
pipe :copy \\x22rspamc\\x22 [\\x22learn_ham\\x22];
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/report-ham.sieve"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/report-ham.sieve '
.
'/var/mail/vmail/sieve/global/report-ham.sieve'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service dovecot restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service dovecot status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/sievec '
.
'/var/mail/vmail/sieve/global/spam-global.sieve'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/sievec '
.
'/var/mail/vmail/sieve/global/report-spam.sieve'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'/usr/local/bin/sievec '
.
'/var/mail/vmail/sieve/global/report-ham.sieve'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -Rv vmail: /var/mail/vmail/sieve/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mkdir -vp /var/lib/rspamd/dkim/'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo '
.
'/usr/local/bin/rspamadm dkim_keygen -b 2048 -s mail -k '
.
'/var/lib/rspamd/dkim/mail.key | sudo tee -a '
.
'/var/lib/rspamd/dkim/mail.pub'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chown -Rv _rspamd: /var/lib/rspamd/dkim'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'chmod -v 440 /var/lib/rspamd/dkim/*'
,
'__display__'
);
$ad
=
<<END;
selector = \\x22mail\\x22;
path = \\x22/var/lib/rspamd/dkim/\\x24selector.key\\x22;
allow_username_mismatch = true;
END
(
$stdout
,
$stderr
)=
$handle
->cmd(
"echo -e \"$ad\" >> ~/dkim_signing.conf"
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'mv -v ~/dkim_signing.conf '
.
'/usr/local/etc/rspamd/local.d/dkim_signing.conf'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v /usr/local/etc/rspamd/local.d/dkim_signing.conf '
.
'/usr/local/etc/rspamd/local.d/arc.conf'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'systemctl enable rspamd.service'
,
'__display__'
);
sleep
2;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service rspamd restart'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'service rspamd status -l'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
$done
=0;
$gittry
=0;
while
(
$done
==0) {
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'__display__'
);
if
(++
$gittry
>5) {
print
"\n\n FATAL ERROR: $stderr\n\n"
;
cleanup();
}
my
$gittest
=
'Connection reset by peer|'
.
'Could not read from remote repository'
;
$done
=1
if
$stderr
!~/
$gittest
/s;
last
if
$done
;
sleep
30;
}
(
$stdout
,
$stderr
)=
$handle
->cwd(
'Unhide'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo /usr/local/bin/gcc -Wall -O2 -l:libpthread.so '
.
'unhide-linux*.c unhide-output.c -o unhide-linux'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo /usr/local/bin/gcc -Wall -O2 unhide_rb.c -o unhide_rb'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo /usr/local/bin/gcc -Wall -O2 unhide-tcp.c '
.
'unhide-tcp-fast.c unhide-output.c -o unhide-tcp'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
'sudo /usr/local/bin/gcc -Wall -O2 unhide-posix.c -o unhide-posix'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v unhide-linux unhide_rb unhide-tcp unhide-posix /usr/bin'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/usr/bin'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ln -s unhide-linux unhide'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar xvf skdet-1.0.tar.bz2'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'skdet-1.0/src'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'wget --random-wait --progress=dot '
.
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'patch --verbose --force skdet.c <skdet-fix-includes.diff'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'patch --verbose --force usage.c <skdet-fix-includes.diff'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'..'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make clean'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'make'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'cp -v skdet /usr/bin'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cwd(
'/opt/source'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"wget --random-wait --progress=dot "
.
"projects/rkhunter/files/latest/download"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'tar xvf rkhunter.tar.gz'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'ls -1'
);
$stdout
=~s/^.*(rkhunter-.*?)\n.*$/$1/s;
(
$stdout
,
$stderr
)=
$handle
->cwd(
$stdout
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'./installer.sh --install'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
'rkhunter --propupd'
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"cat /var/lib/rspamd/dkim/mail.pub"
);
$stdout
=~s/^.*?[
"](.*)["
].*$/$1/s;
$stdout
=~s/\n//g;
$stdout
=~s/
"\s+"
//g;
my
$txt_r
=
$stdout
;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"dig -x $public_ip"
);
my
$dkim
=
<<END;
In DNS, create a new TXT record with mail._domainkey as a name
while the value/content of the TXT record should look like this:
$txt_r
Also, create a DMARC policy with _dmarc as a name while the
value/content of the TXT record should look like this:
v=DMARC1; p=none; adkim=r; aspf=r;
It may take a while for the DNS changes to propagate.
You can check whether the records have propagated using the dig command:
dig mail._domainkey.$domain_url TXT +short
dig _dmarc.$domain_url TXT +short
Create these accounts with PostFixAdmin:
abuse\@$domain_url hostmaster\@$domain_url
postmaster\@$domain_url webmaster\@$domain_url
Finally, ask your hosting provider to create a PTR record:
$stdout
END
print
$dkim
;
sleep
60;
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"dig mail._domainkey.$domain_url TXT +short"
,
'__display__'
);
(
$stdout
,
$stderr
)=
$handle
->cmd(
$sudo
.
"dig _dmarc.$domain_url TXT +short"
,
'__display__'
);
my
$thanks
=
<<'END';
______ _ ,
/ / / ' ) / /
--/ /_ __. ____ /_ / / __ . . /
(_/ / /_(_/|_/ / <_/ <_ (__/_(_)(_/_' For Trying
//
_ _ _ _____ _ _ _ _
| \ | | ___| |_ | ___| _| | | / \ _ _| |_ |
| \| |/ _ \ __| o o | |_ | | | | | | / _ \| | | | __/ | \
| |\ | __/ |_ o o | _|| |_| | | |/ ___ \ |_| | || |
|_| \_|\___|\__| |_| \__,_|_|_/_/ \_\__,_|\__\___/ (C)
Copyright (C) 2000-2024 Brian M. Kelly Brian.Kelly@FullAuto.com
END
eval
{
local
$SIG
{ALRM} =
sub
{
die
"alarm\n"
};
alarm
15;
print
$thanks
;
print
" \n Press Any Key to EXIT ... "
;
<STDIN>;
};
alarm
(0);
print
"\n\n"
;
cleanup;
};
my
$standup_emailserver
=
sub
{
my
$catalyst
=
"]T[{select_emailserver_setup}"
;
my
$password
=
"]I[{'enter_password',1}"
;
my
$email_address
=
"]I[{'email_address',1}"
;
my
$stripe_pub
=
"]I[{'stripe_keys',1}"
;
my
$stripe_sec
=
"]I[{'stripe_keys',2}"
;
my
$recaptcha_pub
=
"]I[{'recaptcha_keys',1}"
;
my
$recaptcha_sec
=
"]I[{'recaptcha_keys',2}"
;
my
$domain_url
=
"]I[{'domain_url',1}"
;
my
$cnt
=0;
$configure_emailserver
->(
$catalyst
,
$domain_url
,
$password
,
$email_address
,
$stripe_pub
,
$stripe_sec
,
$recaptcha_pub
,
$recaptcha_sec
);
return
'{choose_demo_setup}<'
;
};
my
$emailserver_setup_summary
=
sub
{
my
$region
=
"]T[{awsregions}"
;
$region
=~s/^"//;
$region
=~s/"$//;
my
$type
=
"]T[{select_type}"
;
$type
=~s/^"//;
$type
=~s/"$//;
my
$money
=
$type
;
$money
=~s/^.*-> \$(.*?) +(?:[(].+[)] )*\s
*per
hour$/$1/;
$type
=
substr
(
$type
,0,(
index
$type
,
' ->'
)-3);
my
$catalyst
=
"]T[{select_emailserver_setup}"
;
$catalyst
=~s/^"//;
$catalyst
=~s/"$//;
print
"REGION=$region and TYPE=$type\n"
;
print
"CATALYST=$catalyst\n"
;
my
$num_of_servers
=0;
my
$ol
=
$catalyst
;
$ol
=~s/^.*(\d+)\sServer.*$/$1/;
if
(
$ol
==1) {
$main::aws
->{
'CatalystFramework.org'
}->[0]=[];
}
elsif
(
$ol
=~/^\d+$/ &&
$ol
) {
foreach
my
$n
(0..
$ol
) {
$main::aws
->{
'CatalystFramework.org'
}=[]
unless
exists
$main::aws
->{
'CatalystFramework.org'
};
$main::aws
->{
'CatalystFramework.org'
}->[
$n
]=[];
}
}
$num_of_servers
=
$ol
;
my
$cost
=
int
(
$num_of_servers
)
*$money
;
my
$cents
=
''
;
if
(
$cost
=~/^0\./) {
$cents
=
$cost
;
$cents
=~s/^0\.//;
if
(
length
$cents
>2) {
$cents
=~s/^(..)(.*)$/$1.$2/;
$cents
=~s/^0//;
$cents
=
' ('
.
$cents
.
' cents)'
;
}
else
{
$cents
=
' ('
.
$cents
.
' cents)'
;
}
}
my
$show_cost_banner
=
<<'END';
_ _ ___ _ ___
/_\ __ __ ___ _ __| |_ / __|___ __| ||__ \
/ _ \/ _/ _/ -_) '_ \ _| | (__/ _ (_-< _|/_/
/_/ \_\__\__\___| .__/\__| \___\___/__/\__(_)
|_|
END
$show_cost_banner
.=
<<END;
Note: There is a \$$cost per hour cost$cents to launch $num_of_servers
AWS EC2 $type servers for the FullAuto Demo:
$catalyst
END
my
%show_cost
=(
Name
=>
'show_cost'
,
Item_1
=> {
Text
=>
"I accept the \$$cost$cents per hour cost"
,
Result
=>
$standup_emailserver
,
},
Item_2
=> {
Text
=>
"Return to Choose Demo Menu"
,
Result
=>
sub
{
return
'{choose_demo_setup}<'
},
},
Item_3
=> {
Text
=>
"Exit FullAuto"
,
Result
=>
sub
{ cleanup() },
},
Scroll
=> 1,
Banner
=>
$show_cost_banner
,
);
return
\
%show_cost
;
};
our
$recaptcha_keys
=
sub
{
my
$password_banner
=
<<'END';
___ _ _ _ __
_ _ ___ / __|__ _ _ __| |_ __| |_ __ _ | |/ /___ _ _ ___
| '_/ -_) (__/ _` | '_ \ _/ _| ' \/ _` | | ' </ -_) || (_-<
|_| \___|\___\__,_| .__/\__\__|_||_\__,_| |_|\_\___|\_, /__/
|_| |__/
END
$password_banner
.=
<<END;
Paste the necessary reCaptcha Keys here:
*** BE SURE TO WRITE IT DOWN AND KEEP IT SOMEWHERE SAFE! ***
Input box with === border is highlighted (active) input box.
Use [TAB] key to switch focus between input boxes.
Publish Key
]I[{1,'',46}
Secret Key
]I[{2,'',46}
END
my
$recaptcha_keys
={
Name
=>
'recaptcha_keys'
,
Input
=> 1,
Result
=>
$standup_emailserver
,
Banner
=>
$password_banner
,
};
return
$recaptcha_keys
;
};
our
$stripe_keys
=
sub
{
my
$password_banner
=
<<'END';
___ _ _ _ __
/ __| |_ _ _(_)_ __ ___ | |/ /___ _ _ ___
\__ \ _| '_| | '_ \/ -_) | ' </ -_) || (_-<
|___/\__|_| |_| .__/\___| |_|\_\___|\_, /__/
|_| |__/
END
$password_banner
.=
<<END;
Paste the necessary Stripe Account Keys here:
*** BE SURE TO WRITE IT DOWN AND KEEP IT SOMEWHERE SAFE! ***
Input box with === border is highlighted (active) input box.
Use [TAB] key to switch focus between input boxes.
Publish Key
]I[{1,'',46}
Secret Key
]I[{2,'',46}
END
my
$stripe_keys
={
Name
=>
'stripe_keys'
,
Input
=> 1,
Result
=>
$recaptcha_keys
,
Banner
=>
$password_banner
,
};
return
$stripe_keys
;
};
our
$email_address
=
sub
{
my
$email_banner
=
<<'END';
___ _ _ _ _ _
| __|_ __ __ _(_) | /_\ __| |__| |_ _ ___ ______
| _|| ' \/ _` | | | / _ \/ _` / _` | '_/ -_|_-<_-<
|___|_|_|_\__,_|_|_| /_/ \_\__,_\__,_|_| \___/__/__/
END
$email_banner
.=
<<END;
Type or Paste the necessary Email Address for EmailServer here:
Input box with === border is highlighted (active) input box.
Use [TAB] key to switch focus between input boxes.
Email Address
]I[{1,'brian.kelly\@fullauto.com',45}
Confirm Address
]I[{2,'brian.kelly\@fullauto.com',45}
END
my
$email_address
={
Name
=>
'email_address'
,
Input
=> 1,
Result
=>
$standup_emailserver
,
Banner
=>
$email_banner
,
};
return
$email_address
;
};
our
$create_strong_password
=
sub
{
my
$length
=
$_
[0]||15;
my
$minlen
=
$length
;
my
$maxlen
=
$length
;
my
@set
=(
"A"
..
"Z"
,
"a"
..
"z"
,0..9,
"#"
,
"-"
,
"_"
,
"@"
,
"%"
,
"^"
,
"="
);
my
$word
=
''
;
foreach
my
$count
(1..50) {
print
"\n Generating Password ...\n"
;
$word
=
eval
{
local
$SIG
{ALRM} =
sub
{
die
"alarm\n"
};
alarm
7;
my
$word
=chars(
$minlen
,
$maxlen
,\
@set
);
print
"\n Trying Password - $word ...\n"
;
die
if
-1<
index
$word
,
'*'
;
die
if
-1<
index
$word
,
'$'
;
die
if
-1<
index
$word
,
'+'
;
die
if
-1<
index
$word
,
'&'
;
die
if
-1<
index
$word
,
'/'
;
die
if
-1<
index
$word
,
'!'
;
die
if
-1<
index
$word
,
'^'
;
die
if
-1<
index
$word
,
'#'
;
die
if
$word
!~/\d/;
die
if
$word
!~/[A-Z]/;
die
if
$word
!~/[a-z]/;
die
if
$word
!~/[@%=]/;
return
$word
;
};
alarm
0;
last
if
$word
;
}
return
$word
;
};
our
$choose_strong_password
=
sub
{
my
$password_banner
=
<<'END';
___ _ ___ _
/ __| |_ _ _ ___ _ _ __ _ | _ \__ _ _______ __ _____ _ _ __| |
\__ \ _| '_/ _ \ ' \/ _` | | _/ _` (_-<_-< V V / _ \ '_/ _` |
|___/\__|_| \___/_||_\__, | |_| \__,_/__/__/\_/\_/\___/_| \__,_|
|___/
END
my
$word
=
$create_strong_password
->(15);
$password_banner
.=
<<END;
The Web Server (NGINX) and the SSL Certificate each need a strong password.
Use the one supplied here, or create your own. To create your own, use the
[DEL] key to clear the highlighted input box first.
*** BE SURE TO WRITE IT DOWN AND KEEP IT SOMEWHERE SAFE! ***
Input box with === border is highlighted (active) input box.
Use [TAB] key to switch focus between input boxes.
Password
]I[{1,\'$word\',50}
Confirm
]I[{2,\'$word\',50}
END
my
$enter_password
={
Name
=>
'enter_password'
,
Input
=> 1,
Result
=>
$email_address
,
Banner
=>
$password_banner
,
};
return
$enter_password
;
};
our
$test_letsencrypt
=
sub
{
my
$domain_url
=
"]I[{'domain_url',1}"
;
my
$handle
=connect_shell();
my
(
$stdout
,
$stderr
)=
$handle
->cmd(
my
$tr
=0;
my
$certid
=
''
;
unless
(
$stdout
=~/None found/s) {
my
$nextline
=0;
my
$tr
=0;
foreach
my
$line
(
split
/\n/,
$stdout
) {
if
(
$line
=~/TR/) {
$nextline
=1;
}
elsif
(
$nextline
==1 and
$line
=~/id=/) {
$tr
++;
$line
=~s/^.
*id
=(.*)["].*$/$1/;
$nextline
=0;
}
if
(
$tr
==5) {
$certid
=
$line
;
last
;
}
}
}
unless
(
$certid
) {
$choose_strong_password
->();
}
else
{
(
$stdout
,
$stderr
)=
$handle
->cmd(
$stdout
=~/^.*?Log URL.*?TD[>](.*?)[&].*?[>]([^ ]+) UTC.*$/s;
my
$date
=$1;
my
$time
=$2;
my
(
$yr
,
$mn
,
$dy
,
$hr
,
$mt
,
$sc
)=(0,0,0,0,0,0);
(
$yr
,
$mn
,
$dy
)=
split
/-/,
$date
;
(
$hr
,
$mt
,
$sc
)=
split
/:/,
$time
;
my
$timestamp
=
&Net::FullAuto::FA_Core::timelocal
(
$sc
,
$mt
,
$hr
,
$dy
,
$mn
-1,
$yr
);
$timestamp
-=21600;
my
$diff
=
time
()-
$timestamp
;
$diff
=
int
(
$diff
/3600);
if
(
$diff
<169) {
$Net::FullAuto::ISets::Local::EmailServer_is::domain_url
->(
$diff
,
$domain_url
);
}
else
{
$choose_strong_password
->();
}
}
};
our
$domain_url
=
sub
{
my
$diff
=
$_
[0]||
''
;
my
$tried
=
$_
[1]||
''
;
my
$days
=0;
my
$hours
=0;
if
(
$diff
) {
my
$remain
=168-
$diff
;
$days
=
int
(
$remain
/24);
$hours
=
$remain
%24;
}
$tried
=
"\n ERROR! => Letsencrypt Cert for $tried is\n"
.
" not available for $days days $hours hours!\n"
if
$diff
;
my
$handle
=connect_shell();
my
$public_ip
=
$stdout
if
$stdout
=~/^\d+\.\d+\.\d+\.\d+\s*/s;
unless
(
$public_ip
) {
import
Sys::Hostname;
import
Socket;
my
(
$addr
)=inet_ntoa((
gethostbyname
(Sys::Hostname::hostname))[4]);
$public_ip
=
$addr
if
$addr
=~/^\d+\.\d+\.\d+\.\d+\s*/s;
}
chomp
(
$public_ip
);
$public_ip
=
'127.0.0.1'
unless
$public_ip
;
my
$domain_url_banner
=
<<'END';
___ _ _ _ ___ _
| \ ___ _ __ __ _(_)_ _ | | | | _ \ |
| |) / _ \ ' \/ _` | | ' \ | |_| | / |__
|___/\___/_|_|_\__,_|_|_||_| \___/|_|_\____|
END
$domain_url_banner
.=
<<END;
Type or paste the domain url for the site:
*** A properly registered domain url is necessary! ***
$tried
Create the DNS A/AAAA record(s) for this domain:
A @ $public_ip
A mail.domain_url $public_ip
CNAME mail @
CNAME postfixadmin @
MX @ 10 mail.domain_url 3600
TXT v=spf1 mx -all 3600
Domain URL
]I[{1,'fullauto.com',46}
END
my
$domain_url
={
Name
=>
'domain_url'
,
Input
=> 1,
Result
=>
$test_letsencrypt
,
Banner
=>
$domain_url_banner
,
};
return
$domain_url
;
};
our
$select_emailserver_setup
=
sub
{
my
@options
=(
'EmailServer on This Host'
);
my
$emailserver_setup_banner
=
<<'END';
_____ _ _ ____
| ____|_ __ ___ __ _(_) | / ___| ___ _ ____ _____ _ __
| _| | '_ ` _ \ / _` | | | \___ \ / _ \ '__\ \ / / _ \ '__|
| |___| | | | | | (_| | | | ___) | __/ | \ V / __/ |
|_____|_| |_| |_|\__,_|_|_| |____/ \___|_| \_/ \___|_|
Choose the EmailServer setup you wish to install on this localhost:
END
my
%select_emailserver_setup
=(
Name
=>
'select_emailserver_setup'
,
Item_1
=> {
Text
=>
']C['
,
Convey
=> \
@options
,
Result
=>
$domain_url
,
},
Scroll
=> 1,
Banner
=>
$emailserver_setup_banner
,
);
return
\
%select_emailserver_setup
};
sub
exit_on_error {
eval
{
local
$SIG
{ALRM} =
sub
{
die
"alarm\n"
};
alarm
1800;
print
"\n FATAL ERROR!:\n\n "
;
print
$_
[0];
print
" \n\n Press Any Key to EXIT ... "
;
<STDIN>;
};
alarm
(0);
print
"\n\n"
;
cleanup;
}
1