From e1ceb050e19c7574bca146a8da7047ee4ff456b5 Mon Sep 17 00:00:00 2001 From: Marius Burkard <m.burkard@pixcept.de> Date: Sun, 10 Jul 2016 05:02:35 -0400 Subject: [PATCH] Merge branch 'stable-3.1' --- server/mods-available/monitor_core_module.inc.php | 778 ++--------------------------------------------------------- 1 files changed, 29 insertions(+), 749 deletions(-) diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php index 9244b05..a5a38c6 100644 --- a/server/mods-available/monitor_core_module.inc.php +++ b/server/mods-available/monitor_core_module.inc.php @@ -1,766 +1,46 @@ <?php - /* - Copyright (c) 2007-2011, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com - All rights reserved. +Copyright (c) 2007-2010, Till Brehm, projektfarm Gmbh, Oliver Vogel www.muv.com +All rights reserved. - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: - * Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - * Neither the name of ISPConfig nor the names of its contributors - may be used to endorse or promote products derived from this software without - specific prior written permission. + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of ISPConfig nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, - EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ class monitor_core_module { - - var $interval = 5; // do the monitoring every 5 minutes - var $module_name = 'monitor_core_module'; - var $class_name = 'monitor_core_module'; - /* No actions at this time. maybe later... */ + var $module_name = 'remoteaction_core_module'; + var $class_name = 'remoteaction_core_module'; var $actions_available = array(); - /** The Tools */ - private $_tools = null; - /** - * This function is called during ispconfig installation to determine - * if a symlink shall be created for this plugin. - */ - public function onInstall() { - global $conf; - return true; + function onInstall() { + return false; } - /** - * This function is called when the module is loaded - */ - public function onLoad() { - global $app; - - /* - * Do the monitor every n minutes and write the result to the db - */ - $min = @date('i'); - if (($min % $this->interval) == 0) { - $this->_doMonitor(); - } + function onLoad() { } - /** - * This function is called when a change in one of the registered tables is detected. - * The function then raises the events for the plugins. - */ - public function process($tablename, $action, $data) { - // not needed + function process() { } - - /** - * 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 - private function _doMonitor() { - global $app; - /* - * We need the tools in almost every method, so initialize them once... - */ - $app->load('monitor_tools'); - $this->_tools = new monitor_tools(); - - /* - * Calls the single Monitoring steps - */ - $this->_monitorHDQuota(); - $this->_monitorServer(); - $this->_monitorOsVer(); - $this->_monitorIspcVer(); - $this->_monitorDiskUsage(); - $this->_monitorMemUsage(); - $this->_monitorCpu(); - $this->_monitorServices(); - if (@file_exists('/proc/user_beancounters')) { - $this->_monitorOpenVzHost(); - $this->_monitorOpenVzUserBeancounter(); - } - $this->_monitorMailLog(); - $this->_monitorMailWarnLog(); - $this->_monitorMailErrLog(); - $this->_monitorMessagesLog(); - $this->_monitorISPCCronLog(); - $this->_monitorFreshClamLog(); - $this->_monitorClamAvLog(); - $this->_monitorIspConfigLog(); - $this->_monitorSystemUpdate(); - $this->_monitorMailQueue(); - $this->_monitorRaid(); - $this->_monitorRkHunter(); - $this->_monitorFail2ban(); - $this->_monitorSysLog(); - } - - private function _monitorHDQuota() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorHDQuota(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorServer() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorServer(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorOsVer() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorOsVer(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorIspcVer() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorIspcVer(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorDiskUsage() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorDiskUsage(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMemUsage() { - global $app; - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMemUsage(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorCpu() { - global $app; - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorCpu(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorServices() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorServices(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorOpenVzHost() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorOpenVzHost(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorOpenVzUserBeancounter() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorOpenVzUserBeancounter(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorSystemUpdate() { - /* - * This monitoring is expensive, so do it only once an hour - */ - $min = date('i'); - if ($min != 0) - return; - - /* - * OK - here we go... - */ - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorSystemUpdate(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMailQueue() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMailQueue(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorRaid() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorRaid(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorRkHunter() { - /* - * This monitoring is expensive, so do it only once a day - */ - $min = date('i'); - $hour = date('H'); - if (!($min == 0 && $hour == 23)) - return; - /* - * OK . here we go... - */ - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorRkHunter(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorFail2ban() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorFail2ban(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorSysLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorSysLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMailLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMailLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMailWarnLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMailWarnLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMailErrLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMailErrLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorMessagesLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorMessagesLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorISPCCronLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorISPCCronLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorFreshClamLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorFreshClamLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorClamAvLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorClamAvLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - private function _monitorIspConfigLog() { - global $app; - - /* - * First we get the Monitoring-data from the tools - */ - $res = $this->_tools->monitorIspConfigLog(); - - /* - * Insert the data into the database - */ - $sql = 'INSERT INTO monitor_data (server_id, type, created, data, state) ' . - 'VALUES (' . - $res['server_id'] . ', ' . - "'" . $app->dbmaster->quote($res['type']) . "', " . - time() . ', ' . - "'" . $app->dbmaster->quote(serialize($res['data'])) . "', " . - "'" . $res['state'] . "'" . - ')'; - $app->dbmaster->query($sql); - - /* The new data is written, now we can delete the old one */ - $this->_delOldRecords($type, $res['server_id']); - } - - /** - * Deletes Records older than 4 minutes. - * The monitor writes new data every 5 minutes or longer (4 hour, 1 day). - * So if i delete all Date older than 4 minutes i can be sure, that all old data - * are deleted... - */ - private function _delOldRecords($type, $serverId) { - global $app; - - $now = time(); - $old = $now - (4 * 60); // 4 minutes - /* - * ATTENTION if i do NOT pay attention of the server id, i delete all data (of the type) - * of ALL servers. This means, if i have a multiserver-environment and a server has a - * time not synced with the others (for example, all server has 11:00 and ONE server has - * 10:45) then the actual data of this server (with the time-stamp 10:45) get lost - * even though it is the NEWEST data of this server. To avoid this i HAVE to include - * the server-id! - */ - $sql = 'DELETE FROM monitor_data ' . - 'WHERE ' . - ' type =' . "'" . $app->dbmaster->quote($type) . "' " . - 'AND ' . - ' created < ' . $old . ' ' . - 'AND ' . - ' server_id = ' . $serverId; - $app->dbmaster->query($sql); - } - } ?> -- Gitblit v1.9.1