improved error handling for plugins (if an error occur now in a plugin it always gets deactivated and maniacontrol directly restarted
This commit is contained in:
parent
5abc3c3a16
commit
3e138a9065
@ -37,7 +37,7 @@ class ErrorHandler {
|
|||||||
*/
|
*/
|
||||||
public function __construct(ManiaControl $maniaControl) {
|
public function __construct(ManiaControl $maniaControl) {
|
||||||
$this->maniaControl = $maniaControl;
|
$this->maniaControl = $maniaControl;
|
||||||
set_error_handler(array(&$this, 'handleError'), -1);
|
set_error_handler(array(&$this, 'handleError')); //TODO before was -1 verify why
|
||||||
set_exception_handler(array(&$this, 'handleException'));
|
set_exception_handler(array(&$this, 'handleException'));
|
||||||
register_shutdown_function(array(&$this, 'handleShutdown'));
|
register_shutdown_function(array(&$this, 'handleShutdown'));
|
||||||
}
|
}
|
||||||
@ -78,7 +78,7 @@ class ErrorHandler {
|
|||||||
if (!$this->handlingError) {
|
if (!$this->handlingError) {
|
||||||
// Reset error handler for safety
|
// Reset error handler for safety
|
||||||
$this->handlingError = true;
|
$this->handlingError = true;
|
||||||
set_error_handler(array(&$this, 'handleError'), -1);
|
set_error_handler(array(&$this, 'handleError'));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build log message
|
// Build log message
|
||||||
@ -86,6 +86,8 @@ class ErrorHandler {
|
|||||||
$isUserError = self::isUserErrorNumber($errorNumber);
|
$isUserError = self::isUserErrorNumber($errorNumber);
|
||||||
$isFatalError = self::isFatalError($errorNumber);
|
$isFatalError = self::isFatalError($errorNumber);
|
||||||
|
|
||||||
|
$isPluginError = false;
|
||||||
|
|
||||||
$traceString = null;
|
$traceString = null;
|
||||||
$sourceClass = null;
|
$sourceClass = null;
|
||||||
$traceSourceClass = null;
|
$traceSourceClass = null;
|
||||||
@ -117,16 +119,22 @@ class ErrorHandler {
|
|||||||
if ($fileLine) {
|
if ($fileLine) {
|
||||||
$report['FileLine'] = self::stripBaseDir($fileLine);
|
$report['FileLine'] = self::stripBaseDir($fileLine);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($sourceClass) {
|
if ($sourceClass) {
|
||||||
$report['SourceClass'] = $sourceClass;
|
$report['SourceClass'] = $sourceClass;
|
||||||
$pluginId = PluginManager::getPluginId($sourceClass);
|
$pluginId = PluginManager::getPluginId($sourceClass);
|
||||||
if ($pluginId > 0) {
|
if ($pluginId > 0) {
|
||||||
$report['PluginId'] = $pluginId;
|
$report['PluginId'] = $pluginId;
|
||||||
|
|
||||||
if ($isFatalError) {
|
if ($isFatalError) {
|
||||||
$this->maniaControl->getPluginManager()->deactivatePlugin($sourceClass);
|
$this->maniaControl->getPluginManager()->deactivatePlugin($sourceClass);
|
||||||
|
$this->maniaControl->getChat()->sendError("Plugin " . $sourceClass . " has an Error -> The Plugin will be deactivated and ManiaControl restarted");
|
||||||
|
Logger::logError("Plugin " . $sourceClass . " has an Error -> The Plugin will be deactivated and ManiaControl restarted");
|
||||||
|
$isPluginError = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($traceString) {
|
if ($traceString) {
|
||||||
$report['Backtrace'] = $traceString;
|
$report['Backtrace'] = $traceString;
|
||||||
}
|
}
|
||||||
@ -161,12 +169,17 @@ class ErrorHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ($isFatalError) {
|
if ($isFatalError) {
|
||||||
$this->maniaControl->quit('Quitting ManiaControl after Fatal Error.');
|
if ($isPluginError) {
|
||||||
|
$this->maniaControl->restart();
|
||||||
|
} else {
|
||||||
|
$this->maniaControl->quit('Quitting ManiaControl after Fatal Error.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable safety state
|
// Disable safety state
|
||||||
$this->handlingError = false;
|
$this->handlingError = false;
|
||||||
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -381,7 +394,20 @@ class ErrorHandler {
|
|||||||
$filePath = str_replace('core' . DIRECTORY_SEPARATOR, 'ManiaControl\\', $filePath);
|
$filePath = str_replace('core' . DIRECTORY_SEPARATOR, 'ManiaControl\\', $filePath);
|
||||||
$className = str_replace('.php', '', $filePath);
|
$className = str_replace('.php', '', $filePath);
|
||||||
$className = str_replace(DIRECTORY_SEPARATOR, '\\', $className);
|
$className = str_replace(DIRECTORY_SEPARATOR, '\\', $className);
|
||||||
|
|
||||||
|
|
||||||
if (!class_exists($className, false)) {
|
if (!class_exists($className, false)) {
|
||||||
|
//For Classes With different Folder Namespaces
|
||||||
|
$splitNameSpace = explode('\\', $className);
|
||||||
|
if (is_array($splitNameSpace)) {
|
||||||
|
$className = end($splitNameSpace);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (get_declared_classes() as $declared_class) {
|
||||||
|
if (strpos($declared_class, $className) !== false) {
|
||||||
|
return $declared_class;
|
||||||
|
}
|
||||||
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
return $className;
|
return $className;
|
||||||
|
@ -133,7 +133,10 @@ class PluginManager {
|
|||||||
if (!$pluginClass) {
|
if (!$pluginClass) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$this->isPluginActive($pluginClass)) {
|
if (!$this->isPluginActive($pluginClass)) {
|
||||||
|
//If Error Occured while loading Plugin
|
||||||
|
$this->savePluginStatus($pluginClass, false);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -388,6 +391,7 @@ class PluginManager {
|
|||||||
if ($this->isPluginActive($pluginClass)) {
|
if ($this->isPluginActive($pluginClass)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var Plugin $plugin */
|
/** @var Plugin $plugin */
|
||||||
$plugin = new $pluginClass();
|
$plugin = new $pluginClass();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user