Net-FullAuto

 view release on metacpan or  search on metacpan

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

#cleanup;
my $do=1;
if ($do==1) {
   unless ($^O eq 'cygwin') {
   } else {
      # https://www.digitalocean.com/community/questions/how-to-change-port-80-into-8080-on-my-emailserver
      # https://opensource.com/article/18/9/linux-iptables-firewalld
      # https://www.digitalocean.com/community/tutorials/iptables-essentials-common-firewall-rules-and-commands - for JavaPipe
      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}='';
            }
         }
      }
      # http://www.fjakkarin.com/2015/11/cygwin-cygserver-and-apache-httpd/
      ($stdout,$stderr)=$handle->cmd($sudo.
         "wget --random-wait --progress=dot ".
         "https://github.com/transcode-open/apt-cyg/archive/master.zip",
         '__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('~');
         # http://blogostuffivelearnt.blogspot.com/2012/07/
         # smtp-mail-server-with-windows.html
         ($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;

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

   ($stdout,$stderr)=$handle->cwd('/opt/source');
   ($stdout,$stderr)=$handle->cmd($sudo.
      'wget -qO- https://www.sourceware.org/bzip2/');
   $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.
            'git clone git://sourceware.org/git/bzip2.git',
            '__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');
   # https://bipulkkuri.medium.com/install-latest-gcc-on-centos-linux-release-7-6-a704a11d943d
   ($stdout,$stderr)=$handle->cmd($sudo.
      'wget -qO- http://mirrors.concertpass.com/gcc/releases/');
   $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 '.
         'http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz',
         '__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.
         'wget -qO- https://git.savannah.gnu.org/cgit/automake.git');
      $stdout=~s#^.*?Download.*?href.*?href=['](.*?snapshot.*?)['].*$#$1#s;
      my $atarfile=$stdout;
      $atarfile=~s/^.*\/(.*)$/$1/;
      ($stdout,$stderr)=$handle->cmd($sudo.
         'wget --random-wait --progress=dot '.
         'https://git.savannah.gnu.org'.$stdout,
         '__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 '.
         "http://mirrors.concertpass.com/gcc/releases/gcc-$verss/gcc-$verss.tar.xz",
         '__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.
         'git clone --recursive https://github.com/madler/zlib.git',
         '__display__');
      if (++$gittry>5) {
         print "\n\n   FATAL ERROR: $stderr\n\n";
         cleanup();

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

             'mv -v libxml2 libxml2-old','__display__');
      }
      my $done=0;my $gittry=0;
      while ($done==0) {
         ($stdout,$stderr)=$handle->cmd($sudo.
            'git clone https://gitlab.gnome.org/GNOME/libxml2.git',
            '__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 '.
      'https://www.sqlite.org/src/tarball/sqlite.tar.gz',
      '__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 '.
      'http://ftp.gnu.org/gnu/autoconf/autoconf-latest.tar.gz',
      '__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.
      'wget -qO- https://en.wikipedia.org/wiki/OpenSSL');
   $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.
            'git clone --recursive https://github.com/openssl/openssl.git',
            '__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');
      # https://www.thegeekstuff.com/2015/02/rpm-build-package-example/
      ($stdout,$stderr)=$handle->cmd($sudo.
         'wget --random-wait --progress=dot '.
         'https://git.sailfishos.org/mer-core/'.
         '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__');

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

         '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.
               'git clone https://github.com/MariaDB/server.git '.
               '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__');
         # https://www.linuxfromscratch.org/blfs/view/cvs/server/mariadb.html
         ($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.
      #   'chmod -v 1777 /tmp','__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__');
      #
      # echo-ing/streaming files over ssh can be tricky. Use echo -e
      #          and replace these characters with thier HEX
      #          equivalents (use an external editor for quick
      #          search and replace - and paste back results.
      #          use copy/paste or cat file and copy/paste results.):
      #
      #          !  -   \\x21     `  -  \\x60   * - \\x2A
      #          "  -   \\x22     \  -  \\x5C
      #          $  -   \\x24     %  -  \\x25
      #
      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

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

      "${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.
   #   'openssl req -new -outform PEM -out /etc/postfix/smtpd.cert '.
   #   '-newkey rsa:2048 -nodes -keyout /etc/postfix/smtpd.key '.
   #   '-keyform PEM -days 3650 -x509','__display__');
   #($stdout,$stderr)=$handle->cmd($sudo.
   #   'chmod -v 640 /etc/postfix/smtpd.key','__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_sender_restrictions '.
   #   '= permit_mynetworks, permit_sasl_authenticated, '.
   #   'reject_unknown_sender_domain, '.
   #   'reject_unknown_reverse_client_hostname, '.
   #   'reject_unknown_client_hostname\'',
   #   '__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 '.

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

   # https://serverfault.com/questions/803920/postfix-configure-to-use-tlsv1-2
   # https://www.howtoforge.com/howto_postfix_smtp_auth_tls_howto
   ($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__');
   #($stdout,$stderr)=$handle->cmd($sudo.
   #   'postconf -e \'proxy_read_maps = $local_recipient_maps '.
   #   '$mydestination $virtual_alias_maps $virtual_alias_domains '.
   #   '$virtual_mailbox_maps $virtual_mailbox_domains '.
   #   '$relay_recipient_maps $relay_domains $canonical_maps '.
   #   '$sender_canonical_maps $recipient_canonical_maps '.
   #   '$relocated_maps $transport_maps $mynetworks '.
   #   '$virtual_mailbox_limit_maps\'',
   #   '__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__');
      #
      # echo-ing/streaming files over ssh can be tricky. Use echo -e
      #          and replace these characters with thier HEX
      #          equivalents (use an external editor for quick
      #          search and replace - and paste back results.
      #          use copy/paste or cat file and copy/paste results.):
      #
      #          !  -   \\x21     `  -  \\x60   * - \\x2A
      #          "  -   \\x22     \  -  \\x5C
      #          $  -   \\x24     %  -  \\x25
      #
      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)

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

    '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 ".
         "file://sespolicy";
      ($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__');
   }
   # TROUBLESHOOTING THE CONNECTION
   # http://orcorc.blogspot.com/2010/04/running-down-stray-errors.html 
   # openssl s_client -connect localhost:25 -starttls smtp
   ($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");
   # https://www.linode.com/community/questions/11498/postfix-does-not-start-correctly-on-linode-reboot-not-always
   #
   # echo-ing/streaming files over ssh can be tricky. Use echo -e
   #          and replace these characters with thier HEX
   #          equivalents (use an external editor for quick
   #          search and replace - and paste back results.
   #          use copy/paste or cat file and copy/paste results.):
   #
   #          !  -   \\x21     `  -  \\x60   * - \\x2A
   #          "  -   \\x22     \  -  \\x5C
   #          $  -   \\x24     %  -  \\x25
   #
   $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

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

   ($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__');

#https://github.com/postfixadmin/postfixadmin/releases/latest

   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.
      'wget -qO- https://github.com/postfixadmin/'.
      'postfixadmin/releases/latest');
   $stdout=~s/^.*?return_to.*?(postfixadmin-.*?)["].*$/$1/s;
   my $pfix=$stdout;
   ($stdout,$stderr)=$handle->cmd($sudo.
      'wget --random-wait --progress=dot '.
      'https://github.com/postfixadmin/postfixadmin'.
      "/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.
   #   'chcon -t httpd_sys_rw_content_t '.
   #   '/var/www/html/postfixadmin/templates_c/ -R',
   #   '__display__');
   ($stdout,$stderr)=$handle->cmd($sudo.
      'setsebool -P httpd_can_network_connect 1',
      '__display__');
   # sudo setfacl -R -m u:nginx:rwx /var/lib/php/opcache/
   # /var/lib/php/session/ /var/lib/php/wsdlcache/
   ($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;
   #
   # echo-ing/streaming files over ssh can be tricky. Use echo -e
   #          and replace these characters with thier HEX
   #          equivalents (use an external editor for quick
   #          search and replace - and paste back results.
   #          use copy/paste or cat file and copy/paste results.):
   #
   #          !  -   \\x21     `  -  \\x60   * - \\x2A
   #          "  -   \\x22     \  -  \\x5C
   #          $  -   \\x24     %  -  \\x25
   #
   $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

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

      "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");

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

       "/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

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

    888     "Y88P"  "Y88888888  888 "Y88888 "Y8888P "Y8888888888P"  "Y8888


          (roundcube is **NOT** a sponsor of the FullAuto© Project.)


END
   # http://charmingwebdesign.com/setup-roundcube-use-amazon-ses-send-email/
   # https://astroman.org/blog/2017/04/e-mail-server-hosting-on-amazon-ec2/
   # https://speedkills.io/email-server-aws/
   # https://www.linode.com/community/questions/10148/postfix-dovecot-mysql-amazon-ses
   ($stdout,$stderr)=$handle->cwd('/opt/source');
   print $install_roundcube;
   sleep 5;
   ($stdout,$stderr)=$handle->cmd($sudo.
      'wget -qO- https://roundcube.net/download/');
   $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);
   # https://copypaste.guru/WhereIsMyPHPpackage/how-to-install-the-php-package-tecnickcom-tcpdf-with-composer
   # composer require tecnickcom/tcpdf
   # composer require setasign/fpdi
   ($stdout,$stderr)=$handle->cmd($sudo.
      "wget --random-wait --progress=dot ".
      "https://getcomposer.org/composer-stable.phar",
      '__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.
      'sed -i "s#\'\'#\'https://www.getwisdom.com/contact-us\'#" '.
      '/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__');

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

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.
         'git clone --recursive https://github.com/redis/redis.git',
         '__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__');
   #
   # echo-ing/streaming files over ssh can be tricky. Use echo -e
   #          and replace these characters with thier HEX
   #          equivalents (use an external editor for quick
   #          search and replace - and paste back results.
   #          use copy/paste or cat file and copy/paste results.):
   #
   #          !  -   \\x21     `  -  \\x60   * - \\x2A
   #          "  -   \\x22     \  -  \\x5C
   #          $  -   \\x24     %  -  \\x25
   #

   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
Documentation=http://redis.io/documentation, man:redis-server(1)

[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

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

   ($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->cmd($sudo.
   #   'wget -qO- http://site.icu-project.org/download');
   #$stdout=~s/^.*[<]i[>]ICU (.*?) is now available.*$/$1/s;
   #$stdout=~s/\./-/g;
   #($stdout,$stderr)=$handle->cmd($sudo.
   #   'git clone https://github.com/unicode-org/icu.git '.
   #   "--depth=1 --branch=release-$stdout",'__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__');
   # https://linuxize.com/post/install-and-integrate-rspamd/
   ($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#\$#\\\\x24#g;
   ($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.

lib/Net/FullAuto/ISets/Local/EmailServer_is.pm  view on Meta::CPAN

      '/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.
         'git clone https://github.com/YJesus/Unhide.git',
         '__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__');



( run in 0.567 second using v1.01-cache-2.11-cpan-71847e10f99 )