tbrehm
2011-09-26 b31bb1f27f066a2d49f5ab9ee0ca15e985efc788
server/plugins-available/nginx_plugin.inc.php
@@ -567,7 +567,7 @@
         }
         //* add the nginx user to the client group
         $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['user']));
         $app->system->add_user_to_group($groupname, escapeshellcmd($web_config['nginx_user']));
         $this->_exec('chown '.$username.':'.$groupname.' '.escapeshellcmd($data['new']['document_root']));
@@ -638,20 +638,49 @@
      $vhost_data['web_document_root'] = $data['new']['document_root'].'/web';
      $vhost_data['web_document_root_www'] = $web_config['website_basedir'].'/'.$data['new']['domain'].'/web';
      $vhost_data['web_basedir'] = $web_config['website_basedir'];
      $vhost_data['security_level'] = $web_config['security_level'];
      $vhost_data['allow_override'] = ($data['new']['allow_override'] == '')?'All':$data['new']['allow_override'];
      //$vhost_data['php_open_basedir'] = ($data['new']['php_open_basedir'] == '')?$data['new']['document_root']:$data['new']['php_open_basedir'];
      $vhost_data['ssl_domain'] = $data['new']['ssl_domain'];
      //$vhost_data['has_custom_php_ini'] = $has_custom_php_ini;
      //$vhost_data['custom_php_ini_dir'] = escapeshellcmd($custom_php_ini_dir);
      $vhost_data['fpm_port'] = $web_config['php_fpm_start_port'] + $data['new']['domain_id'];
      // IPv6
      if($data['new']['ipv6_address'] != '') $tpl->setVar('ipv6_enabled', 1);
      // PHP-FPM
      $pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
      if(substr($pool_dir,-1) != '/') $pool_dir .= '/';
      $pool_name = 'web'.$data['new']['domain_id'];
      $socket_dir = escapeshellcmd($web_config['php_fpm_socket_dir']);
      if(substr($socket_dir,-1) != '/') $socket_dir .= '/';
      if($data['new']['php_fpm_use_socket'] == 'y'){
         $use_tcp = 0;
         $use_socket = 1;
      } else {
         $use_tcp = 1;
         $use_socket = 0;
      }
      $tpl->setVar('use_tcp', $use_tcp);
      $tpl->setVar('use_socket', $use_socket);
      $fpm_socket = $socket_dir.$pool_name.'.sock';
      $tpl->setVar('fpm_socket', $fpm_socket);
      $vhost_data['fpm_port'] = $web_config['php_fpm_start_port'] + $data['new']['domain_id'] + 1;
      // Custom nginx directives
      $final_nginx_directives = array();
      $nginx_directives = $data['new']['nginx_directives'];
      // Make sure we only have Unix linebreaks
      $nginx_directives = str_replace("\r\n", "\n", $nginx_directives);
      $nginx_directives = str_replace("\r", "\n", $nginx_directives);
      $nginx_directive_lines = explode("\n", $nginx_directives);
      if(is_array($nginx_directive_lines) && !empty($nginx_directive_lines)){
         foreach($nginx_directive_lines as $nginx_directive_line){
            $final_nginx_directives[] = array('nginx_directive' => $nginx_directive_line);
         }
      }
      $tpl->setLoop('nginx_directives', $final_nginx_directives);
      // Check if a SSL cert exists
      $ssl_dir = $data['new']['document_root'].'/ssl';
      $domain = $data['new']['ssl_domain'];
      $key_file = $ssl_dir.'/'.$domain.'.key';
      $crt_file = $ssl_dir.'/'.$domain.'.crt';
      //$bundle_file = $ssl_dir.'/'.$domain.'.bundle';
      if($domain!='' && $data['new']['ssl'] == 'y' && @is_file($crt_file) && @is_file($key_file) && (@filesize($crt_file)>0)  && (@filesize($key_file)>0)) {
         $vhost_data['ssl_enabled'] = 1;
@@ -661,37 +690,52 @@
         $app->log('SSL Disabled. '.$domain,LOGLEVEL_DEBUG);
      }
      //if(@is_file($bundle_file)) $vhost_data['has_bundle_cert'] = 1;
      //$vhost_data['document_root'] = $data['new']['document_root'].'/web';
      // Set SEO Redirect
      if($data['new']['seo_redirect'] != '' && ($data['new']['subdomain'] == 'www' || $data['new']['subdomain'] == '*')){
         $vhost_data['seo_redirect_enabled'] = 1;
         if($data['new']['seo_redirect'] == 'non_www_to_www'){
            $vhost_data['seo_redirect_origin_domain'] = $data['new']['domain'];
            $vhost_data['seo_redirect_target_domain'] = 'www.'.$data['new']['domain'];
         }
         if($data['new']['seo_redirect'] == 'www_to_non_www'){
            $vhost_data['seo_redirect_origin_domain'] = 'www.'.$data['new']['domain'];
            $vhost_data['seo_redirect_target_domain'] = $data['new']['domain'];
         }
      } else {
         $vhost_data['seo_redirect_enabled'] = 0;
      }
      $tpl->setVar($vhost_data);
      // Rewrite rules
      $rewrite_rules = array();
      if($data['new']['redirect_type'] != '') {
         if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/';
         if(substr($data['new']['redirect_path'],0,8) == '[scheme]') $data['new']['redirect_path'] = '$scheme'.substr($data['new']['redirect_path'],8);
         /* Disabled path extension
         if($data['new']['redirect_type'] == 'no' && substr($data['new']['redirect_path'],0,4) != 'http') {
            $data['new']['redirect_path'] = $data['new']['document_root'].'/web'.realpath($data['new']['redirect_path']).'/';
         }
         */
         $rewrite_rules[] = array(   'rewrite_domain'    => $data['new']['domain'],
               'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
               'rewrite_target'    => $data['new']['redirect_path']);
         switch($data['new']['subdomain']) {
            case 'www':
               $rewrite_rules[] = array(   'rewrite_domain'    => 'www.'.$data['new']['domain'],
                     'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':'['.$data['new']['redirect_type'].']',
               $rewrite_rules[] = array(   'rewrite_domain'    => '^'.$data['new']['domain'],
               'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
               'rewrite_target'    => $data['new']['redirect_path']);
               $rewrite_rules[] = array(   'rewrite_domain'    => '^www.'.$data['new']['domain'],
                     'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
                     'rewrite_target'    => $data['new']['redirect_path']);
               break;
            case '*':
            // TODO
            //$rewrite_rules[] = array(   'rewrite_domain'    => '*'.$alias['domain'],
            //                     'rewrite_type'       => $alias['redirect_type'],
            //                     'rewrite_target'    => $alias['redirect_path']);
               $rewrite_rules[] = array(   'rewrite_domain'    => $data['new']['domain'],
                  'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
                  'rewrite_target'    => $data['new']['redirect_path']);
               break;
            default:
               $rewrite_rules[] = array(   'rewrite_domain'    => '^'.$data['new']['domain'],
               'rewrite_type'       => ($data['new']['redirect_type'] == 'no')?'':$data['new']['redirect_type'],
               'rewrite_target'    => $data['new']['redirect_path']);
         }
      }
@@ -722,27 +766,33 @@
            $app->log('Add server alias: '.$alias['domain'],LOGLEVEL_DEBUG);
            // Rewriting
            if($alias['redirect_type'] != '') {
               if(substr($data['new']['redirect_path'],-1) != '/') $data['new']['redirect_path'] .= '/';
               if(substr($alias['redirect_path'],-1) != '/') $alias['redirect_path'] .= '/';
               if(substr($alias['redirect_path'],0,8) == '[scheme]') $alias['redirect_path'] = '$scheme'.substr($alias['redirect_path'],8);
               /* Disabled the path extension
               if($data['new']['redirect_type'] == 'no' && substr($data['new']['redirect_path'],0,4) != 'http') {
                  $data['new']['redirect_path'] = $data['new']['document_root'].'/web'.realpath($data['new']['redirect_path']).'/';
               }
               */
               $rewrite_rules[] = array(   'rewrite_domain'    => $alias['domain'],
                     'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
                     'rewrite_target'    => $alias['redirect_path']);
               switch($alias['subdomain']) {
                  case 'www':
                     $rewrite_rules[] = array(   'rewrite_domain'    => 'www.'.$alias['domain'],
                           'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':'['.$alias['redirect_type'].']',
                     $rewrite_rules[] = array(   'rewrite_domain'    => '^'.$alias['domain'],
                        'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
                        'rewrite_target'    => $alias['redirect_path']);
                     $rewrite_rules[] = array(   'rewrite_domain'    => '^www.'.$alias['domain'],
                           'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
                           'rewrite_target'    => $alias['redirect_path']);
                     break;
                  case '*':
                  // TODO
                  //$rewrite_rules[] = array(   'rewrite_domain'    => '*'.$alias['domain'],
                  //                     'rewrite_type'       => $alias['redirect_type'],
                  //                     'rewrite_target'    => $alias['redirect_path']);
                     $rewrite_rules[] = array(   'rewrite_domain'    => $alias['domain'],
                        'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
                        'rewrite_target'    => $alias['redirect_path']);
                     break;
                  default:
                     $rewrite_rules[] = array(   'rewrite_domain'    => '^'.$alias['domain'],
                     'rewrite_type'       => ($alias['redirect_type'] == 'no')?'':$alias['redirect_type'],
                     'rewrite_target'    => $alias['redirect_path']);
               }
            }
         }
@@ -764,11 +814,8 @@
      }
      if(count($rewrite_rules) > 0) {
         $tpl->setVar('rewrite_enabled',1);
      } else {
         $tpl->setVar('rewrite_enabled',0);
         $tpl->setLoop('redirects',$rewrite_rules);
      }
      $tpl->setLoop('redirects',$rewrite_rules);
      
      //* Create basic http auth for website statistics
      $tpl->setVar('stats_auth_passwd_file', $data['new']['document_root']."/.htpasswd_stats");
@@ -844,7 +891,7 @@
         $this->awstats_update($data,$web_config);
      }
      
      $this->php_fpm_pool_update($data,$web_config);
      $this->php_fpm_pool_update($data,$web_config,$pool_dir,$pool_name,$socket_dir);
      
      if($web_config['check_apache_config'] == 'y') {
         //* Test if nginx starts with the new configuration file
@@ -1047,47 +1094,96 @@
   }
   
   //* Update the PHP-FPM pool configuration file
   private function php_fpm_pool_update ($data,$web_config) {
   private function php_fpm_pool_update ($data,$web_config,$pool_dir,$pool_name,$socket_dir) {
      global $app, $conf;
      $pool_dir = $web_config['php_fpm_pool_dir'];
      //$reload = false;
      
      if($data['new']['php'] == 'no'){
         if(@is_file($pool_dir.'/'.$data['old']['domain'].'.conf')){
            unlink($pool_dir.'/'.$data['old']['domain'].'.conf');
            //$reload = true;
         }
         if(@is_file($pool_dir.'/'.$data['new']['domain'].'.conf')){
            unlink($pool_dir.'/'.$data['new']['domain'].'.conf');
         if(@is_file($pool_dir.$pool_name.'.conf')){
            unlink($pool_dir.$pool_name.'.conf');
            //$reload = true;
         }
         //if($reload == true) $app->services->restartService('php-fpm','reload');
         return;
      }
      if(!@is_file($pool_dir.'/'.$data['new']['domain'].'.conf') || ($data['old']['domain'] != '' && $data['new']['domain'] != $data['old']['domain'])) {
         if ( @is_file($pool_dir.'/'.$data['old']['domain'].'.conf') ) {
            unlink($pool_dir.'/'.$data['old']['domain'].'.conf');
         }
         
         $app->uses("getconf");
         $web_config = $app->getconf->get_server_config($conf["server_id"], 'web');
      $app->uses("getconf");
      $web_config = $app->getconf->get_server_config($conf["server_id"], 'web');
         
         $app->load('tpl');
         $tpl = new tpl();
         $tpl->newTemplate('php_fpm_pool.conf.master');
      $app->load('tpl');
      $tpl = new tpl();
      $tpl->newTemplate('php_fpm_pool.conf.master');
         $tpl->setVar('fpm_pool', $data['new']['domain']);
         $tpl->setVar('fpm_port', $web_config['php_fpm_start_port'] + $data['new']['domain_id']);
         $tpl->setVar('fpm_user', $data['new']['system_user']);
         $tpl->setVar('fpm_group', $data['new']['system_group']);
         file_put_contents($pool_dir.'/'.$data['new']['domain'].'.conf',$tpl->grab());
         $app->log('Writing the PHP-FPM config file: '.$pool_dir.'/'.$data['new']['domain'].'.conf',LOGLEVEL_DEBUG);
         unset($tpl);
         //$reload = true;
      if($data['new']['php_fpm_use_socket'] == 'y'){
         $use_tcp = 0;
         $use_socket = 1;
         if(!is_dir($socket_dir)) exec('mkdir -p '.$socket_dir);
      } else {
         $use_tcp = 1;
         $use_socket = 0;
      }
      $tpl->setVar('use_tcp', $use_tcp);
      $tpl->setVar('use_socket', $use_socket);
      $fpm_socket = $socket_dir.$pool_name.'.sock';
      $tpl->setVar('fpm_socket', $fpm_socket);
      $tpl->setVar('fpm_pool', $pool_name);
      $tpl->setVar('fpm_port', $web_config['php_fpm_start_port'] + $data['new']['domain_id'] + 1);
      $tpl->setVar('fpm_user', $data['new']['system_user']);
      $tpl->setVar('fpm_group', $data['new']['system_group']);
      $tpl->setVar('document_root', $data['new']['document_root']);
      $tpl->setVar('security_level',$web_config['security_level']);
      $php_open_basedir = ($data['new']['php_open_basedir'] == '')?escapeshellcmd($data['new']['document_root']):escapeshellcmd($data['new']['php_open_basedir']);
      $tpl->setVar('php_open_basedir', $php_open_basedir);
      if($php_open_basedir != ''){
         $tpl->setVar('enable_php_open_basedir', '');
      } else {
         $tpl->setVar('enable_php_open_basedir', ';');
      }
      // Custom php.ini settings
      $final_php_ini_settings = array();
      $custom_php_ini_settings = trim($data['new']['custom_php_ini']);
      if($custom_php_ini_settings != ''){
         // Make sure we only have Unix linebreaks
         $custom_php_ini_settings = str_replace("\r\n", "\n", $custom_php_ini_settings);
         $custom_php_ini_settings = str_replace("\r", "\n", $custom_php_ini_settings);
         $ini_settings = explode("\n", $custom_php_ini_settings);
         if(is_array($ini_settings) && !empty($ini_settings)){
            foreach($ini_settings as $ini_setting){
                  list($key, $value) = explode('=', $ini_setting);
                  if($value){
                     $value = escapeshellcmd(trim($value));
                     $key = escapeshellcmd(trim($key));
                     switch (strtolower($value)) {
                        case 'on':
                        case 'off':
                        case '1':
                        case '0':
                           // PHP-FPM might complain about invalid boolean value if you use 0
                           $value = 'off';
                        case 'true':
                        case 'false':
                        case 'yes':
                        case 'no':
                           $final_php_ini_settings[] = array('ini_setting' => 'php_admin_flag['.$key.'] = '.$value);
                           break;
                        default:
                           $final_php_ini_settings[] = array('ini_setting' => 'php_admin_value['.$key.'] = '.$value);
                     }
                  }
            }
         }
      }
      $tpl->setLoop('custom_php_ini_settings', $final_php_ini_settings);
      file_put_contents($pool_dir.$pool_name.'.conf',$tpl->grab());
      $app->log('Writing the PHP-FPM config file: '.$pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
      unset($tpl);
      //$reload = true;
      //if($reload == true) $app->services->restartService('php-fpm','reload');
   }
   
@@ -1095,12 +1191,14 @@
   private function php_fpm_pool_delete ($data,$web_config) {
      global $app;
      
      $pool_dir = $web_config['php_fpm_pool_dir'];
      $pool_dir = escapeshellcmd($web_config['php_fpm_pool_dir']);
      if(substr($pool_dir,-1) != '/') $pool_dir .= '/';
      $pool_name = 'web'.$data['new']['domain_id'];
      
      if ( @is_file($pool_dir.'/'.$data['old']['domain'].'.conf') ) {
         unlink($pool_dir.'/'.$data['old']['domain'].'.conf');
         $app->log('Removed PHP-FPM config file: '.$pool_dir.'/'.$data['old']['domain'].'.conf',LOGLEVEL_DEBUG);
         $app->services->restartService('php-fpm','reload');
      if ( @is_file($pool_dir.$pool_name.'.conf') ) {
         unlink($pool_dir.$pool_name.'.conf');
         $app->log('Removed PHP-FPM config file: '.$pool_dir.$pool_name.'.conf',LOGLEVEL_DEBUG);
         //$app->services->restartService('php-fpm','reload');
      }
   }