Till Brehm
2014-10-18 1fc360dfaf61613735cb635c8e905af2b089cf68
install/lib/installer_base.lib.php
@@ -56,12 +56,21 @@
      echo 'WARNING: '.$msg."\n";
   }
   public function simple_query($query, $answers, $default) {
   public function simple_query($query, $answers, $default, $name = '') {
      global $autoinstall;
      $finished = false;
      do {
         $answers_str = implode(',', $answers);
         swrite($this->lng($query).' ('.$answers_str.') ['.$default.']: ');
         $input = sread();
         if($name != '' && $autoinstall[$name] != '') {
            if($autoinstall[$name] == 'default') {
               $input = $default;
            } else {
               $input = $autoinstall[$name];
            }
         } else {
            $answers_str = implode(',', $answers);
            swrite($this->lng($query).' ('.$answers_str.') ['.$default.']: ');
            $input = sread();
         }
         //* Stop the installation
         if($input == 'quit') {
@@ -86,9 +95,18 @@
      return $answer;
   }
   public function free_query($query, $default) {
      swrite($this->lng($query).' ['.$default.']: ');
      $input = sread();
   public function free_query($query, $default, $name = '') {
      global $autoinstall;
      if($name != '' && $autoinstall[$name] != '') {
         if($autoinstall[$name] == 'default') {
            $input = $default;
         } else {
            $input = $autoinstall[$name];
         }
      } else {
         swrite($this->lng($query).' ['.$default.']: ');
         $input = sread();
      }
      //* Stop the installation
      if($input == 'quit') {
@@ -628,7 +646,7 @@
            copy('tpl/mailman-virtual_to_transport.sh', $full_file_name);
         }
         chgrp($full_file_name, 'list');
         chmod($full_file_name, 0750);
         chmod($full_file_name, 0755);
      }
      //* Create aliasaes
@@ -638,7 +656,7 @@
   }
   public function configure_postfix($options = '') {
      global $conf;
      global $conf,$autoinstall;
      $cf = $conf['postfix'];
      $config_dir = $cf['config_dir'];
@@ -690,7 +708,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 `" . $this->db->quote($conf["mysql"]["database"]) . "`.`server` WHERE server_id = ".$conf['server_id']);
      $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
      unset($server_ini_rec);
@@ -750,8 +768,13 @@
      if(!stristr($options, 'dont-create-certs')) {
         //* Create the SSL certificate
         $command = 'cd '.$config_dir.'; '
            .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509';
         if(AUTOINSTALL){
            $command = 'cd '.$config_dir.'; '
               ."openssl req -new -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509";
         } else {
            $command = 'cd '.$config_dir.'; '
               .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509';
         }
         exec($command);
         $command = 'chmod o= '.$config_dir.'/smtpd.key';
@@ -960,19 +983,20 @@
      //* Get the dovecot version
      exec('dovecot --version', $tmp);
      $parts = explode('.', trim($tmp[0]));
      $dovecot_version = $parts[0];
      $dovecot_version = $tmp[0];
      unset($tmp);
      unset($parts);
      //* Copy dovecot configuration file
      if($dovecot_version == 2) {
      if(version_compare($dovecot_version,2) >= 0) {
         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot2.conf.master')) {
            copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot2.conf.master', $config_dir.'/'.$configfile);
         } else {
            copy('tpl/debian_dovecot2.conf.master', $config_dir.'/'.$configfile);
         }
         replaceLine($config_dir.'/'.$configfile, 'postmaster_address = postmaster@example.com', 'postmaster_address = postmaster@'.$conf['hostname'], 1, 0);
         if(version_compare($dovecot_version,2.1) < 0) {
            removeLine($config_dir.'/'.$configfile, 'ssl_protocols =');
         }
      } else {
         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot.conf.master')) {
            copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/debian_dovecot.conf.master', $config_dir.'/'.$configfile);
@@ -992,6 +1016,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('{server_id}', $conf['server_id'], $content);
      wf($config_dir.'/'.$configfile, $content);
      chmod($config_dir.'/'.$configfile, 0600);
@@ -1671,7 +1696,7 @@
   }
   public function make_ispconfig_ssl_cert() {
      global $conf;
      global $conf,$autoinstall;
      $install_dir = $conf['ispconfig_install_dir'];
@@ -1683,11 +1708,17 @@
      $ssl_pw = substr(md5(mt_rand()), 0, 6);
      exec("openssl genrsa -des3 -passout pass:$ssl_pw -out $ssl_key_file 4096");
      exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file");
      if(AUTOINSTALL){
         exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -key $ssl_key_file -out $ssl_csr_file");
      } else {
         exec("openssl req -new -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -out $ssl_csr_file");
      }
      exec("openssl req -x509 -passin pass:$ssl_pw -passout pass:$ssl_pw -key $ssl_key_file -in $ssl_csr_file -out $ssl_crt_file -days 3650");
      exec("openssl rsa -passin pass:$ssl_pw -in $ssl_key_file -out $ssl_key_file.insecure");
      rename($ssl_key_file, $ssl_key_file.'.secure');
      rename($ssl_key_file.'.insecure', $ssl_key_file);
      exec('chown -R root:root /usr/local/ispconfig/interface/ssl');
   }
@@ -1716,6 +1747,31 @@
      //* copy the ISPConfig server part
      $command = 'cp -rf ../server '.$install_dir;
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* Make a backup of the security settings
      if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~');
      //* copy the ISPConfig security part
      $command = 'cp -rf ../security '.$install_dir;
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* Apply changed security_settings.ini values to new security_settings.ini file
      if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) {
         $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~'));
         $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini'));
         if(is_array($security_settings_new) && is_array($security_settings_old)) {
            foreach($security_settings_new as $section => $sval) {
               if(is_array($sval)) {
                  foreach($sval as $key => $val) {
                     if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) {
                        $security_settings_new[$section][$key] = $security_settings_old[$section][$key];
                     }
                  }
               }
            }
            file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new));
         }
      }
      //* Create a symlink, so ISPConfig is accessible via web
      // Replaced by a separate vhost definition for port 8080
@@ -1857,12 +1913,38 @@
      }
      //* Chmod the files
      $command = 'chmod -R 750 '.$install_dir;
      // chown install dir to root and chmod 755
      $command = 'chown root:root '.$install_dir;
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      $command = 'chmod 755 '.$install_dir;
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* chown the files to the ispconfig user and group
      $command = 'chown -R ispconfig:ispconfig '.$install_dir;
      //* Chmod the files and directories in the install dir
      $command = 'chmod -R 750 '.$install_dir.'/*';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* chown the interface files to the ispconfig user and group
      $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* chown the server files to the root user and group
      $command = 'chown -R root:root '.$install_dir.'/server';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* chown the security files to the root user and group
      $command = 'chown -R root:root '.$install_dir.'/security';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* chown the security directory and security_settings.ini to root:ispconfig
      $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      $command = 'chown root:ispconfig '.$install_dir.'/security';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      $command = 'chown root:ispconfig '.$install_dir.'/security/ids.whitelist';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      $command = 'chown root:ispconfig '.$install_dir.'/security/ids.htmlfield';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      $command = 'chown root:ispconfig '.$install_dir.'/security/apache_directives.blacklist';
      caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
      //* Make the global language file directory group writable
@@ -1915,6 +1997,8 @@
         exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices'));
         exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices'));
      }
      exec('chown -R root:root /usr/local/ispconfig/interface/ssl');
      // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing
      // and must be fixed as this will allow the apache user to read the ispconfig files.
@@ -2114,7 +2198,7 @@
      
      // 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');
   }
   public function configure_dbserver() {
@@ -2203,11 +2287,27 @@
      chmod($conf['ispconfig_log_dir'].'/cron.log', 0660);
   }
   // This function is called at the end of the update process and contains code to clean up parts of old ISPCONfig releases
   public function cleanup_ispconfig() {
      global $app,$conf;
      // Remove directories recursively
      if(is_dir('/usr/local/ispconfig/interface/web/designer')) exec('rm -rf /usr/local/ispconfig/interface/web/designer');
      if(is_dir('/usr/local/ispconfig/interface/web/themes/default-304')) exec('rm -rf /usr/local/ispconfig/interface/web/themes/default-304');
      // Remove files
      if(is_file('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/db_firebird.inc.php');
      if(is_file('/usr/local/ispconfig/interface/lib/classes/form.inc.php')) unlink('/usr/local/ispconfig/interface/lib/classes/form.inc.php');
   }
   public function getinitcommand($servicename, $action, $init_script_directory = ''){
      global $conf;
      // systemd
      if(is_executable('/bin/systemd')){
      if(is_executable('/bin/systemd') || is_executable('/usr/bin/systemctl')){
         return 'systemctl '.$action.' '.$servicename.'.service';
      }
      // upstart