error and exception handler class
This commit is contained in:
		
				
					committed by
					
						
						Steffen Schröder
					
				
			
			
				
	
			
			
			
						parent
						
							96a90b0b0c
						
					
				
				
					commit
					053649600d
				
			@@ -53,72 +53,6 @@ function logMessage($message) {
 | 
			
		||||
	echo $message;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the prefix for the given error level
 | 
			
		||||
 *
 | 
			
		||||
 * @param int $errorLevel
 | 
			
		||||
 * @return string
 | 
			
		||||
 */
 | 
			
		||||
function getErrorTag($errorLevel) {
 | 
			
		||||
	if ($errorLevel == E_NOTICE) {
 | 
			
		||||
		return '[PHP NOTICE]';
 | 
			
		||||
	}
 | 
			
		||||
	if ($errorLevel == E_WARNING) {
 | 
			
		||||
		return '[PHP WARNING]';
 | 
			
		||||
	}
 | 
			
		||||
	if ($errorLevel == E_ERROR) {
 | 
			
		||||
		return '[PHP ERROR]';
 | 
			
		||||
	}
 | 
			
		||||
	if ($errorLevel == E_USER_NOTICE) {
 | 
			
		||||
		return '[ManiaControl NOTICE]';
 | 
			
		||||
	}
 | 
			
		||||
	if ($errorLevel == E_USER_WARNING) {
 | 
			
		||||
		return '[ManiaControl WARNING]';
 | 
			
		||||
	}
 | 
			
		||||
	if ($errorLevel == E_USER_ERROR) {
 | 
			
		||||
		return '[ManiaControl ERROR]';
 | 
			
		||||
	}
 | 
			
		||||
	return "[PHP {$errorLevel}]";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Register error handler
 | 
			
		||||
set_error_handler('errorHandler', -1);
 | 
			
		||||
set_exception_handler('exceptionHandler');
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Error Handler
 | 
			
		||||
 *
 | 
			
		||||
 * @param $errorNumber
 | 
			
		||||
 * @param $errorString
 | 
			
		||||
 * @param $errorFile
 | 
			
		||||
 * @param $errorLine
 | 
			
		||||
 * @return bool
 | 
			
		||||
 */
 | 
			
		||||
function errorHandler($errorNumber, $errorString, $errorFile, $errorLine) {
 | 
			
		||||
	if (error_reporting() == 0) {
 | 
			
		||||
		// Error suppressed
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
	// Log error
 | 
			
		||||
	$errorTag = getErrorTag($errorNumber);
 | 
			
		||||
	$message  = "{$errorTag}: {$errorString} in File '{$errorFile}' on Line {$errorLine}!";
 | 
			
		||||
	logMessage($message);
 | 
			
		||||
	if ($errorNumber == E_ERROR || $errorNumber == E_USER_ERROR) {
 | 
			
		||||
		logMessage('Stopping execution...');
 | 
			
		||||
		exit();
 | 
			
		||||
	}
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Exception Handler
 | 
			
		||||
 *
 | 
			
		||||
 * @param Exception $ex
 | 
			
		||||
 */
 | 
			
		||||
function exceptionHandler(Exception $ex) {
 | 
			
		||||
	$message = "[ManiaControl EXCEPTION]: {$ex->getMessage()} Trace: {$ex->getTraceAsString()}!";
 | 
			
		||||
	logMessage($message);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Autoload Function that loads ManiaControl Class Files on Demand
 | 
			
		||||
spl_autoload_register(function ($className) {
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										79
									
								
								application/core/ErrorHandler.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								application/core/ErrorHandler.php
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,79 @@
 | 
			
		||||
<?php
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Error and Exception Manager Class
 | 
			
		||||
 *
 | 
			
		||||
 * @author steeffeen & kremsy
 | 
			
		||||
 */
 | 
			
		||||
class ErrorHandler {
 | 
			
		||||
	/**
 | 
			
		||||
	 * Construct Error Handler
 | 
			
		||||
	 */
 | 
			
		||||
	public function __construct() {
 | 
			
		||||
		set_error_handler(array(&$this, 'errorHandler'), -1);
 | 
			
		||||
		set_exception_handler(array(&$this, 'exceptionHandler'));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * ManiaControl ExceptionHandler
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param Exception $ex
 | 
			
		||||
	 */
 | 
			
		||||
	public function exceptionHandler(Exception $ex) {
 | 
			
		||||
		$message = "[ManiaControl EXCEPTION]: {$ex->getMessage()} Trace: {$ex->getTraceAsString()}!";
 | 
			
		||||
		logMessage($message);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Error Handler
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param $errorNumber
 | 
			
		||||
	 * @param $errorString
 | 
			
		||||
	 * @param $errorFile
 | 
			
		||||
	 * @param $errorLine
 | 
			
		||||
	 * @return bool
 | 
			
		||||
	 */
 | 
			
		||||
	public function errorHandler($errorNumber, $errorString, $errorFile, $errorLine) {
 | 
			
		||||
		if (error_reporting() == 0) {
 | 
			
		||||
			// Error suppressed
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
		// Log error
 | 
			
		||||
		$errorTag = $this->getErrorTag($errorNumber);
 | 
			
		||||
		$message  = "{$errorTag}: {$errorString} in File '{$errorFile}' on Line {$errorLine}!";
 | 
			
		||||
		logMessage($message);
 | 
			
		||||
		if ($errorNumber == E_ERROR || $errorNumber == E_USER_ERROR) {
 | 
			
		||||
			logMessage('Stopping execution...');
 | 
			
		||||
			exit();
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Get the prefix for the given error level
 | 
			
		||||
	 *
 | 
			
		||||
	 * @param int $errorLevel
 | 
			
		||||
	 * @return string
 | 
			
		||||
	 */
 | 
			
		||||
	public function getErrorTag($errorLevel) {
 | 
			
		||||
		if ($errorLevel == E_NOTICE) {
 | 
			
		||||
			return '[PHP NOTICE]';
 | 
			
		||||
		}
 | 
			
		||||
		if ($errorLevel == E_WARNING) {
 | 
			
		||||
			return '[PHP WARNING]';
 | 
			
		||||
		}
 | 
			
		||||
		if ($errorLevel == E_ERROR) {
 | 
			
		||||
			return '[PHP ERROR]';
 | 
			
		||||
		}
 | 
			
		||||
		if ($errorLevel == E_USER_NOTICE) {
 | 
			
		||||
			return '[ManiaControl NOTICE]';
 | 
			
		||||
		}
 | 
			
		||||
		if ($errorLevel == E_USER_WARNING) {
 | 
			
		||||
			return '[ManiaControl WARNING]';
 | 
			
		||||
		}
 | 
			
		||||
		if ($errorLevel == E_USER_ERROR) {
 | 
			
		||||
			return '[ManiaControl ERROR]';
 | 
			
		||||
		}
 | 
			
		||||
		return "[PHP {$errorLevel}]";
 | 
			
		||||
	}
 | 
			
		||||
} 
 | 
			
		||||
@@ -2,6 +2,7 @@
 | 
			
		||||
 | 
			
		||||
namespace ManiaControl;
 | 
			
		||||
 | 
			
		||||
use ErrorHandler;
 | 
			
		||||
use ManiaControl\Admin\ActionsMenu;
 | 
			
		||||
use ManiaControl\Admin\AuthenticationManager;
 | 
			
		||||
use ManiaControl\Callbacks\CallbackManager;
 | 
			
		||||
@@ -62,6 +63,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	public $settingManager = null;
 | 
			
		||||
	public $statisticManager = null;
 | 
			
		||||
	public $updateManager = null;
 | 
			
		||||
	public $errorHandler = null;
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Private properties
 | 
			
		||||
@@ -72,6 +74,9 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 * Construct ManiaControl
 | 
			
		||||
	 */
 | 
			
		||||
	public function __construct() {
 | 
			
		||||
		//Construct Error Handler
 | 
			
		||||
		$this->errorHandler = new ErrorHandler($this);
 | 
			
		||||
 | 
			
		||||
		$this->log('Loading ManiaControl v' . self::VERSION . '...');
 | 
			
		||||
 | 
			
		||||
		// Load config
 | 
			
		||||
@@ -100,6 +105,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
		$this->commandManager->registerCommandListener('shutdown', $this, 'command_Shutdown', true);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
	 * Print a message to console and log
 | 
			
		||||
	 *
 | 
			
		||||
@@ -107,7 +113,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 */
 | 
			
		||||
	public function log($message, $stripCodes = false) {
 | 
			
		||||
		$date = date("d.M y H:i:s");
 | 
			
		||||
		if($stripCodes) {
 | 
			
		||||
		if ($stripCodes) {
 | 
			
		||||
			$message = Formatter::stripCodes($message);
 | 
			
		||||
		}
 | 
			
		||||
		logMessage($date . ' ' . $message);
 | 
			
		||||
@@ -121,15 +127,15 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 */
 | 
			
		||||
	public function getOS($compareOS = null) {
 | 
			
		||||
		$windows = defined('PHP_WINDOWS_VERSION_MAJOR');
 | 
			
		||||
		if($compareOS) {
 | 
			
		||||
		if ($compareOS) {
 | 
			
		||||
			// Return bool whether OS equals $compareOS
 | 
			
		||||
			if($compareOS == self::OS_WIN) {
 | 
			
		||||
			if ($compareOS == self::OS_WIN) {
 | 
			
		||||
				return $windows;
 | 
			
		||||
			}
 | 
			
		||||
			return !$windows;
 | 
			
		||||
		}
 | 
			
		||||
		// Return OS
 | 
			
		||||
		if($windows) {
 | 
			
		||||
		if ($windows) {
 | 
			
		||||
			return self::OS_WIN;
 | 
			
		||||
		}
 | 
			
		||||
		return self::OS_UNIX;
 | 
			
		||||
@@ -153,7 +159,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 * @param Player $player
 | 
			
		||||
	 */
 | 
			
		||||
	public function command_Restart(array $chatCallback, Player $player) {
 | 
			
		||||
		if(!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) {
 | 
			
		||||
		if (!AuthenticationManager::checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) {
 | 
			
		||||
			$this->authenticationManager->sendNotAllowed($player);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
@@ -167,7 +173,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 * @param Player $player
 | 
			
		||||
	 */
 | 
			
		||||
	public function command_Shutdown(array $chat, Player $player) {
 | 
			
		||||
		if(!$this->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) {
 | 
			
		||||
		if (!$this->authenticationManager->checkRight($player, AuthenticationManager::AUTH_LEVEL_SUPERADMIN)) {
 | 
			
		||||
			$this->authenticationManager->sendNotAllowed($player);
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
@@ -180,7 +186,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	 * @param string $message
 | 
			
		||||
	 */
 | 
			
		||||
	public function quit($message = null) {
 | 
			
		||||
		if($message) {
 | 
			
		||||
		if ($message) {
 | 
			
		||||
			$this->log($message);
 | 
			
		||||
		}
 | 
			
		||||
		exit();
 | 
			
		||||
@@ -217,7 +223,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
 | 
			
		||||
		// Announce restart
 | 
			
		||||
		$this->chat->sendInformation('Restarting ManiaControl...');
 | 
			
		||||
		if($message) {
 | 
			
		||||
		if ($message) {
 | 
			
		||||
			$this->log($message);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -227,7 +233,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
		$this->log('Restarting ManiaControl!');
 | 
			
		||||
 | 
			
		||||
		// Execute start script in background
 | 
			
		||||
		if($this->getOS(self::OS_UNIX)) {
 | 
			
		||||
		if ($this->getOS(self::OS_UNIX)) {
 | 
			
		||||
			$command = 'sh ' . escapeshellarg(ManiaControlDir . '/ManiaControl.sh') . ' > /dev/null &';
 | 
			
		||||
			exec($command);
 | 
			
		||||
		} else {
 | 
			
		||||
@@ -274,7 +280,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
			// Yield for next tick
 | 
			
		||||
			$loopEnd   = microtime(true);
 | 
			
		||||
			$sleepTime = 300000 - $loopEnd + $loopStart;
 | 
			
		||||
			if($sleepTime > 0) {
 | 
			
		||||
			if ($sleepTime > 0) {
 | 
			
		||||
				usleep($sleepTime);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
@@ -289,12 +295,12 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
	private function connect() {
 | 
			
		||||
		// Load remote client
 | 
			
		||||
		$host = $this->config->server->xpath('host');
 | 
			
		||||
		if(!$host) {
 | 
			
		||||
		if (!$host) {
 | 
			
		||||
			trigger_error("Invalid server configuration (host).", E_USER_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		$host = (string)$host[0];
 | 
			
		||||
		$port = $this->config->server->xpath('port');
 | 
			
		||||
		if(!$host) {
 | 
			
		||||
		if (!$host) {
 | 
			
		||||
			trigger_error("Invalid server configuration (port).", E_USER_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		$port = (string)$port[0];
 | 
			
		||||
@@ -302,12 +308,12 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
		$this->log("Connecting to server at {$host}:{$port}...");
 | 
			
		||||
 | 
			
		||||
		$login = $this->config->server->xpath('login');
 | 
			
		||||
		if(!$login) {
 | 
			
		||||
		if (!$login) {
 | 
			
		||||
			trigger_error("Invalid server configuration (login).", E_USER_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		$login = (string)$login[0];
 | 
			
		||||
		$pass  = $this->config->server->xpath('pass');
 | 
			
		||||
		if(!$pass) {
 | 
			
		||||
		if (!$pass) {
 | 
			
		||||
			trigger_error("Invalid server configuration (password).", E_USER_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
		$pass = (string)$pass[0];
 | 
			
		||||
@@ -326,7 +332,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// Wait for server to be ready
 | 
			
		||||
		if(!$this->server->waitForStatus(4)) {
 | 
			
		||||
		if (!$this->server->waitForStatus(4)) {
 | 
			
		||||
			trigger_error("Server couldn't get ready!", E_USER_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -343,7 +349,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
		$this->client->sendHideManialinkPage();
 | 
			
		||||
 | 
			
		||||
		// Enable script callbacks if needed
 | 
			
		||||
		if($this->server->getGameMode() != 0) {
 | 
			
		||||
		if ($this->server->getGameMode() != 0) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
@@ -354,7 +360,7 @@ class ManiaControl implements CommandListener {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if(!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
 | 
			
		||||
		if (!array_key_exists('S_UseScriptCallbacks', $scriptSettings)) {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user