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 .= ' + // + // + // '; + // } + // + // $x++; + // } + // $html_out .= '
'.$mpart[0].':'.$mpart[1].'
'; + // 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 .= ' + // + // + // '; + // } + // } + // + // $x++; + // } + // $html_out .= '
'.$mpart[0].':'.$mpart[1].'
'; + // + // + // return $html_out; + // } + // + // function show_services () + // { + // global $app; + // + // $html_out .= ''; + // + // // Checke Webserver + // if(_check_tcp('localhost',80)) { + // $status = 'Online'; + // } else { + // $status = 'Offline'; + // } + // $html_out .= ' + // + // + // '; + // + // + // // Checke FTP-Server + // if(_check_ftp('localhost',21)) { + // $status = 'Online'; + // } else { + // $status = 'Offline'; + // } + // $html_out .= ' + // + // + // '; + // + // // Checke SMTP-Server + // if(_check_tcp('localhost',25)) { + // $status = 'Online'; + // } else { + // $status = 'Offline'; + // } + // $html_out .= ' + // + // + // '; + // + // // Checke POP3-Server + // if(_check_tcp('localhost',110)) { + // $status = 'Online'; + // } else { + // $status = 'Offline'; + // } + // $html_out .= ' + // + // + // '; + // + // // Checke BIND-Server + // if(_check_tcp('localhost',53)) { + // $status = 'Online'; + // } else { + // $status = 'Offline'; + // } + // $html_out .= ' + // + // + // '; + // + // // Checke MYSQL-Server + // //if($this->_check_tcp('localhost',3306)) { + // $status = 'Online'; + // //} else { + // //$status = 'Offline'; + // //} + // $html_out .= ' + // + // + // '; + // + // + // $html_out .= '
Web-Server:'.$status.'
FTP-Server:'.$status.'
SMTP-Server:'.$status.'
POP3-Server:'.$status.'
DNS-Server:'.$status.'
mySQL-Server:'.$status.'
'; + // + // + // 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'); } /*