Commit eed6b3c6 authored by vogelor's avatar vogelor

the new rescue-module is now able to rescue (restart) mysql

parent 4ebc7d18
......@@ -61,8 +61,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
function updateError($location)
{
global $app;
$this->errorNumber = mysql_errno($this->linkId);
$this->errorMessage = mysql_error($this->linkId);
$this->errorNumber = @mysql_errno($this->linkId);
$this->errorMessage = @mysql_error($this->linkId);
$this->errorLocation = $location;
if($this->errorNumber && $this->show_error_messages && method_exists($app,'log'))
{
......@@ -76,7 +76,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
{
if($this->linkId == 0)
{
$this->linkId = mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
$this->linkId = @mysql_connect($this->dbHost, $this->dbUser, $this->dbPass);
if(!$this->linkId)
{
$this->updateError('DB::connect()-> mysql_connect');
......@@ -463,7 +463,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return $this->query($sql);
}
// gibt Array mit Tabellennamen zurück
// gibt Array mit Tabellennamen zurck
function getTables($database_name = '') {
if($database_name == '') $database_name = $this->dbName;
......@@ -474,7 +474,7 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
return $tb_names;
}
// gibt Feldinformationen zur Tabelle zurück
// gibt Feldinformationen zur Tabelle zurck
/*
$columns = array(action => add | alter | drop
name => Spaltenname
......
......@@ -518,8 +518,16 @@ class monitor_tools {
/** the id of the server as int */
$server_id = intval($conf['server_id']);
/** get the "active" Services of the server from the DB */
/** get the "active" Services of the server from the DB */
$services = $app->dbmaster->queryOneRecord('SELECT * FROM server WHERE server_id = ' . $server_id);
/*
* If the DB is down, we have to set the db to "yes".
* If we don't do this, then the monitor will NOT monitor, that the db is down and so the
* rescue-module can not try to rescue the db
*/
if ($services == null) {
$services['db_server'] = 1;
}
/* The type of the Monitor-data */
$type = 'services';
......@@ -1539,16 +1547,16 @@ class monitor_tools {
* We got a connection, but maybe apache is not able to send data over this
* connection?
*/
fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 10);
$info = stream_get_meta_data($fp);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
if ($info['timed_out']) {
return false; // Apache was not able to send data over this connection
} else {
} else {
return true; // Apache was able to send data over this connection
}
}
} else {
return false; // Apache was not able to establish a connection
}
......@@ -1577,6 +1585,67 @@ class monitor_tools {
return false;
}
}
/*
* Set the state to the given level (or higher, but not lesser).
* * If the actual state is critical and you call the method with ok,
* then the state is critical.
*
* * If the actual state is critical and you call the method with error,
* then the state is error.
*/
private function _setState($oldState, $newState)
{
/*
* Calculate the weight of the old state
*/
switch ($oldState) {
case 'no_state': $oldInt = 0;
break;
case 'ok': $oldInt = 1;
break;
case 'unknown': $oldInt = 2;
break;
case 'info': $oldInt = 3;
break;
case 'warning': $oldInt = 4;
break;
case 'critical': $oldInt = 5;
break;
case 'error': $oldInt = 6;
break;
}
/*
* Calculate the weight of the new state
*/
switch ($newState) {
case 'no_state': $newInt = 0 ;
break;
case 'ok': $newInt = 1 ;
break;
case 'unknown': $newInt = 2 ;
break;
case 'info': $newInt = 3 ;
break;
case 'warning': $newInt = 4 ;
break;
case 'critical': $newInt = 5 ;
break;
case 'error': $newInt = 6 ;
break;
}
/*
* Set to the higher level
*/
if ($newInt > $oldInt){
return $newState;
}
else
{
return $oldState;
}
}
private function _getIntArray($line) {
/** The array of float found */
......
......@@ -93,6 +93,11 @@ class rescue_core_module {
*/
$this->_rescueApache();
/*
* rescue mysql if needed
*/
$this->_rescueMySql();
/*
* The last step is to save the rescue-data
*/
......@@ -263,16 +268,95 @@ class rescue_core_module {
$app->log('Apache is down! Try rescue apache (try:' . $tryCount . ')...', LOGLEVEL_WARN);
// echo 'Apache is down! Try rescue apache (try:' . $tryCount . ')...';
/*
* First we stop the running service "normally"
*/
$daemon = '';
if(is_file($conf['init_scripts'] . '/' . 'httpd')) {
$daemon = 'httpd';
} else {
$daemon = 'apache2';
}
$this->_rescueDaemon($daemon);
}
/**
* restarts mysql, if needed
*/
private function _rescueMySql(){
global $app, $conf;
/*
* do nothing, if it is not allowed to rescue mysql
*/
if ((isset($conf['serverconfig']['rescue']['do_not_try_rescue_mysql']) && ($conf['serverconfig']['rescue']['do_not_try_rescue_mysql']) == 'y')){
return;
}
/*
* if the service is up and running, or the service is not installed there is nothing to do...
*/
if ($this->_monitoringData[0][0]['data']['mysqlserver'] != 0){
/* Clear the try counter, because we do not have to try to rescue the service */
$this->_rescueData['mysqlserver']['try_counter'] = 0;
return;
}
/*
* OK, the service is installed and down.
* Maybe this is because of a restart of the service by the admin.
* This means, we check the data 1 minute ago
*/
if ((!isset($this->_monitoringData[1][0]['data']['mysqlserver'])) ||
((isset($this->_monitoringData[1][0]['data']['mysqlserver'])) && ($this->_monitoringData[1][0]['data']['mysqlserver'] != 0))){
/*
* We do NOT have this data or we have this data, but the webserver was not down 1 minute ago.
* This means, it could be, that the admin is restarting the server.
* We wait one more minute...
*/
return;
}
/*#####
* The service is down and it was down 1 minute ago.
* We try to rescue it
*#####*/
/* Get the try counter */
$tryCount = (!isset($this->_rescueData['mysqlserver']['try_counter']))? 1 : $this->_rescueData['mysqlserver']['try_counter'] + 1;
/* Set the new try counter */
$this->_rescueData['mysqlserver']['try_counter'] = $tryCount;
/* if 5 times will not work, we have to give up... */
if ($tryCount > 5){
$app->log('MySQL is down! Rescue will not help!', LOGLEVEL_ERROR);
return;
}
$app->log('MySQL is down! Try rescue mysql (try:' . $tryCount . ')...', LOGLEVEL_WARN);
// echo 'MySQL is down! Try rescue mysql (try:' . $tryCount . ')...';
if(is_file($conf['init_scripts'] . '/' . 'mysqld')) {
$daemon = 'mysqld';
} else {
$daemon = 'mysql';
}
$this->_rescueDaemon($daemon);
}
/**
* Tries to stop and then restart the daemon
*
* @param type $daemon the name of the daemon
*/
private function _rescueDaemon($daemon){
global $conf;
// if you need to find all restarts search for "['init_scripts']"
/*
* First we stop the running service "normally"
*/
/*
* ATTENTION!
* The service hangs. this means it could be, that "stop" will hang also.
......@@ -292,7 +376,5 @@ class rescue_core_module {
*/
exec($conf['init_scripts'] . '/' . $daemon . ' start');
}
// if you need to find all restarts search for "['init_scripts']"
}
?>
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment