diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 92c3708a873aedeac9f4bdf2c0fb02d53b1a3d8d..fd94133152c3a626cf39b08251c62b15c65f9e74 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -88,8 +88,97 @@ class apache2_plugin { $app->plugins->registerEvent('ftp_user_delete',$this->plugin_name,'ftp_user_delete'); + $app->plugins->registerAction('php_ini_changed', $this->plugin_name, 'php_ini_changed'); } + + // check for php.ini changes + + + // Handle php.ini changes + function php_ini_changed($event_name, $data) { + global $app, $conf; + + $app->uses('getconf'); + $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi'); + + /* $data contains an array with these keys: + * file -> full path of changed php_ini + * mode -> web_domain php modes to change (mod, fast-cgi, php-fpm or '' for all except 'mod') + * php_version -> php ini path that changed (additional php versions) + */ + + $qrystr = "SELECT * FROM web_domain WHERE custom_php_ini != ''"; + if($data['mode'] == 'mod') { + $qrystr .= " AND php = 'mod'"; + } elseif($data['mode'] == 'fast-cgi') { + $qrystr .= " AND php = 'fast-cgi'"; + if($data['php_version']) { + $qrystr .= " AND fastcgi_php_version LIKE '%:" . $app->db->quote($data['php_version']) . "'"; + } + } elseif($data['mode'] == 'php-fpm') { + $qrystr .= " AND php = 'php-fpm'"; + if($data['php_version']) { + $qrystr .= " AND fastcgi_php_version LIKE '%:" . $app->db->quote($data['php_version']) . ":%'"; + } + } else { + $qrystr .= " AND php != 'mod' AND php != 'fast-cgi'"; + } + + + //** Get all the webs + $web_domains = $app->db->queryAllRecords($qrystr); + foreach($web_domains as $web_data) { + $custom_php_ini_dir = $web_config['website_basedir'].'/conf/'.$web_data['system_user']; + $web_folder = 'web'; + if($web_data['type'] == 'vhostsubdomain') { + $web_folder = $web_data['web_folder']; + $custom_php_ini_dir .= '_' . $web_folder; + } + if(!is_dir($web_config['website_basedir'].'/conf')) $app->system->mkdir($web_config['website_basedir'].'/conf'); + + if(!is_dir($custom_php_ini_dir)) $app->system->mkdir($custom_php_ini_dir); + $php_ini_content = ''; + if($web_data['php'] == 'mod') { + $master_php_ini_path = $web_config['php_ini_path_apache']; + } else { + if($web_data['php'] == 'fast-cgi' && file_exists($fastcgi_config["fastcgi_phpini_path"])) { + $master_php_ini_path = $fastcgi_config["fastcgi_phpini_path"]; + } else { + $master_php_ini_path = $web_config['php_ini_path_cgi']; + } + } + if($master_php_ini_path != '' && substr($master_php_ini_path,-7) == 'php.ini' && is_file($master_php_ini_path)) { + $php_ini_content .= $app->system->file_get_contents($master_php_ini_path)."\n"; + } + $php_ini_content .= str_replace("\r",'',trim($web_data['custom_php_ini'])); + $app->system->file_put_contents($custom_php_ini_dir.'/php.ini',$php_ini_content); + $app->log('Info: rewrote custom php.ini for web ' . $web_data['domain_id'] . ' (' . $web_data['domain'] . ').',LOGLEVEL_DEBUG); + } + + if(count($web_domains) > 0) { + //* We do not check the apache config here - we only changed the php.ini + //* Check if this is a chrooted setup + if($web_config['website_basedir'] != '' && @is_file($web_config['website_basedir'].'/etc/passwd')) { + $apache_chrooted = true; + $app->log('Info: Apache is chrooted.',LOGLEVEL_DEBUG); + } else { + $apache_chrooted = false; + } + + $app->log('Info: rewrote all php.ini and reloading apache now.',LOGLEVEL_DEBUG); + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } + } else { + $app->log('Info: No webs affected by php.ini change.',LOGLEVEL_DEBUG); + } + } + // Handle the creation of SSL certificates function ssl($event_name,$data) { global $app, $conf; diff --git a/server/plugins-available/webserver_plugin.inc.php b/server/plugins-available/webserver_plugin.inc.php new file mode 100644 index 0000000000000000000000000000000000000000..f7d888b0a9515d44129b05cde64453ddeacc4930 --- /dev/null +++ b/server/plugins-available/webserver_plugin.inc.php @@ -0,0 +1,156 @@ +plugins->registerAction('server_plugins_loaded', $this->plugin_name, 'check_phpini_changes'); + } + + /** + * This function is called when a change in one of the registered tables is detected. + * The function then raises the events for the plugins. + */ + public function process($tablename, $action, $data) { + // not needed + } + + /** + * The method checks for a change of a php.ini file + */ + public function check_phpini_changes() { + global $app, $conf; + + //** check if the main php.ini of the system changed so we need to regenerate all custom php.inis + $app->uses('getconf'); + + //** files to check + $check_files = array(); + + $web_config = $app->getconf->get_server_config($conf['server_id'], 'web'); + $fastcgi_config = $app->getconf->get_server_config($conf['server_id'], 'fastcgi'); + + //** add default php.ini files to check + $check_files[] = array('file' => $web_config['php_ini_path_apache'], + 'mode' => 'mod', + 'php_version' => ''); // default; + + $check_files[] = array('file' => $web_config['php_ini_path_cgi'], + 'mode' => '', // all but 'mod' and 'fast-cgi' + 'php_version' => ''); // default; + + if($fastcgi_config["fastcgi_phpini_path"] && $fastcgi_config["fastcgi_phpini_path"] != $web_config['php_ini_path_cgi']) { + $check_files[] = array('file' => $fastcgi_config["fastcgi_phpini_path"], + 'mode' => 'fast-cgi', + 'php_version' => ''); // default; + } else { + $check_files[] = array('file' => $web_config['php_ini_path_cgi'], + 'mode' => 'fast-cgi', // all but 'mod' + 'php_version' => ''); // default; + } + + + //** read additional php versions of this server + $php_versions = $app->db->queryAllRecords('SELECT server_php_id, php_fastcgi_ini_dir, php_fpm_ini_dir FROM server_php WHERE server_id = ' . intval($conf['server_id'])); + foreach($php_versions as $php) { + if($php['php_fastcgi_ini_dir'] && $php['php_fastcgi_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { + $check_files[] = array('file' => $php['php_fastcgi_ini_dir'] . '/php.ini', + 'mode' => 'fast-cgi', + 'php_version' => $php['php_fastcgi_ini_dir']); + } elseif($php['php_fpm_ini_dir'] && $php['php_fpm_ini_dir'] . '/php.ini' != $web_config['php_ini_path_cgi']) { + $check_files[] = array('file' => $php['php_fpm_ini_dir'] . '/php.ini', + 'mode' => 'php-fpm', + 'php_version' => $php['php_fpm_ini_dir']); + } + } + unset($php_versions); + + //** read md5sum status file + $new_php_ini_md5 = array(); + $php_ini_md5 = array(); + $php_ini_changed = false; + if(file_exists(SCRIPT_PATH . '/php.ini.md5sum')) $php_ini_md5 = unserialize(base64_decode(trim($app->system->file_get_contents(SCRIPT_PATH . '/php.ini.md5sum')))); + if(!is_array($php_ini_md5)) $php_ini_md5 = array(); + + $processed = array(); + foreach($check_files as $file) { + $file_path = $file['file']; + if(substr($file_path, -8) !== '/php.ini') $file_path .= (substr($file_path, -1) !== '/' ? '/' : '') . 'php.ini'; + if(!file_exists($file_path)) continue; + + //** check if this php.ini file was already processed (if additional php version uses same php.ini) + $ident = $file_path . '::' . $file['mode'] . '::' . $file['php_version']; + if(in_array($ident, $processed) == true) continue; + $processed[] = $ident; + + //** check if md5sum of file changed + $file_md5 = md5_file($file_path); + if(array_key_exists($file_path, $php_ini_md5) == false || $php_ini_md5[$file_path] != $file_md5) { + $php_ini_changed = true; + + $app->log('Info: PHP.ini changed: ' . $file_path . ', mode ' . $file['mode'] . ' vers ' . $file['php_version'] . '.',LOGLEVEL_DEBUG); + // raise action for this file + $app->plugins->raiseAction('php_ini_changed', $file); + } + + $new_php_ini_md5[$file_path] = $file_md5; + } + + //** write new md5 sums if something changed + if($php_ini_changed == true) $app->system->file_put_contents(SCRIPT_PATH . '/php.ini.md5sum', base64_encode(serialize($new_php_ini_md5))); + unset($new_php_ini_md5); + unset($php_ini_md5); + unset($processed); + } +} + +?> \ No newline at end of file diff --git a/server/server.php b/server/server.php index 54a4b5b5eed218811ab2880e08269db5de97e23d..be710eec66e24118323dd0725b0c230275c6b5ea 100644 --- a/server/server.php +++ b/server/server.php @@ -153,6 +153,9 @@ if ($app->db->connect_error == NULL && $app->dbmaster->connect_error == NULL) { $app->modules->loadModules('all'); //** Load the plugins that are in the plugins-enabled folder $app->plugins->loadPlugins('all'); + + $app->plugins->raiseAction('server_plugins_loaded', ''); + if ($tmp_num_records > 0) { $app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG); //** Go through the sys_datalog table and call the processing functions