| | |
| | | <?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; |
| | | //** Email Quota |
| | | public function monitorEmailQuota() { |
| | | global $conf, $app; |
| | | |
| | | //* Initialize data array |
| | | $data = array(); |
| | |
| | | |
| | | //* The state of the email_quota. |
| | | $state = 'ok'; |
| | | |
| | | $mailboxes = $app->db->queryAllRecords("SELECT email FROM mail_user WHERE server_id = $server_id"); |
| | | |
| | | $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 = '/var/vmail/'.$email_parts[1].'/'.$email_parts[0].'/.quotausage'; |
| | | if(file_exists($filename)) { |
| | | $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('/var/vmail/'.$email_parts[1].'/'.$email_parts[0]),$out); |
| | | exec('du -s '.escapeshellcmd($mb['maildir']),$out); |
| | | $parts = explode(' ',$out[0]); |
| | | $data[$email]['used'] = intval($parts[0])*1024; |
| | | unset($out); |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | unset($mailboxes); |
| | | |
| | | //* Dovecot quota check Courier in progress lathama@gmail.com |
| | | //* 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); |
| | | } |
| | | 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; |
| | | } |
| | | return $res; |
| | | } |
| | | |
| | | //** Filesystem Quota |
| | | //** Filesystem Quota |
| | | public function monitorHDQuota() { |
| | | global $conf; |
| | | |
| | |
| | | $state = 'ok'; |
| | | |
| | | //* Fetch the data for all users |
| | | $dfData = shell_exec('repquota -au'); |
| | | $dfData = shell_exec('repquota -au 2>/dev/null'); |
| | | |
| | | //* Split into array |
| | | $df = explode("\n", $dfData); |
| | |
| | | $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'); |
| | | $dfData = shell_exec('repquota -ag 2>/dev/null'); |
| | | |
| | | //* split into array |
| | | $df = explode("\n", $dfData); |
| | |
| | | $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; |
| | |
| | | $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); |
| | |
| | | * calculate the state |
| | | */ |
| | | $usePercent = floatval($data[$i]['percent']); |
| | | |
| | | |
| | | //* get the free memsize |
| | | if(substr($data[$i]['available'],-1) == 'G') { |
| | | $freesize = floatval($data[$i]['available'])*1024; |
| | |
| | | $type = 'mem_usage'; |
| | | |
| | | /* |
| | | Fetch the data into a array |
| | | Fetch the data into a array |
| | | */ |
| | | $miData = shell_exec('cat /proc/meminfo'); |
| | | |
| | |
| | | $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'); |
| | |
| | | $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(); |
| | |
| | | */ |
| | | $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]; |
| | | |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /* |
| | | * 3ware Controller |
| | | */ |
| | |
| | | $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) { |
| | |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | /* |
| | | * Return the Result |
| | |
| | | } |
| | | |
| | | public function monitorIPTables() { |
| | | global $conf; |
| | | global $conf; |
| | | |
| | | /* the id of the server as int */ |
| | | $server_id = intval($conf['server_id']); |
| | | /* the id of the server as int */ |
| | | $server_id = intval($conf['server_id']); |
| | | |
| | | /** The type of the data */ |
| | | $type = 'iptables_rules'; |
| | | /** 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'); |
| | | /* 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'); |
| | | /* |
| | | * At this moment, there is no state (maybe later) |
| | | */ |
| | | $state = 'no_state'; |
| | | } else { |
| | | $state = 'no_state'; |
| | | $data = ''; |
| | | } |
| | | |
| | | /* |
| | | * 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; |
| | | } |
| | | /* 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; |
| | |
| | | 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') { |