Exemplo n.º 1
0
 /**
  * Метод убеждается в том, что провайдер безопасности установлен.
  * Наша задача - установить провайдер один раз и проверить, чтобы он больше не менялся.
  */
 public static function init()
 {
     self::$inited = check_condition(!self::$inited, 'Cannot initialize ' . __CLASS__ . ' twice');
     if (self::$provider instanceof PsSecurityProvider) {
         //Провайдер безопастности был уже установлен
     } else {
         check_condition(is_null(self::$provider), __CLASS__ . ' is not correctly initialized');
         if (PsContext::isCmd()) {
             //Если работаем под процессом - установим специальный провайдер безопастности
             self::$provider = new PsSecurityProviderCmd();
         } else {
             //Устанавливаем базовый провайдер безопасности на основе сессии
             self::$provider = new PsSecurityProviderSdk();
         }
     }
     check_condition(!PsContext::isCmd() || self::$provider instanceof PsSecurityProviderCmd, 'Invalid security provider for cmd process');
     $LOGGER = PsLogger::inst(__CLASS__);
     if ($LOGGER->isEnabled()) {
         $LOGGER->info('Context:       {}', PsContext::describe());
         $LOGGER->info('Provider:      {}', get_class(self::$provider));
         $LOGGER->info('Is authorized: {}', var_export(self::$provider->isAuthorized(), true));
         $LOGGER->info('Is admin:      {}', var_export(self::$provider->isAuthorizedAsAdmin(), true));
         $LOGGER->info('User ID:       {}', self::$provider->getUserId());
     }
 }
Exemplo n.º 2
0
 /**
  * Метод вызывается для инициализации окружения:
  * 1. Директория ресурсов окружения будет подключена в Autoload
  * 2. Файл, включающий окружение, будет выполнен
  */
 public static function init()
 {
     if (self::$inited) {
         return;
         //---
     }
     self::$inited = true;
     //---
     /*
      * Проверим, нужно ли подключать окружение
      */
     if (self::isSkipInclude()) {
         return;
         //---
     }
     $env = self::env();
     if (!$env) {
         return;
         //---
     }
     $envDir = array_get_value($env, ConfigIni::environments());
     if (!$envDir) {
         return PsUtil::raise('Environment [{}] not found', $env);
     }
     if (!is_dir($envDir)) {
         return PsUtil::raise('Environment dir for [{}] not found', $env);
     }
     $envSrcDir = next_level_dir($envDir, DirManager::DIR_SRC);
     $envIncFile = file_path($envDir, $env, PsConst::EXT_PHP);
     if (!is_file($envIncFile)) {
         return PsUtil::raise('Environment include file for [{}] not found', $env);
     }
     $LOGGER = PsLogger::inst(__CLASS__);
     if ($LOGGER->isEnabled()) {
         $LOGGER->info('Including \'{}\' environment for context \'{}\'', $env, PsContext::describe());
         $LOGGER->info('Env dir:  {}', $envDir);
         $LOGGER->info('Src dir:  {}', $envSrcDir);
         $LOGGER->info('Inc file: {}', $envIncFile);
     }
     //Проинициализировано окружение
     self::$included = true;
     //Регистрируем директорию с классами, специфичными только для данного окружения
     Autoload::inst()->registerBaseDir($envSrcDir, false);
     //Выполним необходимое действие
     $PROFILER = PsProfiler::inst(__CLASS__);
     try {
         $LOGGER->info('{');
         $PROFILER->start($env);
         self::initImpl($LOGGER, $envIncFile);
         $secundomer = $PROFILER->stop();
         $LOGGER->info('}');
         $LOGGER->info('Inc file included for {} sec', $secundomer->getTime());
     } catch (Exception $ex) {
         $PROFILER->stop(false);
         $LOGGER->info('Inc file execution error: [{}]', $ex->getMessage());
         throw $ex;
         //---
     }
 }
Exemplo n.º 3
0
 /**
  * При инициализации:
  * 1. Получим из файла номер сессии
  * 2. Почистим/создадим директорию для логирования
  */
 public function initAndWriteFirstLog()
 {
     $DM = PsLogger::DM();
     $num = PsSequence::LOG()->next();
     $num = pad_left("{$num}", 2, '0');
     $logDirName = "session {$num}";
     $DM->cd(null, $logDirName)->clearDir();
     $fileCommon = $DM->absFilePath(null, '!session ' . $num, 'txt');
     //Сделаем первую запись
     $date = date(DF_PS);
     $this->doAppend($fileCommon, self::SEPARATOR . " {$num}. [{$date}] " . self::SEPARATOR);
     $this->doAppend($fileCommon, 'SERVER: ' . (isset($_SERVER) ? print_r($_SERVER, true) : ''));
     $this->doAppend($fileCommon, 'REQUEST: ' . (isset($_REQUEST) ? print_r($_REQUEST, true) : ''));
     $this->doAppend($fileCommon, 'SESSION: ' . (isset($_SESSION) ? print_r($_SESSION, true) : ''));
     $this->doAppend($fileCommon, 'FILES: ' . (isset($_FILES) ? print_r($_FILES, true) : ''));
     $this->doAppend($fileCommon, 'CTXT: ' . PsContext::describe());
     //Установим переменные класса
     $this->sessionDM = $DM;
     $this->sessionNUM = $num;
     $this->fileCommon = $fileCommon;
 }
Exemplo n.º 4
0
    foreach ($exception->getTrace() as $num => $stackItem) {
        $str = $num . '# ' . (array_key_exists('file', $stackItem) ? $stackItem['file'] : '') . ' (' . (array_key_exists('line', $stackItem) ? $stackItem['line'] : '') . ')';
        dolog(pad_left('', $num, ' ') . $str);
    }
    dolog('');
    die(1);
}
restore_exception_handler();
set_exception_handler('print_stack');
//Параметр $CALLED_FILE должен установлен запущенным процессом
check_condition($CALLED_FILE, 'Global variable $CALLED_FILE is not set');
check_condition(is_file($CALLED_FILE), "Programm file {$CALLED_FILE} is not found");
//Функция должна быть определена запущенным процессом
check_condition(is_callable(PS_PROCESS_FUNCTION_NAME), PS_PROCESS_FUNCTION_NAME . ' is not callable');
//Проверим, что программа вызвана из командной строки
check_condition(is_array($argv) && PsContext::isCmd(), "Programm {$CALLED_FILE} can be runned only from console");
//В необязательном режиме подключим папку src нашего процесса
Autoload::inst()->registerBaseDir(array(dirname($CALLED_FILE), DirManager::DIR_SRC), false);
//Определим вспомогательную функцию логирования
function dolog($info = '')
{
    call_user_func_array(array(PsLogger::inst('PROCESS'), 'info'), func_get_args());
}
//Заругистрируем функцию, которая после окончания процесса запишет лог в файл
function dimpConsoleLog()
{
    global $CALLED_FILE;
    if ($CALLED_FILE) {
        $log = file_path(dirname($CALLED_FILE), get_file_name($CALLED_FILE), 'log');
        $FULL_LOG = PsLogger::controller()->getFullLog();
        $FULL_LOG = mb_convert_encoding($FULL_LOG, 'UTF-8', 'cp866');
Exemplo n.º 5
0
/*
 * Зарегистрируем наш обработчик для php ошибок
 */
ExceptionHandler::register4errors();
/*
 * Подключим обработчик эксепшенов. Позднее мы подключим "красивый" обработчик ошибок.
 */
ExceptionHandler::register();
/*
 * Подключим загрузчик служебных классов
 */
Autoload::inst()->register();
/*
 * Если мы работаем под процессом - не подключаемся автоматически к DB и используем специальный провайдер безопасности
 */
if (PsContext::isCmd()) {
    /*
     * Установим специальный провайдер безопасности для консольного процесса
     */
    PsSecurity::set(new PsSecurityProviderCmd());
} else {
    /*
     * Автоматически подключаемся к БД
     */
    PsConnectionPool::configure(PsConnectionParams::production());
}
/*
 * Инициализируем окружение, если мы работаем под ним.
 * Подключаемое окружение может установить свой провайдер безопасности.
 * Важно! Вызов не перемещать в if, так как метод init должен быть вызван обязательно.
 */