Skip to content
monitor_core_module.inc.php 42 KiB
Newer Older

		/* 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?
		$dbData = $app->dbmaster->queryAllRecords("SELECT loglevel FROM sys_log WHERE server_id = " . $server_id . " AND loglevel > 0");
			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 */
         * Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorMailLog() {
		global $app;
		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...???...
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorMailWarnLog() {
		global $app;
		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...???...
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorMailErrLog() {
		global $app;
		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...???...
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}
	function monitorMessagesLog() {
		global $app;
		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...???...
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorISPCCronLog() {
		global $app;
		global $conf;

		/* the id of the server as int */
		$server_id = intval($conf["server_id"]);

		/** The type of the data */
		$type = 'log_ispc_cron';

		/* Get the data of the log */
		$data = $this->_getLogData($type);

		/*
         * actually this info has no state.
         * maybe someone knows better...???...
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorFreshClamLog() {
		global $app;
		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) {
				$state = $this->_setState($state, 'warning');
			}
		}

		/*
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorClamAvLog() {
		global $app;
		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';

		/*
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}

	function monitorIspConfigLog() {
		global $app;
		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';

		/*
        Insert the data into the database
		*/
		$sql = "INSERT INTO monitor_data (server_id, type, created, data, state) " .
				"VALUES (".
				$server_id . ", " .
				"'" . $app->dbmaster->quote($type) . "', " .
				time() . ", " .
				"'" . $app->dbmaster->quote(serialize($data)) . "', " .
				"'" . $state . "'" .
				")";
		$app->dbmaster->query($sql);

		/* The new data is written, now we can delete the old one */
		$this->_delOldRecords($type, 10);
	}


	function _getLogData($log) {

		if(@is_file('/etc/debian_version')) $dist = 'debian';
		if(@is_file('/etc/redhat-release')) $dist = 'redhat';
		if(@is_file('/etc/SuSE-release')) $dist = 'suse';
		if(@is_file('/etc/gentoo-release')) $dist = 'gentoo';
			case 'log_mail':
				if($dist == 'debian') $logfile = '/var/log/mail.log';
				if($dist == 'redhat') $logfile = '/var/log/maillog';
				if($dist == 'suse') $logfile = '/var/log/mail.info';
				if($dist == 'gentoo') $logfile = '/var/log/maillog';
				break;
			case 'log_mail_warn':
				if($dist == 'debian') $logfile = '/var/log/mail.warn';
				if($dist == 'redhat') $logfile = '/var/log/maillog';
				if($dist == 'suse') $logfile = '/var/log/mail.warn';
				if($dist == 'gentoo') $logfile = '/var/log/maillog';
				break;
			case 'log_mail_err':
				if($dist == 'debian') $logfile = '/var/log/mail.err';
				if($dist == 'redhat') $logfile = '/var/log/maillog';
				if($dist == 'suse') $logfile = '/var/log/mail.err';
				if($dist == 'gentoo') $logfile = '/var/log/maillog';
				break;
			case 'log_messages':
				if($dist == 'debian') $logfile = '/var/log/messages';
				if($dist == 'redhat') $logfile = '/var/log/messages';
tbrehm's avatar
tbrehm committed
				if($dist == 'suse') $logfile = '/var/log/messages';
				if($dist == 'gentoo') $logfile = '/var/log/messages';
				break;
			case 'log_ispc_cron':
				if($dist == 'debian') $logfile = '/var/log/ispconfig/cron.log';
				if($dist == 'redhat') $logfile = '/var/log/ispconfig/cron.log';
				if($dist == 'suse') $logfile = '/var/log/ispconfig/cron.log';
				if($dist == 'gentoo') $logfile = '/var/log/cron';
				break;
			case 'log_freshclam':
				if($dist == 'debian') $logfile = '/var/log/clamav/freshclam.log';
				if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/freshclam.log') ? '/var/log/clamav/freshclam.log' : '/var/log/freshclam.log');
				if($dist == 'suse') $logfile = '';
				if($dist == 'gentoo') $logfile = '/var/log/clamav/freshclam.log';
			case 'log_clamav':
				if($dist == 'debian') $logfile = '/var/log/clamav/clamav.log';
				if($dist == 'redhat') $logfile = (is_file('/var/log/clamav/clamd.log') ? '/var/log/clamav/clamd.log' : '/var/log/maillog');
				if($dist == 'suse') $logfile = '';
				if($dist == 'gentoo') $logfile = '/var/log/clamav/clamd.log';
				break;
			case 'log_fail2ban':
				if($dist == 'debian') $logfile = '/var/log/fail2ban.log';
				if($dist == 'redhat') $logfile = '/var/log/fail2ban.log';
				if($dist == 'suse') $logfile = '/var/log/fail2ban.log';
				if($dist == 'gentoo') $logfile = '/var/log/fail2ban.log';
				break;
			case 'log_ispconfig':
				if($dist == 'debian') $logfile = '/var/log/ispconfig/ispconfig.log';
				if($dist == 'redhat') $logfile = '/var/log/ispconfig/ispconfig.log';
				if($dist == 'suse') $logfile = '/var/log/ispconfig/ispconfig.log';
				if($dist == 'gentoo') $logfile = '/var/log/ispconfig/ispconfig.log';
				break;
			default:
				$logfile = '';
				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)) {
					if($fd = popen("tail -n 100 $logfile", 'r')) {
						while (!feof($fd)) {
							$log .= fgets($fd, 4096);
							$n++;
							if($n > 1000) break;
						}
						fclose($fd);
					}
				} else {
					$log = 'Unable to read '.$logfile;
				}
			}
		}

		return $log;
	}

	function _checkTcp ($host,$port) {

		$fp = @fsockopen ($host, $port, $errno, $errstr, 2);

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

	function _checkUdp ($host,$port) {

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

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

	function _checkFtp ($host,$port) {

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

		if($conn_id) {
			@ftp_close($conn_id);
			return true;
		} else {
			return false;
		}
	}

	/*
     Deletes Records older than n.
	*/
	function _delOldRecords($type, $min, $hour=0, $days=0) {
		global $app;

		$now = time();
		$old = $now - ($min * 60) - ($hour * 60 * 60) - ($days * 24 * 60 * 60);
		$sql = "DELETE FROM monitor_data " .
				"WHERE " .
				"type =" . "'" . $app->dbmaster->quote($type) . "' " .
				"AND " .
				"created < " . $old;
		$app->dbmaster->query($sql);
	}

	/*
     * 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.
	*/
	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;
		}

		/*
		*/
		if ($newInt > $oldInt) {
			return $newState;
		}
		else {
			return $oldState;
		}
	}

	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;
			}
		}
		return $res;
	}
}
?>