Skip to content
monitor_tools.inc.php 49 KiB
Newer Older

		/*
		 * 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];
		$res = $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) || (strpos($line, 'U_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');
				if(is_array($data['output'])) {
					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, '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');
							}
		system('which tw_cli', $retval);
		if($retval === 0) {
			
			// TYPOWORX FIX | Determine Controler-ID
			$availableControlers = shell_exec('tw_cli info | grep -Eo "c[0-9]+');
			$data['output'] = shell_exec('tw_cli info ' . $availableControlers);
			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
		 */
		$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 monitorIPTables() {
		/* 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;
	}
vogelor's avatar
vogelor committed
		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...
		 */
		$clamav_outdated_warning = false;
		$clamav_bytecode_updated = false;
			if (stristr($line,'outdated')) {
				$clamav_outdated_warning = true;
			if(stristr($line,'main.cld is up to date')) {
				$clamav_bytecode_updated = true;
			}
		}
		
		//* Warn when clamav is outdated and main.cld update failed.
		if($clamav_outdated_warning == true && $clamav_bytecode_updated == false) {
			$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
		 */
		$res['server_id'] = $server_id;
		$res['type'] = $type;
		$res['data'] = $data;
		$res['state'] = $state;
		return $res;
	}

	public function _getLogData($log) {
		global $conf;

		$dist = '';
		$logfile = '';

		if (@is_file('/etc/debian_version')) {
			$dist = 'debian';
		} elseif (@is_file('/etc/redhat-release')) {
			$dist = 'redhat';
		} elseif (@is_file('/etc/SuSE-release')) {
			$dist = 'suse';
		} elseif (@is_file('/etc/gentoo-release')) {
			$dist = 'gentoo';
		}

		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/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_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
		if ($logfile != '') {
			$logfile = escapeshellcmd($logfile);
			if (stristr($logfile, ';') or substr($logfile, 0, 9) != '/var/log/' or stristr($logfile, '..')) {
				$log = 'Logfile path error.';
			} else {
				$log = '';
				if (is_readable($logfile)) {
					$fd = popen('tail -n 100 ' . $logfile, 'r');
					if ($fd) {
						while (!feof($fd)) {
							$log .= fgets($fd, 4096);
							$n++;
							if ($n > 1000)
								break;
						}
						fclose($fd);
					}
				} else {
					$log = 'Unable to read ' . $logfile;
				}
			}
		}

		return $log;
	}

	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;
			/* We are NOT able to establish a connection */
			return false;
		}
	}

	private function _checkUdp($host, $port) {

		$fp = @fsockopen('udp://' . $host, $port, $errno, $errstr, 2);

		if ($fp) {
			fclose($fp);
			return true;
		} else {
			return false;
		}
	}

	private function _checkFtp($host, $port) {

		$conn_id = @ftp_connect($host, $port);

		if ($conn_id) {
			@ftp_close($conn_id);
			return true;
		} else {
			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;
		}
	}
		/** 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;
			}
		}
		return $res;
	}

}