Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/elxis/error.class.php
<?php
/**
* @version        $Id: error.class.php 2384 2021-01-20 19:10:39Z IOS $
* @package        Elxis
* @subpackage    Error handling
* @copyright    Copyright (c) 2006-2021 Elxis CMS (https://www.elxis.org). All rights reserved.
* @license        Elxis Public License ( https://www.elxis.org/elxis-public-license.html )
* @author        Elxis Team ( https://www.elxis.org )
* @description     Elxis CMS is free software. Read the license for copyright notices and details
*/

defined('_ELXIS_') or die ('Direct access to this location is not allowed');


class
elxisError {

    static private
$ERROR_LOG = 0;
    static private
$ERROR_REPORT = 1;
    static private
$ERROR_ALERT = 0;
    static private
$LOG_ROTATE = 0;
    static private
$MAIL_MANAGER_NAME = '';
    static private
$MAIL_MANAGER_EMAIL = '';
    static private
$URL = 'http://localhost';
    static private
$REPO_PATH = '';
    static private
$DEBUG = false;


   
/****************************/
    /* SET ENVIROMENT VARIABLES */
    /****************************/
   
public static function init() {
       
$elxis = eFactory::getElxis();
       
self::$ERROR_LOG = (int)$elxis->getConfig('ERROR_LOG');
       
self::$ERROR_REPORT = (int)$elxis->getConfig('ERROR_REPORT');
       
self::$ERROR_ALERT = (int)$elxis->getConfig('ERROR_ALERT');
       
self::$LOG_ROTATE = (int)$elxis->getConfig('LOG_ROTATE');
       
self::$MAIL_MANAGER_NAME = $elxis->getConfig('MAIL_MANAGER_NAME');
       
self::$MAIL_MANAGER_EMAIL = $elxis->getConfig('MAIL_MANAGER_EMAIL');
        if (
self::$MAIL_MANAGER_EMAIL == '') { self::$ERROR_ALERT = 0; }
       
self::$URL = $elxis->getConfig('URL');
       
$repo_path = $elxis->getConfig('REPO_PATH');
        if (
$repo_path == '') { $repo_path = ELXIS_PATH.'/repository'; }
        if (!
is_dir($repo_path.'/') || !file_exists($repo_path.'/')) {
           
exitPage::make('fatal', 'ERRO-0001', 'Elxis repository folder not found at '.$repo_path);
        }
       
self::$REPO_PATH = $repo_path;
       
self::$DEBUG = (intval($elxis->getConfig('DEBUG')) > 1) ? true : false;

        switch (
self::$ERROR_REPORT) {
            case
1: error_reporting(E_ERROR); break;
            case
2: error_reporting(E_ALL ^ E_NOTICE); break;
            case
3: error_reporting(E_ALL); break;
            case
0: default: error_reporting(0); break;
        }
    }


   
/********************/
    /* SEND EMAIL ALERT */
    /********************/
   
static private function mailError($errfile, $errline, $errstr) {
       
$file = self::$REPO_PATH.'/logs/lastnotify.txt';
        if (!
file_exists($file)) {
            @
touch($file);
           
$proceed = true;
        } else {
           
$last = filemtime($file);
            if ((
time() - filemtime($file)) > 600) {
                @
touch($file);
               
$proceed = true;
            } else {
               
$proceed = false;
            }
        }

        if (!
$proceed) { return; }

       
$parsed = parse_url(self::$URL);
         
$host = preg_replace('#^(www\.)#i', '', $parsed['host']);
       
$subject = 'Fatal error at '.$host;
       
$to = self::$MAIL_MANAGER_EMAIL.','.self::$MAIL_MANAGER_NAME;

       
$body = 'A fatal error occured at '.self::$URL."\r\n";
       
$body .= 'Please inspect the site to find-out was caused this error and fix it.'."\r\n\r\n";
       
$body .= 'The detailed error message was:'."\r\n";
       
$body .= 'ERROR in file '.$errfile.' line '.$errline."\r\n";
       
$body .= $errstr."\r\n\r\n";
        if (
self::$ERROR_LOG > 0) {
           
$body .= 'This error was logged'."\r\n\r\n";
        }
       
$body .= 'Date: '.date('Y-m-d H:i:s')." (UTC)\r\n";
       
$body .= 'Site URL: '.self::$URL."\r\n\r\n\r\n";
       
$body .= "---------------------------------------\r\n";
       
$body .= 'Please do not reply to this message as it was generated automatically by the Elxis Error Handler ';
       
$body .= 'and it was sent for informational purposes. If you dont want to receive error notifications you can ';
       
$body .= 'set so at Elxis global configuration. Elxis Error Handler will not send you an other notification for ';
       
$body .= 'the next 10 minutes even if more errors occurs.'."\r\n";

       
$elxis = eFactory::getElxis();
       
$elxis->sendmail($subject, $body, '', null, 'plain', $to, null, null, null, 1);
    }


   
/**********************/
    /* SHOW ERROR MESSAGE */
    /**********************/
   
static private function showMessage($severity, $errfile, $errline, $errstr) {
        if (!
headers_sent()) { header('content-type: text/html; charset=utf-8'); }
        switch (
$severity) {
            case
'ERROR':
               
$bg = 'fdeeee';
               
$col = 'FF0000';
            break;
            case
'WARNING':
               
$bg = 'fff1db';
               
$col = 'FF9900';
            break;
            default:
               
$bg = 'fdfdee';
               
$col = 'abac72';
            break;
        }
        echo
'<div style="margin: 5px 0; padding: 3px; font-size: 12px; font-family: arial; border: 1px solid #'.$col.'; background-color: #'.$bg.';">'."\n";
        echo
'<span style="font-weight: bold; color: #'.$col.';">'.$severity.'</span> in file <em>'.$errfile.'</em> line <em>'.$errline."</em><br />\n";
        echo
nl2br($errstr)."\n";
        echo
"</div>\n";
    }


   
/**************************/
    /* SHOW/LOG ERROR MESSAGE */
    /**************************/
   
static public function error($errno, $errstr, $errfile, $errline) {
           switch (
$errno) {
            case
E_ERROR: case E_USER_ERROR: case E_CORE_ERROR: case E_PARSE: case E_COMPILE_ERROR:
                if (
self::$DEBUG) {
                   
$ePerformance = eRegistry::get('ePerformance');
                   
$ePerformance->addError();
                }
                if (
self::$ERROR_LOG > 0) {
                   
$msg = 'ERROR in file '.$errfile.' line '.$errline._LEND.$errstr;
                   
self::writetoLog($msg, 'error');
                }
                if (
self::$ERROR_ALERT > 0) {
                   
self::mailError($errfile, $errline, $errstr);
                }
                if (
self::$ERROR_REPORT > 0) {
                   
self::showMessage('ERROR', $errfile, $errline, $errstr);
                }
                die();
            break;
            case
E_WARNING: case E_USER_WARNING: case E_CORE_WARNING: case E_COMPILE_WARNING:
                if (
self::$DEBUG) {
                   
$ePerformance = eRegistry::get('ePerformance');
                   
$ePerformance->addError();
                }
                if (
self::$ERROR_LOG > 1) {
                   
$msg = 'WARNING in file '.$errfile.' line '.$errline._LEND.$errstr;
                   
self::writetoLog($msg, 'warning');
                }
                if (
self::$ERROR_REPORT > 1) {
                   
self::showMessage('WARNING', $errfile, $errline, $errstr);
                }
            break;
            case
E_NOTICE: case E_USER_NOTICE: case E_STRICT:
                if (
self::$DEBUG) {
                   
$ePerformance = eRegistry::get('ePerformance');
                   
$ePerformance->addError();
                }
                if (
self::$ERROR_LOG > 2) {
                   
$msg = 'NOTICE in file '.$errfile.' line '.$errline._LEND.$errstr;
                   
self::writetoLog($msg, 'notice');
                }
                if (
self::$ERROR_REPORT > 2) {
                   
self::showMessage('NOTICE', $errfile, $errline, $errstr);
                }
            break;
            default: return; break;
        }
    }


   
/***************************/
    /* SYSTEM SHUTDOWN HANDLER */
    /***************************/
   
static public function shutdown() {
       
$error = error_get_last();
        if (
$error) {
            if (
in_array($error['type'], array(E_ERROR, E_USER_ERROR, E_COMPILE_ERROR, E_CORE_ERROR, E_PARSE))) {
               
self::error($error['type'], $error['message'], $error['file'], $error['line']);
                exit();
            }
        }
    }


   
/****************************************************************/
    /* LOG WARNING (USED TO SILENT LOG DB WARNINGS ON INSERTS, ETC) */
    /****************************************************************/
   
static public function logWarning($message) {
        if (
self::$ERROR_LOG > 1) {
           
self::writetoLog($message, 'warning');
        }
    }


   
/*****************************************/
    /* LOG ERROR (USED TO SILENT LOG ERRORS) */
    /*****************************************/
   
static public function logError($message) {
        if (
self::$ERROR_LOG > 0) {
           
self::writetoLog($message, 'error');
        }
    }


   
/**********************/
    /* LOG PAGE NOT FOUND */
    /**********************/
   
static public function logNotfound($message) {
        if (
self::$ERROR_LOG > 0) {
           
self::writetoLog($message, 'notfound');
        }
    }


   
/**************************************************/
    /* WRITE MESSSAGE INTO LOGS (IMPORTANT: PRIVATE!) */
    /**************************************************/
   
static private function writetoLog($message, $type='error') {
        if (
$type == '') { $type = 'error'; }
       
$file = self::$REPO_PATH.'/logs/'.$type.'.log';
        if (
self::$LOG_ROTATE == 1) {
            if (
file_exists($file)) {
               
$modym = date('Ym', filemtime($file));
               
$creym = date('Ym');
                if (
$creym > $modym) {
                    if (
filesize($file) > 0) {//backup old file only if it is not empty
                       
$new_file = self::$REPO_PATH.'/logs/'.$type.'_'.$modym.'.log';
                        @
copy($file, $new_file);
                        @
unlink($file);
                    }
                }
            }
        }

       
$txt = '['.date('Y-m-d H:i:s').']'." \t".$message._LEND._LEND;

        if (!
$fp = @fopen($file, 'a')) { return false; }
       
flock($fp, LOCK_EX);
       
fwrite($fp, $txt);
       
flock($fp, LOCK_UN);
       
fclose($fp);
        return
true;
    }

}


/*****************/
/* ERROR HANDLER */
/*****************/
function elxisErrorHandler($errno, $errstr, $errfile, $errline) {
   
elxisError::error($errno, $errstr, $errfile, $errline);
}


/*********************/
/* SHUTDOWN FUNCTION */
/*********************/
function elxisErrorShutdown() {
   
elxisError::shutdown();
}

?>