From 7ed7413fd58e429f7c0a742f8857ed1ecd853d4b Mon Sep 17 00:00:00 2001 From: tbrehm Date: Thu, 22 Jul 2010 13:05:36 +0000 Subject: [PATCH] Fixed: FS#1149 - Ispconfig(apache) Breaks on bad format SSL certificate --- install/tpl/server.ini.master | 1 + .../web/admin/form/server_config.tform.php | 6 +++ .../web/admin/lib/lang/en_server_config.lng | 1 + .../templates/server_config_web_edit.htm | 6 +++ .../plugins-available/apache2_plugin.inc.php | 48 +++++++++++++++++-- 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master index 01fcd80ff9..20ac535733 100644 --- a/install/tpl/server.ini.master +++ b/install/tpl/server.ini.master @@ -53,6 +53,7 @@ awstats_pl=/usr/lib/cgi-bin/awstats.pl awstats_buildstaticpages_pl=/usr/share/awstats/tools/awstats_buildstaticpages.pl php_ini_path_apache=/etc/php5/apache2/php.ini php_ini_path_cgi=/etc/php5/cgi/php.ini +check_apache_config=y [dns] bind_user=root diff --git a/interface/web/admin/form/server_config.tform.php b/interface/web/admin/form/server_config.tform.php index 585a120675..8be4e5161c 100644 --- a/interface/web/admin/form/server_config.tform.php +++ b/interface/web/admin/form/server_config.tform.php @@ -376,6 +376,12 @@ $form["tabs"]['web'] = array ( 'default' => '20', 'value' => array('10' => 'Medium', '20' => 'High') ), + 'check_apache_config' => array ( + 'datatype' => 'VARCHAR', + 'formtype' => 'CHECKBOX', + 'default' => 'y', + 'value' => array(0 => 'n',1 => 'y') + ), 'user' => array ( 'datatype' => 'VARCHAR', 'formtype' => 'TEXT', diff --git a/interface/web/admin/lib/lang/en_server_config.lng b/interface/web/admin/lib/lang/en_server_config.lng index bacf38ddc2..48609b7af5 100644 --- a/interface/web/admin/lib/lang/en_server_config.lng +++ b/interface/web/admin/lib/lang/en_server_config.lng @@ -73,4 +73,5 @@ $wb["backup_dir_txt"] = 'Backup directory'; $wb["named_conf_local_path_txt"] = 'BIND named.conf.local path'; $wb["php_ini_path_cgi_txt"] = 'CGI php.ini path'; $wb["php_ini_path_apache_txt"] = 'Apache php.ini path'; +$wb["check_apache_config_txt"] = 'Test apache configuration on restart'; ?> \ No newline at end of file diff --git a/interface/web/admin/templates/server_config_web_edit.htm b/interface/web/admin/templates/server_config_web_edit.htm index 68c57bd97c..060823ae67 100644 --- a/interface/web/admin/templates/server_config_web_edit.htm +++ b/interface/web/admin/templates/server_config_web_edit.htm @@ -33,6 +33,12 @@ +
+

{tmpl_var name='check_apache_config_txt'}

+
+ {tmpl_var name='check_apache_config'} +
+
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php index 2f106ef5f3..a404060345 100644 --- a/server/plugins-available/apache2_plugin.inc.php +++ b/server/plugins-available/apache2_plugin.inc.php @@ -825,6 +825,10 @@ class apache2_plugin { } $vhost_file = escapeshellcmd($web_config["vhost_conf_dir"].'/'.$data["new"]["domain"].'.vhost'); + //* Make a backup copy of vhost file + copy($vhost_file,$vhost_file.'~'); + + //* Write vhost file file_put_contents($vhost_file,$tpl->grab()); $app->log("Writing the vhost file: $vhost_file",LOGLEVEL_DEBUG); unset($tpl); @@ -879,14 +883,36 @@ class apache2_plugin { if($data["new"]["stats_type"] == 'awstats' && $data["new"]["type"] == "vhost") { $this->awstats_update($data,$web_config); } + + if($web_config['check_apache_config'] == 'y') { + //* Test if apache starts with the new configuration file + $apache_online_status_before_restart = $this->_checkTcp('localhost',80); + $app->log("Apache status is: ".$apache_online_status_before_restart,LOGLEVEL_DEBUG); - - if($apache_chrooted) { - $app->services->restartServiceDelayed('httpd','restart'); + $app->services->restartService('httpd','restart'); + + //* Check if apache restarted successfully if it was online before + $apache_online_status_after_restart = $this->_checkTcp('localhost',80); + $app->log("Apache online status after restart is: ".$apache_online_status_after_restart,LOGLEVEL_DEBUG); + if($apache_online_status_before_restart && !$apache_online_status_after_restart) { + $app->log("Apache did not restart after the configuration change for website ".$data["new"]["domain"].' Reverting the configuration. Saved not working config as '.$vhost_file.'.err',LOGLEVEL_WARN); + copy($vhost_file,$vhost_file.'.err'); + copy($vhost_file.'~',$vhost_file); + $app->services->restartService('httpd','restart'); + } } else { - // request a httpd reload when all records have been processed - $app->services->restartServiceDelayed('httpd','reload'); + //* We do not check the apache config after changes (is faster) + if($apache_chrooted) { + $app->services->restartServiceDelayed('httpd','restart'); + } else { + // request a httpd reload when all records have been processed + $app->services->restartServiceDelayed('httpd','reload'); + } } + + // Remove the backup copy of the config file. + unlink($vhost_file.'~'); + //* Unset action to clean it for next processed vhost. $this->action = ''; @@ -1283,6 +1309,18 @@ class apache2_plugin { $app->log("exec: ".$command,LOGLEVEL_DEBUG); exec($command); } + + private function _checkTcp ($host,$port) { + + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); + + if ($fp) { + fclose($fp); + return true; + } else { + return false; + } + } } // end class -- GitLab