From 132081c0e69f0313ccb0d23637499e940d29f470 Mon Sep 17 00:00:00 2001
From: Marius Cramer <m.cramer@pixcept.de>
Date: Fri, 26 Sep 2014 17:57:38 +0200
Subject: [PATCH] - added check for mysql error to avoid flood of error
 messages/mails

---
 server/cron_daily.php               |  2 ++
 server/lib/app.inc.php              | 18 ++++++++++++++++++
 server/lib/classes/db_mysql.inc.php | 13 +++++++++++++
 server/server.php                   |  2 ++
 4 files changed, 35 insertions(+)

diff --git a/server/cron_daily.php b/server/cron_daily.php
index ee54a46207..10f168812c 100644
--- a/server/cron_daily.php
+++ b/server/cron_daily.php
@@ -32,6 +32,8 @@ define('SCRIPT_PATH', dirname($_SERVER["SCRIPT_FILENAME"]));
 require SCRIPT_PATH."/lib/config.inc.php";
 require SCRIPT_PATH."/lib/app.inc.php";
 
+$app->setCaller('cron_daily');
+
 set_time_limit(0);
 ini_set('error_reporting', E_ALL & ~E_NOTICE);
 
diff --git a/server/lib/app.inc.php b/server/lib/app.inc.php
index a1e75af16a..a9d47a5578 100755
--- a/server/lib/app.inc.php
+++ b/server/lib/app.inc.php
@@ -35,6 +35,7 @@ class app {
 
 	var $loaded_modules = array();
 	var $loaded_plugins = array();
+	var $_calling_script = '';
 
 	function __construct() {
 
@@ -60,6 +61,23 @@ class app {
 
 	}
 
+	function setCaller($caller) {
+		$this->_calling_script = $caller;
+	}
+	
+	function getCaller() {
+		return $this->_calling_script;
+	}
+	
+	function forceErrorExit($errmsg = 'undefined') {
+		global $conf;
+		
+		if($this->_calling_script == 'server') {
+			@unlink($conf['temppath'] . $conf['fs_div'] . '.ispconfig_lock');
+		}
+		die('Exiting because of error: ' . $errmsg);
+	}
+
 	function uses($classes) {
 
 		global $conf;
diff --git a/server/lib/classes/db_mysql.inc.php b/server/lib/classes/db_mysql.inc.php
index d8bfbea495..6d428475e8 100644
--- a/server/lib/classes/db_mysql.inc.php
+++ b/server/lib/classes/db_mysql.inc.php
@@ -130,6 +130,8 @@ class db extends mysqli
 	}
 
 	public function query($queryString) {
+		global $app;
+		
 		if($this->isConnected == false) return false;
 		$try = 0;
 		do {
@@ -138,6 +140,17 @@ class db extends mysqli
 			if(!$ok) {
 				if(!$this->real_connect($this->dbHost, $this->dbUser, $this->dbPass, $this->dbName)) {
 					$this->updateError('DB::query -> reconnect');
+					if($this->errorNumber == '111') {
+						// server is not available
+						if($try > 9) {
+							if(isset($app) && isset($app->forceErrorExit)) {
+								$app->forceErrorExit('Database connection failure!');
+							}
+							// if we reach this, the app object is missing or has no exit method, so we continue as normal
+						}
+						sleep(30); // additional seconds, please!
+					}
+
 					if($try > 9) {
 						return false;
 					} else {
diff --git a/server/server.php b/server/server.php
index ab25404424..1d2c6d21d7 100644
--- a/server/server.php
+++ b/server/server.php
@@ -31,6 +31,8 @@ define('SCRIPT_PATH', dirname($_SERVER["SCRIPT_FILENAME"]));
 require SCRIPT_PATH."/lib/config.inc.php";
 require SCRIPT_PATH."/lib/app.inc.php";
 
+$app->setCaller('server');
+
 set_time_limit(0);
 ini_set('error_reporting', E_ALL & ~E_NOTICE);
 
-- 
GitLab