From 7ed7413fd58e429f7c0a742f8857ed1ecd853d4b Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Thu, 22 Jul 2010 09:05:36 -0400
Subject: [PATCH] Fixed: FS#1149 - Ispconfig(apache) Breaks on bad format SSL certificate 

---
 interface/web/admin/templates/server_config_web_edit.htm |    6 +++
 server/plugins-available/apache2_plugin.inc.php          |   48 +++++++++++++++++++++--
 interface/web/admin/lib/lang/en_server_config.lng        |    1 
 install/tpl/server.ini.master                            |    1 
 interface/web/admin/form/server_config.tform.php         |    6 +++
 5 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/install/tpl/server.ini.master b/install/tpl/server.ini.master
index 01fcd80..20ac535 100644
--- a/install/tpl/server.ini.master
+++ b/install/tpl/server.ini.master
@@ -53,6 +53,7 @@
 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 585a120..8be4e51 100644
--- a/interface/web/admin/form/server_config.tform.php
+++ b/interface/web/admin/form/server_config.tform.php
@@ -376,6 +376,12 @@
 			'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 bacf38d..48609b7 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["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 68c57bd..060823a 100644
--- a/interface/web/admin/templates/server_config_web_edit.htm
+++ b/interface/web/admin/templates/server_config_web_edit.htm
@@ -34,6 +34,12 @@
 					</div>
 			</div>
 	  <div class="ctrlHolder">
+				<p class="label">{tmpl_var name='check_apache_config_txt'}</p>
+					<div class="multiField">
+						{tmpl_var name='check_apache_config'}
+					</div>
+			</div>
+	  <div class="ctrlHolder">
       	<label for="user">{tmpl_var name='web_user_txt'}</label>
         <input name="user" id="user" value="{tmpl_var name='user'}" size="40" maxlength="255" type="text" class="textInput" />
 			</div>
diff --git a/server/plugins-available/apache2_plugin.inc.php b/server/plugins-available/apache2_plugin.inc.php
index 2f106ef..a404060 100644
--- a/server/plugins-available/apache2_plugin.inc.php
+++ b/server/plugins-available/apache2_plugin.inc.php
@@ -825,6 +825,10 @@
 		}
 
 		$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 @@
 		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 @@
 		$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

--
Gitblit v1.9.1