Exemple #1
0
/**
 * Процесс выполняет периодические задачи cron
 * 
 * @param array $argv
 */
function executeProcess(array $argv)
{
    $SYNC_DIR = 'd:/Zona Downloads/Архив пранкоты/';
    $lists = DirManager::inst(__DIR__)->getDirContent('m3u', PsConst::EXT_M3U);
    $filesCopied = DirItem::inst(__DIR__, 'all_copied', 'list')->remove()->touch();
    $filesSkipped = DirItem::inst(__DIR__, 'all_skipped', 'list')->remove()->touch();
    $destDir = DirManager::inst(__DIR__, 'dest')->clearDir()->makePath();
    /* @var $list DirItem */
    foreach ($lists as $name => $list) {
        $name = mb_convert_encoding($name, 'UTF-8', 'cp1251');
        dolog("+ {$name}");
        foreach ($list->getFileLines() as $newFile) {
            $newFile = mb_convert_encoding($newFile, 'UTF-8', 'UTF-8');
            if (starts_with($newFile, '#')) {
                dolog(" - {$newFile}");
                continue;
                //---
            }
            $absPath = next_level_dir($SYNC_DIR, $newFile);
            $absPath = iconv('UTF-8', 'cp1251', $absPath);
            $isFile = is_file($absPath);
            dolog(" + {$newFile} ? {}", var_export($isFile, true));
            if (!$isFile) {
                $filesSkipped->writeLineToFile($absPath);
                continue;
                //---
            }
            $fileName = iconv('UTF-8', 'cp1251', basename($newFile));
            copy($absPath, $destDir->absFilePath(null, $fileName));
            $filesCopied->writeLineToFile($absPath);
        }
        //print_r($list->getFileLines());
    }
}
Exemple #2
0
 public function testDolog()
 {
     global $_log_fh;
     $tmpfile = tempnam('/tmp', 'LTS');
     if (file_exists($tmpfile)) {
         unlink($tmpfile);
     }
     $config = null;
     if (is_object(Config::$inst)) {
         $config = clone Config::$inst;
     }
     Config::set('log', 'file', $tmpfile);
     Config::set('log', 'level', LOG_INFO);
     Config::set('log', 'date_format', 'mdY');
     Config::set('log', 'format', '[%s] %s - %s');
     dolog('test info', LOG_INFO);
     _closelog();
     $log = file_get_contents($tmpfile);
     $this->assertEquals(18, strpos($log, 'test info'));
     unlink($tmpfile);
     //restore original config
     if (is_object($config)) {
         Config::$inst = $config;
     }
     $_log_fh = false;
 }
Exemple #3
0
function doTest()
{
    global $HOST;
    global $TOTAL;
    global $HREFS;
    global $REQUESTS_CNT;
    $RESULTS = array();
    $j = 0;
    foreach ($HREFS as $href => $name) {
        ++$j;
        $href = ensure_starts_with($href, '/');
        $path = "http://{$HOST}{$href}";
        $sec = Secundomer::inst();
        for ($index = 0; $index <= $REQUESTS_CNT; $index++) {
            if ($index == 0) {
                //Пропустим первый вызов, на случай кеширования
                file_get_contents($path);
                continue;
            }
            $sec->start();
            file_get_contents($path);
            $sec->stop();
            ++$TOTAL;
        }
        dolog(pad_zero_left($j, 2) . '/' . count($HREFS) . " [{$path}] - " . $sec->getAverage() . ' (' . $sec->getTotalTime() . '/' . $sec->getCount() . ')');
        $RESULTS[$path] = str_replace('.', ',', round($sec->getAverage(), 2));
    }
    asort($RESULTS, SORT_DESC);
    $RESULTS = array_reverse($RESULTS, true);
    return $RESULTS;
}
Exemple #4
0
/**
 *  OpenLSS - Lighter Smarter Simpler
 *
 *	This file is part of OpenLSS.
 *
 *	OpenLSS is free software: you can redistribute it and/or modify
 *	it under the terms of the GNU Lesser General Public License as
 *	published by the Free Software Foundation, either version 3 of
 *	the License, or (at your option) any later version.
 *
 *	OpenLSS is distributed in the hope that it will be useful,
 *	but WITHOUT ANY WARRANTY; without even the implied warranty of
 *	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *	GNU Lesser General Public License for more details.
 *
 *	You should have received a copy of the 
 *	GNU Lesser General Public License along with OpenLSS.
 *	If not, see <http://www.gnu.org/licenses/>.
 */
function run($cmd, &$return = null)
{
    $output = '';
    $cmd = '/usr/bin/sudo /bin/bash -c "' . addslashes($cmd) . '"';
    exec($cmd, $output, $return);
    $output = implode("\n", $output);
    dolog($cmd . ': ' . $output);
    return $output;
}
Exemple #5
0
function updateServer($auth_area, &$return)
{
    $cmd = 'sudo /usr/local/rwhoisd/bin/rwhois_indexer -v -A ' . $auth_area . ' -C network -s txt -c /usr/local/rwhoisd/etc/rwhoisd/rwhoisd.conf';
    dolog('about to run: ' . $cmd);
    exec($cmd, $output);
    $output = implode("\n", $output);
    dolog('updated server with output: ' . $output);
    return $output;
}
Exemple #6
0
/**
 * Процесс строит скрипты для вставки ячеек в БД
 * 
 * @param array $argv
 */
function executeProcess(array $argv)
{
    $DM = DirManager::inst(array(__DIR__, 'output'));
    $customNum = $argv[1];
    dolog('Processing mosaic demo, custom num={}', $customNum);
    /* @var $dir DirItem */
    foreach ($DM->getDirContent(null, DirItemFilter::DIRS) as $dir) {
        if (is_inumeric($customNum) && $customNum != $dir->getName()) {
            continue;
            //----
        }
        $imgDM = DirManager::inst($dir->getAbsPath());
        $imgDI = end($imgDM->getDirContent(null, DirItemFilter::IMAGES));
        $map = $imgDM->getDirItem(null, 'map', 'txt')->getFileAsProps();
        $demoDM = DirManager::inst($imgDM->absDirPath(), 'demo');
        $demoDM->clearDir();
        dolog("Building map for: [{}].", $imgDI->getRelPath());
        //CELLS BINDING
        $dim = $imgDM->getDirItem(null, 'settings', 'txt')->getFileAsProps();
        $dim = $dim['dim'];
        $dim = explode('x', $dim);
        $cw = 1 * $dim[0];
        $ch = 1 * $dim[1];
        $sourceImg = SimpleImage::inst()->load($imgDI);
        $w = $sourceImg->getWidth();
        $h = $sourceImg->getHeight();
        $destImg = SimpleImage::inst()->create($w, $h, MosaicImage::BG_COLOR);
        dolog("Img size: [{$w} x {$h}].");
        check_condition($w > 0 && !($w % $cw), 'Bad width');
        check_condition($h > 0 && !($h % $ch), 'Bad height');
        $totalCells = count($map);
        $lengtn = strlen("{$totalCells}");
        //dolog("Cells cnt: [$xcells x $ycells], total: $totalCells.");
        //СТРОИМ КАРТИНКИ
        $secundomer = Secundomer::startedInst();
        //$encoder = new PsGifEncoder();
        for ($cellCnt = 0; $cellCnt <= $totalCells; $cellCnt++) {
            $name = pad_zero_left($cellCnt, $lengtn);
            $copyTo = $demoDM->absFilePath(null, $name, 'jpg');
            if ($cellCnt > 0) {
                $cellParams = $map[$cellCnt];
                $cellParams = explode('x', $cellParams);
                $xCell = $cellParams[0];
                $yCell = $cellParams[1];
                $x = ($xCell - 1) * $cw;
                $y = ($yCell - 1) * $ch;
                $destImg->copyFromAnother($sourceImg, $x, $y, $x, $y, $cw, $ch);
            }
            $destImg->save($copyTo);
            dolog("[{$totalCells}] {$copyTo}");
        }
        //$encoder->saveToFile($demoDM->absFilePath(null, 'animation'));
        $secundomer->stop();
        dolog('Execution time: ' . $secundomer->getTotalTime());
    }
}
Exemple #7
0
function print_stack(Exception $exception)
{
    dolog('');
    dolog("ERROR occured: " . $exception->getMessage());
    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);
    }
    die(1);
}
function executeProcess(array $argv)
{
    dolog('try to get lock');
    $taken = PsLock::lock('mylock-wait', true);
    dolog('lock ' . ($taken ? 'taken' : 'not taken'));
    if ($taken) {
        sleep(10);
        PsLock::unlock();
        dolog('lock released');
    }
}
Exemple #9
0
function __exception_handler($e)
{
    if (php_sapi_name() != 'cli') {
        echo '<h1>Error</h1><p>' . $e->getMessage() . '</p><pre>' . $e . '</pre>';
        exit($e->getCode());
    }
    try {
        if (is_callable('dolog')) {
            dolog($e->getMessage() . "\n" . $e, LOG_ERROR);
            exit($e);
        }
    } catch (Exception $le) {
        echo $le;
    }
    exit($e);
}
Exemple #10
0
function executeProcess(array $argv)
{
    $rebuses = DirItem::inst(__DIR__, 'rebuses.txt')->getTextFileAdapter();
    $MR = PsMathRebus::inst();
    $result = array();
    foreach ($rebuses->getLines() as $rebus) {
        if (starts_with($rebus, '#')) {
            continue;
            //---
        }
        $rebus = $MR->normalize($rebus);
        switch ($MR->rebusState($rebus)) {
            case PsMathRebus::STATE_HAS_ANSWERS:
                dolog("Take rebus answers: {$rebus}");
                $result[$rebus] = $MR->rebusAnswers($rebus);
                break;
            case PsMathRebus::STATE_NO_ANSWERS:
                dolog("Skipping rebus: {$rebus}");
                $result[$rebus] = array();
                break;
            case PsMathRebus::STATE_NOT_REGISTERED:
                dolog("Processing rebus: {$rebus}");
                $result[$rebus] = PsMathRebusSolver::solve($rebus);
                break;
        }
    }
    $ansDI = DirItem::inst(__DIR__, 'answers.txt');
    $ansDI->remove();
    foreach ($result as $rebus => $answers) {
        $ansDI->writeLineToFile($rebus);
        foreach ($answers as $answer) {
            $ansDI->writeLineToFile($answer);
        }
        $ansDI->writeLineToFile();
    }
    /*
     * Если передан параметр копирования, то скопируем файл после обработки
     */
    if (1 == array_get_value(1, $argv, 0)) {
        dolog('Copy from [{}] to [{}]', $ansDI->getRelPath(), $MR->getAnswersDI()->getRelPath());
        $ansDI->copyTo($MR->getAnswersDI()->getAbsPath());
    }
}
Exemple #11
0
function executeProcess(array $argv)
{
    PsConnectionPool::assertDisconnectied();
    /*
     * СОЗДАЁМ SQL
     * 
     * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД.
     * Все данные из "редактируемых" таблиц также загружаются из этой БД.
     */
    $DB = DirManager::inst(__DIR__ . '/temp');
    $SDK = DirManager::inst(__DIR__ . '/temp/sdk');
    //Почистим файлы для удаления
    dolog('Clearing not .sql/.txt from temp dir');
    /* @var $item DirItem */
    foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) {
        if (!$item->checkExtension(array(PsConst::EXT_TXT, PsConst::EXT_SQL))) {
            dolog('[-] {}', $item->remove()->getRelPath());
        }
    }
    dolog();
    /*
     * SDK
     */
    //dolog('Processing objects.sql');
    /* @var $DIR DirManager */
    foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) {
        dolog();
        dolog('***************************************************************');
        dolog('>>> Processing scope [{}], dir: [{}]', $scope, $DM->absDirPath());
        $SCHEMA = $DM->getDirItem(null, 'schema.sql');
        if (!$SCHEMA->isFile()) {
            dolog('schema.sql is not exists, skipping');
            continue;
            //---
        }
        $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects');
        /*
         * Очищаем папку, в которой будет содержимое для автосгенерированных файлов
         */
        $DM_AUTO = DirManager::inst($DM_SYSOBJECTS->absDirPath(), 'auto')->clearDir();
        /*
         * Создадим ссылку на файл с данными, выгруженными из таблиц
         */
        $DI_AUTO_DATA = $DM_AUTO->getDirItem(null, 'data.sql');
        /*
         * Сначала сделаем триггеры на таблицы, от которых зависит кеш и к которым привязаны фолдинги.
         */
        LOGBOX_INIT();
        LOGBOX('Making cache and folding table triggers');
        $DM_AUTO_TRIGGERS = $DM_AUTO->getDirItem('triggers')->makePath();
        $DI_AUTO_TRIGGERS_SQL = $DM_AUTO->getDirItem(null, 'triggers', 'sql')->getSqlFileBuilder();
        $triggerPattern = $SDK->getDirItem('sysobjects/patterns', 'ta_iud_pattern.sql')->getFileContents();
        //BUILDIAN AND ADDING TRIGGERS
        foreach (PsTriggersAware::getTriggeredTables($scope) as $table) {
            foreach (PsTriggersAware::getActions() as $action) {
                $actions = PsTriggersAware::getTriggerActions($table, $scope, $action);
                if (empty($actions)) {
                    continue;
                    //---
                }
                $name = 'ta' . strtolower(first_char($action)) . '_' . $table;
                $trigger = str_replace('<%NAME%>', $name, $triggerPattern);
                $trigger = str_replace('<%TABLE%>', $table, $trigger);
                $trigger = str_replace('<%ACTION%>', $action, $trigger);
                $trigger = str_replace('<%CALL%>', implode("\n", $actions), $trigger);
                dolog("+ {$name}");
                foreach ($actions as $_action) {
                    dolog($_action);
                }
                $DI_AUTO_TRIGGERS_SQL->appendFile($DM_AUTO_TRIGGERS->getDirItem(null, $name, 'sql')->putToFile($trigger));
            }
        }
        //Все автоматически сгенерированные триггеры положим в отдельный файл
        $DI_AUTO_TRIGGERS_SQL->save();
        $autoTriggers = DirManager::inst($DM_AUTO_TRIGGERS->getAbsPath())->getDirContent(null, PsConst::EXT_SQL);
        dolog('Triggers made: {}', count($autoTriggers));
        /*
         * objects.sql
         */
        $OBJECTS_SQL = $DM_AUTO->getDirItem(null, 'objects.sql')->getSqlFileBuilder();
        /*
         * Добавляем автосгенерированные триггеры
         */
        LOGBOX('Processing objects.sql');
        if (empty($autoTriggers)) {
            dolog('No auto triggers');
        } else {
            dolog('Adding {} auto triggers', count($autoTriggers));
            $OBJECTS_SQL->appendMlComment('AUTO TRIGGERS SECTION');
            /* @var $triggerDi DirItem */
            foreach ($autoTriggers as $triggerDi) {
                dolog('+ {}', $triggerDi->getName());
                $OBJECTS_SQL->appendFile($triggerDi);
            }
        }
        /*
         * Получаем строки с включениями
         */
        $ALL = $DM_SYSOBJECTS->getDirItem(null, 'all.txt')->getFileLines(false);
        if (empty($ALL)) {
            dolog('No includes');
        } else {
            dolog('Adding {} includes from all.txt', count($ALL));
            $OBJECTS_SQL->appendMlComment('INCLUDES SECTION');
            foreach ($ALL as $include) {
                dolog('+ {}', $include);
                $OBJECTS_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include));
            }
        }
        $OBJECTS_SQL->save();
        /*
         * Создаём скрипты инициализации для схем
         */
        foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) {
            if (PsConnectionParams::has($connection, $scope)) {
                $props = PsConnectionParams::get($connection, $scope);
                $database = $props->database();
                if (empty($database)) {
                    continue;
                    //Не задана БД - пропускаем (для root)
                }
                LOGBOX('Making schema script for {}', $props);
                $SCHEMA_SQL = $DM_AUTO->getDirItem('schemas', $database, 'sql')->makePath()->getSqlFileBuilder();
                //DROP+USE
                $SCHEMA_SQL->clean();
                $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};");
                $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;");
                $SCHEMA_SQL->appendLine("USE {$database};");
                if ($scope == ENTITY_SCOPE_PROJ) {
                    dolog('+ SDK PART');
                    //Добавим секцию в лог
                    $SCHEMA_SQL->appendMlComment('>>> SDK');
                    //CREATE CHEMA SCRIPT
                    $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema.sql'));
                    //OBJECTS SCRIPT
                    $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto', 'objects.sql'));
                    //Добавим секцию в лог
                    $SCHEMA_SQL->appendMlComment('<<< SDK');
                }
                //CREATE CHEMA SCRIPT
                $SCHEMA_SQL->appendFile($SCHEMA);
                //OBJECTS SCRIPT
                $SCHEMA_SQL->appendFile($OBJECTS_SQL->getDi());
                //CREATE USER
                $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';";
                $SCHEMA_SQL->appendMlComment('Grants');
                $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password()));
                /*
                 * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini
                 */
                if ($connection == PsConnectionParams::CONN_TEST) {
                    dolog('Making physical schema {}', $props);
                    $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT);
                    dolog('Root connection props: {}', $rootProps);
                    $rootProps->execureShell($SCHEMA_SQL->getDi());
                    dolog('Connecting to [{}]', $props);
                    PsConnectionPool::configure($props);
                    $tables = PsTable::all();
                    /*
                     * Нам нужно определить новый список таблиц SDK, чтобы по ним 
                     * провести валидацию новых db.ini.
                     * 
                     * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и 
                     * можем положиться на него. Если мы подготавливаем SDK-шный db.ini,
                     * но новый список таблиц возмём из развёрнутой тестовой БД.
                     */
                    $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : DbIni::getSdkTables();
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        //Уберём из всех таблиц - SDK`шные
                        array_remove_keys($tables, $sdkTableNames);
                    }
                    $scopeTableNames = array_keys($tables);
                    sort($scopeTableNames);
                    /*
                     * Составим список таблиц.
                     * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились.
                     */
                    $tablesDi = $DM_AUTO->getDirItem(null, 'tables.txt')->putToFile(implode("\n", $scopeTableNames));
                    dolog('Tables: {} saved to {}', print_r($scopeTableNames, true), $tablesDi->getAbsPath());
                    /*
                     * Загружаем полный список таблиц схемы и на основе имеющихся db.ini файлов строим новые, добавляя/удаляя 
                     * таблицы, добавленные/удалённые из схемы.
                     */
                    $dbIniProps = PsDbIniHelper::makeDbIniForSchema($scope, $tables);
                    dolog('db.ini props: {}', print_r($dbIniProps, true));
                    $dbIniErrors = PsDbIniHelper::validateAndSaveDbIniTableProps($scope, $dbIniProps, $sdkTableNames);
                    if ($dbIniErrors) {
                        PsUtil::raise('db.ini errors for {}: {}', $scope, print_r($dbIniErrors, true));
                    }
                    /*
                     * Для проекта выгружаем данные, хранящиеся в файлах
                     */
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        dolog('Exporting tables data from files');
                        $DM_AUTO->getDirItem('data')->makePath();
                        $AUTO_DATA_SQL = $DI_AUTO_DATA->touch()->getSqlFileBuilder();
                        //Пробегаемся по таблицам
                        foreach (DbIni::getTables() as $tableName) {
                            $table = PsTable::inst($tableName);
                            if ($table->isFilesync()) {
                                $fileData = $table->exportFileAsInsertsSql();
                                if ($fileData) {
                                    dolog(' + {}', $tableName);
                                    $AUTO_DATA_SQL->appendFile($DM_AUTO->getDirItem('data', $tableName, 'sql')->putToFile($fileData));
                                } else {
                                    dolog(' - {}', $tableName);
                                }
                            }
                        }
                        $AUTO_DATA_SQL->save();
                        /*
                         * Вставим данные в тестовую схему
                         */
                        dolog('Inserting data to test schema.');
                        $props->execureShell($DI_AUTO_DATA);
                    }
                    /*
                     * Теперь ещё создадим тестовые объекты.
                     * Мы уверены, что для SDK тестовая часть есть всегда.
                     */
                    $TEST_SCHEMA_SQL = $DM_AUTO->getDirItem('test', 'schema', 'sql')->makePath()->getSqlFileBuilder();
                    if ($scope == ENTITY_SCOPE_PROJ) {
                        dolog('+ SDK TEST PART');
                        //Добавим секцию в лог
                        $TEST_SCHEMA_SQL->appendMlComment('>>> SDK');
                        //CREATE CHEMA SCRIPT
                        $TEST_SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/auto/test', 'schema.sql'));
                        //Добавим секцию в лог
                        $TEST_SCHEMA_SQL->appendMlComment('<<< SDK');
                    }
                    $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema.sql'), false);
                    $TEST_SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data.sql'), false);
                    $TEST_SCHEMA_SQL->save();
                    /*
                     * На тестовой схеме прогоняем скрипты с тестовыми данными
                     */
                    dolog('Making test schema objects.');
                    $props->execureShell($TEST_SCHEMA_SQL->getDi());
                }
                #end conn== TEST
                /*
                 * Если были сгенерированы данные из файлов - добавляем их
                 */
                if ($DI_AUTO_DATA->isFile() && $DI_AUTO_DATA->getSize() > 0) {
                    dolog('Append data inserts to {}', $SCHEMA_SQL->getDi()->getName());
                    $SCHEMA_SQL->appendFile($DI_AUTO_DATA);
                }
                //SAVE .sql
                $SCHEMA_SQL->save();
            }
        }
    }
    dolog('Database schemas successfully exported');
}
Exemple #12
0
<?php

require_once '../ToolsResources.php';
$CALLED_FILE = __FILE__;
dolog(__FILE__ . ' called in ' . time());
file_append_contents(file_path(__DIR__, 'called.log'), time() . "\n");
Exemple #13
0
/**
 * Процесс строит скрипты разворачивания БД
 * 
 * @param array $argv
 */
function executeProcess(array $argv)
{
    /*
     * СОЗДАЁМ SQL
     * 
     * Нам нужны настройки таблиц, которые неоткуда взять, кроме как из базы, поэтому для экспорта данных нужна БД.
     */
    $DB = DirManager::inst(__DIR__ . '/temp');
    $SDK = DirManager::inst(__DIR__ . '/temp/ps-sdk');
    //Почистим файлы, которые нам не интересны
    $cleanExt = array(PsConst::EXT_TXT, PsConst::EXT_SQL);
    dolog('Clearing not {} files from temp dir', array_to_string($cleanExt));
    /* @var $item DirItem */
    foreach ($DB->getDirContentFull(null, DirItemFilter::FILES) as $item) {
        if (!$item->checkExtension($cleanExt)) {
            dolog('[-] {}', $item->remove()->getRelPath());
        }
    }
    //Пробежимся по скоупам и выполним обработку
    /* @var $DIR DirManager */
    foreach (array(ENTITY_SCOPE_SDK => $SDK, ENTITY_SCOPE_PROJ => $DB) as $scope => $DM) {
        dolog();
        dolog('***************************** SCOPE [{}] *****************************', $scope);
        dolog('Working directory: [{}]', $DM->absDirPath());
        $SCHEMA = $DM->getDirItem(null, 'schema', PsConst::EXT_SQL);
        if (!$SCHEMA->isFile()) {
            dolog('schema.sql is not exists, skipping');
            continue;
            //---
        }
        //Директория с системными объектами
        $DM_SYSOBJECTS = DirManager::inst($DM->absDirPath(), 'sysobjects');
        //Директория, в которой будет содержимое для автосгенерированных файлов
        $DM_BUILD = DirManager::inst($DM->absDirPath(), 'build')->clearDir();
        //Создадим ссылку на файл с объектами
        $DM_BUILD_ALL_SQL = $DM_BUILD->getDirItem(null, 'all', PsConst::EXT_SQL)->getSqlFileBuilder();
        //Строим objects.sql
        dolog('Processing all.sql');
        /*
         * Получаем строки с включениями в objects.sql
         */
        $ALL_LINES = $DM_SYSOBJECTS->getDirItem(null, 'all', PsConst::EXT_TXT)->getFileLines(false);
        if (empty($ALL_LINES)) {
            dolog('No includes');
        } else {
            dolog('Adding {} includes from all.txt', count($ALL_LINES));
            foreach ($ALL_LINES as $include) {
                dolog('+ {}', $include);
                $DM_BUILD_ALL_SQL->appendFile($DM_SYSOBJECTS->getDirItem($include));
            }
        }
        // << Сохраняем objects.sql
        $DM_BUILD_ALL_SQL->save();
        /*
         * Создаём скрипты инициализации для схем
         */
        dolog('Processing default connection names: {}', array_to_string(array_values(PsConnectionParams::getDefaultConnectionNames())));
        foreach (PsConnectionParams::getDefaultConnectionNames() as $connection) {
            //На момент обработки скоупа мы не должны быть подключены никуда
            PsConnectionPool::assertDisconnectied();
            //Для данного скоупа не задан коннект? Пропускаем...
            if (PsConnectionParams::CONN_ROOT == $connection) {
                dolog('Skip {}', $connection);
                continue;
                //---
            }
            if (!PsConnectionParams::has($connection, $scope)) {
                dolog('No connection properties for {}', $connection);
                continue;
                //---
            }
            //Поработаем с настройками
            $props = PsConnectionParams::get($connection, $scope);
            $database = $props->database();
            if (empty($database)) {
                continue;
                //Не задана БД - пропускаем (для root)
            }
            dolog('Making schema script for {}', $props);
            $SCHEMA_DI = $DM_BUILD->getDirItem('schemas', $database, PsConst::EXT_SQL)->makePath();
            check_condition(!$SCHEMA_DI->isFile(), 'Schema file for database "{}" is already exists. Dublicate database names?', $database);
            $SCHEMA_SQL = $SCHEMA_DI->getSqlFileBuilder();
            //DROP+USE
            $SCHEMA_SQL->clean();
            $SCHEMA_SQL->appendLine("DROP DATABASE IF EXISTS {$database};");
            $SCHEMA_SQL->appendLine("CREATE DATABASE {$database} CHARACTER SET utf8 COLLATE utf8_general_ci;");
            $SCHEMA_SQL->appendLine("USE {$database};");
            //CREATE USER
            $grant = "grant all on {}.* to '{}'@'{}' identified by '{}';";
            $SCHEMA_SQL->appendMlComment('Create user with grants');
            $SCHEMA_SQL->appendLine(PsStrings::replaceWithBraced($grant, $database, $props->user(), $props->host(), $props->password()));
            if ($scope == ENTITY_SCOPE_PROJ) {
                dolog('+ SDK PART');
                //Добавим секцию в лог
                $SCHEMA_SQL->appendMlComment('>>> SDK');
                //CREATE CHEMA SCRIPT
                $SCHEMA_SQL->appendFile($SDK->getDirItem(null, 'schema', PsConst::EXT_SQL));
                //OBJECTS SCRIPT
                $SCHEMA_SQL->appendFile($SDK->getDirItem('build', 'all', PsConst::EXT_SQL));
                //Добавим секцию в лог
                $SCHEMA_SQL->appendMlComment('<<< SDK');
            }
            //CREATE CHEMA SCRIPT
            $SCHEMA_SQL->appendFile($SCHEMA);
            //OBJECTS SCRIPT
            $SCHEMA_SQL->appendFile($DM_BUILD_ALL_SQL->getDi());
            /*
             * Мы должны создать тестовую схему, чтобы убедиться, что всё хорошо и сконфигурировать db.ini
             */
            if ($connection != PsConnectionParams::CONN_TEST) {
                //Всё, сохраняем скрипт, работа закончена
                $SCHEMA_SQL->save();
                continue;
                //---
            }
            /*
             * На тестовой схеме прогоняем скрипт
             */
            dolog('Making physical schema {}', $props);
            $rootProps = PsConnectionParams::get(PsConnectionParams::CONN_ROOT);
            dolog('Root connection props: {}', $rootProps);
            $rootProps->execureShell($SCHEMA_SQL->getDi());
            dolog('Connecting to [{}]', $props);
            PsConnectionPool::configure($props);
            $tables = PsTable::all();
            /*
             * Нам нужно определить новый список таблиц SDK, чтобы по ним 
             * провести валидацию новых db.ini.
             * 
             * Если мы обрабатываем проект, то SDK-шный db.ini уже готов и 
             * можем положиться на него. Если мы подготавливаем SDK-шный db.ini,
             * но новый список таблиц возмём из развёрнутой тестовой БД.
             */
            $sdkTableNames = $scope == ENTITY_SCOPE_SDK ? array_keys($tables) : $SDK->getDirItem('build', 'tables', PsConst::EXT_TXT)->getFileLines();
            if ($scope == ENTITY_SCOPE_PROJ) {
                //Уберём из всех таблиц - SDK`шные
                array_remove_keys($tables, $sdkTableNames);
            }
            $scopeTableNames = array_keys($tables);
            sort($scopeTableNames);
            /*
             * Составим список таблиц.
             * Он нам особенно не нужен, но всёже будем его формировать для наглядности - какие таблицы добавились.
             */
            $TABLES_DI = $DM_BUILD->getDirItem(null, 'tables', PsConst::EXT_TXT)->touch()->putToFile(implode("\n", $scopeTableNames));
            dolog('Tables saved to {}: {}', $TABLES_DI->getRelPath(), print_r($scopeTableNames, true));
            /*
             * Выгрузим данные из таблиц в файл, чтобы убедиться, что всё корректно вставилось.
             */
            if ($scopeTableNames) {
                dolog("Exporting '{}' schema tables data to file", $database);
                $DATA_DI_SQL = $DM_BUILD->getDirItem(null, 'data', PsConst::EXT_SQL)->getSqlFileBuilder();
                $DATA_DI_SQL->clean();
                //Пробегаемся по таблицам
                foreach ($scopeTableNames as $tableName) {
                    $fileData = PsTable::inst($tableName)->exportAsSqlString();
                    if ($fileData) {
                        dolog(' + {} [not empty]', $tableName);
                        $DATA_DI_SQL->appendMlComment('+ table ' . $tableName);
                        $DATA_DI_SQL->appendLine($fileData);
                    } else {
                        dolog(' - {} [empty]', $tableName);
                    }
                }
                $DATA_DI_SQL->save();
            }
            /*
             * Теперь ещё создадим тестовые объекты.
             * Для каждого скоупа свои тестовые данные, так что таблицы можно называть одинаково.
             */
            dolog('Add test part');
            $SCHEMA_SQL->appendMlComment('Test part');
            /*
             if ($scope == ENTITY_SCOPE_PROJ) {
             dolog('+ SDK TEST PART');
            
             //Добавим секцию в лог
             $SCHEMA_SQL->appendMlComment('>>> SDK TEST PART');
            
             //CREATE CHEMA SCRIPT
             $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'schema', PsConst::EXT_SQL));
            
             //ADD TEST DATA
             $SCHEMA_SQL->appendFile($SDK->getDirItem('sysobjects/test', 'data', PsConst::EXT_SQL));
            
             //Добавим секцию в лог
             $SCHEMA_SQL->appendMlComment('<<< SDK TEST PART');
             }
            */
            $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'schema', PsConst::EXT_SQL), false);
            $SCHEMA_SQL->appendFile($DM_SYSOBJECTS->getDirItem('test', 'data', PsConst::EXT_SQL), false);
            $SCHEMA_SQL->save();
            #end conn== TEST
            /*
             * Всё, сохраняем финальный скрипт
             */
            //SAVE .sql
            $SCHEMA_SQL->save();
            //Переразвернём тестовую схему с тестовыми таблицами
            dolog("Rebuilding checma '{}'", $database);
            $rootProps->execureShell($SCHEMA_SQL->getDi());
            //Отключимся от схемы
            PsConnectionPool::disconnect();
        }
    }
    dolog('Database schemas successfully exported');
}
Exemple #14
0
        continue;
    }
    $rebus = $MR->normalize($rebus);
    switch ($MR->rebusState($rebus)) {
        case PsMathRebus::STATE_HAS_ANSWERS:
            dolog("Take rebus answers: {$rebus}");
            $result[$rebus] = $MR->rebusAnswers($rebus);
            break;
        case PsMathRebus::STATE_NO_ANSWERS:
            dolog("Scipping rebus: {$rebus}");
            $result[$rebus] = array();
            break;
        case PsMathRebus::STATE_NOT_REGISTERED:
            dolog("Processing rebus: {$rebus}");
            $result[$rebus] = PsMathRebusSolver::solve($rebus);
            break;
    }
}
$ansDI = DirItem::inst(__DIR__, 'answers.txt');
$ansDI->remove();
foreach ($result as $rebus => $answers) {
    $ansDI->writeLineToFile($rebus);
    foreach ($answers as $answer) {
        $ansDI->writeLineToFile($answer);
    }
    $ansDI->writeLineToFile();
}
if (getCmdParam(1) == 1) {
    dolog('Copy from [' . $ansDI->getRelPath() . '] to [' . $MR->getAnswersDI()->getRelPath() . ']');
    $ansDI->copyTo($MR->getAnswersDI()->getAbsPath());
}
Exemple #15
0
    dolog("Img size: [{$w} x {$h}].");
    check_condition($w > 0 && !($w % $cw), 'Bad width');
    check_condition($h > 0 && !($h % $ch), 'Bad height');
    $xcells = $w / $cw;
    $ycells = $h / $ch;
    $totalCells = $xcells * $ycells;
    dolog("Cells cnt: [{$xcells} x {$ycells}], total: {$totalCells}.");
    $generator = new MosaicCellsGenerator($totalCells);
    $secundomer = Secundomer::startedInst();
    $sqlDI = $outDm->getDirItem(null, 'fill', 'sql');
    $mapDI = $outDm->getDirItem(null, 'map', 'txt');
    $sqlImg = "delete from ps_img_mosaic_parts where id_img={$id};";
    $sqlDI->writeLineToFile($sqlImg);
    $sqlImg = "delete from ps_img_mosaic_answers where id_img={$id};";
    $sqlDI->writeLineToFile($sqlImg);
    $sqlImg = "delete from ps_img_mosaic where id_img={$id};";
    $sqlDI->writeLineToFile($sqlImg);
    $sqlImg = "insert into ps_img_mosaic (id_img, w, h, cx, cy, cw, ch) values ({$id}, {$w}, {$h}, {$xcells}, {$ycells}, {$cw}, {$ch});";
    $sqlDI->writeLineToFile($sqlImg);
    for ($cellCnt = 1; $cellCnt <= $totalCells; $cellCnt++) {
        $cellNum = $generator->getCellNum();
        $xCell = $cellNum % $xcells;
        $xCell = $xCell == 0 ? $xcells : $xCell;
        $yCell = ($cellNum - $xCell) / $xcells + 1;
        $sqlCell = "insert into ps_img_mosaic_parts (id_img, n_part, x_cell, y_cell) values ({$id}, {$cellCnt}, {$xCell}, {$yCell});";
        $sqlDI->writeLineToFile($sqlCell);
        $mapDI->writeLineToFile($cellCnt . '=' . $xCell . 'x' . $yCell);
    }
    $secundomer->stop();
    dolog('Execution time: ' . $secundomer->getTotalTime());
}
Exemple #16
0
 function doTest($className, $methodName, array $params, $expected)
 {
     $method = "{$className}::{$methodName}";
     $actual = call_user_func_array($method, $params);
     dolog("{}({})='{}', Expected='{}'", $method, join(', ', $params), $actual, $expected);
     check_condition($actual == $expected, "{$actual} != {$expected}");
 }
Exemple #17
0
 private static function _cleanHostname($hostname = '')
 {
     $orig_hn = $hostname;
     $c = 1;
     while ($c > 0) {
         str_replace('..', '.', $hostname, $c);
     }
     $hostname = trim($hostname, '. ');
     if ($hostname != $orig_hn) {
         dolog('Hostname ' . $orig_hn . ' auto-repaired to ' . $hostname);
     }
     return $hostname;
 }
Exemple #18
0
LOGBOX('Set consts');
$props = DirItem::inst(__DIR__, 'consts.txt')->getFileAsProps();
dolog(print_r($props, true));
PsGlobals::inst()->updateProps($props);
/*
 * УДАЛИМ ТЕСТОВЫЕ ДИРЕКТОРИИ
 */
LOGBOX('Remove test dirs');
$dirs = DirManager::inst()->getDirContentFull(null, DirItemFilter::DIRS);
$testDirNames = array('temp', 'orig', '4use', 'tests', 'testcase');
$testDirStartsWith = array('!');
/* @var $dir DirItem */
foreach ($dirs as $dir) {
    if (in_array($dir->getName(), $testDirNames) || starts_with($dir->getName(), $testDirStartsWith)) {
        $path = $dir->getAbsPath();
        dolog('Removing: ' . $path);
        DirManager::inst($path)->clearDir(null, true);
    }
}
/*
 * УДАЛИМ АРХИВЫ
 */
LOGBOX('Remove archivs');
$archivs = DirManager::inst()->getDirContentFull(null, DirItemFilter::ARCHIVES);
/* @var $dir DirItem */
foreach ($archivs as $arc) {
    dolog('Removing: ' . $arc->getAbsPath());
    $arc->remove();
}
dolog("\nFile actions successfully finished\n");
Exemple #19
0
        throw new Exception('password required');
    }
    if (empty($data['auth_area'])) {
        throw new Exception('auth area required');
    }
    if (empty($data['net_block'])) {
        throw new Exception('net block required');
    }
    //auth
    if (!isset($config['user'][$data['user']])) {
        throw new Exception('user doesnt exist');
    }
    if ($data['password'] != $config['user'][$data['user']]) {
        throw new Exception('password invalid');
    }
} catch (Exception $e) {
    dolog('ERROR: ' . $e->getMessage());
    exit;
}
$auth_area = $data['auth_area'];
$auth_area_dashed = str_replace('/', '-', $data['auth_area']);
$net_block = $data['net_block'];
$net_block_dashed = str_replace('/', '-', $data['net_block']);
//del the org file
$org_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/org/' . $net_block_dashed . '.txt';
unlink($org_file);
//del the network file
$net_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/network/' . $net_block_dashed . '.txt';
unlink($net_file);
//update server
updateServer($auth_area);
Exemple #20
0
/**
 * Процесс строит скрипты для вставки ячеек в БД
 * 
 * @param array $argv
 */
function executeProcess(array $argv)
{
    $DM = DirManager::inst(__DIR__);
    //Перенесём картинки в директорию со всеми картинками
    /* @var $img DirItem */
    foreach ($DM->getDirContent(null, DirItemFilter::IMAGES) as $img) {
        $img->copyTo($DM->absFilePath('source', $img->getName()));
        $img->remove();
    }
    //Очистим директорию с выходными файлами
    $DM->clearDir('output');
    $DM->makePath('output');
    //Пробегаемся по картинкам, разбиваем их на ячейки и строим sql для вставки
    /* @var $img DirItem */
    foreach ($DM->getDirContent('source', DirItemFilter::IMAGES) as $img) {
        $id = $img->getNameNoExt();
        //Обрабатываем только картинки с целыми кодами
        if (is_inumeric($id)) {
            dolog("Processing img [{$img->getRelPath()}].");
            $id = 1 * $id;
        } else {
            dolog("Skip img [{$img->getRelPath()}], name is not numeric.");
            continue;
            //---
        }
        //Начало обработки
        $outDm = DirManager::inst(array(__DIR__, 'output'), $id);
        //Скопируем картинку
        $img->copyTo($outDm->absFilePath(null, $img->getName()));
        //Вычислим размеры ячейки
        $cw = 10;
        $ch = 10;
        $dim = $DM->getDirItem('source', $id, 'txt')->getFileAsProps(false);
        $dim = $dim['dim'];
        if ($dim) {
            $dim = explode('x', $dim);
            $cw = 1 * $dim[0];
            $ch = 1 * $dim[1];
        }
        //Скопируем свойства, с которыми она создавалась
        $outDm->getDirItem(null, 'settings', 'txt')->putToFile('dim=' . $cw . 'x' . $ch);
        dolog("Cell dimensions: [{$cw} x {$ch}].");
        //Размеры картинки получим у самой картинки
        $w = $img->getImageAdapter()->getWidth();
        $h = $img->getImageAdapter()->getHeight();
        dolog("Img size: [{$w} x {$h}].");
        check_condition($w > 0 && !($w % $cw), 'Bad width');
        check_condition($h > 0 && !($h % $ch), 'Bad height');
        $xcells = $w / $cw;
        $ycells = $h / $ch;
        $totalCells = $xcells * $ycells;
        dolog("Cells cnt: [{$xcells} x {$ycells}], total: {$totalCells}.");
        $generator = new MosaicCellsGenerator($totalCells);
        $secundomer = Secundomer::startedInst();
        $sqlDI = $outDm->getDirItem(null, 'fill', 'sql');
        $mapDI = $outDm->getDirItem(null, 'map', 'txt');
        $sqlImg = "delete from ps_img_mosaic_parts where id_img={$id};";
        $sqlDI->writeLineToFile($sqlImg);
        $sqlImg = "delete from ps_img_mosaic_answers where id_img={$id};";
        $sqlDI->writeLineToFile($sqlImg);
        $sqlImg = "delete from ps_img_mosaic where id_img={$id};";
        $sqlDI->writeLineToFile($sqlImg);
        $sqlImg = "insert into ps_img_mosaic (id_img, w, h, cx, cy, cw, ch) values ({$id}, {$w}, {$h}, {$xcells}, {$ycells}, {$cw}, {$ch});";
        $sqlDI->writeLineToFile($sqlImg);
        for ($cellCnt = 1; $cellCnt <= $totalCells; $cellCnt++) {
            $cellNum = $generator->getCellNum();
            $xCell = $cellNum % $xcells;
            $xCell = $xCell == 0 ? $xcells : $xCell;
            $yCell = ($cellNum - $xCell) / $xcells + 1;
            $sqlCell = "insert into ps_img_mosaic_parts (id_img, n_part, x_cell, y_cell) values ({$id}, {$cellCnt}, {$xCell}, {$yCell});";
            $sqlDI->writeLineToFile($sqlCell);
            $mapDI->writeLineToFile($cellCnt . '=' . $xCell . 'x' . $yCell);
        }
        $secundomer->stop();
        dolog('Execution time: ' . $secundomer->getTotalTime());
    }
}
Exemple #21
0
<?php

require_once '../ToolsResources.php';
$CALLED_FILE = __FILE__;
dolog('try to get lock');
$taken = PsLock::lock('mylock-nowait', false);
dolog('lock ' . ($taken ? 'taken' : 'not taken'));
if ($taken) {
    sleep(10);
    PsLock::unlock();
    dolog('lock released');
}
Exemple #22
0
Postal-Code: {$zip}
Country-Code: {$country}
Phone: {$phone}
Created: {$time}
Updated: {$time}
Updated-By: {$hostmaster}
CODE;
$network = <<<CODE
ID: net-{$net_block}
Auth-Area: {$auth_area}
Network-Name: {$company}-{$net_block}
IP-Network: {$net_block}
Organization: {$org_name}
Tech-Contact: {$tech_contact}
Admin-Contact: {$tech_contact}
Created: {$time}
Updated: {$time}
Updated-By: {$hostmaster}
CODE;
//write the org file
$org_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/org/' . $net_block_dashed . '.txt';
dolog('adding new org file (' . $org_file . '): ' . "\n" . $org);
unlink($org_file);
file_put_contents($org_file, $org);
//write the network file
$net_file = $config['root'] . '/etc/rwhoisd/net-' . $auth_area_dashed . '/data/network/' . $net_block_dashed . '.txt';
dolog('adding new network file (' . $net_file . '): ' . "\n" . $network);
unlink($net_file);
file_put_contents($net_file, $network);
//update server
updateServer($auth_area);
 public static function url_stat($path, $flags)
 {
     $opts = static::parsePath($path);
     try {
         $wrapper = new static();
         $wrapper->reset();
         $wrapper->populateInfo($opts);
         $stat = $wrapper->stat($wrapper->stream_stat());
         return $stat;
     } catch (Exception $e) {
         dolog(self::getPrefix(false) . ' [url_stat] ' . $e->getMessage(), LOG_WARN);
         return false;
     }
 }