diff --git a/install/dist/lib/fedora.lib.php b/install/dist/lib/fedora.lib.php
index 2d15af97ec3da8b460fe26eb003c85bf4f8d627b..c2f87c63b8b74582f47062b596610e2eb5f823d5 100644
--- a/install/dist/lib/fedora.lib.php
+++ b/install/dist/lib/fedora.lib.php
@@ -530,6 +530,9 @@ class installer_dist extends installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
+ if (strpos($file, '_core_module') !== false) {
+ if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
+ }
}
}
closedir($dh);
@@ -542,6 +545,9 @@ class installer_dist extends installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
+ if (strpos($file, '_core_plugin') !== false) {
+ if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
+ }
}
}
closedir($dh);
diff --git a/install/dist/lib/opensuse.lib.php b/install/dist/lib/opensuse.lib.php
index 391e896f4f71875ed881840172ff70305ef85256..2d64357348d70d72f89a541cb21b0e42f7a5fb6c 100644
--- a/install/dist/lib/opensuse.lib.php
+++ b/install/dist/lib/opensuse.lib.php
@@ -555,6 +555,9 @@ class installer_dist extends installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
+ if (strpos($file, '_core_module') !== false) {
+ if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
+ }
}
}
closedir($dh);
@@ -567,6 +570,9 @@ class installer_dist extends installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
+ if (strpos($file, '_core_plugin') !== false) {
+ if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
+ }
}
}
closedir($dh);
diff --git a/install/lib/installer_base.lib.php b/install/lib/installer_base.lib.php
index 79c7ef6ce6d4cfe464413601e64d63a57505c0df..1a2fd6fff6ba192bf58d8d4331c82d6b53cc2213 100644
--- a/install/lib/installer_base.lib.php
+++ b/install/lib/installer_base.lib.php
@@ -35,6 +35,7 @@ class installer_base {
var $db;
public $conf;
public $install_ispconfig_interface = true;
+
public function __construct()
@@ -749,6 +750,9 @@ class installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
+ if (strpos($file, '_core_module') !== false) {
+ if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
+ }
}
}
closedir($dh);
@@ -761,6 +765,9 @@ class installer_base {
while (($file = readdir($dh)) !== false) {
if($file != '.' && $file != '..') {
if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
+ if (strpos($file, '_core_plugin') !== false) {
+ if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
+ }
}
}
closedir($dh);
diff --git a/install/sql/ispconfig3.sql b/install/sql/ispconfig3.sql
index 35867d7e1876d5373e9d048c96e63b3e0911cd97..5727fe05391d3a507914708f2d6fa598401841fd 100644
--- a/install/sql/ispconfig3.sql
+++ b/install/sql/ispconfig3.sql
@@ -1062,6 +1062,21 @@ CREATE TABLE `attempts_login` (
`ip` varchar(12) NOT NULL,
`times` tinyint(1) NOT NULL default '1',
`login_time` timestamp NOT NULL default '0000-00-00 00:00:00'
-);
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
+
+--
+-- Tabellenstruktur für Tabelle `monitor_data`
+--
+
+CREATE TABLE `monitor_data` (
+ `server_id` int(11) NOT NULL,
+ `type` varchar(255) NOT NULL,
+ `created` int(11) NOT NULL,
+ `data` mediumtext NOT NULL,
+ `state` enum('unknown','ok','warning','error') NOT NULL default 'unknown',
+ PRIMARY KEY (`server_id`,`type`,`created`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;
+
SET FOREIGN_KEY_CHECKS = 1;
diff --git a/server/lib/classes/modules.inc.php b/server/lib/classes/modules.inc.php
index 41bc2ae259c508c2e1d70e63e5a98bd12ed86e37..6ad967f1337d9c04123357bab9e61c4f983a23d6 100644
--- a/server/lib/classes/modules.inc.php
+++ b/server/lib/classes/modules.inc.php
@@ -33,15 +33,15 @@ class modules {
var $notification_hooks = array();
/*
- This function is called to load the modules from the mods-available folder
+ This function is called to load the modules from the mods-enabled or the mods-core folder
*/
-
- function loadModules() {
+ function loadModules($type) {
global $app, $conf;
-
-
- $modules_dir = $conf["rootpath"].$conf["fs_div"]."mods-enabled".$conf["fs_div"];
+ $subPath = 'mods-enabled';
+ if ($type == 'core') $subPath = 'mods-core';
+
+ $modules_dir = $conf["rootpath"].$conf["fs_div"].$subPath.$conf["fs_div"];
if (is_dir($modules_dir)) {
if ($dh = opendir($modules_dir)) {
while (($file = readdir($dh)) !== false) {
diff --git a/server/lib/classes/plugins.inc.php b/server/lib/classes/plugins.inc.php
index 63c8cb979b116fd52e33a3a8d7c3a149f3e17f49..8d016d2f535c511e637ffcb3695b7a49b41e4619 100644
--- a/server/lib/classes/plugins.inc.php
+++ b/server/lib/classes/plugins.inc.php
@@ -34,13 +34,16 @@ class plugins {
var $subscribed_events = array();
/*
- This function is called to load the plugins from the plugins-available folder
+ This function is called to load the plugins from the plugins-enabled or the plugins-core folder
*/
- function loadPlugins() {
+ function loadPlugins($type) {
global $app,$conf;
+
+ $subPath = 'plugins-enabled';
+ if ($type == 'core') $subPath = 'plugins-core';
- $plugins_dir = $conf["rootpath"].$conf["fs_div"]."plugins-enabled".$conf["fs_div"];
+ $plugins_dir = $conf["rootpath"].$conf["fs_div"].$subPath.$conf["fs_div"];
$tmp_plugins = array();
if (is_dir($plugins_dir)) {
diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php
new file mode 100644
index 0000000000000000000000000000000000000000..136463cbc4785977777287b0a7e62b31b82d3068
--- /dev/null
+++ b/server/mods-available/monitor_core_module.inc.php
@@ -0,0 +1,421 @@
+plugins->announceEvents($this->module_name,$this->actions_available);
+
+ /*
+ As we want to get notified of any changes on several database tables,
+ we register for them.
+
+ The following function registers the function "functionname"
+ to be executed when a record for the table "dbtable" is
+ processed in the sys_datalog. "classname" is the name of the
+ class that contains the function functionname.
+ */
+ /* none at them moment */
+ //$app->modules->registerTableHook('mail_access','mail_module','process');
+
+ /*
+ Do the monitor every n minutes and write the result in the db
+ */
+ $min = date('i');
+ if (($min % $this->interval) == 0)
+ {
+ $this->doMonitor();
+ }
+ }
+
+ /*
+ This function is called when a change in one of the registered tables is detected.
+ The function then raises the events for the plugins.
+ */
+ function process($tablename, $action, $data) {
+ // global $app;
+ //
+ // switch ($tablename) {
+ // case 'mail_access':
+ // if($action == 'i') $app->plugins->raiseEvent('mail_access_insert',$data);
+ // if($action == 'u') $app->plugins->raiseEvent('mail_access_update',$data);
+ // if($action == 'd') $app->plugins->raiseEvent('mail_access_delete',$data);
+ // break;
+ // } // end switch
+ } // end function
+
+ /*
+ This method is called every n minutes, when the module ist loaded.
+ The method then does a system-monitoring
+ */
+ // TODO: what monitoring is done should be a config-var
+ function doMonitor()
+ {
+ /* Calls the single Monitoring steps */
+ $this->monitorServer();
+ $this->monitorDiskUsage();
+ }
+
+ function monitorServer(){
+ global $app;
+ global $conf;
+
+ /* the id of the server as int */
+ $server_id = intval($conf["server_id"]);
+
+ /** The type of the data */
+ $type = 'server_load';
+
+ /* Delete Data older than 1 day */
+ $this->_delOldRecords($type, 0, 0, 1);
+
+ /*
+ Fetch the data into a array
+ */
+ $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '");
+ $data['up_days'] = floor($procUptime/86400);
+ $data['up_hours'] = floor(($procUptime-$data['up_days']*86400)/3600);
+ $data['up_minutes'] = floor(($procUptime-$data['up_days']*86400-$data['up_hours']*3600)/60);
+
+ $data['uptime'] = shell_exec("uptime");
+
+ $tmp = explode(",", $data['uptime'], 3);
+ $tmpUser = explode(" ", trim($tmp[1]));
+ $data['user_online'] = intval($tmpUser[0]);
+
+ $loadTmp = explode(":" , trim($tmp[2]));
+ $load = explode(",", $loadTmp[1]);
+ $data['load_1'] = floatval(trim($load[0]));
+ $data['load_5'] = floatval(trim($load[1]));
+ $data['load_15'] = floatval(trim($load[2]));
+
+ // Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
+ $state = 'ok';
+
+ /*
+ Insert the data into the database
+ */
+ $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
+ "VALUES (".
+ $conf["server_id"] . ", " .
+ "'" . $app->db->quote(serialize($type)) . "', " .
+ time() . ", " .
+ "'" . $app->db->quote(serialize($data)) . "', " .
+ "'" . $state . "'" .
+ ")";
+ $app->db->query($sql);
+ }
+
+ function monitorDiskUsage() {
+ global $app;
+ global $conf;
+
+ /* the id of the server as int */
+ $server_id = intval($conf["server_id"]);
+
+ /** The type of the data */
+ $type = 'disk_usage';
+
+ /* Delete Data older than 10 minutes */
+ $this->_delOldRecords($type, 10);
+
+ /*
+ Fetch the data into a array
+ */
+ $fd = popen ("df", "r");
+ $buffer = '';
+ while (!feof($fd)) {
+ $buffer .= fgets($fd, 4096);
+ }
+
+ // split into array
+ $df = split("\n", $buffer);
+ // ignore the first line make a array of the rest
+ for($i=1; $i <= sizeof($df); $i++){
+ if ($df[$i] != '')
+ {
+ $s = preg_split ("/[\s]+/", $df[$i]);
+ $data[$i]['fs'] = $s[0];
+ $data[$i]['size'] = $s[1];
+ $data[$i]['used'] = $s[2];
+ $data[$i]['available'] = $s[3];
+ $data[$i]['percent'] = $s[4];
+ $data[$i]['mounted'] = $s[5];
+ }
+ }
+
+ // Todo: the state should be calculated. For example if the load is to heavy, the state is warning...
+ $state = 'ok';
+
+ /*
+ Insert the data into the database
+ */
+ $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
+ "VALUES (".
+ $conf["server_id"] . ", " .
+ "'" . $app->db->quote(serialize($type)) . "', " .
+ time() . ", " .
+ "'" . $app->db->quote(serialize($data)) . "', " .
+ "'" . $state . "'" .
+ ")";
+ $app->db->query($sql);
+ }
+ //
+ //
+ // function show_memusage ()
+ // {
+ // global $app;
+ //
+ // $html_out .= '
';
+ //
+ // $fd = fopen ("/proc/meminfo", "r");
+ // while (!feof($fd)) {
+ // $buffer .= fgets($fd, 4096);
+ // }
+ // fclose($fd);
+ //
+ // $meminfo = split("\n",$buffer);
+ //
+ // foreach($meminfo as $mline){
+ // if($x > 2 and trim($mline) != "") {
+ //
+ // $mpart = split(":",$mline);
+ //
+ // $html_out .= '
+ // '.$mpart[0].': |
+ // '.$mpart[1].' |
+ //
';
+ // }
+ //
+ // $x++;
+ // }
+ // $html_out .= '
';
+ // return $html_out;
+ // }
+ //
+ // function show_cpu ()
+ // {
+ // global $app;
+ //
+ // $html_out .= '';
+ //
+ // $n = 0;
+ // if(is_readable("/proc/cpuinfo")) {
+ // if($fd = fopen ("/proc/cpuinfo", "r")) {
+ // while (!feof($fd)) {
+ // $buffer .= fgets($fd, 4096);
+ // $n++;
+ // if($n > 100) break;
+ // }
+ // fclose($fd);
+ // }
+ // }
+ //
+ // $meminfo = split("\n",$buffer);
+ //
+ // if(is_array($meminfo)) {
+ // foreach($meminfo as $mline){
+ // if(trim($mline) != "") {
+ //
+ // $mpart = split(":",$mline);
+ //
+ // $html_out .= '
+ // '.$mpart[0].': |
+ // '.$mpart[1].' |
+ //
';
+ // }
+ // }
+ //
+ // $x++;
+ // }
+ // $html_out .= '
';
+ //
+ //
+ // return $html_out;
+ // }
+ //
+ // function show_services ()
+ // {
+ // global $app;
+ //
+ // $html_out .= '';
+ //
+ // // Checke Webserver
+ // if(_check_tcp('localhost',80)) {
+ // $status = 'Online';
+ // } else {
+ // $status = 'Offline';
+ // }
+ // $html_out .= '
+ // Web-Server: |
+ // '.$status.' |
+ //
';
+ //
+ //
+ // // Checke FTP-Server
+ // if(_check_ftp('localhost',21)) {
+ // $status = 'Online';
+ // } else {
+ // $status = 'Offline';
+ // }
+ // $html_out .= '
+ // FTP-Server: |
+ // '.$status.' |
+ //
';
+ //
+ // // Checke SMTP-Server
+ // if(_check_tcp('localhost',25)) {
+ // $status = 'Online';
+ // } else {
+ // $status = 'Offline';
+ // }
+ // $html_out .= '
+ // SMTP-Server: |
+ // '.$status.' |
+ //
';
+ //
+ // // Checke POP3-Server
+ // if(_check_tcp('localhost',110)) {
+ // $status = 'Online';
+ // } else {
+ // $status = 'Offline';
+ // }
+ // $html_out .= '
+ // POP3-Server: |
+ // '.$status.' |
+ //
';
+ //
+ // // Checke BIND-Server
+ // if(_check_tcp('localhost',53)) {
+ // $status = 'Online';
+ // } else {
+ // $status = 'Offline';
+ // }
+ // $html_out .= '
+ // DNS-Server: |
+ // '.$status.' |
+ //
';
+ //
+ // // Checke MYSQL-Server
+ // //if($this->_check_tcp('localhost',3306)) {
+ // $status = 'Online';
+ // //} else {
+ // //$status = 'Offline';
+ // //}
+ // $html_out .= '
+ // mySQL-Server: |
+ // '.$status.' |
+ //
';
+ //
+ //
+ // $html_out .= '
';
+ //
+ //
+ // return $html_out;
+ // }
+ //
+ // function _check_tcp ($host,$port) {
+ //
+ // $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2);
+ //
+ // if ($fp) {
+ // return true;
+ // fclose($fp);
+ // } else {
+ // return false;
+ // fclose($fp);
+ // }
+ // }
+ //
+ // function _check_udp ($host,$port) {
+ //
+ // $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2);
+ //
+ // if ($fp) {
+ // return true;
+ // fclose($fp);
+ // } else {
+ // return false;
+ // fclose($fp);
+ // }
+ // }
+ //
+ // function _check_ftp ($host,$port){
+ //
+ // $conn_id = @ftp_connect($host, $port);
+ //
+ // if($conn_id){
+ // @ftp_close($conn_id);
+ // return true;
+ // } else {
+ // @ftp_close($conn_id);
+ // return false;
+ // }
+ // }
+
+ /*
+ Deletes Records older than n.
+ */
+ function _delOldRecords($type, $min, $hour=0, $days=0) {
+ global $app;
+
+ $now = time();
+ $old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60);
+ $sql = "DELETE FROM monitor_data " .
+ "WHERE " .
+ "type =" . "'" . $app->db->quote(serialize($type)) . "' " .
+ "AND " .
+ "created < " . $old;
+ $app->db->query($sql);
+ }
+
+
+} // end class
+
+?>
\ No newline at end of file
diff --git a/server/server.php b/server/server.php
index b87ea45690966e6ad5480dd3562e2c46b838d68a..f0eabfc2e9ae4ead114605a1122f3e9175b4cd31 100644
--- a/server/server.php
+++ b/server/server.php
@@ -72,42 +72,38 @@ $tmp_num_records = $tmp_rec["number"];
unset($tmp_rec);
if($tmp_num_records > 0) {
-
- $app->log("Found $tmp_num_records changes, starting update process.",LOGLEVEL_DEBUG);
-
+ /*
+ There is something to do, triggert by the database -> do it!
+ */
+ // Write the Log
+ $app->log("Found $tmp_num_records changes, starting update process.", LOGLEVEL_DEBUG);
// Load required base-classes
$app->uses('ini_parser,modules,plugins,file,services');
-
-
// Get server configuration
$conf["serverconfig"] = $app->ini_parser->parse_ini_string(stripslashes($server_db_record["config"]));
-
- /*
- Load the modules that are im the mods-enabled folder
- */
-
- $app->modules->loadModules();
-
- /*
- Load the plugins that are in the plugins-enabled folder
- */
-
- $app->plugins->loadPlugins();
-
- /*
- Go trough the sys_datalog table and call the processing functions
- in the modules that are hooked on to the table actions
- */
+ // Load the modules that are im the mods-enabled folder
+ $app->modules->loadModules('all');
+ // Load the plugins that are in the plugins-enabled folder
+ $app->plugins->loadPlugins('all');
+ // Go trough the sys_datalog table and call the processing functions
+ // in the modules that are hooked on to the table actions
$app->modules->processDatalog();
-
- /*
- Restart services that need to be restarted after configuration
- */
+ // Restart services that need to be restarted after configuration
$app->services->processDelayedActions();
-
-
} else {
- $app->log('No Updated records found.',LOGLEVEL_DEBUG);
+ /*
+ There is no trigger inside the database -> load only the core, maybe they have to do something
+ */
+ // Write the log
+ $app->log('No Updated records found, starting only the core.', LOGLEVEL_DEBUG);
+ // Load required base-classes
+ $app->uses('ini_parser,modules,plugins,file,services');
+ // Get server configuration
+ $conf["serverconfig"] = $app->ini_parser->parse_ini_string(stripslashes($server_db_record["config"]));
+ // Load the modules that are im the mods-core folder
+ $app->modules->loadModules('core');
+ // Load the plugins that are in the plugins-core folder
+ $app->plugins->loadPlugins('core');
}
/*