| | |
| | | <?php |
| | | |
| | | /* |
| | | Copyright (c) 2007-2011, Till Brehm, projektfarm Gmbh and Oliver Vogel www.muv.com |
| | | All rights reserved. |
| | | Copyright (c) 2007-2011, Till Brehm, projektfarm Gmbh and 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. |
| | | 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. |
| | | 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. |
| | | 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_tools { |
| | |
| | | |
| | | //** Debian or Ubuntu |
| | | if (file_exists('/etc/debian_version')) { |
| | | if (strstr(trim(file_get_contents('/etc/issue')), 'Ubuntu')) { |
| | | if (strstr(trim(file_get_contents('/etc/issue')), 'LTS')) { |
| | | $lts=" LTS"; |
| | | } else { |
| | | $lts=""; |
| | | } |
| | | |
| | | if (trim(file_get_contents('/etc/debian_version')) == '4.0') { |
| | | $issue=file_get_contents('/etc/issue'); |
| | | $distname = 'Ubuntu'; |
| | | $distid = 'debian40'; |
| | | $distbaseid = 'debian'; |
| | | $ver = explode(' ',$issue); |
| | | $ver = array_filter($ver); |
| | | $ver = next($ver); |
| | | $mainver = explode('.',$ver); |
| | | $mainver = array_filter($mainver); |
| | | $mainver = current($mainver).'.'.next($mainver); |
| | | switch ($mainver){ |
| | | case "12.10": |
| | | $relname = "(Quantal Quetzal)"; |
| | | break; |
| | | case "12.04": |
| | | $relname = "(Precise Pangolin)"; |
| | | break; |
| | | case "11.10": |
| | | $relname = "(Oneiric Ocelot)"; |
| | | break; |
| | | case "11.14": |
| | | $relname = "(Natty Narwhal)"; |
| | | break; |
| | | case "10.10": |
| | | $relname = "(Maverick Meerkat)"; |
| | | break; |
| | | case "10.04": |
| | | $relname = "(Lucid Lynx)"; |
| | | break; |
| | | case "9.10": |
| | | $relname = "(Karmic Koala)"; |
| | | break; |
| | | case "9.04": |
| | | $relname = "(Jaunty Jackpole)"; |
| | | break; |
| | | case "8.10": |
| | | $relname = "(Intrepid Ibex)"; |
| | | break; |
| | | case "8.04": |
| | | $relname = "(Hardy Heron)"; |
| | | break; |
| | | case "7.10": |
| | | $relname = "(Gutsy Gibbon)"; |
| | | break; |
| | | case "7.04": |
| | | $relname = "(Feisty Fawn)"; |
| | | break; |
| | | case "6.10": |
| | | $relname = "(Edgy Eft)"; |
| | | break; |
| | | case "6.06": |
| | | $relname = "(Dapper Drake)"; |
| | | break; |
| | | case "5.10": |
| | | $relname = "(Breezy Badger)"; |
| | | break; |
| | | case "5.04": |
| | | $relname = "(Hoary Hedgehog)"; |
| | | break; |
| | | case "4.10": |
| | | $relname = "(Warty Warthog)"; |
| | | break; |
| | | default: |
| | | $relname = "UNKNOWN"; |
| | | } |
| | | $distver = $ver.$lts." ".$relname; |
| | | } elseif(trim(file_get_contents('/etc/debian_version')) == '4.0') { |
| | | $distname = 'Debian'; |
| | | $distver = '4.0'; |
| | | $distid = 'debian40'; |
| | |
| | | } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '6.0') || trim(file_get_contents('/etc/debian_version')) == 'squeeze/sid') { |
| | | $distname = 'Debian'; |
| | | $distver = 'Squeeze/Sid'; |
| | | $distid = 'debian60'; |
| | | $distbaseid = 'debian'; |
| | | } elseif (strstr(trim(file_get_contents('/etc/debian_version')), '7.0') || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') { |
| | | $distname = 'Debian'; |
| | | $distver = 'Wheezy/Sid'; |
| | | $distid = 'debian60'; |
| | | $distbaseid = 'debian'; |
| | | } else { |
| | |
| | | return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'baseid' => $distbaseid); |
| | | } |
| | | |
| | | //** Email Quota |
| | | public function monitorEmailQuota() { |
| | | global $conf, $app; |
| | | |
| | | //* Initialize data array |
| | | $data = array(); |
| | | |
| | | //* the id of the server as int |
| | | $server_id = intval($conf['server_id']); |
| | | |
| | | //* The type of the data |
| | | $type = 'email_quota'; |
| | | |
| | | //* The state of the email_quota. |
| | | $state = 'ok'; |
| | | |
| | | $mailboxes = $app->db->queryAllRecords("SELECT email,maildir FROM mail_user WHERE server_id = $server_id"); |
| | | if(is_array($mailboxes)) { |
| | | foreach($mailboxes as $mb) { |
| | | $email = $mb['email']; |
| | | $email_parts = explode('@',$mb['email']); |
| | | $filename = $mb['maildir'].'/.quotausage'; |
| | | if(file_exists($filename) && !is_link($filename)) { |
| | | $quotafile = file($filename); |
| | | $data[$email]['used'] = trim($quotafile['1']); |
| | | unset($quotafile); |
| | | } else { |
| | | exec('du -s '.escapeshellcmd($mb['maildir']),$out); |
| | | $parts = explode(' ',$out[0]); |
| | | $data[$email]['used'] = intval($parts[0])*1024; |
| | | unset($out); |
| | | unset($parts); |
| | | } |
| | | } |
| | | } |
| | | |
| | | unset($mailboxes); |
| | | |
| | | //* Dovecot quota check Courier in progress lathama@gmail.com |
| | | /* |
| | | if($dir = opendir("/var/vmail")){ |
| | | while (($quotafiles = readdir($dir)) !== false){ |
| | | if(preg_match('/.\_quota$/', $quotafiles)){ |
| | | $quotafile = (file("/var/vmail/" . $quotafiles)); |
| | | $emailaddress = preg_replace('/_quota/',"", $quotafiles); |
| | | $emailaddress = preg_replace('/_/',"@", $emailaddress); |
| | | $data[$emailaddress]['used'] = trim($quotafile['1']); |
| | | } |
| | | } |
| | | closedir($dir); |
| | | } |
| | | */ |
| | | $res['server_id'] = $server_id; |
| | | $res['type'] = $type; |
| | | $res['data'] = $data; |
| | | $res['state'] = $state; |
| | | return $res; |
| | | } |
| | | |
| | | //** Filesystem Quota |
| | | public function monitorHDQuota() { |
| | | global $conf; |
| | | |
| | | /* Initialize data array */ |
| | | //* Initialize data array |
| | | $data = array(); |
| | | |
| | | /* the id of the server as int */ |
| | | //* the id of the server as int |
| | | $server_id = intval($conf['server_id']); |
| | | |
| | | /** The type of the data */ |
| | | //* The type of the data |
| | | $type = 'harddisk_quota'; |
| | | |
| | | /** The state of the harddisk_quota. */ |
| | | //* The state of the harddisk_quota. |
| | | $state = 'ok'; |
| | | |
| | | /** Fetch the data for all users */ |
| | | $dfData = shell_exec('repquota -au'); |
| | | //* Fetch the data for all users |
| | | $dfData = shell_exec('repquota -au 2>/dev/null'); |
| | | |
| | | // split into array |
| | | //* Split into array |
| | | $df = explode("\n", $dfData); |
| | | |
| | | /* |
| | | * ignore the first 5 lines, process the rest |
| | | */ |
| | | //* ignore the first 5 lines, process the rest |
| | | for ($i = 5; $i <= sizeof($df); $i++) { |
| | | if ($df[$i] != '') { |
| | | /* |
| | | * Make a array of the data |
| | | */ |
| | | //* Make a array of the data |
| | | $s = preg_split('/[\s]+/', $df[$i]); |
| | | $username = $s[0]; |
| | | if (substr($username, 0, 3) == 'web') { |
| | |
| | | $data['user'][$username]['used'] += $s[2]; |
| | | $data['user'][$username]['soft'] += $s[3]; |
| | | $data['user'][$username]['hard'] += $s[4]; |
| | | $data['user'][$username]['files'] += $s[5]; |
| | | } else { |
| | | $data['user'][$username]['used'] = $s[2]; |
| | | $data['user'][$username]['soft'] = $s[3]; |
| | | $data['user'][$username]['hard'] = $s[4]; |
| | | $data['user'][$username]['files'] = $s[5]; |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /** Fetch the data for all users */ |
| | | $dfData = shell_exec('repquota -ag'); |
| | | //** Fetch the data for all users |
| | | $dfData = shell_exec('repquota -ag 2>/dev/null'); |
| | | |
| | | // split into array |
| | | //* split into array |
| | | $df = explode("\n", $dfData); |
| | | |
| | | /* |
| | | * ignore the first 5 lines, process the rest |
| | | */ |
| | | //* ignore the first 5 lines, process the rest |
| | | for ($i = 5; $i <= sizeof($df); $i++) { |
| | | if ($df[$i] != '') { |
| | | /* |
| | | * Make a array of the data |
| | | */ |
| | | //* Make a array of the data |
| | | $s = preg_split('/[\s]+/', $df[$i]); |
| | | $groupname = $s[0]; |
| | | if (substr($groupname, 0, 6) == 'client') { |
| | |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * Return the Result |
| | | */ |
| | | //* Return the Result |
| | | $res['server_id'] = $server_id; |
| | | $res['type'] = $type; |
| | | $res['data'] = $data; |
| | |
| | | $type = 'server_load'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $procUptime = shell_exec("cat /proc/uptime | cut -f1 -d' '"); |
| | | $data['up_days'] = floor($procUptime / 86400); |
| | |
| | | $type = 'os_info'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $dist = $this->get_distname(); |
| | | |
| | |
| | | $type = 'ispc_info'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $data['name'] = ISPC_APP_TITLE; |
| | | $data['version'] = ISPC_APP_VERSION; |
| | | |
| | | /* the ISPC-Version has no state. It is, what it is */ |
| | | $state = 'no_state'; |
| | | |
| | | |
| | | /* |
| | | * Return the Result |
| | | */ |
| | |
| | | $state = 'ok'; |
| | | |
| | | /** Fetch the data of ALL devices into a array (needed for monitoring!) */ |
| | | $dfData = shell_exec('df -hT'); |
| | | $dfData = shell_exec('df -hT 2>/dev/null'); |
| | | |
| | | // split into array |
| | | $df = explode("\n", $dfData); |
| | |
| | | */ |
| | | $usePercent = floatval($data[$i]['percent']); |
| | | |
| | | //* get the free memsize |
| | | if(substr($data[$i]['available'],-1) == 'G') { |
| | | $freesize = floatval($data[$i]['available'])*1024; |
| | | } elseif(substr($data[$i]['available'],-1) == 'T') { |
| | | $freesize = floatval($data[$i]['available'])*1024*1024; |
| | | } else { |
| | | $freesize = floatval($data[$i]['available']); |
| | | } |
| | | |
| | | //* We don't want to check some filesystem which have no sensible filling levels |
| | | switch ($data[$i]['type']) { |
| | | case 'iso9660': |
| | |
| | | case 'udev': |
| | | break; |
| | | default: |
| | | if ($usePercent > 75) |
| | | if ($usePercent > 75 && $freesize < 2000) |
| | | $state = $this->_setState($state, 'info'); |
| | | if ($usePercent > 80) |
| | | if ($usePercent > 80 && $freesize < 1000) |
| | | $state = $this->_setState($state, 'warning'); |
| | | if ($usePercent > 90) |
| | | if ($usePercent > 90 && $freesize < 500) |
| | | $state = $this->_setState($state, 'critical'); |
| | | if ($usePercent > 95) |
| | | if ($usePercent > 95 && $freesize < 100) |
| | | $state = $this->_setState($state, 'error'); |
| | | break; |
| | | } |
| | |
| | | $type = 'mem_usage'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $miData = shell_exec('cat /proc/meminfo'); |
| | | |
| | |
| | | * maybe someone knows better...???... |
| | | */ |
| | | $state = 'no_state'; |
| | | |
| | | |
| | | /* |
| | | * Return the Result |
| | | */ |
| | |
| | | $type = 'cpu_info'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | if (file_exists('/proc/cpuinfo')) { |
| | | $cpuData = shell_exec('cat /proc/cpuinfo'); |
| | |
| | | /** the id of the server as int */ |
| | | $server_id = intval($conf['server_id']); |
| | | |
| | | /** get the "active" Services of the server from the DB */ |
| | | $services = $app->dbmaster->queryOneRecord('SELECT * FROM server WHERE server_id = ' . $server_id); |
| | | /** get the "active" Services of the server from the DB */ |
| | | $services = $app->db->queryOneRecord('SELECT * FROM server WHERE server_id = ' . $server_id); |
| | | /* |
| | | * If the DB is down, we have to set the db to "yes". |
| | | * If we don't do this, then the monitor will NOT monitor, that the db is down and so the |
| | | * rescue-module can not try to rescue the db |
| | | */ |
| | | if ($services == null) { |
| | | $services['db_server'] = 1; |
| | | } |
| | | |
| | | /* The type of the Monitor-data */ |
| | | $type = 'services'; |
| | |
| | | /* Monitor BIND-Server */ |
| | | $data['bindserver'] = -1; // unknown - not needed |
| | | if ($services['dns_server'] == 1) { |
| | | if ($this->_checkTcp('localhost', 53)) { |
| | | if ($this->_checkUdp('localhost', 53)) { |
| | | $data['bindserver'] = 1; |
| | | } else { |
| | | $data['bindserver'] = 0; |
| | |
| | | $state = 'error'; // because service is down |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * Return the Result |
| | | */ |
| | |
| | | $type = 'openvz_veinfo'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $app->load(openvz_tools); |
| | | $openVzTools = new openvz_tools(); |
| | |
| | | $type = 'openvz_beancounter'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $app->load(openvz_tools); |
| | | $openVzTools = new openvz_tools(); |
| | |
| | | $state = 'info'; |
| | | $data['output'] = shell_exec('glsa-check -pv --nocolor affected 2>/dev/null'); |
| | | } |
| | | } elseif (file_exists('/etc/SuSE-release')) { |
| | | |
| | | /* |
| | | * update and find the upgrade. |
| | | * if there is any output, then there is a needed update |
| | | */ |
| | | $aptData = shell_exec('zypper -q lu'); |
| | | if ($aptData == '') { |
| | | /* There is nothing to update! */ |
| | | $state = 'ok'; |
| | | } else { |
| | | /* |
| | | * There is something to update! this is in most cases not critical, so we can |
| | | * do a system-update once a month or so... |
| | | */ |
| | | $state = 'info'; |
| | | } |
| | | |
| | | /* |
| | | * Fetch the output |
| | | */ |
| | | $data['output'] = shell_exec('zypper lu'); |
| | | } else { |
| | | /* |
| | | * It is not Debian/Ubuntu, so there is no data and no state |
| | |
| | | */ |
| | | $tmp = explode("\n", $data['output']); |
| | | $more = $tmp[sizeof($tmp) - 1]; |
| | | $this->_getIntArray($more); |
| | | $res = $this->_getIntArray($more); |
| | | $data['bytes'] = $res[0]; |
| | | $data['requests'] = $res[1]; |
| | | |
| | |
| | | /* |
| | | * Fetch the output |
| | | */ |
| | | $data['output'] = shell_exec('mpt-status --autoload -n'); |
| | | $data['output'] = shell_exec('mpt-status --autoload'); |
| | | |
| | | /* |
| | | * Then calc the state. |
| | | */ |
| | | $state = 'ok'; |
| | | foreach ($data['output'] as $item) { |
| | | /* |
| | | * The output contains information for every RAID and every HDD. |
| | | * We only need the state of the RAID |
| | | */ |
| | | if (strpos($item, 'raidlevel:') !== false) { |
| | | if(is_array($data['output'])) { |
| | | foreach ($data['output'] as $item) { |
| | | /* |
| | | * We found a raid, process the state of it |
| | | */ |
| | | if (strpos($item, ' ONLINE ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } elseif (strpos($item, ' OPTIMAL ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } elseif (strpos($item, ' INITIAL ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } elseif (strpos($item, ' INACTIVE ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } elseif (strpos($item, ' RESYNC ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } elseif (strpos($item, ' DEGRADED ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } else { |
| | | /* we don't know the state. so we set the state to critical, that the |
| | | * admin is warned, that something is wrong |
| | | */ |
| | | $this->_setState($state, 'critical'); |
| | | * The output contains information for every RAID and every HDD. |
| | | * We only need the state of the RAID |
| | | */ |
| | | if (strpos($item, 'state ') !== false) { |
| | | /* |
| | | * We found a raid, process the state of it |
| | | */ |
| | | if (strpos($item, ' ONLINE ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } elseif (strpos($item, ' OPTIMAL ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } elseif (strpos($item, ' INITIAL ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } elseif (strpos($item, ' INACTIVE ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } elseif (strpos($item, ' RESYNC ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } elseif (strpos($item, ' DEGRADED ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } else { |
| | | /* we don't know the state. so we set the state to critical, that the |
| | | * admin is warned, that something is wrong |
| | | */ |
| | | $this->_setState($state, 'critical'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /* |
| | | * 3ware Controller |
| | | */ |
| | | system('which tw_cli', $retval); |
| | | if($retval === 0) { |
| | | |
| | | $data['output'] = shell_exec('tw_cli info c0'); |
| | | |
| | | $state = 'ok'; |
| | | if(is_array($data['output'])) { |
| | | foreach ($data['output'] as $item) { |
| | | if (strpos($item, 'RAID') !== false) { |
| | | if (strpos($item, ' VERIFYING ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } |
| | | else if (strpos($item, ' MIGRATE-PAUSED ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } |
| | | else if (strpos($item, ' MIGRATING ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } |
| | | else if (strpos($item, ' INITIALIZING ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } |
| | | else if (strpos($item, ' INIT-PAUSED ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } |
| | | else if (strpos($item, ' REBUILDING ') !== false) { |
| | | $this->_setState($state, 'info'); |
| | | } |
| | | else if (strpos($item, ' REBUILD-PAUSED ') !== false) { |
| | | $this->_setState($state, 'warning'); |
| | | } |
| | | else if (strpos($item, ' RECOVERY ') !== false) { |
| | | $this->_setState($state, 'warning'); |
| | | } |
| | | else if (strpos($item, ' DEGRADED ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } |
| | | else if (strpos($item, ' UNKNOWN ') !== false) { |
| | | $this->_setState($state, 'critical'); |
| | | } |
| | | else if (strpos($item, ' OK ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } |
| | | else if (strpos($item, ' OPTIMAL ') !== false) { |
| | | $this->_setState($state, 'ok'); |
| | | } |
| | | else { |
| | | $this->_setState($state, 'critical'); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * Return the Result |
| | |
| | | return $res; |
| | | } |
| | | |
| | | public function monitorIPTables() { |
| | | global $conf; |
| | | |
| | | /* the id of the server as int */ |
| | | $server_id = intval($conf['server_id']); |
| | | |
| | | /** The type of the data */ |
| | | $type = 'iptables_rules'; |
| | | |
| | | /* This monitoring is only available if fail2ban is installed */ |
| | | system('which iptables', $retval); // Debian, Ubuntu, Fedora |
| | | if ($retval === 0) { |
| | | /* Get the data of the log */ |
| | | $data['output'] = '<h2>iptables -S (ipv4)</h2>'.shell_exec('iptables -S 2>/dev/null'); |
| | | |
| | | /* |
| | | * At this moment, there is no state (maybe later) |
| | | */ |
| | | $state = 'no_state'; |
| | | } else { |
| | | $state = 'no_state'; |
| | | $data = ''; |
| | | } |
| | | |
| | | |
| | | /* This monitoring is only available if fail2ban is installed */ |
| | | system('which ip6tables', $retval); // Debian, Ubuntu, Fedora |
| | | if ($retval === 0) { |
| | | /* Get the data of the log */ |
| | | $data['output'] .= '<br><h2>ip6tables -S (ipv6)</h2>'.shell_exec('ip6tables -S 2>/dev/null'); |
| | | |
| | | /* |
| | | * At this moment, there is no state (maybe later) |
| | | */ |
| | | $state = 'no_state'; |
| | | } else { |
| | | $state = 'no_state'; |
| | | $data = ''; |
| | | } |
| | | |
| | | /* |
| | | * Return the Result |
| | | */ |
| | | $res['server_id'] = $server_id; |
| | | $res['type'] = $type; |
| | | $res['data'] = $data; |
| | | $res['state'] = $state; |
| | | return $res; |
| | | } |
| | | |
| | | public function monitorSysLog() { |
| | | global $app; |
| | | global $conf; |
| | | |
| | | /* the id of the server as int */ |
| | |
| | | break; |
| | | case 'log_messages': |
| | | if ($dist == 'debian') { |
| | | $logfile = '/var/log/messages'; |
| | | $logfile = '/var/log/syslog'; |
| | | } elseif ($dist == 'redhat') { |
| | | $logfile = '/var/log/messages'; |
| | | } elseif ($dist == 'suse') { |
| | |
| | | } |
| | | |
| | | private function _checkTcp($host, $port) { |
| | | |
| | | /* Try to open a connection */ |
| | | $fp = @fsockopen($host, $port, $errno, $errstr, 2); |
| | | |
| | | if ($fp) { |
| | | /* |
| | | * We got a connection, this means, everything is O.K. |
| | | * But maybe we are able to do more deep testing? |
| | | */ |
| | | if ($port == 80) { |
| | | /* |
| | | * Port 80 means, testing APACHE |
| | | * So we can do a deepter test and try to get data over this connection. |
| | | * (if apache hangs, we get a connection but a timeout by trying to GET the data!) |
| | | */ |
| | | // fwrite($fp, "GET / HTTP/1.0\r\n\r\n"); |
| | | $out = "GET / HTTP/1.1\r\n"; |
| | | $out .= "Host: localhost\r\n"; |
| | | $out .= "User-Agent: Mozilla/5.0 (ISPConfig monitor)\r\n"; |
| | | $out .= "Accept: application/xml,application/xhtml+xml,text/html\r\n"; |
| | | $out .= "Connection: Close\r\n\r\n"; |
| | | fwrite($fp, $out); |
| | | stream_set_timeout($fp, 5); // Timeout after 5 seconds |
| | | $res = fread($fp, 10); // try to get 10 bytes (enough to test!) |
| | | $info = stream_get_meta_data($fp); |
| | | if ($info['timed_out']) { |
| | | return false; // Apache was not able to send data over this connection |
| | | } |
| | | } |
| | | |
| | | /* The connection is no longer needed */ |
| | | fclose($fp); |
| | | /* We are able to establish a connection */ |
| | | return true; |
| | | } else { |
| | | /* We are NOT able to establish a connection */ |
| | | return false; |
| | | } |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * Set the state to the given level (or higher, but not lesser). |
| | | * * If the actual state is critical and you call the method with ok, |
| | | * then the state is critical. |
| | | * |
| | | * * If the actual state is critical and you call the method with error, |
| | | * then the state is error. |
| | | */ |
| | | private function _setState($oldState, $newState) { |
| | | /* |
| | | * Calculate the weight of the old state |
| | | */ |
| | | switch ($oldState) { |
| | | case 'no_state': $oldInt = 0; |
| | | break; |
| | | case 'ok': $oldInt = 1; |
| | | break; |
| | | case 'unknown': $oldInt = 2; |
| | | break; |
| | | case 'info': $oldInt = 3; |
| | | break; |
| | | case 'warning': $oldInt = 4; |
| | | break; |
| | | case 'critical': $oldInt = 5; |
| | | break; |
| | | case 'error': $oldInt = 6; |
| | | break; |
| | | } |
| | | /* |
| | | * Calculate the weight of the new state |
| | | */ |
| | | switch ($newState) { |
| | | case 'no_state': $newInt = 0; |
| | | break; |
| | | case 'ok': $newInt = 1; |
| | | break; |
| | | case 'unknown': $newInt = 2; |
| | | break; |
| | | case 'info': $newInt = 3; |
| | | break; |
| | | case 'warning': $newInt = 4; |
| | | break; |
| | | case 'critical': $newInt = 5; |
| | | break; |
| | | case 'error': $newInt = 6; |
| | | break; |
| | | } |
| | | |
| | | /* |
| | | * Set to the higher level |
| | | */ |
| | | if ($newInt > $oldInt) { |
| | | return $newState; |
| | | } else { |
| | | return $oldState; |
| | | } |
| | | } |
| | | |
| | | private function _getIntArray($line) { |
| | | /** The array of float found */ |
| | | $res = array(); |
| | |
| | | |
| | | } |
| | | |
| | | ?> |
| | | ?> |