Marius Burkard
2016-05-23 9376d70f0ccba49ead95ef47f0ecba568ea2d6e1
install/dist/lib/fedora.lib.php
@@ -29,87 +29,22 @@
*/
class installer_dist extends installer_base {
   public function configure_mailman($status = 'insert') {
      global $conf;
      $config_dir = $conf['mailman']['config_dir'].'/';
      $full_file_name = $config_dir.'mm_cfg.py';
      //* Backup exiting file
      if(is_file($full_file_name)) {
         copy($full_file_name, $config_dir.'mm_cfg.py~');
   protected $mailman_group = 'mailman';
   public function __construct() {
      //** check apache modules */
      $mods = getapachemodules();
      if(in_array('authz_compat', $mods, true)) {
         swriteln($inst->lng('    WARNING! You are using mod_authz_compat.'));
         swriteln($inst->lng('    Please make sure that your apache config uses the new auth syntax:'));
         swriteln($inst->lng('    <Directory />'));
         swriteln($inst->lng('    Options None'));
         swriteln($inst->lng('    AllowOverride None'));
         swriteln($inst->lng('    Require all denied'));
         swriteln($inst->lng('    </Directory>'."\n"));
         swriteln($inst->lng('    If it uses the old syntax (deny from all) ISPConfig would fail to work.'));
      }
      // load files
      $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/mm_cfg.py.master', 'tpl/mm_cfg.py.master');
      $old_file = rf($full_file_name);
      $old_options = array();
      $lines = explode("\n", $old_file);
      foreach ($lines as $line)
      {
         if (trim($line) != '' && substr($line, 0, 1) != '#')
         {
            @list($key, $value) = @explode("=", $line);
            if (!empty($value))
            {
               $key = rtrim($key);
               $old_options[$key] = trim($value);
            }
         }
      }
      if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
      exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman');
      $virtual_domains = '';
      if($status == 'update')
      {
         // create virtual_domains list
         $domainAll = $this->db->queryAllRecords("SELECT domain FROM mail_mailinglist GROUP BY domain");
         if(is_array($domainAll)) {
            foreach($domainAll as $domain)
            {
               if ($domainAll[0]['domain'] == $domain['domain'])
                  $virtual_domains .= "'".$domain['domain']."'";
               else
                  $virtual_domains .= ", '".$domain['domain']."'";
            }
         }
      }
      else
         $virtual_domains = "' '";
      $content = str_replace('{hostname}', $conf['hostname'], $content);
      if(!isset($old_options['DEFAULT_SERVER_LANGUAGE'])) $old_options['DEFAULT_SERVER_LANGUAGE'] = '';
      $content = str_replace('{default_language}', $old_options['DEFAULT_SERVER_LANGUAGE'], $content);
      $content = str_replace('{virtual_domains}', $virtual_domains, $content);
      wf($full_file_name, $content);
      //* Write virtual_to_transport.sh script
      $config_dir = $conf['mailman']['config_dir'].'/';
      $full_file_name = $config_dir.'virtual_to_transport.sh';
      //* Backup exiting virtual_to_transport.sh script
      if(is_file($full_file_name)) {
         copy($full_file_name, $config_dir.'virtual_to_transport.sh~');
      }
      if(is_dir('/etc/mailman')) {
         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh')) {
            copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/mailman-virtual_to_transport.sh', $full_file_name);
         } else {
            copy('tpl/mailman-virtual_to_transport.sh', $full_file_name);
         }
         chgrp($full_file_name, 'mailman');
         chmod($full_file_name, 0750);
      }
      //* Create aliasaes
      exec('/usr/lib/mailman/bin/genaliases 2>/dev/null');
   }
   function configure_postfix($options = '')
@@ -185,7 +120,7 @@
      if(!is_user($cf['vmail_username'])) caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* These postconf commands will be executed on installation and update
      $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM server WHERE server_id = ".$conf['server_id']);
      $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM server WHERE server_id = ?", $conf['server_id']);
      $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
      unset($server_ini_rec);
@@ -249,6 +184,27 @@
      exec('postmap /etc/mailman/virtual-mailman');
      if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
      exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman');
      //* Create auxillary postfix conf files
      $configfile = 'helo_access';
      if(is_file($config_dir.'/'.$configfile)) {
         copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
         chmod($config_dir.'/'.$configfile.'~', 0400);
      }
      $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
      $content = strtr($content, $postconf_placeholders);
      # todo: look up this server's ip addrs and loop through each
      # todo: look up domains hosted on this server and loop through each
      wf($config_dir.'/'.$configfile, $content);
      $configfile = 'blacklist_helo';
      if(is_file($config_dir.'/'.$configfile)) {
         copy($config_dir.'/'.$configfile, $config_dir.'/'.$configfile.'~');
         chmod($config_dir.'/'.$configfile.'~', 0400);
      }
      $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', 'tpl/'.$configfile.'.master');
      $content = strtr($content, $postconf_placeholders);
      wf($config_dir.'/'.$configfile, $content);
      //* Make a backup copy of the main.cf file
      copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
@@ -358,9 +314,6 @@
      wf("$pam/smtp", $content);
      // On some OSes smtp is world readable which allows for reading database information.  Removing world readable rights should have no effect.
      if(is_file("$pam/smtp"))    exec("chmod o= $pam/smtp");
      //exec("chmod 660 $pam/smtp");
      //exec("chown root:root $pam/smtp");
   }
   public function configure_courier()
@@ -378,6 +331,7 @@
      $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
      $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
      $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
      $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
      wf("$config_dir/$configfile", $content);
      exec("chmod 660 $config_dir/$configfile");
@@ -401,39 +355,39 @@
      global $conf;
      $virtual_transport = 'dovecot';
      $configure_lmtp = false;
      
      // check if virtual_transport must be changed
      if ($this->is_update) {
         $tmp = $this->db->queryOneRecord("SELECT * FROM ".$conf["mysql"]["database"].".server WHERE server_id = ".$conf['server_id']);
         $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']);
         $ini_array = ini_to_array(stripslashes($tmp['config']));
         // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni()
         
         if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') {
            $virtual_transport = 'lmtp:unix:private/dovecot-lmtp';
            $configure_lmtp = true;
         }
      }
      $config_dir = $conf['dovecot']['config_dir'];
      //* Use /etc/dovecot as config dir if exists
      if(is_dir('/etc/dovecot')) $config_dir = '/etc/dovecot';
      $config_dir = $conf['postfix']['config_dir'];
      //* Configure master.cf and add a line for deliver
      if(is_file($config_dir.'/master.cf')){
         copy($config_dir.'/master.cf', $config_dir.'/master.cf~2');
      }
      if(is_file($config_dir.'/master.cf~')){
         exec('chmod 400 '.$config_dir.'/master.cf~2');
      }
      $content = rf($conf["postfix"]["config_dir"].'/master.cf');
      // Only add the content if we had not addded it before
      if(!stristr($content, "dovecot/deliver")) {
         $deliver_content = 'dovecot   unix  -       n       n       -       -       pipe'."\n".'  flags=DROhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop}';
      if(!$this->get_postfix_service('dovecot', 'unix')) {
         //* backup
         if(is_file($config_dir.'/master.cf')){
            copy($config_dir.'/master.cf', $config_dir.'/master.cf~2');
         }
         if(is_file($config_dir.'/master.cf~')){
            chmod($config_dir.'/master.cf~2', 0400);
         }
         //* Configure master.cf and add a line for deliver
         $content = rf($conf["postfix"]["config_dir"].'/master.cf');
         $deliver_content = 'dovecot   unix  -       n       n       -       -       pipe'."\n".'  flags=DRhu user=vmail:vmail argv=/usr/libexec/dovecot/deliver -f ${sender} -d ${user}@${nexthop}'."\n";
         af($conf["postfix"]["config_dir"].'/master.cf', $deliver_content);
         unset($content);
         unset($deliver_content);
      }
      unset($content);
      unset($deliver_content);
      //* Reconfigure postfix to use dovecot authentication
      // Adding the amavisd commands to the postfix configuration
@@ -452,6 +406,10 @@
         $command = "postconf -e '$cmd'";
         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      }
      //* Use /etc/dovecot as config dir if exists
//      if(is_dir('/etc/dovecot')) $config_dir = '/etc/dovecot';
      $config_dir = $conf['dovecot']['config_dir'];
      //* backup dovecot.conf
      $configfile = 'dovecot.conf';
@@ -482,6 +440,11 @@
         }
      }
      //* dovecot-lmtpd
      if($configure_lmtp) {
         replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0);
      }
      //* dovecot-sql.conf
      $configfile = 'dovecot-sql.conf';
      if(is_file("$config_dir/$configfile")){
@@ -496,6 +459,7 @@
      $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
      $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
      $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
      $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
      $content = str_replace('{server_id}', $conf['server_id'], $content);
      wf("$config_dir/$configfile", $content);
@@ -522,6 +486,7 @@
      $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
      $content = str_replace('{hostname}', $conf['hostname'], $content);
      wf($conf["amavis"]["config_dir"].'/amavisd.conf', $content);
      chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
      // Adding the amavisd commands to the postfix configuration
@@ -539,28 +504,33 @@
         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      }
      // Append the configuration for amavisd to the master.cf file
      if(is_file($conf['postfix']['config_dir'].'/master.cf')) copy($conf['postfix']['config_dir'].'/master.cf', $conf['postfix']['config_dir'].'/master.cf~');
      $content = rf($conf['postfix']['config_dir'].'/master.cf');
      // Only add the content if we had not addded it before
      if(!preg_match('/^amavis\s+unix\s+/m', $content)) {
         unset($content);
         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
         af($conf['postfix']['config_dir'].'/master.cf', $content);
         $content = rf($conf['postfix']['config_dir'].'/master.cf');
      $config_dir = $conf['postfix']['config_dir'];
      // Adding amavis-services to the master.cf file if the service does not already exists
      $add_amavis = !$this->get_postfix_service('amavis','unix');
      $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
      $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
      if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
         //* backup master.cf
         if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
         // adjust amavis-config
         if($add_amavis) {
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
            af($config_dir.'/master.cf', $content);
            unset($content);
         }
         if ($add_amavis_10025) {
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
            af($config_dir.'/master.cf', $content);
            unset($content);
         }
         if ($add_amavis_10027) {
            $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
            af($config_dir.'/master.cf', $content);
            unset($content);
         }
      }
      if(!preg_match('/^127.0.0.1:10025\s+/m', $content)) {
         unset($content);
         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
         af($conf['postfix']['config_dir'].'/master.cf', $content);
         $content = rf($conf['postfix']['config_dir'].'/master.cf');
      }
      if(!preg_match('/^127.0.0.1:10027\s+/m', $content)) {
         unset($content);
         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
         af($conf['postfix']['config_dir'].'/master.cf', $content);
      }
      unset($content);
      removeLine('/etc/sysconfig/freshclam', 'FRESHCLAM_DELAY=disabled-warn   # REMOVE ME', 1);
      replaceLine('/etc/freshclam.conf', 'Example', '# Example', 1);
@@ -652,6 +622,7 @@
      $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
      $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
      $content = str_replace('{mysql_server_host}', $conf["mysql"]["host"], $content);
      $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
      $content = str_replace('{server_id}', $conf["server_id"], $content);
      wf($conf["mydns"]["config_dir"].'/'.$configfile, $content);
      exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
@@ -678,7 +649,7 @@
      //* Chown the slave subdirectory to $conf['bind']['bind_user']
      exec('chown '.$conf['bind']['bind_user'].':'.$conf['bind']['bind_group'].' '.$content);
      exec('chmod 770 '.$content);
      exec('chmod 2770 '.$content);
   }
@@ -713,7 +684,7 @@
      $tpl = new tpl('apache_ispconfig.conf.master');
      $tpl->setVar('apache_version',getapacheversion());
      
      $records = $this->db->queryAllRecords('SELECT * FROM '.$conf['mysql']['master_database'].'.server_ip WHERE server_id = '.$conf['server_id']." AND virtualhost = 'y'");
      $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']);
      $ip_addresses = array();
      
      if(is_array($records) && count($records) > 0) {
@@ -799,7 +770,7 @@
      if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
   }
   public function configure_firewall()
   public function configure_bastille_firewall()
   {
      global $conf;
@@ -821,7 +792,7 @@
      $tcp_public_services = '';
      $udp_public_services = '';
      $row = $this->db->queryOneRecord('SELECT * FROM '.$conf["mysql"]["database"].'.firewall WHERE server_id = '.intval($conf['server_id']));
      $row = $this->db->queryOneRecord('SELECT * FROM ?? WHERE server_id = ?', $conf["mysql"]["database"] . '.firewall', $conf['server_id']);
      if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
         $tcp_public_services = trim(str_replace(',', ' ', $row["tcp_port"]));
@@ -832,7 +803,7 @@
      }
      if(!stristr($tcp_public_services, $conf['apache']['vhost_port'])) {
         $tcp_public_services .= ' '.intval($conf['apache']['vhost_port']);
         if($row["tcp_port"] != '') $this->db->query("UPDATE firewall SET tcp_port = tcp_port + ',".intval($conf['apache']['vhost_port'])."' WHERE server_id = ".intval($conf['server_id']));
         if($row["tcp_port"] != '') $this->db->query("UPDATE firewall SET tcp_port = tcp_port + ? WHERE server_id = ?", ',' . intval($conf['apache']['vhost_port']), $conf['server_id']);
      }
      $content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
@@ -862,7 +833,6 @@
      unset($iptables_location);
   }
   public function install_ispconfig()
   {
@@ -931,11 +901,13 @@
      $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
      $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
      $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
      $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
      $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
      $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
      $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
      $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
      $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
      $content = str_replace('{server_id}', $conf['server_id'], $content);
      $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
@@ -956,11 +928,13 @@
      $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
      $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
      $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
      $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
      $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
      $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
      $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
      $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
      $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
      $content = str_replace('{server_id}', $conf['server_id'], $content);
      $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
@@ -977,7 +951,6 @@
         $content = '<?php' . "\n" . '$maxid_remote_action = 0;' . "\n" . '?>';
         wf($install_dir.'/server/lib/remote_action.inc.php', $content);
      }
      //* Enable the server modules and plugins.
      // TODO: Implement a selector which modules and plugins shall be enabled.
@@ -1032,13 +1005,11 @@
      $file_server_enabled = ($conf['services']['file'])?1:0;
      $db_server_enabled = ($conf['services']['db'])?1:0;
      $vserver_server_enabled = ($conf['services']['vserver'])?1:0;
      $sql = "UPDATE `server` SET mail_server = '$mail_server_enabled', web_server = '$web_server_enabled', dns_server = '$dns_server_enabled', file_server = '$file_server_enabled', db_server = '$db_server_enabled', vserver_server = '$vserver_server_enabled' WHERE server_id = ".intval($conf['server_id']);
      $sql = "UPDATE `server` SET mail_server = ?, web_server = ?, dns_server = ?, file_server = ?, db_server = ?, vserver_server = ? WHERE server_id = ?";
      $this->db->query($sql, $mail_server_enabled, $web_server_enabled, $dns_server_enabled, $file_server_enabled, $db_server_enabled, $vserver_server_enabled, $conf['server_id']);
      if($conf['mysql']['master_slave_setup'] == 'y') {
         $this->dbmaster->query($sql);
         $this->db->query($sql);
      } else {
         $this->db->query($sql);
         $this->dbmaster->query($sql, $mail_server_enabled, $web_server_enabled, $dns_server_enabled, $file_server_enabled, $db_server_enabled, $vserver_server_enabled, $conf['server_id']);
      }
      // chown install dir to root and chmod 755
@@ -1137,11 +1108,6 @@
      if($conf['nginx']['installed'] == true){
         $command = 'usermod -a -G ispconfig '.$conf['nginx']['user'];
         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
         //if(is_user('ispapps')){
         // Allow the ispapps vhost access to /etc/squirrelmail
         //$command = 'usermod -a -G '.$conf['apache']['group'].' ispapps';
         //caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
         //}
         if(is_group('ispapps')){
            $command = 'usermod -a -G ispapps '.$conf['nginx']['user'];
            caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
@@ -1328,7 +1294,12 @@
      
      // Add symlink for patch tool
      if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch');
      // Change mode of a few files from amavisd
      if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640);
      if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400);
      if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
      if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400);
   }
}