From 66d94a0790fb96e85debe5809d5ad48f0f27f798 Mon Sep 17 00:00:00 2001 From: oilyflutesalad <oilyflutesalad@ispconfig3> Date: Sat, 16 Jan 2010 11:22:13 -0500 Subject: [PATCH] Fixed: Server uptime minutes will always be two digits as a clock would show (eg 10:03 hours instead of 10:3 hours) --- server/mods-available/monitor_core_module.inc.php | 261 +++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 216 insertions(+), 45 deletions(-) diff --git a/server/mods-available/monitor_core_module.inc.php b/server/mods-available/monitor_core_module.inc.php index cbd2417..cc95772 100644 --- a/server/mods-available/monitor_core_module.inc.php +++ b/server/mods-available/monitor_core_module.inc.php @@ -113,6 +113,7 @@ $this->monitorMailWarnLog(); $this->monitorMailErrLog(); $this->monitorMessagesLog(); + $this->monitorISPCCronLog(); $this->monitorFreshClamLog(); $this->monitorClamAvLog(); $this->monitorIspConfigLog(); @@ -120,6 +121,7 @@ $this->monitorMailQueue(); $this->monitorRaid(); $this->monitorRkHunter(); + $this->monitorFail2ban(); $this->monitorSysLog(); } @@ -190,8 +192,8 @@ /** The state of the disk-usage */ $state = 'ok'; - /** Fetch the data into a array */ - $dfData = shell_exec("df"); + /** Fetch the data of ALL devices into a array (needed for monitoring!)*/ + $dfData = shell_exec("df -hT"); // split into array $df = explode("\n", $dfData); @@ -207,19 +209,24 @@ */ $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]; + $data[$i]['type'] = $s[1]; + $data[$i]['size'] = $s[2]; + $data[$i]['used'] = $s[3]; + $data[$i]['available'] = $s[4]; + $data[$i]['percent'] = $s[5]; + $data[$i]['mounted'] = $s[6]; /* * calculate the state */ $usePercent = floatval($data[$i]['percent']); - if ($usePercent > 75) $state = $this->_setState($state, 'info'); - if ($usePercent > 80) $state = $this->_setState($state, 'warning'); - if ($usePercent > 90) $state = $this->_setState($state, 'critical'); - if ($usePercent > 95) $state = $this->_setState($state, 'error'); + + //* We dont want to check the cdrom drive as a cd / dvd is always 100% full + if($data[$i]['type'] != 'iso9660' && $data[$i]['type'] != 'cramfs' && $data[$i]['type'] != 'udf') { + if ($usePercent > 75) $state = $this->_setState($state, 'info'); + if ($usePercent > 80) $state = $this->_setState($state, 'warning'); + if ($usePercent > 90) $state = $this->_setState($state, 'critical'); + if ($usePercent > 95) $state = $this->_setState($state, 'error'); + } } } @@ -261,7 +268,7 @@ $memInfo = explode("\n", $miData); foreach($memInfo as $line){ - $part = split(":", $line); + $part = preg_split("/:/", $line); $key = trim($part[0]); $tmp = explode(" ", trim($part[1])); $value = 0; @@ -309,12 +316,15 @@ */ $cpuData = shell_exec("cat /proc/cpuinfo"); $cpuInfo = explode("\n", $cpuData); + $processor = 0; foreach($cpuInfo as $line){ - $part = split(":", $line); + + $part = preg_split("/:/", $line); $key = trim($part[0]); $value = trim($part[1]); - $data[$key] = $value; + if($key == 'processor') $processor = intval($value); + if($key != '') $data[$key.' '.$processor] = $value; } /* the cpu has no state. It is, what it is */ @@ -510,6 +520,34 @@ */ $data['output'] = shell_exec('apt-get -s -q dist-upgrade'); } + elseif (file_exists("/etc/gentoo-release")) { + + /* + * first update the portage tree + */ + shell_exec('emerge --sync --quiet'); + + /* + * Then test the upgrade. + * if there is any output, then there is a needed update + */ + $emergeData = shell_exec('emerge -puDNt --color n --nospinner --quiet world'); + if ($emergeData == '') + { + /* There is nothing to update! */ + $state = 'ok'; + } + else + { + /* There is something to update! */ + $state = 'warning'; + } + + /* + * Fetch the output + */ + $data['output'] = shell_exec('emerge -pvuDNt --color n --nospinner world'); + } else { /* * It is not debian/Ubuntu, so there is no data and no state @@ -599,8 +637,8 @@ $type = 'raid_state'; /* This monitoring is only available if mdadm is installed */ - $location = shell_exec('which mdadm'); - if($location != ''){ + $location = system('which mdadm', $retval); + if($retval === 0){ /* * Fetch the output */ @@ -688,10 +726,11 @@ function monitorRkHunter(){ /* - * This monitoring is expensive, so do it only once a hour + * This monitoring is expensive, so do it only once a day */ $min = date('i'); - if ($min != 0) return; + $hour = date('H'); + if (!($min == 0 && $hour == 23)) return; global $app; global $conf; @@ -703,8 +742,8 @@ $type = 'rkhunter'; /* This monitoring is only available if rkhunter is installed */ - $location = shell_exec('which rkhunter'); - if($location != ''){ + $location = system('which rkhunter', $retval); + if($retval === 0){ /* * Fetch the output */ @@ -746,6 +785,59 @@ $this->_delOldRecords($type, 0, 2); } + function monitorFail2ban(){ + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_fail2ban'; + + /* This monitoring is only available if fail2ban is installed */ + $location = system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora + if($retval !== 0) $location = system('which fail2ban', $retval); // CentOS + if($retval === 0){ + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * At this moment, there is no state (maybe later) + */ + $state = 'no_state'; + } + else { + /* + * fail2ban is not installed, so there is no data and no state + * + * no_state, NOT unknown, because "unknown" is shown as state + * inside the GUI. no_state is hidden. + * + * We have to write NO DATA inside the DB, because the GUI + * could not know, if there is any dat, or not... + */ + $state = 'no_state'; + $data = ''; + } + + /* + * Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + function monitorSysLog(){ global $app; global $conf; @@ -756,19 +848,19 @@ /** The type of the data */ $type = 'sys_log'; - /* - * is there any warning or error for this server? - */ - $state = 'ok'; + /* + * is there any warning or error for this server? + */ + $state = 'ok'; $dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0"); - if (is_array($dbData)) { - foreach($dbData as $item){ - if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); - if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); - } - } + if (is_array($dbData)) { + foreach($dbData as $item){ + if ($item['loglevel'] == 1) $state = $this->_setState($state, 'warning'); + if ($item['loglevel'] == 2) $state = $this->_setState($state, 'error'); + } + } - /** There is no monitor-data because the data is in the sys_log table */ + /** There is no monitor-data because the data is in the sys_log table */ $data['output']= ''; /* @@ -788,7 +880,7 @@ $this->_delOldRecords($type, 10); } -function monitorMailLog() + function monitorMailLog() { global $app; global $conf; @@ -937,6 +1029,43 @@ $this->_delOldRecords($type, 10); } + function monitorISPCCronLog() + { + global $app; + global $conf; + + /* the id of the server as int */ + $server_id = intval($conf["server_id"]); + + /** The type of the data */ + $type = 'log_ispc_cron'; + + /* Get the data of the log */ + $data = $this->_getLogData($type); + + /* + * actually this info has no state. + * maybe someone knows better...???... + */ + $state = 'no_state'; + + /* + Insert the data into the database + */ + $sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " . + "VALUES (". + $server_id . ", " . + "'" . $app->dbmaster->quote($type) . "', " . + time() . ", " . + "'" . $app->dbmaster->quote(serialize($data)) . "', " . + "'" . $state . "'" . + ")"; + $app->dbmaster->query($sql); + + /* The new data is written, now we can delete the old one */ + $this->_delOldRecords($type, 10); + } + function monitorFreshClamLog() { global $app; @@ -1079,27 +1208,69 @@ function _getLogData($log){ - switch($log) { + + $dist = ''; + $logfile = ''; + + if(@is_file('/etc/debian_version')) $dist = 'debian'; + if(@is_file('/etc/redhat-release')) $dist = 'redhat'; + if(@is_file('/etc/SuSE-release')) $dist = 'suse'; + if(@is_file('/etc/gentoo-release')) $dist = 'gentoo'; + + switch($log) { case 'log_mail': - $logfile = '/var/log/mail.log'; + if($dist == 'debian') $logfile = '/var/log/mail.log'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.info'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; break; case 'log_mail_warn': - $logfile = '/var/log/mail.warn'; + if($dist == 'debian') $logfile = '/var/log/mail.warn'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.warn'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; break; case 'log_mail_err': - $logfile = '/var/log/mail.err'; + if($dist == 'debian') $logfile = '/var/log/mail.err'; + if($dist == 'redhat') $logfile = '/var/log/maillog'; + if($dist == 'suse') $logfile = '/var/log/mail.err'; + if($dist == 'gentoo') $logfile = '/var/log/maillog'; break; case 'log_messages': - $logfile = '/var/log/messages'; + if($dist == 'debian') $logfile = '/var/log/messages'; + if($dist == 'redhat') $logfile = '/var/log/messages'; + if($dist == 'suse') $logfile = '/var/log/messages'; + if($dist == 'gentoo') $logfile = '/var/log/messages'; + break; + case 'log_ispc_cron': + if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log'; + if($dist == 'gentoo') $logfile = '/var/log/cron'; break; case 'log_freshclam': - $logfile = '/var/log/clamav/freshclam.log'; - break; + if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log'; + break; case 'log_clamav': - $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log'; + if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + if($dist == 'suse') $logfile = ''; + if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log'; + break; + case 'log_fail2ban': + if($dist == 'debian') $logfile = '/var/log/fail2ban.log'; + if($dist == 'redhat') $logfile = '/var/log/fail2ban.log'; + if($dist == 'suse') $logfile = '/var/log/fail2ban.log'; + if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log'; break; case 'log_ispconfig': - $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log'; + if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log'; break; default: $logfile = ''; @@ -1109,7 +1280,7 @@ // Getting the logfile content if($logfile != '') { $logfile = escapeshellcmd($logfile); - if(stristr($logfile, ';')) { + if(stristr($logfile, ';') or substr($logfile,0,9) != '/var/log/' or stristr($logfile, '..')) { $log = 'Logfile path error.'; } else @@ -1135,7 +1306,7 @@ function _checkTcp ($host,$port) { - $fp = @fsockopen ($host, $port, &$errno, &$errstr, 2); + $fp = @fsockopen ($host, $port, $errno, $errstr, 2); if ($fp) { fclose($fp); @@ -1147,7 +1318,7 @@ function _checkUdp ($host,$port) { - $fp = @fsockopen ('udp://'.$host, $port, &$errno, &$errstr, 2); + $fp = @fsockopen ('udp://'.$host, $port, $errno, $errstr, 2); if ($fp) { fclose($fp); @@ -1263,4 +1434,4 @@ } // end class -?> \ No newline at end of file +?> -- Gitblit v1.9.1