Commit 9eff6c25 authored by tbrehm's avatar tbrehm
Browse files

Fixed several bugs in data replication.

parent 70e890ed
......@@ -598,7 +598,7 @@ CREATE TABLE `server` (
`db_server` tinyint(4) NOT NULL default '0',
`vserver_server` tinyint(4) NOT NULL default '0',
`config` text NOT NULL,
`updated` tinyint(4) NOT NULL default '0',
`updated` bigint(20) unsigned NOT NULL default '0',
`active` tinyint(4) NOT NULL default '1',
PRIMARY KEY (`server_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 ;
......@@ -1004,6 +1004,7 @@ INSERT INTO `sys_group` (`groupid`, `name`, `description`, `client_id`) VALUES (
CREATE TABLE `sys_log` (
`syslog_id` int(10) unsigned NOT NULL auto_increment,
`server_id` int(10) unsigned NOT NULL default '0',
`datalog_id` bigint(20) unsigned NOT NULL default '0',
`loglevel` tinyint(4) NOT NULL default '0',
`tstamp` int(10) unsigned NOT NULL,
`message` text,
......
......@@ -134,6 +134,7 @@ $inst->db = new db();
//* Update $conf array with values from the server.ini that shall be preserved
$tmp = $inst->db->queryOneRecord("SELECT * FROM ".$conf["mysql"]["database"].".server WHERE server_id = ".$conf['server_id']);
$ini_array = ini_to_array(stripslashes($tmp['config']));
$conf['services']['mail'] = ($tmp['mail_server'] == 1)?true:false;
$conf['services']['web'] = ($tmp['web_server'] == 1)?true:false;
......@@ -141,6 +142,7 @@ $conf['services']['dns'] = ($tmp['dns_server'] == 1)?true:false;
$conf['services']['file'] = ($tmp['file_server'] == 1)?true:false;
$conf['services']['db'] = ($tmp['db_server'] == 1)?true:false;
$conf['services']['vserver'] = ($tmp['vserver_server'] == 1)?true:false;
$conf['postfix']['vmail_mailbox_base'] = $ini_array['mail']['homedir_path'];
//** Delete the old database
if( !$inst->db->query('DROP DATABASE IF EXISTS '.$conf['mysql']['database']) ) {
......
......@@ -145,9 +145,11 @@ class app {
//* loading global and module Wordbook
// TODO: this need to be made clearer somehow - pedro
@include_once(ISPC_ROOT_PATH.'/lib/lang/'.$_SESSION['s']['language'].'.lng');
$lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
if(!file_exists($lng_file)) $lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
include_once($lng_file);
if(isset($_SESSION['s']['module']['name']) && isset($_SESSION['s']['language'])) {
$lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/'.$_SESSION['s']['language'].'.lng';
if(!file_exists($lng_file)) $lng_file = ISPC_ROOT_PATH.'/web/'.$_SESSION['s']['module']['name'].'/lib/lang/en.lng';
@include_once($lng_file);
}
$this->_wb = $wb;
$this->_language_inc = 1;
}
......
......@@ -125,15 +125,27 @@ class app {
}
echo date("d.m.Y-H:i")." - ".$priority_txt." - ". $msg."\n";
fclose($fp);
// Log to database
if(isset($this->db)) {
if(isset($this->dbmaster)) {
$server_id = $conf['server_id'];
$loglevel = $priority;
$tstamp = time();
$message = $this->db->quote($msg);
$sql = "INSERT INTO sys_log (server_id,loglevel,tstamp,message) VALUES ('$server_id','$loglevel','$tstamp','$message')";
$this->db->query($sql);
$message = $this->dbmaster->quote($msg);
$datalog_id = (isset($this->modules->current_datalog_id) && $this->modules->current_datalog_id > 0)?$this->modules->current_datalog_id:0;
if($datalog_id > 0) {
$tmp_rec = $this->dbmaster->queryOneRecord("SELECT count(syslog_id) as number FROM sys_log WHERE datalog_id = $datalog_id AND loglevel = ".LOGLEVEL_ERROR);
//* Do not insert duplicate errors into the web log.
if($tmp_rec['number'] == 0) {
$sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',$datalog_id,'$loglevel','$tstamp','$message')";
$this->dbmaster->query($sql);
}
} else {
$sql = "INSERT INTO sys_log (server_id,datalog_id,loglevel,tstamp,message) VALUES ('$server_id',0,'$loglevel','$tstamp','$message')";
$this->dbmaster->query($sql);
}
}
//} else {
......
......@@ -31,6 +31,8 @@ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
class modules {
var $notification_hooks = array();
var $current_datalog_id = 0;
var $debug = false;
/*
This function is called to load the modules from the mods-enabled or the mods-core folder
......@@ -48,7 +50,7 @@ class modules {
if($file != '.' && $file != '..' && substr($file,-8,8) == '.inc.php') {
$module_name = substr($file,0,-8);
include_once($modules_dir.$file);
$app->log("Loading Module: $module_name",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Loading Module: $module_name",LOGLEVEL_DEBUG);
$app->loaded_modules[$module_name] = new $module_name;
$app->loaded_modules[$module_name]->onLoad();
}
......@@ -68,7 +70,7 @@ class modules {
function registerTableHook($table_name,$module_name,$function_name) {
global $app;
$this->notification_hooks[$table_name][] = array('module' => $module_name, 'function' => $function_name);
$app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Registered TableHook '$table_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
}
/*
......@@ -83,13 +85,15 @@ class modules {
// TODO: process only new entries.
//* If its a multiserver setup
if($app->db->dbHost != $app->dbmaster->dbHost) {
$sql = "SELECT * FROM sys_datalog WHERE server_id = ".$conf["server_id"]." ORDER BY datalog_id";
$sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id";
$records = $app->dbmaster->queryAllRecords($sql);
foreach($records as $d) {
$data = unserialize(stripslashes($d["data"]));
$replication_error = false;
$this->current_datalog_id = $d["datalog_id"];
if($d["action"] == 'i') {
$idx = explode(":",$d["dbidx"]);
$tmp_sql1 = '';
......@@ -144,25 +148,25 @@ class modules {
$this->raiseTableHook($d["dbtable"],$d["action"],$data);
//$app->dbmaster->query("DELETE FROM sys_datalog WHERE datalog_id = ".$d["datalog_id"]);
//$app->log("Deleting sys_datalog ID ".$d["datalog_id"],LOGLEVEL_DEBUG);
$app->db->query("UPDATE sys_datalog SET status = 'ok' WHERE datalog_id = ".$d["datalog_id"]);
$app->log("Changing datalog status to -ok- for sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
$app->dbmaster->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]);
$app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG);
} else {
$app->log("Error in Repliction, changes were not processed.",LOGLEVEL_ERROR);
$app->db->query("UPDATE sys_datalog SET status = 'error' WHERE datalog_id = ".$d["datalog_id"]);
}
}
//* if we have a single server setup
} else {
$sql = "SELECT * FROM sys_datalog WHERE server_id = ".$conf["server_id"]." ORDER BY datalog_id";
$sql = "SELECT * FROM sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0) ORDER BY datalog_id";
$records = $app->db->queryAllRecords($sql);
foreach($records as $rec) {
$data = unserialize(stripslashes($rec["data"]));
$this->raiseTableHook($rec["dbtable"],$rec["action"],$data);
foreach($records as $d) {
$data = unserialize(stripslashes($d["data"]));
$this->current_datalog_id = $d["datalog_id"];
$this->raiseTableHook($d["dbtable"],$d["action"],$data);
//$app->db->query("DELETE FROM sys_datalog WHERE datalog_id = ".$rec["datalog_id"]);
//$app->log("Deleting sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
$app->db->query("UPDATE sys_datalog SET status = 'ok' WHERE datalog_id = ".$rec["datalog_id"]);
$app->log("Changing datalog status to -ok- for sys_datalog ID ".$rec["datalog_id"],LOGLEVEL_DEBUG);
$app->db->query("UPDATE server SET updated = ".$d["datalog_id"]." WHERE server_id = ".$conf["server_id"]);
$app->log("Processed datalog_id ".$d["datalog_id"],LOGLEVEL_DEBUG);
}
}
......@@ -177,14 +181,14 @@ class modules {
// Get the hooks for this table
$hooks = $this->notification_hooks[$table_name];
$app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Raised TableHook for table: '$table_name'",LOGLEVEL_DEBUG);
if(is_array($hooks)) {
foreach($hooks as $hook) {
$module_name = $hook["module"];
$function_name = $hook["function"];
// Claa the processing function of the module
$app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Call function '$function_name' in module '$module_name' raised by TableHook '$table_name'.",LOGLEVEL_DEBUG);
call_user_method($function_name,$app->loaded_modules[$module_name],$table_name,$action,$data);
unset($module_name);
unset($function_name);
......
......@@ -32,6 +32,7 @@ class plugins {
var $available_events = array();
var $subscribed_events = array();
var $debug = false;
/*
This function is called to load the plugins from the plugins-enabled or the plugins-core folder
......@@ -61,7 +62,7 @@ class plugins {
//** load the plugins
foreach($tmp_plugins as $plugin_name => $file) {
include_once($plugins_dir.$file);
$app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Loading Plugin: $plugin_name",LOGLEVEL_DEBUG);
$app->loaded_plugins[$plugin_name] = new $plugin_name;
$app->loaded_plugins[$plugin_name]->onLoad();
}
......@@ -82,7 +83,7 @@ class plugins {
global $app;
foreach($events as $event_name) {
$this->available_events[$event_name] = $module_name;
$app->log("Announced event: $event_name",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Announced event: $event_name",LOGLEVEL_DEBUG);
}
}
......@@ -97,7 +98,7 @@ class plugins {
$app->log("Unable to register the function '$function_name' in the plugin '$plugin_name' for event '$event_name'",LOGLEVEL_DEBUG);
} else {
$this->subscribed_events[$event_name][] = array('plugin' => $plugin_name, 'function' => $function_name);
$app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Registered the function '$function_name' in the plugin '$plugin_name' for event '$event_name'.",LOGLEVEL_DEBUG);
}
}
......@@ -107,7 +108,7 @@ class plugins {
// Get the subscriptions for this event
$events = $this->subscribed_events[$event_name];
$app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Raised event: '$event_name'",LOGLEVEL_DEBUG);
if(is_array($events)) {
foreach($events as $event) {
......
......@@ -32,6 +32,7 @@ class services {
var $registered_services = array();
var $delayed_restarts = array();
var $debug = false;
// This function adds a request for restarting
// a service at the end of the configuration run.
......@@ -64,7 +65,7 @@ class services {
function registerService($service_name,$module_name, $function_name) {
global $app;
$this->registered_services[$service_name] = array('module' => $module_name, 'function' => $function_name);
$app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
if($this->debug) $app->log("Registered Service '$service_name' in module '$module_name' for processing function '$function_name'",LOGLEVEL_DEBUG);
}
// This function is called at the end of the server script to restart services.
......
......@@ -66,8 +66,13 @@ if(is_file($conf["temppath"].$conf["fs_div"].".ispconfig_lock")){
$app->log("Set Lock: ".$conf["temppath"].$conf["fs_div"].".ispconfig_lock", LOGLEVEL_DEBUG);
*/
// get the dalaog_id of the last performed record
$tmp_rec = $app->dbmaster->queryOneRecord("SELECT updated FROM server WHERE server_id = ".$conf["server_id"]);
$conf['last_datalog_id'] = (int)$tmp_rec['updated'];
unset($tmp_rec);
// Check if there is anything to update
$tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE server_id = ".$conf["server_id"]." AND status = 'pending'");
$tmp_rec = $app->dbmaster->queryOneRecord("SELECT count(server_id) as number from sys_datalog WHERE datalog_id > ".$conf['last_datalog_id']." AND (server_id = ".$conf["server_id"]." OR server_id = 0)");
$tmp_num_records = $tmp_rec["number"];
unset($tmp_rec);
......
Supports Markdown
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