403Webshell
Server IP : 104.21.14.103  /  Your IP : 3.147.28.206
Web Server : LiteSpeed
System : Linux business53.web-hosting.com 4.18.0-553.lve.el8.x86_64 #1 SMP Mon May 27 15:27:34 UTC 2024 x86_64
User : giankuin ( 1871)
PHP Version : 7.4.33
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : ON  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /proc/thread-self/cwd/dup-installer/ctrls/classes/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /proc/thread-self/cwd/dup-installer/ctrls/classes/class.ctrl.s3.funcs.php
<?php
/**
 * Class used to update and edit web server configuration files
 * for .htaccess, web.config and user.ini
 *
 * Standard: PSR-2
 * @link http://www.php-fig.org/psr/psr-2 Full Documentation
 *
 * @package SC\DUPX\Crypt
 *
 */
defined('ABSPATH') || defined('DUPXABSPATH') || exit;

//-- START OF ACTION STEP 3: Update the database
require_once(DUPX_INIT.'/classes/config/class.archive.config.php');
require_once(DUPX_INIT.'/lib/config/class.wp.config.tranformer.php');
require_once(DUPX_INIT.'/lib/config/class.wp.config.tranformer.src.php');
require_once(DUPX_INIT.'/classes/utilities/class.u.multisite.php');
require_once(DUPX_INIT.'/classes/utilities/class.u.search.reaplce.manager.php');
require_once(DUPX_INIT.'/classes/Chunk/class.chunk.s3.manager.php');

/**
 * Step 3 functions
 * Singlethon
 */
final class DUPX_S3_Funcs
{

    const MODE_NORMAL = 1;
    const MODE_CHUNK  = 2;
    const MODE_SKIP   = 3; // not implemented yet

    /**
     *
     * @var DUPX_S3_Funcs
     */
    protected static $instance = null;

    /**
     *
     * @var array
     */
    public $post = null;

    /**
     *
     * @var array
     */
    public $cTableParams = null;

    /**
     *
     * @var array
     */
    public $report = array();

    /**
     *
     * @var int
     */
    private $timeStart = null;

    /**
     *
     * @var database connection
     */
    private $dbh = null;

    private function __construct()
    {
        $this->timeStart = DUPX_U::getMicrotime();
    }

    public function updateWebsite()
    {
        try {
            DUPX_Log::setThrowExceptionOnError(true);
            $nManager = DUPX_NOTICE_MANAGER::getInstance();

            switch ($this->getEngineMode()) {
                case DUPX_S3_Funcs::MODE_CHUNK:
                    /** START CHUNK MANAGER */
                    $maxIteration                  = 50;     // max iteration before stop. If 0 have no limit
                    // auto set prevent timeout
                    $inimaxExecutionTime           = ini_get('max_execution_time');
                    $maxExecutionTime              = (int) (empty($inimaxExecutionTime) ? DUPX_Constants::CHUNK_MAX_TIMEOUT_TIME : $inimaxExecutionTime);
                    $timeOut                       = max(5, $maxExecutionTime - 2) * 1000;    // timeout in milliseconds before stop exectution
                    $throttling                    = 2;  // sleep in milliseconds every iteration
                    $GLOBALS['DATABASE_PAGE_SIZE'] = 1000;   // database pagination size for engine update queries

                    /* TEST INIT SINGLE FUNC
                      $maxIteration                  = 1;     // max iteration before stop. If 0 have no limit
                      $timeOut                       = 0;    // timeout in milliseconds before stop exectution
                      $throttling                    = 0;  // sleep in milliseconds every iteration
                      $GLOBALS['DATABASE_PAGE_SIZE'] = 1000000;   // database pagination size for engine update queries
                     */

                    $chunkmManager = new DUPX_chunkS3Manager($maxIteration, $timeOut, $throttling);
                    if ($chunkmManager->start() === false) {
                        /* Stop executions */
                        $this->chunkStop($chunkmManager->getProgressPerc(), $chunkmManager->getLastPosition());
                    } else {
                        /* step 3 completed */
                        $this->complete();
                    }
                    break;
                case DUPX_S3_Funcs::MODE_SKIP:
                    $this->initLog();

                    $this->removeMaincenanceMode();

                    $this->removeLicenseKey();
                    $this->createNewAdminUser();
                    $this->configurationFileUpdate();
                    $this->htaccessUpdate();
                    $this->generalCleanup();

                    $this->noticeTest();
                    $this->cleanupTmpFiles();
                    $this->finalReportNotices();
                    $this->complete();
                    break;
                case DUPX_S3_Funcs::MODE_NORMAL:
                default:
                    $this->initLog();

                    $this->runSearchAndReplace();
                    $this->removeMaincenanceMode();

                    $this->removeLicenseKey();
                    $this->createNewAdminUser();
                    $this->configurationFileUpdate();
                    $this->htaccessUpdate();
                    $this->generalUpdate();
                    $this->generalCleanup();

                    $this->noticeTest();
                    $this->cleanupTmpFiles();
                    $this->finalReportNotices();
                    $this->complete();
            }

            $nManager->saveNotices();
        }
        catch (Exception $e) {
            $this->error($e->getMessage());
        }

        return $this->getJsonReport();
    }

    /**
     *
     * @return self
     */
    public static function getInstance()
    {
        if (is_null(self::$instance)) {
            self::$instance = new self;
        }
        return self::$instance;
    }

    /**
     * inizialize 3sFunc data
     */
    public function initData()
    {
        // if data file exists load saved data
        if (file_exists(self::getS3dataFilePath())) {
            DUPX_Log::info('LOAD S3 DATA FROM JSON', DUPX_Log::LV_DETAILED);
            if ($this->loadData() == false) {
                throw new Exception('Can\'t load s3 data');
            }
        } else {
            DUPX_Log::info('INIT S3 DATA', DUPX_Log::LV_DETAILED);
            // else init data from $_POST
            $this->setPostData();
            $this->setReplaceList();
            $this->initReport();
            $this->copyOriginalConfigFiles();
        }
    }

    /**
     *
     * @return string
     */
    private static function getS3dataFilePath()
    {
        static $path = null;
        if (is_null($path)) {
            $path = DUPX_INIT.'/dup-installer-s3data__'.DUPX_Package::getPackageHash().'.json';
        }
        return $path;
    }

    /**
     *
     * @return boolean
     */
    public function saveData()
    {
        $data = array(
            'post'         => $this->getPost(),
            'report'       => $this->report,
            'cTableParams' => $this->cTableParams,
            'replaceData'  => DUPX_S_R_MANAGER::getInstance()->getArrayData()
        );

        if (($json = DupProSnapJsonU::wp_json_encode_pprint($data)) === false) {
            DUPX_Log::info('Can\'t encode json data');
            return false;
        }

        if (@file_put_contents(self::getS3dataFilePath(), $json) === false) {
            DUPX_Log::info('Can\'t save s3 data file');
            return false;
        }

        return true;
    }

    /**
     *
     * @return boolean
     */
    private function loadData()
    {
        if (!file_exists(self::getS3dataFilePath())) {
            return false;
        }

        if (($json = @file_get_contents(self::getS3dataFilePath())) === false) {
            DUPX_Log::info('Can\'t load s3 data file');
            return false;
        }

        $data = json_decode($json, true);

        if (!is_array($data)) {
            DUPX_Log::info('Can\'t decode json data');
            return false;
        }

        if (array_key_exists('post', $data)) {
            $this->post = $data['post'];
        } else {
            DUPX_Log::info('S3 data not well formed: post not found.');
            return false;
        }

        if (array_key_exists('cTableParams', $data)) {
            $this->cTableParams = $data['cTableParams'];
        } else {
            DUPX_Log::info('S3 data not well formed: cTableParams not found.');
            return false;
        }

        if (array_key_exists('replaceData', $data)) {
            DUPX_S_R_MANAGER::getInstance()->setFromArrayData($data['replaceData']);
        } else {
            DUPX_Log::info('S3 data not well formed: replace not found.');
            return false;
        }

        if (array_key_exists('report', $data)) {
            $this->report = $data['report'];
        } else {
            DUPX_Log::info('S3 data not well formed: report not found.');
            return false;
        }

        return true;
    }

    /**
     *
     * @return boolean
     */
    public static function resetData()
    {
        $result = true;
        if (file_exists(self::getS3dataFilePath())) {
            if (@unlink(self::getS3dataFilePath()) === false) {
                DUPX_Log::info('Can\'t delete s3 data file');
                $result = false;
            }
        }

        if (file_exists($GLOBALS["CHUNK_DATA_FILE_PATH"])) {
            if (@unlink($GLOBALS["CHUNK_DATA_FILE_PATH"]) === false) {
                DUPX_Log::info('Can\'t delete s3 chunk file');
                $result = false;
            }
        }
        return $result;
    }

    private function initReport()
    {
        $this->report = self::getInitReport();
    }

    public static function getInitReport()
    {
        return array(
            'pass'          => 0,
            'chunk'         => 0,
            'chunkPos'      => array(),
            'progress_perc' => 0,
            'scan_tables'   => 0,
            'scan_rows'     => 0,
            'scan_cells'    => 0,
            'updt_tables'   => 0,
            'updt_rows'     => 0,
            'updt_cells'    => 0,
            'errsql'        => array(),
            'errser'        => array(),
            'errkey'        => array(),
            'errsql_sum'    => 0,
            'errser_sum'    => 0,
            'errkey_sum'    => 0,
            'profile_start' => '',
            'profile_end'   => '',
            'time'          => '',
            'err_all'       => 0,
            'warn_all'      => 0,
            'warnlist'      => array()
        );
    }

    public function getJsonReport()
    {
        $this->report['warn_all'] = empty($this->report['warnlist']) ? 0 : count($this->report['warnlist']);

        return array(
            'step3' => $this->report
        );
    }

    private static function logSectionHeader($title, $func, $line)
    {
        $log = "\n".'===================================='."\n".
            $title;

        if (DUPX_Log::isLevel(DUPX_Log::LV_DETAILED)) {
            $log .= ' [FUNC: '.$func.' L:'.$line.']';
        }
        $log .= "\n".
            '====================================';
        DUPX_Log::info($log);
    }

    private function setPostData()
    {
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        $subsite_id    = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SUBSITE_ID);

        // POST PARAMS
        // SEARCH AND SEPLACE SETTINGS
        $this->post = array();

        $this->post['blogname']               = htmlspecialchars($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_BLOGNAME), ENT_QUOTES);
        $this->post['url_old']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_OLD);
        $this->post['url_new']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_NEW);
        $this->post['siteurl']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SITE_URL);
        $this->post['path_new']               = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_NEW);
        $this->post['path_old']               = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_OLD);
        $this->post['replace_mode']           = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_REPLACE_MODE);
        $this->post['empty_schedule_storage'] = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_EMPTY_SCHEDULE_STORAGE);
        $this->post['mode_chunking']          = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_REPLACE_ENGINE);
        $this->post['tables']                 = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLES);
        $this->post['plugins']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PLUGINS);
        $this->post['wp_username']            = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_NAME);
        $this->post['wp_password']            = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_PASSWORD);
        $this->post['wp_mail']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_MAIL);
        $this->post['wp_nickname']            = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_NICKNAME);
        $this->post['wp_first_name']          = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_FIRST_NAME);
        $this->post['wp_last_name']           = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_ADMIN_LAST_NAME);
        $this->post['cross_search']           = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_MULTISITE_CROSS_SEARCH);
        $this->post['postguid']               = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_POSTGUID);
        $this->post['fullsearch']             = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_FULL_SEARCH);
        $this->post['replaceMail']            = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_EMAIL_REPLACE);
        $this->post['maxSerializeStrlen']     = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_MAX_SERIALIZE_CHECK) * 1000000;
        $this->post['auth_keys_and_salts']    = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_GEN_WP_AUTH_KEY);
        $this->post['mu_replace']             = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_MU_REPLACE);
        $this->post['search']                 = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_CUSTOM_SEARCH);
        $this->post['replace']                = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_CUSTOM_REPLACE);

        // MULTI SITE MODE
        if ($GLOBALS['DUPX_AC']->mu_mode == 0) {
            $this->post['action_mu_mode'] = DUPX_MultisiteMode::SingleSite;
        } else {
            $this->post['action_mu_mode'] = $subsite_id > 0 ? DUPX_MultisiteMode::Standalone : $GLOBALS['DUPX_AC']->mu_mode;
        }
    }

    /**
     * get vaule post if  thepost isn't initialized inizialize it
     *
     * @param string $key
     * @return mixed
     */
    public function getPost($key = null)
    {
        if (is_null($this->post)) {
            $this->initData();
        }

        if (is_null($key)) {
            return $this->post;
        } else if (isset($this->post[$key])) {
            return $this->post[$key];
        } else {
            return null;
        }
    }

    public function isMapping()
    {
        return $this->getPost('replace_mode') === "mapping";
    }

    /**
     * add table in tables list to scan in search and replace engine if isn't already in array
     * 
     * @param string $table
     */
    public function addTable($table)
    {
        if (empty($table)) {
            return;
        }

        // make sure post data is initialized
        $this->getPost();
        if (!in_array($table, $this->post['tables'])) {
            $this->post['tables'][] = $table;
        }
    }

    public function newSiteIsMultisite()
    {
        return $this->post['action_mu_mode'] == DUPX_MultisiteMode::Subdirectory || $this->post['action_mu_mode'] == DUPX_MultisiteMode::Subdomain;
    }

    /**
     * open db connection if is closed
     * 
     * @return database connection handle
     * 
     */
    private function dbConnection()
    {
        if (is_null($this->dbh)) {
            $paramsManager = DUPX_Paramas_Manager::getInstance();

            if ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_TEST_OK) == false) {
                throw new Exception('Database test not passed');
            }

            // make sure post data is initialized
            $this->getPost();

            $dbhost = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_HOST);
            $dbname = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_NAME);
            $dbuser = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_USER);
            $dbpass = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_PASS);

            //MYSQL CONNECTION
            if (($dbh = DUPX_DB::connect($dbhost, $dbuser, $dbpass, $dbname)) == false) {
                $dbConnError = (mysqli_connect_error()) ? 'Error: '.mysqli_connect_error() : 'Unable to Connect';
                $msg         = "Unable to connect with the following parameters:<br/>"
                    ."<b>HOST:</b>{$dbhost}<br/>"
                    ."<b>DATABASE:</b> {$dbname}<br/>"
                    ."<b>Connection Error:</b> {$dbConnError}";
                DUPX_Log::error($msg);
            } else {
                $this->dbh = $dbh;
            }

            $db_max_time = mysqli_real_escape_string($this->dbh, $GLOBALS['DB_MAX_TIME']);
            DUPX_DB::mysqli_query($this->dbh, "SET wait_timeout = ".mysqli_real_escape_string($this->dbh, $db_max_time));
            DUPX_DB::setCharset($this->dbh, $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_CHARSET), $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_COLLATE));
        }
        return $this->dbh;
    }

    /**
     *  @return database connection handle
     */
    public function getDbConnection()
    {
        return $this->dbConnection();
    }

    /**
     * close db connection if is open
     */
    public function closeDbConnection()
    {
        if (!is_null($this->dbh)) {
            mysqli_close($this->dbh);
            $this->dbh = null;
        }
    }

    public function initLog()
    {
        $paramsManager = DUPX_Paramas_Manager::getInstance();

        // make sure dbConnection is initialized
        $this->dbConnection();

        $charsetServer = @mysqli_character_set_name($this->dbh);
        $charsetClient = @mysqli_character_set_name($this->dbh);

        //LOGGING
        $date = @date('h:i:s');
        $log  = "\n\n".
            "********************************************************************************\n".
            "DUPLICATOR PRO INSTALL-LOG\n".
            "STEP-3 START @ ".$date."\n".
            "NOTICE: Do NOT post to public sites or forums\n".
            "********************************************************************************\n".
            "CHARSET SERVER:\t".DUPX_Log::varToString($charsetServer)."\n".
            "CHARSET CLIENT:\t".DUPX_Log::varToString($charsetClient)."\n".
            "********************************************************************************\n".
            "OPTIONS:\n";

        $skipOpts = array('tables', 'plugins', 'dbpass', 'search', 'replace', 'wp_password');
        foreach ($this->post as $key => $val) {
            if (in_array($key, $skipOpts)) {
                continue;
            }
            $log .= str_pad($key, 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($val)."\n";
        }

        $log .= str_pad('DISALLOW_FILE_EDIT', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_DISALLOW_FILE_EDIT))."\n";
        $log .= str_pad('AUTOSAVE_INTERVAL', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_AUTOSAVE_INTERVAL))."\n";
        $log .= str_pad('WP_POST_REVISIONS', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_POST_REVISIONS))."\n";
        $log .= str_pad('FORCE_SSL_ADMIN', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_FORCE_SSL_ADMIN))."\n";
        $log .= str_pad('WP_AUTO_UPDATE_CORE', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_AUTO_UPDATE_CORE))."\n";
        $log .= str_pad('WP_CACHE', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_CACHE))."\n";
        $log .= str_pad('WPCACHEHOME', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WPCACHEHOME))."\n";
        $log .= str_pad('WP_DEBUG', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG))."\n";
        $log .= str_pad('WP_DEBUG_LOG', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG_LOG))."\n";
        $log .= str_pad('WP_DEBUG_DISPLAY', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG_DISPLAY))."\n";
        $log .= str_pad('SCRIPT_DEBUG', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_SCRIPT_DEBUG))."\n";
        $log .= str_pad('SAVEQUERIES', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_SAVEQUERIES))."\n";
        $log .= str_pad('COOKIE_DOMAIN', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_COOKIE_DOMAIN))."\n";
        $log .= str_pad('WP_MEMORY_LIMIT', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_MEMORY_LIMIT))."\n";
        $log .= str_pad('WP_MAX_MEMORY_LIMIT', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_MAX_MEMORY_LIMIT))."\n";

        $log .= "********************************************************************************\n";

        DUPX_Log::info($log);

        $POST_LOG = $this->post;
        unset($POST_LOG['tables']);
        unset($POST_LOG['plugins']);
        unset($POST_LOG['dbpass']);
        ksort($POST_LOG);

        //Detailed logging
        $log = "--------------------------------------\n";
        $log .= "POST DATA\n";
        $log .= "--------------------------------------\n";
        $log .= print_r($POST_LOG, true);
        DUPX_Log::info($log, DUPX_Log::LV_DEBUG);

        $log = "--------------------------------------\n";
        $log .= "TABLES TO SCAN\n";
        $log .= "--------------------------------------\n";
        $log .= (isset($this->post['tables']) && count($this->post['tables']) > 0) ? DUPX_Log::varToString($this->post['tables']) : 'No tables selected to update';
        $log .= "--------------------------------------\n";
        $log .= "KEEP PLUGINS ACTIVE\n";
        $log .= "--------------------------------------\n";
        $log .= (isset($this->post['plugins']) && count($this->post['plugins']) > 0) ? DUPX_Log::varToString($this->post['plugins']) : 'No plugins selected for activation';
        DUPX_Log::info($log, 2);
        DUPX_Log::flush();
    }

    public function initChunkLog($maxIteration, $timeOut, $throttling, $rowsPerPage)
    {
        $log = "********************************************************************************\n".
            "CHUNK PARAMS:\n";
        $log .= str_pad('maxIteration', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($maxIteration)."\n";
        $log .= str_pad('timeOut', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($timeOut)."\n";
        $log .= str_pad('throttling', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($throttling)."\n";
        $log .= str_pad('rowsPerPage', 22, '_', STR_PAD_RIGHT).': '.DUPX_Log::varToString($rowsPerPage)."\n";
        $log .= "********************************************************************************\n";
        DUPX_Log::info($log);
    }

    /**
     *
     * @staticvar type $configTransformer
     * 
     * @return WPConfigTransformer
     */
    public function getWpConfigTransformer()
    {
        static $configTransformer = null;

        if (is_null($configTransformer)) {
            if (DUPX_Paramas_Manager::getInstance()->getValue(DUPX_Paramas_Manager::PARAM_WP_CONFIG) === 'new') {
                if (@copy(DUPX_Package::getWpconfigSamplePath(), DUPX_Package::getWpconfigArkPath()) === false) {
                    DUPX_NOTICE_MANAGER::getInstance()->addFinalReportNotice(array(
                        'shortMsg'    => 'Can\' reset wp-config to wp-config-sample',
                        'level'       => DUPX_NOTICE_ITEM::HARD_WARNING,
                        'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_DEFAULT,
                        'sections'    => 'general'
                    ));
                    DUPX_NOTICE_MANAGER::getInstance()->saveNotices();
                }
            }

            if (!is_writable(DUPX_Package::getWpconfigArkPath())) {
                if (DupProSnapLibIOU::chmod(DUPX_Package::getWpconfigArkPath(), 0644)) {
                    DUPX_Log::info("File Permission Update: dup-wp-config-arc__[HASH].txt set to 0644");
                } else {
                    $err_log = "\nWARNING: Unable to update file permissions and write to dup-wp-config-arc__[HASH].txt.  ";
                    $err_log .= "Check that the wp-config.php is in the archive.zip and check with your host or administrator to enable PHP to write to the wp-config.php file.  ";
                    $err_log .= "If performing a 'Manual Extraction' please be sure to select the 'Manual Archive Extraction' option on step 1 under options.";
                    DUPX_Log::error("{$err_log}");
                }
            }
            $configTransformer = new WPConfigTransformer(DUPX_Package::getWpconfigArkPath());
        }

        return $configTransformer;
    }

    /**
     *
     * @return string
     */
    public function copyOriginalConfigFiles()
    {
        $wpArkPath = DUPX_Package::getWpconfigArkPath();
        DUPX_Orig_File_Manager::getInstance()->addEntry('wpconfig', $wpArkPath, DUPX_Orig_File_Manager::MODE_COPY);

        $htArkPath = DUPX_Package::getHtaccessArkPath();
        DUPX_Orig_File_Manager::getInstance()->addEntry('htaccess', $htArkPath, DUPX_Orig_File_Manager::MODE_COPY);
    }

    /**
     * set replace list
     *
     * Auto inizialize function
     */
    public function setReplaceList()
    {
        self::logSectionHeader('SET SEARCH AND REPLACE LIST', __FUNCTION__, __LINE__);
        $this->setCustomReplaceList();
        $this->setMultisiteReplaceList();
        $this->setGlobalSearchAndReplaceList();
    }

    /**
     *
     * @return int MODE_NORAML|MODE_CHUNK|MODE_SKIP
     */
    public function getEngineMode()
    {
        return $this->getPost('mode_chunking');
    }

    /**
     *
     * @return bool 
     */
    public function isChunk()
    {
        return $this->getPost('mode_chunking') === self::MODE_CHUNK;
    }

    private function setCustomReplaceList()
    {
        // make sure post data is initialized
        $this->getPost();

        $s_r_manager = DUPX_S_R_MANAGER::getInstance();
        //CUSTOM REPLACE -> REPLACE LIST
        foreach ($this->post['search'] as $search_index => $search_for) {
            if (strlen($search_for) > 0) {
                $replace_with = $this->post['replace'][$search_index];
                $s_r_manager->addItem($search_for, $replace_with, DUPX_S_R_ITEM::TYPE_STRING, DUPX_UpdateEngine::SR_PRORITY_CUSTOM);
            }
        }
    }

    private function setMultisiteReplaceList()
    {
        // make sure dbConnection is initialized
        $this->dbConnection();

        $s_r_manager    = DUPX_S_R_MANAGER::getInstance();
        $paramsManager  = DUPX_Paramas_Manager::getInstance();
        $archive_config = DUPX_ArchiveConfig::getInstance();
        $subsite_id     = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SUBSITE_ID);


        DUPX_Log::info("-----------------------------------------", 2);
        DUPX_Log::info("ACTION MU MODE START :\"{$this->post['action_mu_mode']}\"", 2);

        switch ($this->post['action_mu_mode']) {
            case DUPX_MultisiteMode::Subdomain:
            case DUPX_MultisiteMode::Subdirectory:
                if ($this->post['action_mu_mode'] === DUPX_MultisiteMode::Subdomain) {
                    self::logSectionHeader('ACTION MU MODE START SUBDOMAINS', __FUNCTION__, __LINE__);
                } else {
                    self::logSectionHeader('ACTION MU MODE START SUBFOLDERS', __FUNCTION__, __LINE__);
                }

                $oldMuUrls = $archive_config->getOldUrlsArrayIdVal();
                if ($this->isMapping()) {
                    $newMuUrls = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_MU_REPLACE);
                } else {
                    $newMuUrls = $archive_config->getNewUrlsArrayIdVal();
                }
                $mainSiteIndex = $archive_config->getMainSiteIndex();
                $mainSite      = $archive_config->subsites[$mainSiteIndex];

                // put the main sub site at the end
                $subsitesIds = array_keys($oldMuUrls);
                if (($delKey      = array_search($mainSite->id, $subsitesIds)) !== false) {
                    unset($subsitesIds[$delKey]);
                }
                $subsitesIds[] = $mainSite->id;

                DUPX_Log::info("MAIN URL :".DUPX_Log::varToString($archive_config->getUrlFromSubsiteObj($mainSite)), DUPX_Log::LV_DETAILED);
                DUPX_Log::info('-- SUBSITES --'."\n".print_r($archive_config->subsites, true), DUPX_Log::LV_DEBUG);

                foreach ($subsitesIds as $currentSubid) {
                    if (($subSiteObj = $archive_config->getSubsiteObjById($currentSubid)) === false) {
                        DUPX_Log::info('INVALID SUBSITE ID: '.$currentSubid);
                        throw new Exception('Invalid subsite id');
                    }

                    DUPX_Log::info('SUBSITE ID:'.$currentSubid.'OLD URL: '.$oldMuUrls[$currentSubid].' NEW URL '.$newMuUrls[$currentSubid], DUPX_Log::LV_DEBUG);

                    $isMainSite = $currentSubid == $mainSite->id;

                    $search  = $oldMuUrls[$currentSubid];
                    $replace = $newMuUrls[$currentSubid];

                    // get table for search and replace scope for subsites
                    if ($this->post['cross_search'] == false && !$isMainSite) {
                        $tables = DUPX_MU::getTablesByPrefix($archive_config->getSubsitePrefixByParam($currentSubid), $this->dbh);
                    } else {
                        // global scope
                        $tables = true;
                    }

                    $priority = ($isMainSite) ? DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P4 : DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE;
                    $s_r_manager->addItem($search, $replace, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, $priority, $tables);

                    // Replace email address ([email protected] to [email protected]).
                    if ($this->post['replaceMail']) {
                        $at_old_domain = '@'.DUPX_U::getDomain($search);
                        $at_new_domain = '@'.DUPX_U::getDomain($replace);
                        $s_r_manager->addItem($at_old_domain, $at_new_domain, DUPX_S_R_ITEM::TYPE_STRING, DUPX_UpdateEngine::SR_PRORITY_LOW, $tables);
                    }

                    // for domain host and path priority is on main site
                    $sUrlInfo = parse_url($search);
                    $sHost    = isset($sUrlInfo['host']) ? $sUrlInfo['host'] : '';
                    $sPath    = isset($sUrlInfo['path']) ? $sUrlInfo['path'] : '';
                    $rUrlInfo = parse_url($replace);
                    $rHost    = isset($rUrlInfo['host']) ? $rUrlInfo['host'] : '';
                    $rPath    = isset($rUrlInfo['path']) ? $rUrlInfo['path'] : '';

                    // add path and host scope for custom columns in database
                    $s_r_manager->addItem($sHost, $rHost, DUPX_S_R_ITEM::TYPE_URL, $priority, 'domain_host');
                    $s_r_manager->addItem($sPath, $rPath, DUPX_S_R_ITEM::TYPE_STRING, $priority, 'domain_path');
                }
                break;
            case DUPX_MultisiteMode::Standalone:
                self::logSectionHeader('ACTION MU MODE START STANDALONE', __FUNCTION__, __LINE__);

                $originalPaths  = $archive_config->getRealValue('originalPaths');
                $contentPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_CONTENT_OLD);
                $uploadPathOld  = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_UPLOADS_OLD);

                // REPLACE URL
                foreach ($GLOBALS['DUPX_AC']->subsites as $cSub) {
                    if ($cSub->id == $subsite_id) {
                        $standalone_obj = $cSub;
                        break;
                    }
                }

                $search  = $archive_config->getUrlFromSubsiteObj($standalone_obj);
                $replace = $this->post['url_new'];
                $s_r_manager->addItem($search, $replace, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE);

                // CONVERSION
                if ($subsite_id == 1) {
                    // Since we are converting subsite to multisite consider this a standalone site
                    $GLOBALS['DUPX_AC']->mu_mode = DUPX_MultisiteMode::Standalone;
                } else if ($subsite_id > 1) {
                    // Need to swap the subsite prefix for the main table prefix
                    $uploadsDirSubOld = $uploadPathOld.'/sites/'.$subsite_id;
                    $uploadsNew       = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_UPLOADS_NEW);

                    $s_r_manager->addItem($uploadsDirSubOld, $uploadsNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);
                    if ($originalPaths->uploads != $uploadPathOld) {
                        $uploadsDirSubOld = $originalPaths->uploads.'/sites/'.$subsite_id;
                        $s_r_manager->addItem($uploadsDirSubOld, $uploadsNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);
                    }

                    $uploadsUrlSubOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_UPLOADS_OLD).'/sites/'.$subsite_id;
                    $uploadsUrlNew    = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_UPLOADS_NEW);
                    $s_r_manager->addItem($uploadsUrlSubOld, $uploadsUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);

                    // Since we are converting subsite to multisite consider this a standalone site
                    $GLOBALS['DUPX_AC']->mu_mode = DUPX_MultisiteMode::Standalone;

                    //Replace WP 3.4.5 subsite uploads path in DB
                    if ($GLOBALS['DUPX_AC']->mu_generation === 1) {
                        $blogsDirOld = $contentPathOld.'/blogs.dir/'.$subsite_id.'/files';

                        $s_r_manager->addItem($blogsDirOld, $uploadsNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);
                        if ($originalPaths->wpcontent != $contentPathOld) {
                            $blogsDirOld = $originalPaths->wpcontent.'/blogs.dir/'.$subsite_id.'/files';
                            $s_r_manager->addItem($blogsDirOld, $uploadsNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);
                        }

                        $subSiteFilesUrl = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_NEW).'/files';
                        $uploadUrlNew    = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_UPLOADS_NEW);
                        $s_r_manager->addItem($subSiteFilesUrl, $uploadUrlNew, DUPX_S_R_ITEM::TYPE_URL, DUPX_UpdateEngine::SR_PRORITY_NETWORK_SUBSITE_HIGH);
                    }
                } else {
                    // trace error stand alone conversion with subsite id <= 0
                }

                try {
                    DUPX_MU::convertSubsiteToStandalone($subsite_id, $this->dbh, $GLOBALS['DUPX_AC'], $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_REMOVE_RENDUNDANT));
                }
                catch (Exception $ex) {
                    DUPX_Log::error("Problem with core logic of converting subsite into a standalone site.<br/>".$ex->getMessage().'<br/>'.$ex->getTraceAsString());
                }

                break;
            case DUPX_MultisiteMode::SingleSite:
            default:
                // do nothing
                break;
        }
    }

    private static function checkRelativeAndAbsoluteDiff($mainOld, $mainNew, $old, $new)
    {
        $log = "CHECK REL AND ABS DIF\n".
            "\tMAIN OLD: ".DUPX_Log::varToString($mainOld)."\n".
            "\tMAIN NEW: ".DUPX_Log::varToString($mainNew)."\n".
            "\tOLD: ".DUPX_Log::varToString($old)."\n".
            "\tNEW: ".DUPX_Log::varToString($new);
        DUPX_Log::info($log, DUPX_Log::LV_DEBUG);

        $isRelativePathDifferent = substr($old, strlen($mainOld)) !== substr($new, strlen($mainNew));

        if (strpos($old, $mainOld) !== 0 || strpos($new, $mainNew) !== 0 || $isRelativePathDifferent) {
            DUPX_Log::info("\t*** RESULT: TRUE", DUPX_Log::LV_DEBUG);
            return true;
        } else {
            DUPX_Log::info("\t*** RESULT: FALSE", DUPX_Log::LV_DEBUG);
            return false;
        }
    }

    private function setGlobalSearchAndReplaceList()
    {
        $s_r_manager   = DUPX_S_R_MANAGER::getInstance();
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        $archiveConfig = DUPX_ArchiveConfig::getInstance();

        // make sure posts is initialized
        $this->getPost();

        $originalPaths = $archiveConfig->getRealValue('originalPaths');

        // DIRS PATHS
        $mainPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_OLD);
        $mainPathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_NEW);

        $uploadPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_UPLOADS_OLD);
        $uploadPathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_UPLOADS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainPathOld, $mainPathNew, $uploadPathOld, $uploadPathNew)) {
            $s_r_manager->addItem($uploadPathOld, $uploadPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }
        if ($originalPaths->uploads != $uploadPathOld && self::checkRelativeAndAbsoluteDiff($originalPaths->home, $mainPathNew, $originalPaths->uploads, $uploadPathNew)) {
            $s_r_manager->addItem($originalPaths->uploads, $uploadPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $pluginsPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_PLUGINS_OLD);
        $pluginsPathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_PLUGINS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainPathOld, $mainPathNew, $pluginsPathOld, $pluginsPathNew)) {
            $s_r_manager->addItem($pluginsPathOld, $pluginsPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }
        if ($originalPaths->plugins != $pluginsPathOld && self::checkRelativeAndAbsoluteDiff($originalPaths->home, $mainPathNew, $originalPaths->plugins, $pluginsPathNew)) {
            $s_r_manager->addItem($originalPaths->plugins, $pluginsPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $mupluginsPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_MUPLUGINS_OLD);
        $mupluginsPathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_MUPLUGINS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainPathOld, $mainPathNew, $mupluginsPathOld, $mupluginsPathNew)) {
            $s_r_manager->addItem($mupluginsPathOld, $mupluginsPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }
        if ($originalPaths->muplugins != $mupluginsPathOld && self::checkRelativeAndAbsoluteDiff($originalPaths->home, $mainPathNew, $originalPaths->muplugins, $mupluginsPathNew)) {
            $s_r_manager->addItem($originalPaths->muplugins, $mupluginsPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $contentPathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_CONTENT_OLD);
        $contentPathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_CONTENT_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainPathOld, $mainPathNew, $contentPathOld, $contentPathNew)) {
            $s_r_manager->addItem($contentPathOld, $contentPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }
        if ($originalPaths->wpcontent != $contentPathOld && self::checkRelativeAndAbsoluteDiff($originalPaths->home, $mainPathNew, $originalPaths->wpcontent, $uploadPathNew)) {
            $s_r_manager->addItem($originalPaths->wpcontent, $contentPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }

        $corePathOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_WP_CORE_OLD);
        $corePathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_WP_CORE_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainPathOld, $mainPathNew, $corePathOld, $corePathNew)) {
            $s_r_manager->addItem($corePathOld, $corePathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }
        if ($originalPaths->abs != $corePathOld && self::checkRelativeAndAbsoluteDiff($originalPaths->home, $mainPathNew, $originalPaths->abs, $corePathNew)) {
            $s_r_manager->addItem($originalPaths->abs, $corePathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }

        $s_r_manager->addItem($mainPathOld, $mainPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P3);
        if ($originalPaths->home != $mainPathOld) {
            $s_r_manager->addItem($originalPaths->home, $mainPathNew, DUPX_S_R_ITEM::TYPE_PATH, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P3);
        }

        // URLS
        $mainUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_OLD);
        $mainUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_NEW);

        $uploadUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_UPLOADS_OLD);
        $uploadUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_UPLOADS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainUrlOld, $mainUrlNew, $uploadUrlOld, $uploadUrlNew)) {
            $s_r_manager->addItem($uploadUrlOld, $uploadUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $pluginsUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_PLUGINS_OLD);
        $pluginsUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_PLUGINS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainUrlOld, $mainUrlNew, $pluginsUrlOld, $pluginsUrlNew)) {
            $s_r_manager->addItem($pluginsUrlOld, $pluginsUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $mupluginsUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_MUPLUGINS_OLD);
        $mupluginsUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_MUPLUGINS_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainUrlOld, $mainUrlNew, $mupluginsUrlOld, $mupluginsUrlNew)) {
            $s_r_manager->addItem($mupluginsUrlOld, $mupluginsUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P1);
        }

        $contentUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_CONTENT_OLD);
        $contentUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_CONTENT_NEW);
        if (self::checkRelativeAndAbsoluteDiff($mainUrlOld, $mainUrlNew, $contentUrlOld, $contentUrlNew)) {
            $s_r_manager->addItem($contentUrlOld, $contentUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }

        $siteUrlOld = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SITE_URL_OLD);
        $siteUrlNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SITE_URL);
        if (self::checkRelativeAndAbsoluteDiff($mainUrlOld, $mainUrlNew, $siteUrlOld, $siteUrlNew)) {
            $s_r_manager->addItem($siteUrlOld, $siteUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P2);
        }

        $s_r_manager->addItem($mainUrlOld, $mainUrlNew, DUPX_S_R_ITEM::TYPE_URL_NORMALIZE_DOMAIN, DUPX_UpdateEngine::SR_PRORITY_GENERIC_SUBST_P3);

        // Replace email address ([email protected] to [email protected]).
        if ($this->post['replaceMail']) {
            $at_old_domain = '@'.DUPX_U::getDomain($mainUrlOld);
            $at_new_domain = '@'.DUPX_U::getDomain($mainUrlNew);
            $s_r_manager->addItem($at_old_domain, $at_new_domain, DUPX_S_R_ITEM::TYPE_STRING, DUPX_UpdateEngine::SR_PRORITY_LOW);
        }
    }

    public function runSearchAndReplace()
    {
        self::logSectionHeader('RUN SEARCH AND REPLACE', __FUNCTION__, __LINE__);

        // make sure post data is initialized
        $this->getPost();

        DUPX_UpdateEngine::load($this->post['tables']);
        DUPX_UpdateEngine::replaceBlogsAndSiteTables();
        DUPX_UpdateEngine::logStats();
        DUPX_UpdateEngine::logErrors();
    }

    public function removeMaincenanceMode()
    {
        self::logSectionHeader('REMOVE MAINTENANCE MODE', __FUNCTION__, __LINE__);
        DUPX_U::maintenanceMode(false);
    }

    public function removeLicenseKey()
    {
        self::logSectionHeader('REMOVE LICENSE KEY', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();
        $escapedTablePrefix = mysqli_real_escape_string($this->dbh, DUPX_Paramas_Manager::getInstance()->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));

        if (isset($GLOBALS['DUPX_AC']->brand) && isset($GLOBALS['DUPX_AC']->brand->enabled) && $GLOBALS['DUPX_AC']->brand->enabled) {

            $license_check = DUPX_DB::mysqli_query($this->dbh,
                    "SELECT COUNT(1) AS count FROM `".$escapedTablePrefix."options` WHERE `option_name` LIKE 'duplicator_pro_license_key' ");
            $license_row   = mysqli_fetch_row($license_check);
            $license_count = is_null($license_row) ? 0 : $license_row[0];
            if ($license_count > 0) {
                DUPX_DB::mysqli_query($this->dbh,
                    "UPDATE `".$escapedTablePrefix."options` SET `option_value` = '' WHERE `option_name` LIKE 'duplicator_pro_license_key'");
            }
        }
    }

    public function createNewAdminUser()
    {
        self::logSectionHeader('CREATE NEW ADMIN USER', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();

        $nManager           = DUPX_NOTICE_MANAGER::getInstance();
        $escapedTablePrefix = mysqli_real_escape_string($this->dbh, DUPX_Paramas_Manager::getInstance()->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));
        $archiveConfig      = DUPX_ArchiveConfig::getInstance();

        if (strlen($this->post['wp_username']) >= 4 && strlen($this->post['wp_password']) >= 6) {
            $wp_username   = mysqli_real_escape_string($this->dbh, $this->post['wp_username']);
            $newuser_check = DUPX_DB::mysqli_query($this->dbh,
                    "SELECT COUNT(*) AS count FROM `".$escapedTablePrefix."users` WHERE user_login = '{$wp_username}' ");
            $newuser_row   = mysqli_fetch_row($newuser_check);
            $newuser_count = is_null($newuser_row) ? 0 : $newuser_row[0];

            if ($newuser_count == 0) {

                $newuser_datetime = @date("Y-m-d H:i:s");
                $newuser_datetime = mysqli_real_escape_string($this->dbh, $newuser_datetime);
                $newuser_security = mysqli_real_escape_string($this->dbh, DUPX_WPConfig::ADMIN_SERIALIZED_SECURITY_STRING);

                $post_wp_username = $this->post['wp_username'];
                $post_wp_password = $this->post['wp_password'];

                $post_wp_mail     = $this->post['wp_mail'];
                $post_wp_nickname = $this->post['wp_nickname'];
                if (empty($post_wp_nickname)) {
                    $post_wp_nickname = $post_wp_username;
                }
                $post_wp_first_name = $this->post['wp_first_name'];
                $post_wp_last_name  = $this->post['wp_last_name'];

                $wp_username   = mysqli_real_escape_string($this->dbh, $post_wp_username);
                $wp_password   = mysqli_real_escape_string($this->dbh, $post_wp_password);
                $wp_mail       = mysqli_real_escape_string($this->dbh, $post_wp_mail);
                $wp_nickname   = mysqli_real_escape_string($this->dbh, $post_wp_nickname);
                $wp_first_name = mysqli_real_escape_string($this->dbh, $post_wp_first_name);
                $wp_last_name  = mysqli_real_escape_string($this->dbh, $post_wp_last_name);

                $usermeta_table = $escapedTablePrefix.'usermeta';

                $newuser1 = DUPX_DB::mysqli_query($this->dbh,
                        "INSERT INTO `".$escapedTablePrefix."users`
                        (`user_login`, `user_pass`, `user_nicename`, `user_email`, `user_registered`, `user_activation_key`, `user_status`, `display_name`)
                        VALUES ('{$wp_username}', MD5('{$wp_password}'), '{$wp_username}', '{$wp_mail}', '{$newuser_datetime}', '', '0', '{$wp_username}')");

                $newuser1_insert_id = intval(mysqli_insert_id($this->dbh));

                $newuser2 = DUPX_DB::mysqli_query($this->dbh,
                        "INSERT INTO `".$usermeta_table."`
                        (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', '".$escapedTablePrefix."capabilities', '{$newuser_security}')");

                $newuser3 = DUPX_DB::mysqli_query($this->dbh,
                        "INSERT INTO `".$usermeta_table."`
                        (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', '".$escapedTablePrefix."user_level', '10')");

                //Misc Meta-Data Settings:
                DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$usermeta_table."` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'rich_editing', 'true')");
                DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$usermeta_table."` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'admin_color',  'fresh')");
                DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$usermeta_table."` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'nickname', '{$wp_nickname}')");
                DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$usermeta_table."` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'first_name', '{$wp_first_name}')");
                DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$usermeta_table."` (`user_id`, `meta_key`, `meta_value`) VALUES ('{$newuser1_insert_id}', 'last_name', '{$wp_last_name}')");

                //Add super admin permissions
                if ($this->newSiteIsMultisite()) {
                    $site_admins_query = DUPX_DB::mysqli_query($this->dbh,
                            "SELECT meta_value FROM `".$escapedTablePrefix."sitemeta` WHERE meta_key = 'site_admins'");
                    $site_admins       = mysqli_fetch_row($site_admins_query);
                    $site_admins[0]    = stripslashes($site_admins[0]);
                    $site_admins_array = unserialize($site_admins[0]);

                    array_push($site_admins_array, $this->post['wp_username']);

                    $site_admins_serialized = serialize($site_admins_array);

                    DUPX_DB::mysqli_query($this->dbh, "UPDATE `".$escapedTablePrefix."sitemeta` SET meta_value = '{$site_admins_serialized}' WHERE meta_key = 'site_admins'");
                    // Adding permission for each sub-site to the newly created user
                    $admin_user_level   = DUPX_WPConfig::ADMIN_LEVEL; // For wp_2_user_level
                    $sql_values_array   = array();
                    $sql_values_array[] = "('{$newuser1_insert_id}', 'primary_blog', '{$GLOBALS['DUPX_AC']->main_site_id}')";
                    foreach ($GLOBALS['DUPX_AC']->subsites as $subsite_info) {
                        // No need to add permission for main site
                        if ($subsite_info->id == $GLOBALS['DUPX_AC']->main_site_id) {
                            continue;
                        }
                        $escapeBlogPrefix = mysqli_real_escape_string($this->dbh, $archiveConfig->getSubsitePrefixByParam($subsite_info->id));

                        $cap_meta_key       = $escapeBlogPrefix.'capabilities';
                        $sql_values_array[] = "('{$newuser1_insert_id}', '{$cap_meta_key}', '{$newuser_security}')";

                        $user_level_meta_key = $escapeBlogPrefix.'user_level';
                        $sql_values_array[]  = "('{$newuser1_insert_id}', '{$user_level_meta_key}', '{$admin_user_level}')";
                    }
                    $sql = "INSERT INTO ".$escapedTablePrefix."usermeta (user_id, meta_key, meta_value) VALUES ".implode(', ', $sql_values_array);
                    DUPX_DB::mysqli_query($this->dbh, $sql);
                }

                DUPX_Log::info("\nNEW WP-ADMIN USER:");
                if ($newuser1 && $newuser2 && $newuser3) {
                    DUPX_Log::info("- New username '{$this->post['wp_username']}' was created successfully allong with MU usermeta.");
                } elseif ($newuser1) {
                    DUPX_Log::info("- New username '{$this->post['wp_username']}' was created successfully.");
                } else {
                    $newuser_warnmsg            = "- Failed to create the user '{$this->post['wp_username']}' \n ";
                    $this->report['warnlist'][] = $newuser_warnmsg;

                    $nManager->addFinalReportNotice(array(
                        'shortMsg' => 'New admin user create error',
                        'level'    => DUPX_NOTICE_ITEM::HARD_WARNING,
                        'longMsg'  => $newuser_warnmsg,
                        'sections' => 'general'
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'new-user-create-error');

                    DUPX_Log::info($newuser_warnmsg);
                }
            } else {
                $newuser_warnmsg            = "\nNEW WP-ADMIN USER:\n - Username '{$this->post['wp_username']}' already exists in the database.  Unable to create new account.\n";
                $this->report['warnlist'][] = $newuser_warnmsg;

                $nManager->addFinalReportNotice(array(
                    'shortMsg'    => 'New admin user create error',
                    'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                    'longMsg'     => $newuser_warnmsg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                    'sections'    => 'general'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'new-user-create-error');

                DUPX_Log::info($newuser_warnmsg);
            }
        }
    }

    public function configurationFileUpdate()
    {
        self::logSectionHeader('CONFIGURATION FILE UPDATES', __FUNCTION__, __LINE__);
        DUPX_Log::incIndent();
        // make sure post data is initialized
        $this->getPost();

        $nManager      = DUPX_NOTICE_MANAGER::getInstance();
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        $archiveConfig = DUPX_ArchiveConfig::getInstance();

        if ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONFIG) == 'nothing') {
            DUPX_Log::info('SKIP WP CONFIG UPDATE');
            return;
        }

        try {
            if (file_exists(DUPX_Package::getWpconfigArkPath())) {
                $this->configurationUrlsAndPaths();

                $confTransformer = $this->getWpConfigTransformer();

                /**
                 * if is single site clean all mu site define
                 */
                if (!$this->newSiteIsMultisite()) {
                    $constatsToRemove = array(
                        'WP_ALLOW_MULTISITE',
                        'ALLOW_MULTISITE',
                        'MULTISITE',
                        'DOMAIN_CURRENT_SITE',
                        'PATH_CURRENT_SITE',
                        'SITE_ID_CURRENT_SITE',
                        'BLOG_ID_CURRENT_SITE',
                        'NOBLOGREDIRECT',
                        'SUBDOMAIN_INSTALL',
                        'VHOST',
                        'SUNRISE',
                        'COOKIEPATH',
                        'SITECOOKIEPATH',
                        'ADMIN_COOKIE_PATH',
                        'PLUGINS_COOKIE_PATH'
                    );

                    foreach ($constatsToRemove as $key) {
                        if ($confTransformer->exists('constant', $key)) {
                            $confTransformer->remove('constant', $key);
                            DUPX_Log::info('TRANSFORMER[no wpmu]: '.$key.' constant removed from WP config file');
                        }
                    }
                }

                $dbhost = DUPX_U::getEscapedGenericString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_HOST));
                $dbname = DUPX_U::getEscapedGenericString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_NAME));
                $dbuser = DUPX_U::getEscapedGenericString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_USER));
                $dbpass = DUPX_U::getEscapedGenericString($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_PASS));

                $confTransformer->update('constant', 'DB_NAME', $dbname, array('raw' => true));
                DUPX_Log::info('UPDATE DB_NAME '.DUPX_Log::varToString($dbname));

                $confTransformer->update('constant', 'DB_USER', $dbuser, array('raw' => true));
                DUPX_Log::info('UPDATE DB_USER '.DUPX_Log::varToString($dbuser));

                $confTransformer->update('constant', 'DB_PASSWORD', $dbpass, array('raw' => true));
                DUPX_Log::info('UPDATE DB_PASSWORD '.DUPX_Log::varToString('** OBSCURED **'));

                $confTransformer->update('constant', 'DB_HOST', $dbhost, array('raw' => true));
                DUPX_Log::info('UPDATE DB_HOST '.DUPX_Log::varToString($dbhost));

                //WP_TEMP_DIR
                if ($confTransformer->exists('constant', 'WP_TEMP_DIR')) {
                    $wp_temp_dir_const_val = $confTransformer->get_value('constant', 'WP_TEMP_DIR');
                    $wp_temp_dir_const_val = DUPX_U::wp_normalize_path($wp_temp_dir_const_val);
                    $new_path              = str_replace($this->post['path_old'], $this->post['path_new'], $wp_temp_dir_const_val, $count);
                    if ($count > 0) {
                        $confTransformer->update('constant', 'WP_TEMP_DIR', $new_path, array('normalize' => true));
                        DUPX_Log::info('UPDATE WP_TEMP_DIR '.DUPX_Log::varToString($new_path));
                    }
                }

                $auth_keys = array(
                    'AUTH_KEY',
                    'SECURE_AUTH_KEY',
                    'LOGGED_IN_KEY',
                    'NONCE_KEY',
                    'AUTH_SALT',
                    'SECURE_AUTH_SALT',
                    'LOGGED_IN_SALT',
                    'NONCE_SALT',
                );

                $updateAuthKeys = ($GLOBALS['DUPX_AC']->getLicenseType() >= DUPX_LicenseType::Freelancer && $this->post['auth_keys_and_salts']);
                if ($updateAuthKeys) {
                    foreach ($auth_keys as $const_key) {
                        $key = DUPX_WPConfig::generatePassword(64, true, true);

                        if ($confTransformer->exists('constant', $const_key)) {
                            $confTransformer->update('constant', $const_key, $key);
                            DUPX_Log::info('UPDATE '.$const_key.' '.DUPX_Log::varToString('**OBSCURED**'));
                        } else {
                            $confTransformer->add('constant', $const_key, $key);
                            DUPX_Log::info('ADD '.$const_key.' '.DUPX_Log::varToString('**OBSCURED**'));
                        }
                    }
                } else {
                    // FORCE OLD VALUES
                    foreach ($auth_keys as $const_key) {
                        $confTransformer->update('constant', $const_key, $archiveConfig->getDefineValue($const_key));
                    }
                }

                $confTransformer->update('variable', 'table_prefix', $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));

                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'DISALLOW_FILE_EDIT', DUPX_Paramas_Manager::PARAM_WP_CONF_DISALLOW_FILE_EDIT);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'FORCE_SSL_ADMIN', DUPX_Paramas_Manager::PARAM_WP_CONF_FORCE_SSL_ADMIN);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_CACHE', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_CACHE);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WPCACHEHOME', DUPX_Paramas_Manager::PARAM_WP_CONF_WPCACHEHOME);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'COOKIE_DOMAIN', DUPX_Paramas_Manager::PARAM_WP_CONF_COOKIE_DOMAIN);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'AUTOSAVE_INTERVAL', DUPX_Paramas_Manager::PARAM_WP_CONF_AUTOSAVE_INTERVAL);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_POST_REVISIONS', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_POST_REVISIONS);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_DEBUG', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_DEBUG_LOG', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG_LOG);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_DEBUG_DISPLAY', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_DEBUG_DISPLAY);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'SCRIPT_DEBUG', DUPX_Paramas_Manager::PARAM_WP_CONF_SCRIPT_DEBUG);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'SAVEQUERIES', DUPX_Paramas_Manager::PARAM_WP_CONF_SAVEQUERIES);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_MEMORY_LIMIT', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_MEMORY_LIMIT);
                DUPX_ArchiveConfig::updateWpConfigByParam($confTransformer, 'WP_MAX_MEMORY_LIMIT', DUPX_Paramas_Manager::PARAM_WP_CONF_WP_MAX_MEMORY_LIMIT);

                $wpConfigValue = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONF_WP_AUTO_UPDATE_CORE);
                switch ($wpConfigValue['value']) {
                    case 'false':
                        $wpConfigValue['value'] = false;
                        break;
                    case 'true':
                        $wpConfigValue['value'] = true;
                        break;
                    case 'minor':
                    default:
                        $wpConfigValue['value'] = 'minor';
                        break;
                }
                DUPX_ArchiveConfig::updateWpConfigByValue($confTransformer, 'WP_AUTO_UPDATE_CORE', $wpConfigValue);

                DUPX_Log::info("\n*** UPDATED WP CONFIG FILE ***");
            } else {
                DUPX_Log::info("WP-CONFIG ARK FILE NOT FOUND PATH: ".DUPX_Log::varToString(dirname(DUPX_Package::getWpconfigArkPath())));
                DUPX_Log::info("WP-CONFIG ARK FILE:\n - 'dup-wp-config-arc__[HASH].txt'");
                DUPX_Log::info("SKIP FILE UPDATES\n");

                $shortMsg = 'wp-config.php not found';
                $longMsg  = <<<LONGMSG
Error updating wp-config file.<br>
The installation is finished but check the wp-config.php file and manually update the incorrect values.
LONGMSG;
                /*    $nManager->addNextStepNotice(array(
                  'shortMsg' => $shortMsg,
                  'level' => DUPX_NOTICE_ITEM::CRITICAL,

                  ), DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'wp-config-transformer-exception'); */
                $nManager->addFinalReportNotice(array(
                    'shortMsg'    => $shortMsg,
                    'level'       => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'     => $longMsg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                    'sections'    => 'general'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-transformer-exception');
            }
        }
        catch (Exception $e) {
            $shortMsg = 'wp-config.php transformer:'.$e->getMessage();
            $longMsg  = <<<LONGMSG
Error updating wp-config file.<br>
The installation is finished but check the wp-config.php file and manually update the incorrect values.
LONGMSG;
            /*    $nManager->addNextStepNotice(array(
              'shortMsg' => $shortMsg,
              'level' => DUPX_NOTICE_ITEM::CRITICAL,

              ), DUPX_NOTICE_MANAGER::ADD_UNIQUE , 'wp-config-transformer-exception'); */
            $nManager->addFinalReportNotice(array(
                'shortMsg'    => $shortMsg,
                'level'       => DUPX_NOTICE_ITEM::CRITICAL,
                'longMsg'     => $longMsg,
                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                'sections'    => 'general'
                ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-transformer-exception');

            DUPX_Log::info("WP-CONFIG TRANSFORMER EXCEPTION\n".$e->getTraceAsString());
        }
        DUPX_Log::resetIndent();
    }

    protected function configurationUrlsAndPaths()
    {

        $confTransformer = $this->getWpConfigTransformer();
        $paramsManager   = DUPX_Paramas_Manager::getInstance();

        $urlNew  = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_NEW);
        $pathNew = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_NEW);

        $mu_newDomain     = parse_url($urlNew);
        $mu_newDomainHost = $mu_newDomain['host'];
        $mu_newUrlPath    = parse_url($urlNew, PHP_URL_PATH);

        if (empty($mu_newUrlPath) || ($mu_newUrlPath == '/')) {
            $mu_newUrlPath = '/';
        } else {
            $mu_newUrlPath = rtrim($mu_newUrlPath, '/').'/';
        }

        if ($confTransformer->exists('constant', 'WP_HOME')) {
            $confTransformer->update('constant', 'WP_HOME', $urlNew, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_HOME '.DUPX_Log::varToString($this->post['url_new']));
        }

        $newSiteUrl = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SITE_URL);
        if ($confTransformer->exists('constant', 'WP_SITEURL') || $urlNew != $newSiteUrl) {
            $confTransformer->update('constant', 'WP_SITEURL', $this->post['siteurl'], array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_SITEURL '.DUPX_Log::varToString($this->post['siteurl']));
        }

        if ($confTransformer->exists('constant', 'DOMAIN_CURRENT_SITE')) {
            $confTransformer->update('constant', 'DOMAIN_CURRENT_SITE', $mu_newDomainHost, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE DOMAIN_CURRENT_SITE '.DUPX_Log::varToString($mu_newDomainHost));
        }
        if ($confTransformer->exists('constant', 'PATH_CURRENT_SITE')) {
            $confTransformer->update('constant', 'PATH_CURRENT_SITE', $mu_newUrlPath, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE PATH_CURRENT_SITE '.DUPX_Log::varToString($mu_newUrlPath));
        }

        $pathContent = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_CONTENT_NEW);
        if ($confTransformer->exists('constant', 'WP_CONTENT_DIR') || $pathNew.'/wp-content' != $pathContent) {
            $confTransformer->update('constant', 'WP_CONTENT_DIR', $pathContent, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_CONTENT_DIR '.DUPX_Log::varToString($pathContent));
        }

        $urlContent = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_CONTENT_NEW);
        if ($confTransformer->exists('constant', 'WP_CONTENT_URL') || $urlNew.'/wp-content' != $urlContent) {
            $confTransformer->update('constant', 'WP_CONTENT_URL', $urlContent, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_CONTENT_URL '.DUPX_Log::varToString($urlContent));
        }

        $pathPlugins = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_PLUGINS_NEW);
        if ($confTransformer->exists('constant', 'WP_PLUGIN_DIR') || $pathNew.'/wp-content/plugins' != $pathPlugins) {
            $confTransformer->update('constant', 'WP_PLUGIN_DIR', $pathPlugins, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_PLUGIN_DIR '.DUPX_Log::varToString($pathPlugins));
        }

        $urlPlugins = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_PLUGINS_NEW);
        if ($confTransformer->exists('constant', 'WP_PLUGIN_URL') || $urlNew.'/wp-content/plugins' != $urlPlugins) {
            $confTransformer->update('constant', 'WP_PLUGIN_URL', $urlPlugins, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WP_PLUGIN_URL '.DUPX_Log::varToString($urlPlugins));
        }

        $pathMuPlugins = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_MUPLUGINS_NEW);
        if ($confTransformer->exists('constant', 'WPMU_PLUGIN_DIR') || $pathNew.'/wp-content/mu-plugins' != $pathMuPlugins) {
            $confTransformer->update('constant', 'WPMU_PLUGIN_DIR', $pathMuPlugins, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WPMU_PLUGIN_DIR '.DUPX_Log::varToString($pathMuPlugins));
        }

        $urlMuPlugins = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_URL_MUPLUGINS_NEW);
        if ($confTransformer->exists('constant', 'WPMU_PLUGIN_URL') || $urlNew.'/wp-content/mu-plugins' != $urlMuPlugins) {
            $confTransformer->update('constant', 'WPMU_PLUGIN_URL', $urlMuPlugins, array('normalize' => true, 'add' => true));
            DUPX_Log::info('UPDATE WPMU_PLUGIN_URL '.DUPX_Log::varToString($urlMuPlugins));
        }
    }

    public function htaccessUpdate()
    {
        self::logSectionHeader('HTACCESS UPDATE', __FUNCTION__, __LINE__);
        $paramsManager = DUPX_Paramas_Manager::getInstance();

        // make sure dbConnection is initialized
        $this->dbConnection();
        $new_htaccess_name = false;


        switch ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_HTACCESS_CONFIG)) {
            case 'original' :
                $new_htaccess_name = '.htaccess';
                break;
            case 'new':
                $new_htaccess_name = 'htaccess.orig'.rand();
                break;
            case 'nothing':
                break;
            default:
                throw new Exception('htaccess config invalid');
        }
        if (!empty($new_htaccess_name)) {
            if (DUPX_ServerConfig::renameHtaccess($this->post['path_new'], $new_htaccess_name)) {
                DUPX_Log::info("\nReset original .htaccess content from .htaccess__[HASH]");
            }
        }
        DUPX_ServerConfig::setup($this->post['action_mu_mode'], $GLOBALS['DUPX_AC']->mu_generation, $this->dbh, $this->post['path_new']);
    }

    public function generalUpdate()
    {
        self::logSectionHeader('GENERAL UPDATES', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();

        $paramsManager      = DUPX_Paramas_Manager::getInstance();
        $escapedTablePrefix = mysqli_real_escape_string($this->dbh, $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));

        $blog_name = mysqli_real_escape_string($this->dbh, $this->post['blogname']);

        /** FINAL UPDATES: Must happen after the global replace to prevent double pathing
          http://xyz.com/abc01 will become http://xyz.com/abc0101  with trailing data */
        DUPX_Log::info('UPATE BLOG NAME '.DUPX_Log::varToString($blog_name), DUPX_Log::LV_DETAILED);
        DUPX_DB::mysqli_query($this->dbh, "UPDATE `".$escapedTablePrefix."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $blog_name)."' WHERE option_name = 'blogname' ");
        DUPX_Log::info('UPATE URL NEW '.DUPX_Log::varToString($this->post['url_new']), DUPX_Log::LV_DETAILED);
        DUPX_DB::mysqli_query($this->dbh, "UPDATE `".$escapedTablePrefix."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $this->post['url_new'])."'  WHERE option_name = 'home' ");
        DUPX_Log::info('UPATE SITE URL '.DUPX_Log::varToString($this->post['siteurl']), DUPX_Log::LV_DETAILED);
        DUPX_DB::mysqli_query($this->dbh, "UPDATE `".$escapedTablePrefix."options` SET option_value = '".mysqli_real_escape_string($this->dbh, $this->post['siteurl'])."'  WHERE option_name = 'siteurl' ");

        DUPX_DB::mysqli_query($this->dbh, "INSERT INTO `".$escapedTablePrefix."options` (option_value, option_name) "
            ."VALUES('".mysqli_real_escape_string($this->dbh, $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SAFE_MODE))."','duplicator_pro_exe_safe_mode')");
        //Reset the postguid data
        if ($this->post['postguid']) {
            DUPX_Log::info('UPATE postguid');
            DUPX_DB::mysqli_query($this->dbh,
                "UPDATE `".$escapedTablePrefix."posts` SET guid = REPLACE(guid, '".mysqli_real_escape_string($this->dbh, $this->post['url_new'])."', '".mysqli_real_escape_string($this->dbh,
                    $this->post['url_old'])."')");
            $update_guid = @mysqli_affected_rows($this->dbh) or 0;
            DUPX_Log::info("Reverted '{$update_guid}' post guid columns back to '{$this->post['url_old']}'");
        }

        $this->managePlugins();
    }

    public function generalCleanup()
    {
        self::logSectionHeader('GENERAL CLEANUP', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();
        $paramsManager      = DUPX_Paramas_Manager::getInstance();
        $escapedTablePrefix = mysqli_real_escape_string($this->dbh, DUPX_Paramas_Manager::getInstance()->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));

        if (!DUPX_UpdateEngine::updateTablePrefixKeys()) {
            // @todo display erorr on notice manager
        }

        if ($this->post['action_mu_mode'] == DUPX_MultisiteMode::Standalone) {
            DUPX_Log::info('UPDATE DATA FOR STANDALONE MIGRATION');
            DUPX_MU::purgeRedundantData($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SUBSITE_ID), $this->dbh);
        }

        //SCHEDULE STORAGE CLEANUP
        if ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_EMPTY_SCHEDULE_STORAGE)) {

            DUPX_DB::mysqli_query($this->dbh, "DELETE FROM `".$escapedTablePrefix."duplicator_pro_entities` WHERE `type` = 'DUP_PRO_Storage_Entity'");
            $dbdelete_count1 = @mysqli_affected_rows($this->dbh);

            DUPX_DB::mysqli_query($this->dbh, "DELETE FROM `".$escapedTablePrefix."duplicator_pro_entities` WHERE `type` = 'DUP_PRO_Schedule_Entity'");
            $dbdelete_count2 = @mysqli_affected_rows($this->dbh);

            $dbdelete_count = (abs($dbdelete_count1) + abs($dbdelete_count2));
            DUPX_Log::info("- Removed '{$dbdelete_count}' schedule storage items");
        }
    }

    /**
     * activate and deactivate plugins 
     * 
     * @return void
     */
    public function managePlugins()
    {
        self::logSectionHeader("MANAGE PLUGINS", __FUNCTION__, __LINE__);
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        $subsite_id    = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SUBSITE_ID);

        try {
            $pluginsManager = DUPX_Plugins_Manager::getInstance();
            $pluginsManager->setActions($this->getPost('plugins'), $subsite_id);
            $pluginsManager->executeActions($this->dbConnection(), $subsite_id);
        }
        catch (Exception $e) {
            $nManager = DUPX_NOTICE_MANAGER::getInstance();
            $nManager->addFinalReportNotice(array(
                'shortMsg'    => 'Plugins settings error '.$e->getMessage(),
                'level'       => DUPX_NOTICE_ITEM::CRITICAL,
                'longMsg'     => $e->getTraceAsString(),
                'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                'sections'    => 'general'
            ));

            DUPX_Log::info("PLUGIN MANAGER EXCEPTIOMN\n".$e->getTraceAsString());
        }
    }

    public function noticeTest()
    {
        self::logSectionHeader('NOTICES TEST', __FUNCTION__, __LINE__);
        // make sure dbConnection is initialized
        $this->dbConnection();
        $escapedTablePrefix = mysqli_real_escape_string($this->dbh, DUPX_Paramas_Manager::getInstance()->getValue(DUPX_Paramas_Manager::PARAM_DB_TABLE_PREFIX));


        $nManager      = DUPX_NOTICE_MANAGER::getInstance();
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        if ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_WP_CONFIG) != 'nothing') {
            if (file_exists(DUPX_Package::getWpconfigArkPath())) {
                $wpconfig_ark_contents = file_get_contents(DUPX_Package::getWpconfigArkPath());
                $config_vars           = array('WPCACHEHOME', 'COOKIE_DOMAIN', 'WP_SITEURL', 'WP_HOME', 'WP_TEMP_DIR');
                $config_found          = DUPX_U::getListValues($config_vars, $wpconfig_ark_contents);

                //Files
                if (!empty($config_found)) {
                    $msg                        = "WP-CONFIG NOTICE: The wp-config.php has following values set [".implode(", ", $config_found)."].  \n";
                    $msg                        .= "Please validate these values are correct by opening the file and checking the values.\n";
                    $msg                        .= "See the codex link for more details: https://codex.wordpress.org/Editing_wp-config.php";
                    // old system
                    $this->report['warnlist'][] = $msg;
                    DUPX_Log::info($msg);

                    $nManager->addFinalReportNotice(array(
                        'shortMsg'    => 'wp-config notice',
                        'level'       => DUPX_NOTICE_ITEM::NOTICE,
                        'longMsg'     => $msg,
                        'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                        'sections'    => 'general'
                    ));
                }

                //-- Finally, back up the old wp-config and rename the new one

                $wpconfig_path = DUPX_WPConfig::getWpConfigPath();
                if (DUPX_Package::getWpconfigArkPath() !== $wpconfig_path) {
                    if (copy(DUPX_Package::getWpconfigArkPath(), $wpconfig_path) === false) {
                        DUPX_LOG::info(
                            'COPY SOURCE: '.DUPX_LOG::varToString(DUPX_Package::getWpconfigArkPath())."\n".
                            "COPY DEST:".DUPX_LOG::varToString($wpconfig_path), DUPX_Log::LV_DEBUG);
                        DUPX_Log::error("ERROR: Unable to copy 'dup-wp-config-arc__[HASH].txt' to 'wp-config.php'.\n".
                            "Check server permissions for more details see FAQ: https://snapcreek.com/duplicator/docs/faqs-tech/#faq-trouble-055-q");
                    }
                }
            } else {
                $msg                        = "WP-CONFIG NOTICE: <b>wp-config.php not found.</b><br><br>";
                $msg                        .= "No action on the wp-config was possible.<br>";
                $msg                        .= "Be sure to insert a properly modified wp-config for correct wordpress operation.";
                $this->report['warnlist'][] = $msg;

                $nManager->addFinalReportNotice(array(
                    'shortMsg'    => 'wp-config not found',
                    'level'       => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'     => $msg,
                    'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML,
                    'sections'    => 'general'
                    ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'wp-config-not-found');

                DUPX_Log::info($msg);
            }
        }

        //Database
        $result = DUPX_DB::mysqli_query($this->dbh,
                "SELECT option_value FROM `".$escapedTablePrefix."options` WHERE option_name IN ('upload_url_path','upload_path')");
        if ($result) {
            while ($row = mysqli_fetch_row($result)) {
                if (strlen($row[0])) {
                    $msg = "MEDIA SETTINGS NOTICE: The table '".$escapedTablePrefix."options' has at least one the following values ['upload_url_path','upload_path'] \n";
                    $msg .= "set please validate settings. These settings can be changed in the wp-admin by going to /wp-admin/options.php'";

                    $this->report['warnlist'][] = $msg;
                    DUPX_Log::info($msg);

                    $nManager->addFinalReportNotice(array(
                        'shortMsg'    => 'Media settings notice',
                        'level'       => DUPX_NOTICE_ITEM::SOFT_WARNING,
                        'longMsg'     => $msg,
                        'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_PRE,
                        'sections'    => 'general'
                        ), DUPX_NOTICE_MANAGER::ADD_UNIQUE_UPDATE, 'media-settings-notice');

                    break;
                }
            }
        }

        $sql = "INSERT into ".$escapedTablePrefix."options (option_name, option_value) VALUES ('duplicator_pro_migration', '1');";
        DUPX_DB::mysqli_query($this->dbh, $sql);

        if (empty($this->report['warnlist'])) {
            DUPX_Log::info("No General Notices Found\n");
        }
    }

    protected function removeRedundant()
    {
        $paramsManager = DUPX_Paramas_Manager::getInstance();
        if ($paramsManager->getValue(DUPX_Paramas_Manager::PARAM_REMOVE_RENDUNDANT)) {
            self::logSectionHeader('REMOVE REDUNDANT', __FUNCTION__, __LINE__);

            // make sure maintenance mode is disabled
            DUPX_U::maintenanceMode(false);

            // Need to load if user selected redundant-data checkbox
            require_once(DUPX_INIT.'/classes/utilities/class.u.remove.redundant.data.php');
            $nManager        = DUPX_NOTICE_MANAGER::getInstance();
            $new_content_dir = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_PATH_CONTENT_NEW);

            try {
                DUPX_Plugins_Manager::getInstance()->unistallInactivePlugins();
            }
            catch (Exception $ex) {
                // Technically it can complete but this should be brought to their attention
                $errorMsg = "**EXCEPTION ERROR** The Inactive Plugins deletion failed";
                DUPX_Log::info($errorMsg);
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $errorMsg,
                    'level'    => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'  => 'Please uninstall all inactive plugins manually',
                    'sections' => 'general'
                ));
            }
            catch (Error $ex) {
                // Technically it can complete but this should be brought to their attention
                $errorMsg = "**FATAL ERROR** The Inactive Plugins deletion failed";
                DUPX_Log::info($errorMsg);
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $errorMsg,
                    'level'    => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'  => 'Please uninstall all inactive plugins manually',
                    'sections' => 'general'
                ));
            }

            try {
                DUPX_RemoveRedundantData::deleteRedundantThemes($new_content_dir, $GLOBALS['DUPX_AC'], $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_SUBSITE_ID));
            }
            catch (Exception $ex) {
                // Technically it can complete but this should be brought to their attention
                $errorMsg = "**EXCEPTION ERROR** The Inactive Themes deletion failed";
                DUPX_Log::info($errorMsg);
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $errorMsg,
                    'level'    => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'  => 'Please uninstall all inactive themes manually',
                    'sections' => 'general'
                ));
            }
            catch (Error $e) {
                $errorMsg = "**FATAL ERROR** The Inactive Themes deletion failed";
                DUPX_Log::info($errorMsg);
                $nManager->addFinalReportNotice(array(
                    'shortMsg' => $errorMsg,
                    'level'    => DUPX_NOTICE_ITEM::HARD_WARNING,
                    'longMsg'  => 'Please uninstall all inactive themes manually',
                    'sections' => 'general'
                ));
            }
            if (DUPX_InstallerState::getInstance()->getMode() === DUPX_InstallerState::MODE_OVR_INSTALL) {
                DUPX_U::maintenanceMode(true);
            }
        }
    }

    public function cleanupTmpFiles()
    {
        $this->removeRedundant();
        self::logSectionHeader('CLEANUP TMP FILES', __FUNCTION__, __LINE__);

        //Cleanup any tmp files a developer may have forgotten about
        //Lets be proactive for the developer just in case
        $wpconfig_path_bak   = $this->post['path_new']."/wp-config.bak";
        $wpconfig_path_old   = $this->post['path_new']."/wp-config.old";
        $wpconfig_path_org   = $this->post['path_new']."/wp-config.org";
        $wpconfig_path_orig  = $this->post['path_new']."/wp-config.orig";
        $wpconfig_safe_check = array($wpconfig_path_bak, $wpconfig_path_old, $wpconfig_path_org, $wpconfig_path_orig);
        foreach ($wpconfig_safe_check as $file) {
            if (file_exists($file)) {
                $tmp_newfile = $file.uniqid('_');
                if (rename($file, $tmp_newfile) === false) {
                    DUPX_Log::info("WARNING: Unable to rename '{$file}' to '{$tmp_newfile}'");
                }
            }
        }
    }

    public function finalReportNotices()
    {
        self::logSectionHeader('FINAL REPORT NOTICES', __FUNCTION__, __LINE__);

        $this->wpConfigFinalReport();
        $this->htaccessFinalReport();
    }

    private function htaccessFinalReport()
    {
        $nManager = DUPX_NOTICE_MANAGER::getInstance();

        $htaccessInfo = DUPX_Orig_File_Manager::getInstance()->getEntry('htaccess');
        $orig         = file_get_contents($htaccessInfo['stored']);
        $new          = file_get_contents($this->post['path_new'].'/.htaccess');

        $lightBoxContent = '<div class="row-cols-2">'.
            '<div class="col col-1"><b>Original .htaccess</b><pre>'.htmlspecialchars($orig).'</pre></div>'.
            '<div class="col col-2"><b>New .htaccess</b><pre>'.htmlspecialchars($new).'</pre></div>'.
            '</div>';
        $longMsg         = DUPX_U_Html::getLigthBox('.htaccess changes', 'HTACCESS COMPARE', $lightBoxContent, false);

        $nManager->addFinalReportNotice(array(
            'shortMsg'    => 'htaccess changes',
            'level'       => DUPX_NOTICE_ITEM::INFO,
            'longMsg'     => $longMsg,
            'sections'    => 'changes',
            'open'        => true,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'htaccess-changes');
    }

    private function wpConfigFinalReport()
    {
        $nManager     = DUPX_NOTICE_MANAGER::getInstance();
        $wpConfigInfo = DUPX_Orig_File_Manager::getInstance()->getEntry('wpconfig');

        if (($orig = file_get_contents($wpConfigInfo['stored'])) === false) {
            $orig = 'Can read origin wp-config.php file';
        } else {
            $orig = $this->obscureWpConfig($orig);
        }

        if (($new = file_get_contents(DUPX_WPConfig::getWpConfigPath())) === false) {
            $new = 'Can read wp-config.php file';
        } else {
            $new = $this->obscureWpConfig($new);
        }

        $lightBoxContent = '<div class="row-cols-2">'.
            '<div class="col col-1"><b>Original wp-config.php</b><pre>'.htmlspecialchars($orig).'</pre></div>'.
            '<div class="col col-2"><b>New wp-config.php</b><pre>'.htmlspecialchars($new).'</pre></div>'.
            '</div>';
        $longMsg         = DUPX_U_Html::getLigthBox('wp-config.php changes', 'WP-CONFIG.PHP COMPARE', $lightBoxContent, false);

        $nManager->addFinalReportNotice(array(
            'shortMsg'    => 'wp-config.php changes',
            'level'       => DUPX_NOTICE_ITEM::INFO,
            'longMsg'     => $longMsg,
            'sections'    => 'changes',
            'open'        => true,
            'longMsgMode' => DUPX_NOTICE_ITEM::MSG_MODE_HTML
            ), DUPX_NOTICE_MANAGER::ADD_UNIQUE, 'wp-config-changes');
    }

    private function obscureWpConfig($src)
    {
        $transformer = new WPConfigTransformerSrc($src);
        $obsKeys     = array(
            'DB_NAME',
            'DB_USER',
            'DB_HOST',
            'DB_PASSWORD',
            'AUTH_KEY',
            'SECURE_AUTH_KEY',
            'LOGGED_IN_KEY',
            'NONCE_KEY',
            'AUTH_SALT',
            'SECURE_AUTH_SALT',
            'LOGGED_IN_SALT',
            'NONCE_SALT');

        foreach ($obsKeys as $key) {
            if ($transformer->exists('constant', $key)) {
                $transformer->update('constant', $key, '**OBSCURED**');
            }
        }

        return $transformer->getSrc();
    }

    public function chunkStop($progressPerc, $position)
    {
        // make sure post data is initialized
        $this->getPost();

        $this->closeDbConnection();

        $ajax3_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $this->timeStart);
        DUPX_Log::info("\nSTEP-3 CHUNK STOP @ ".@date('h:i:s')." - RUNTIME: {$ajax3_sum} \n\n");

        $this->report['chunk']         = 1;
        $this->report['chunkPos']      = $position;
        $this->report['pass']          = 0;
        $this->report['progress_perc'] = $progressPerc;
    }

    public function complete()
    {
        // make sure post data is initialized
        $this->getPost();
        $this->closeDbConnection();

        $paramsManager = DUPX_Paramas_Manager::getInstance();

        $ajax3_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $this->timeStart);
        DUPX_Log::info("\nSTEP-3 COMPLETE @ ".@date('h:i:s')." - RUNTIME: {$ajax3_sum} \n\n");

        $finalReport = $paramsManager->getValue(DUPX_Paramas_Manager::PARAM_FINAL_REPORT_DATA);

        $finalReport['replace']['scan_tables'] = $this->report['scan_tables'];
        $finalReport['replace']['scan_rows']   = $this->report['scan_rows'];
        $finalReport['replace']['scan_cells']  = $this->report['scan_cells'];
        $finalReport['replace']['updt_tables'] = $this->report['updt_tables'];
        $finalReport['replace']['updt_rows']   = $this->report['updt_rows'];
        $finalReport['replace']['updt_cells']  = $this->report['updt_cells'];
        $finalReport['replace']['errsql']      = $this->report['errsql'];
        $finalReport['replace']['errser']      = $this->report['errser'];
        $finalReport['replace']['errkey']      = $this->report['errkey'];
        $finalReport['replace']['errsql_sum']  = $this->report['errsql_sum'];
        $finalReport['replace']['errser_sum']  = $this->report['errser_sum'];
        $finalReport['replace']['errkey_sum']  = $this->report['errkey_sum'];
        $finalReport['replace']['err_all']     = $this->report['err_all'];
        $finalReport['replace']['warn_all']    = $this->report['warn_all'];
        $finalReport['replace']['warnlist']    = $this->report['warnlist'];

        $paramsManager->setValue(DUPX_Paramas_Manager::PARAM_FINAL_REPORT_DATA, $finalReport);
        $paramsManager->save();

        $this->report['pass']          = 1;
        $this->report['chunk']         = 0;
        $this->report['chunkPos']      = null;
        $this->report['progress_perc'] = 100;
        // error_reporting($ajax3_error_level);
    }

    public function error($message)
    {
        // make sure post data is initialized
        $this->getPost();

        $this->closeDbConnection();

        $ajax3_sum = DUPX_U::elapsedTime(DUPX_U::getMicrotime(), $this->timeStart);
        DUPX_Log::info("\nSTEP-3 ERROR @ ".@date('h:i:s')." - RUNTIME: {$ajax3_sum} \n\n");

        $this->report['pass']          = -1;
        $this->report['chunk']         = 0;
        $this->report['chunkPos']      = null;
        $this->report['error_message'] = $message;
    }

    protected function __clone()
    {
        
    }

    public function __wakeup()
    {
        throw new Exception("Cannot unserialize singleton");
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit