From 37b29231e47a0c4458dc1c15d98588f16f07e1e2 Mon Sep 17 00:00:00 2001 From: Marius Cramer <m.cramer@pixcept.de> Date: Thu, 06 Aug 2015 03:18:44 -0400 Subject: [PATCH] - don't set password via remoting if field is empty --- server/lib/classes/monitor_tools.inc.php | 1735 +++++++++++++--------------------------------------------- 1 files changed, 404 insertions(+), 1,331 deletions(-) diff --git a/server/lib/classes/monitor_tools.inc.php b/server/lib/classes/monitor_tools.inc.php index 6539a1a..ce3d4bb 100644 --- a/server/lib/classes/monitor_tools.inc.php +++ b/server/lib/classes/monitor_tools.inc.php @@ -1,31 +1,31 @@ <?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 { @@ -44,8 +44,95 @@ //** 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 "15.04": + $relname = "(Vivid Vervet)"; + break; + case "14.10": + $relname = "(Utopic Unicorn)"; + break; + case "14.04": + $relname = "(Trusty Tahr)"; + break; + case "13.10": + $relname = "(Saucy Salamander)"; + break; + case "13.04": + $relname = "(Raring Ringtail)"; + break; + 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'; @@ -58,6 +145,16 @@ } 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') || substr(trim(file_get_contents('/etc/debian_version')),0,2) == '7.' || trim(file_get_contents('/etc/debian_version')) == 'wheezy/sid') { + $distname = 'Debian'; + $distver = 'Wheezy/Sid'; + $distid = 'debian60'; + $distbaseid = 'debian'; + } elseif(strstr(trim(file_get_contents('/etc/debian_version')), '8') || substr(trim(file_get_contents('/etc/debian_version')),0,1) == '8') { + $distname = 'Debian'; + $distver = 'Jessie'; $distid = 'debian60'; $distbaseid = 'debian'; } else { @@ -124,6 +221,16 @@ $distver = '5.3'; $distid = 'centos53'; $distbaseid = 'fedora'; + } elseif(stristr($content, 'CentOS Linux release 6')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distid = 'centos53'; + $distbaseid = 'fedora'; + } elseif(stristr($content, 'CentOS Linux release 7')) { + $distname = 'CentOS'; + $distver = 'Unknown'; + $distid = 'centos53'; + $distbaseid = 'fedora'; } else { $distname = 'Redhat'; $distver = 'Unknown'; @@ -149,377 +256,18 @@ return array('name' => $distname, 'version' => $distver, 'id' => $distid, 'baseid' => $distbaseid); } - public function monitorHDQuota() { - global $conf; - - /* Initialize data array */ - $data = array(); - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'harddisk_quota'; - - /** The state of the harddisk_quota. */ - $state = 'ok'; - - /** Fetch the data for all users */ - $dfData = shell_exec('repquota -au'); - - // split into array - $df = explode("\n", $dfData); - - /* - * ignore the first 5 lines, process the rest - */ - for ($i = 5; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { - /* - * Make a array of the data - */ - $s = preg_split('/[\s]+/', $df[$i]); - $username = $s[0]; - if (substr($username, 0, 3) == 'web') { - if (isset($data['user'][$username])) { - $data['user'][$username]['used'] += $s[2]; - $data['user'][$username]['soft'] += $s[3]; - $data['user'][$username]['hard'] += $s[4]; - } else { - $data['user'][$username]['used'] = $s[2]; - $data['user'][$username]['soft'] = $s[3]; - $data['user'][$username]['hard'] = $s[4]; - } - } - } - } - - /** Fetch the data for all users */ - $dfData = shell_exec('repquota -ag'); - - // split into array - $df = explode("\n", $dfData); - - /* - * ignore the first 5 lines, process the rest - */ - for ($i = 5; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { - /* - * Make a array of the data - */ - $s = preg_split('/[\s]+/', $df[$i]); - $groupname = $s[0]; - if (substr($groupname, 0, 6) == 'client') { - if (isset($data['group'][$groupname])) { - $data['group'][$groupname]['used'] += $s[1]; - $data['group'][$groupname]['soft'] += $s[2]; - $data['group'][$groupname]['hard'] += $s[3]; - } else { - $data['group'][$groupname]['used'] = $s[1]; - $data['group'][$groupname]['soft'] = $s[2]; - $data['group'][$groupname]['hard'] = $s[3]; - } - } - } - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorServer() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'server_load'; - - /* - 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'], 4); - $tmpUser = explode(' ', trim($tmp[2])); - $data['user_online'] = intval($tmpUser[0]); - - //* New Load Average code to fix "always zero" bug in non-english distros. NEEDS TESTING - $loadTmp = shell_exec("cat /proc/loadavg | cut -f1-3 -d' '"); - $load = explode(' ', $loadTmp); - $data['load_1'] = floatval(str_replace(',', '.', $load[0])); - $data['load_5'] = floatval(str_replace(',', '.', $load[1])); - $data['load_15'] = floatval(str_replace(',', '.', $load[2])); - - /** The state of the server-load. */ - $state = 'ok'; - if ($data['load_1'] > 20) - $state = 'info'; - if ($data['load_1'] > 50) - $state = 'warning'; - if ($data['load_1'] > 100) - $state = 'critical'; - if ($data['load_1'] > 150) - $state = 'error'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorOsVer() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'os_info'; - - /* - Fetch the data into a array - */ - $dist = $this->get_distname(); - - $data['name'] = $dist['name']; - $data['version'] = $dist['version']; - - /* the OS has no state. It is, what it is */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorIspcVer() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'ispc_info'; - - /* - 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 - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorDiskUsage() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'disk_usage'; - - /** The state of the disk-usage */ - $state = 'ok'; - - /** Fetch the data of ALL devices into a array (needed for monitoring!) */ - $dfData = shell_exec('df -hT'); - - // split into array - $df = explode("\n", $dfData); - - /* - * ignore the first line, process the rest - */ - for ($i = 1; $i <= sizeof($df); $i++) { - if ($df[$i] != '') { - /* - * Make an array of the data - */ - $s = preg_split('/[\s]+/', $df[$i]); - $data[$i]['fs'] = $s[0]; - $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']); - - //* We don't want to check some filesystem which have no sensible filling levels - switch ($data[$i]['type']) { - case 'iso9660': - case 'cramfs': - case 'udf': - case 'tmpfs': - case 'devtmpfs': - case 'udev': - break; - default: - 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'); - break; - } - } - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMemUsage() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'mem_usage'; - - /* - Fetch the data into a array - */ - $miData = shell_exec('cat /proc/meminfo'); - - $memInfo = explode("\n", $miData); - - foreach ($memInfo as $line) { - $part = preg_split('/:/', $line); - $key = trim($part[0]); - $tmp = explode(' ', trim($part[1])); - $value = 0; - if ($tmp[1] == 'kB') - $value = $tmp[0] * 1024; - $data[$key] = $value; - } - - /* - * actually this info has no state. - * maybe someone knows better...???... - */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorCpu() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'cpu_info'; - - /* - Fetch the data into a array - */ - if (file_exists('/proc/cpuinfo')) { - $cpuData = shell_exec('cat /proc/cpuinfo'); - $cpuInfo = explode("\n", $cpuData); - $processor = 0; - - foreach ($cpuInfo as $line) { - - $part = preg_split('/:/', $line); - $key = trim($part[0]); - $value = trim($part[1]); - if ($key == 'processor') - $processor = intval($value); - if ($key != '') - $data[$key . ' ' . $processor] = $value; - } - - /* the cpu has no state. It is, what it is */ - $state = 'no_state'; - } else { - /* - * It is not Linux, 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['output'] = ''; - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - + // this function remains in the tools class, because it is used by cron AND rescue public function monitorServices() { global $app; global $conf; /** 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->db->queryOneRecord('SELECT * FROM server WHERE server_id = ' . $server_id); + $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 @@ -597,7 +345,7 @@ /* 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; @@ -615,770 +363,14 @@ $state = 'error'; // because service is down } } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorOpenVzHost() { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'openvz_veinfo'; - - /* - Fetch the data into a array - */ - $app->load(openvz_tools); - $openVzTools = new openvz_tools(); - $data = $openVzTools->getOpenVzVeInfo(); - - /* the VE-Info has no state. It is, what it is */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorOpenVzUserBeancounter() { - global $app; - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'openvz_beancounter'; - - /* - Fetch the data into a array - */ - $app->load(openvz_tools); - $openVzTools = new openvz_tools(); - $data = $openVzTools->getOpenVzVeBeanCounter(); - - /* calculate the state of the beancounter */ - if ($data == '') { - $state = 'no_state'; + $data['mongodbserver'] = -1; + if ($this->_checkTcp('localhost', 27017)) { + $data['mongodbserver'] = 1; } else { - $state = 'ok'; - - /* transfer this output-string into a array */ - $test = explode("\n", $data); - - /* the first list of the output is not needed */ - array_shift($test); - - /* now process all items of the rest */ - foreach ($test as $item) { - /* - * eliminate all doubled spaces and spaces at the beginning and end - */ - while (strpos($item, ' ') !== false) { - $item = str_replace(' ', ' ', $item); - } - $item = trim($item); - - /* - * The failcounter is the LAST - */ - if ($item != '') { - $tmp = explode(' ', $item); - $failCounter = $tmp[sizeof($tmp) - 1]; - if ($failCounter > 0) - $state = 'info'; - if ($failCounter > 50) - $state = 'warning'; - if ($failCounter > 200) - $state = 'critical'; - if ($failCounter > 10000) - $state = 'error'; - } - } + $data['mongodbserver'] = 0; + //$state = 'error'; // because service is down + /* TODO!!! check if this is a mongodbserver at all, otherwise it will always throw an error state!!! */ } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorSystemUpdate() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'system_update'; - - /* This monitoring is only available on Debian or Ubuntu */ - if (file_exists('/etc/debian_version')) { - - /* - * first update the "apt database" - */ - shell_exec('apt-get update'); - - /* - * Then test the upgrade. - * if there is any output, then there is a needed update - */ - $aptData = shell_exec('apt-get -s -qq dist-upgrade'); - 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('apt-get -s -q dist-upgrade'); - } elseif (file_exists('/etc/gentoo-release')) { - - /* - * first update the portage tree - */ - - // In keeping with gentoo's rsync policy, don't update to frequently (every four hours - taken from http://www.gentoo.org/doc/en/source_mirrors.xml) - $do_update = true; - if (file_exists('/usr/portage/metadata/timestamp.chk')) { - $datetime = file_get_contents('/usr/portage/metadata/timestamp.chk'); - $datetime = trim($datetime); - - $dstamp = strtotime($datetime); - if ($dstamp) { - $checkat = $dstamp + 14400; // + 4hours - if (mktime() < $checkat) { - $do_update = false; - } - } - } - - if ($do_update) { - shell_exec('emerge --sync --quiet'); - } - - /* - * Then test the upgrade. - * if there is any output, then there is a needed update - */ - $emergeData = shell_exec('glsa-check -t affected'); - if ($emergeData == '') { - /* There is nothing to update! */ - $state = 'ok'; - $data['output'] = 'No unapplied GLSA\'s found on the system.'; - } else { - /* There is something to update! */ - $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 --non-interactive up'); - } else { - /* - * It is not Debian/Ubuntu, 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['output'] = ''; - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMailQueue() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'mailq'; - - /* Get the data from the mailq */ - $data['output'] = shell_exec('mailq'); - - /* - * The last line has more informations - */ - $tmp = explode("\n", $data['output']); - $more = $tmp[sizeof($tmp) - 1]; - $this->_getIntArray($more); - $data['bytes'] = $res[0]; - $data['requests'] = $res[1]; - - /** The state of the mailq. */ - $state = 'ok'; - if ($data['requests'] > 2000) - $state = 'info'; - if ($data['requests'] > 5000) - $state = 'warning'; - if ($data['requests'] > 8000) - $state = 'critical'; - if ($data['requests'] > 10000) - $state = 'error'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorRaid() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'raid_state'; - - /* - * We support several RAID types, but if we can't find any of them, we have no data - */ - $state = 'no_state'; - $data['output'] = ''; - - /* - * Check, if Software-RAID is enabled - */ - if (file_exists('/proc/mdstat')) { - /* - * Fetch the output - */ - $data['output'] = shell_exec('cat /proc/mdstat'); - - /* - * Then calc the state. - */ - $tmp = explode("\n", $data['output']); - $state = 'ok'; - for ($i = 0; $i < sizeof($tmp); $i++) { - /* fetch the next line */ - $line = $tmp[$i]; - - if ((strpos($line, '[U_]') !== false) || (strpos($line, '[_U]') !== false)) { - /* One Disk is not working. - * if the next line starts with "[>" or "[=" then - * recovery (resync) is in state and the state is - * information instead of critical - */ - $nextLine = $tmp[$i + 1]; - if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { - $state = $this->_setState($state, 'critical'); - } else { - $state = $this->_setState($state, 'info'); - } - } - if (strpos($line, '[__]') !== false) { - /* both Disk are not working */ - $state = $this->_setState($state, 'error'); - } - if (strpos($line, '[UU]') !== false) { - /* The disks are OK. - * if the next line starts with "[>" or "[=" then - * recovery (resync) is in state and the state is - * information instead of ok - */ - $nextLine = $tmp[$i + 1]; - if ((strpos($nextLine, '[>') === false) && (strpos($nextLine, '[=') === false)) { - $state = $this->_setState($state, 'ok'); - } else { - $state = $this->_setState($state, 'info'); - } - } - } - } - /* - * Check, if we have mpt-status installed (LSIsoftware-raid) - */ - if (file_exists('/proc/mpt/summary')) { - system('which mpt-status', $retval); - if ($retval === 0) { - /* - * Fetch the output - */ - $data['output'] = shell_exec('mpt-status --autoload -n'); - - /* - * 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) { - /* - * 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'); - } - } - } - } - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorRkHunter() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'rkhunter'; - - /* This monitoring is only available if rkhunter is installed */ - system('which rkhunter', $retval); - if ($retval === 0) { - /* - * Fetch the output - */ - $data['output'] = shell_exec('rkhunter --update --checkall --nocolors --skip-keypress'); - - /* - * At this moment, there is no state (maybe later) - */ - $state = 'no_state'; - } else { - /* - * rkhunter 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['output'] = ''; - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorFail2ban() { - 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 */ - system('which fail2ban-client', $retval); // Debian, Ubuntu, Fedora - if ($retval !== 0) - 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 = ''; - } - - /* - * 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 */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'sys_log'; - - /* - * 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'); - } - } - - /** There is no monitor-data because the data is in the sys_log table */ - $data['output'] = ''; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMailLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_mail'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - /* - * actually this info has no state. - * maybe someone knows better...???... - */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMailWarnLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_mail_warn'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - /* - * actually this info has no state. - * maybe someone knows better...???... - */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMailErrLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_mail_err'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - /* - * actually this info has no state. - * maybe someone knows better...???... - */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorMessagesLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_messages'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - /* - * actually this info has no state. - * maybe someone knows better...???... - */ - $state = 'no_state'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorISPCCronLog() { - 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'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorFreshClamLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_freshclam'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - /* Get the data from the LAST log-Entry. - * if there can be found: - * WARNING: Your ClamAV installation is OUTDATED! - * then the clamav is outdated. This is a warning! - */ - $state = 'ok'; - - $tmp = explode("\n", $data); - $lastLog = array(); - if ($tmp[sizeof($tmp) - 1] == '') { - /* the log ends with an empty line remove this */ - array_pop($tmp); - } - if (strpos($tmp[sizeof($tmp) - 1], '-------------') !== false) { - /* the log ends with "-----..." remove this */ - array_pop($tmp); - } - for ($i = sizeof($tmp) - 1; $i > 0; $i--) { - if (strpos($tmp[$i], '---------') === false) { - /* no delimiter found, so add this to the last-log */ - $lastLog[] = $tmp[$i]; - } else { - /* delimiter found, so there is no more line left! */ - break; - } - } - - /* - * Now we have the last log in the array. - * Check if the outdated-string is found... - */ - foreach ($lastLog as $line) { - if (strpos(strtolower($line), 'outdated') !== false) { - /* - * Outdatet is only info, because if we set this to warning, the server is - * as long in state warning, as there is a new version of ClamAv which takes - * sometimes weeks! - */ - $state = $this->_setState($state, 'info'); - } - } - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorClamAvLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_clamav'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - // Todo: the state should be calculated. - $state = 'ok'; - - /* - * Return the Result - */ - $res['server_id'] = $server_id; - $res['type'] = $type; - $res['data'] = $data; - $res['state'] = $state; - return $res; - } - - public function monitorIspConfigLog() { - global $conf; - - /* the id of the server as int */ - $server_id = intval($conf['server_id']); - - /** The type of the data */ - $type = 'log_ispconfig'; - - /* Get the data of the log */ - $data = $this->_getLogData($type); - - // Todo: the state should be calculated. - $state = 'ok'; /* * Return the Result @@ -1407,108 +399,111 @@ } switch ($log) { - case 'log_mail': - if ($dist == 'debian') { - $logfile = '/var/log/mail.log'; - } elseif ($dist == 'redhat') { - $logfile = '/var/log/maillog'; - } elseif ($dist == 'suse') { - $logfile = '/var/log/mail.info'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/maillog'; - } - break; - case 'log_mail_warn': - if ($dist == 'debian') { - $logfile = '/var/log/mail.warn'; - } elseif ($dist == 'redhat') { - $logfile = '/var/log/maillog'; - } elseif ($dist == 'suse') { - $logfile = '/var/log/mail.warn'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/maillog'; - } - break; - case 'log_mail_err': - if ($dist == 'debian') { - $logfile = '/var/log/mail.err'; - } elseif ($dist == 'redhat') { - $logfile = '/var/log/maillog'; - } elseif ($dist == 'suse') { - $logfile = '/var/log/mail.err'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/maillog'; - } - break; - case 'log_messages': - if ($dist == 'debian') { - $logfile = '/var/log/messages'; - } elseif ($dist == 'redhat') { - $logfile = '/var/log/messages'; - } elseif ($dist == 'suse') { - $logfile = '/var/log/messages'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/messages'; - } - break; - case 'log_ispc_cron': - if ($dist == 'debian') { - $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; - } elseif ($dist == 'redhat') { - $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; - } elseif ($dist == 'suse') { - $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/cron'; - } - break; - case 'log_freshclam': - if ($dist == 'debian') { - $logfile = '/var/log/clamav/freshclam.log'; - } elseif ($dist == 'redhat') { - $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); - } elseif ($dist == 'suse') { - $logfile = '/var/log/freshclam.log'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/clamav/freshclam.log'; - } - break; - case 'log_clamav': - if ($dist == 'debian') { - $logfile = '/var/log/clamav/clamav.log'; - } elseif ($dist == 'redhat') { - $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); - } elseif ($dist == 'suse') { - $logfile = '/var/log/clamd.log'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/clamav/clamd.log'; - } - break; - case 'log_fail2ban': - if ($dist == 'debian') { - $logfile = '/var/log/fail2ban.log'; - } elseif ($dist == 'redhat') { - $logfile = '/var/log/fail2ban.log'; - } elseif ($dist == 'suse') { - $logfile = '/var/log/fail2ban.log'; - } elseif ($dist == 'gentoo') { - $logfile = '/var/log/fail2ban.log'; - } - break; - case 'log_ispconfig': - if ($dist == 'debian') { - $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; - } elseif ($dist == 'redhat') { - $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; - } elseif ($dist == 'suse') { - $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; - } elseif ($dist == 'gentoo') { - $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; - } - break; - default: - $logfile = ''; - break; + case 'log_mail': + if ($dist == 'debian') { + $logfile = '/var/log/mail.log'; + } elseif ($dist == 'redhat') { + $logfile = '/var/log/maillog'; + } elseif ($dist == 'suse') { + $logfile = '/var/log/mail.info'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/maillog'; + } + break; + case 'log_mail_warn': + if ($dist == 'debian') { + $logfile = '/var/log/mail.warn'; + } elseif ($dist == 'redhat') { + $logfile = '/var/log/maillog'; + } elseif ($dist == 'suse') { + $logfile = '/var/log/mail.warn'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/maillog'; + } + break; + case 'log_mail_err': + if ($dist == 'debian') { + $logfile = '/var/log/mail.err'; + } elseif ($dist == 'redhat') { + $logfile = '/var/log/maillog'; + } elseif ($dist == 'suse') { + $logfile = '/var/log/mail.err'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/maillog'; + } + break; + case 'log_messages': + if ($dist == 'debian') { + $logfile = '/var/log/syslog'; + } elseif ($dist == 'redhat') { + $logfile = '/var/log/messages'; + } elseif ($dist == 'suse') { + $logfile = '/var/log/messages'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/messages'; + } + break; + case 'log_ispc_cron': + if ($dist == 'debian') { + $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; + } elseif ($dist == 'redhat') { + $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; + } elseif ($dist == 'suse') { + $logfile = $conf['ispconfig_log_dir'] . '/cron.log'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/cron'; + } + break; + case 'log_freshclam': + if ($dist == 'debian') { + $logfile = '/var/log/clamav/freshclam.log'; + } elseif ($dist == 'redhat') { + $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log'); + } elseif ($dist == 'suse') { + $logfile = '/var/log/freshclam.log'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/clamav/freshclam.log'; + } + break; + case 'log_clamav': + if ($dist == 'debian') { + $logfile = '/var/log/clamav/clamav.log'; + } elseif ($dist == 'redhat') { + $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog'); + } elseif ($dist == 'suse') { + $logfile = '/var/log/clamd.log'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/clamav/clamd.log'; + } + break; + case 'log_fail2ban': + if ($dist == 'debian') { + $logfile = '/var/log/fail2ban.log'; + } elseif ($dist == 'redhat') { + $logfile = '/var/log/fail2ban.log'; + } elseif ($dist == 'suse') { + $logfile = '/var/log/fail2ban.log'; + } elseif ($dist == 'gentoo') { + $logfile = '/var/log/fail2ban.log'; + } + break; + case 'log_mongodb': + $logfile = '/var/log/mongodb/mongodb.log'; + break; + case 'log_ispconfig': + if ($dist == 'debian') { + $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; + } elseif ($dist == 'redhat') { + $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; + } elseif ($dist == 'suse') { + $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; + } elseif ($dist == 'gentoo') { + $logfile = $conf['ispconfig_log_dir'] . '/ispconfig.log'; + } + break; + default: + $logfile = ''; + break; } // Getting the logfile content @@ -1539,26 +534,42 @@ } private function _checkTcp($host, $port) { - + /* Try to open a connection */ $fp = @fsockopen($host, $port, $errno, $errstr, 2); if ($fp) { /* - * We got a connection, but maybe apache is not able to send data over this - * connection? + * We got a connection, this means, everything is O.K. + * But maybe we are able to do more deep testing? */ - fwrite($fp, "GET / HTTP/1.0\r\n\r\n"); - stream_set_timeout($fp, 2); - $res = fread($fp, 10); - $info = stream_get_meta_data($fp); - fclose($fp); - if ($info['timed_out']) { - return false; // Apache was not able to send data over this connection - } else { - return true; // Apache was able to send data over this connection + 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 { - return false; // Apache was not able to establish a connection + /* We are NOT able to establish a connection */ + return false; } } @@ -1585,80 +596,142 @@ 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; - } - } + /** + * 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. + */ + public 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; + } - private function _getIntArray($line) { - /** The array of float found */ - $res = array(); - /* First build a array from the line */ - $data = explode(' ', $line); - /* then check if any item is a float */ - foreach ($data as $item) { - if ($item . '' == (int) $item . '') { - $res[] = $item; + /* + * Set to the higher level + */ + if ($newInt > $oldInt) { + return $newState; + } else { + return $oldState; + } + } + + /** + * 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... + */ + public function delOldRecords($type, $serverId) { + global $app; + + // $now = time(); + // $old = $now - (4 * 60); // 4 minutes + $old = 240; //seconds + + /* + * 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` = ? AND `created` < UNIX_TIMESTAMP() - ? AND `server_id` = ?'; + $app->dbmaster->query($sql, $type, $old, $serverId); + } + + public function send_notification_email($template, $placeholders, $recipients) { + global $conf; + + if(!is_array($recipients) || count($recipients) < 1) return false; + if(!is_array($placeholders)) $placeholders = array(); + + if(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_'.$conf['language'].'.txt'); + } elseif(file_exists($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt')) { + $lines = file($conf['rootpath'].'/conf-custom/mail/' . $template . '_en.txt'); + } elseif(file_exists($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt')) { + $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_'.$conf['language'].'.txt'); + } else { + $lines = file($conf['rootpath'].'/conf/mail/' . $template . '_en.txt'); + } + + //* get mail headers, subject and body + $mailHeaders = ''; + $mailBody = ''; + $mailSubject = ''; + $inHeader = true; + for($l = 0; $l < count($lines); $l++) { + if($lines[$l] == '') { + $inHeader = false; + continue; + } + if($inHeader == true) { + $parts = explode(':', $lines[$l], 2); + if(strtolower($parts[0]) == 'subject') $mailSubject = trim($parts[1]); + unset($parts); + $mailHeaders .= trim($lines[$l]) . "\n"; + } else { + $mailBody .= trim($lines[$l]) . "\n"; } } - return $res; + $mailBody = trim($mailBody); + + //* Replace placeholders + $mailHeaders = strtr($mailHeaders, $placeholders); + $mailSubject = strtr($mailSubject, $placeholders); + $mailBody = strtr($mailBody, $placeholders); + + for($r = 0; $r < count($recipients); $r++) { + mail($recipients[$r], $mailSubject, $mailBody, $mailHeaders); + } + + unset($mailSubject); + unset($mailHeaders); + unset($mailBody); + unset($lines); + + return true; } } -- Gitblit v1.9.1