public static function stepByStep($logDate = false, &$arrProject = array(), $_flgForceCreateStepFile = false) { set_time_limit(0); ignore_user_abort(true); error_reporting(E_ALL); ob_implicit_flush(); include_once Xpandbuddy::$pathName . '/library/Logger.php'; self::$logger = new Xpandbuddy_Logger('step_log_file'); if (empty($logDate) && !empty($arrProject)) { self::$logger->logDate = time(); $arrProject['step'] = 0; self::$logger->stepProject = $arrProject; self::$logger->setStepLog(); } else { self::$logger->logDate = $logDate; self::$logger->getStepLog(); } if (empty(self::$logger->stepProject) && !empty($logDate) && !empty($arrProject) && $_flgForceCreateStepFile) { self::$logger->logDate = $logDate; $arrProject['step'] = 0; self::$logger->stepProject = $arrProject; self::$logger->setStepLog(); } if (empty(self::$logger->stepProject)) { self::$logger->deleteStepLog(); return self::_setErr('No project settings!'); } if (!isset(self::$logger->stepProject['settings']['user_data']['only_settings'])) { $_thisType = 1; if (isset(self::$logger->stepProject['flg_type']) && is_array(self::$logger->stepProject['flg_type'])) { foreach (self::$logger->stepProject['flg_type'] as $_key => $_value) { if ($_key == $_value) { $_thisType = $_value; break; } } } self::$logger->stepProject['settings']['user_data'] = self::$logger->stepProject['settings']['type_' . $_thisType]; } if (self::$logger->stepProject['step'] < 1) { // Create SQL backup if ((self::$logger->stepProject['settings']['user_data']['only_settings'] == 1 && self::$logger->stepProject['settings']['user_data']['database'] == 1 || self::$logger->stepProject['settings']['user_data']['only_settings'] == 0) && !self::createStepBackup()) { self::$logger->setStepLog(); return self::_setErr('Can\'t create SQL backup file!'); } self::$logString .= 'Created SQL backup file successfully.<br/>'; self::$logger->stepProject['step']++; if (self::$logger->setStepLog() === false) { return self::_setErr('Can\'t save data to temp file!<br/>'); } return true; } $_dirStart = substr(ABSPATH, 0, -1); $_pluginDir = WP_CONTENT_DIR . self::$ds . 'plugins' . self::$ds . 'xpandbuddy' . self::$ds; $_wpContentDir = substr(WP_CONTENT_DIR, strlen(ABSPATH)); $_tmpDir = getcwd(); chdir(ABSPATH); if (self::$logger->stepProject['step'] < 2) { // Get file list self::$logger->stepProject['arrFiles'] = array(); if (@self::$logger->stepProject['settings']['user_data']['only_settings'] == 1) { if (@self::$logger->stepProject['settings']['user_data']['database'] == 1) { self::$logger->stepProject['arrFiles'][] = 'wp-backups' . self::$ds . 'dump_' . self::$logger->logDate . '.sql'; } if (@self::$logger->stepProject['settings']['user_data']['plugins'] == 1) { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'plugins', $_dirStart); } if (@self::$logger->stepProject['settings']['user_data']['themes'] == 1) { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'themes', $_dirStart); } if (@self::$logger->stepProject['settings']['user_data']['uploads'] == 1 && is_dir($_dirStart . self::$ds . $_wpContentDir . self::$ds . 'uploads' . self::_subdirCreation())) { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'uploads' . self::_subdirCreation(), $_dirStart); } } else { if (@self::$logger->stepProject['settings']['blog']['flg_mu2single'] == 1) { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart, $_dirStart, false); foreach (self::$logger->stepProject['arrFiles'] as $_id => $_file) { if ($_file == '.htaccess') { unset(self::$logger->stepProject['arrFiles'][$_id]); continue; } } self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . 'wp-admin', $_dirStart); self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . 'wp-includes', $_dirStart); self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'languages', $_dirStart); self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'plugins', $_dirStart); self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'themes', $_dirStart); if (is_dir($_dirStart . self::$ds . $_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::_subdirCreation())) { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart . self::$ds . $_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::_subdirCreation(), $_dirStart); } else { self::$logger->stepProject['arrFiles'][] = $_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::$ds . 'index.php'; } } else { self::getFiles(self::$logger->stepProject['arrFiles'], $_dirStart, $_dirStart); } } $_clearDirs = array(); $_saveFiles = self::$logger->stepProject['arrFiles']; if (isset(self::$logger->stepProject['settings']['user_data']['arr_execute_dirs']) && count(self::$logger->stepProject['settings']['user_data']['arr_execute_dirs']) > 0 && isset(self::$logger->stepProject['settings']['user_data']['files_exclude']) && self::$logger->stepProject['settings']['user_data']['files_exclude'] == 1) { foreach (@self::$logger->stepProject['settings']['user_data']['arr_execute_dirs'] as $_dirs) { if ($_dirs['value'] == 1) { $_clearDirs[] = stripslashes($_dirs['name']); } } $_saveFiles = array(); foreach (self::$logger->stepProject['arrFiles'] as $_file) { $_flgCheck = true; foreach ($_clearDirs as $_needle) { if (strpos($_dirStart . self::$ds . $_file, $_needle) === 0) { $_flgCheck = false; } } if ($_flgCheck && empty(self::$logger->stepProject['settings']['files_exclude_filter']) || $_flgCheck && !empty(self::$logger->stepProject['settings']['files_exclude_filter']) && @fnmatch(self::$logger->stepProject['settings']['files_exclude_filter'], $_dirStart . self::$ds . $_file)) { $_saveFiles[] = $_file; } } } self::$logger->stepProject['arrAllFilesCount'] = count($_saveFiles); self::$logger->stepProject['arrFiles'] = $_saveFiles; self::$logString .= 'Found ' . self::$logger->stepProject['arrAllFilesCount'] . ' files & dirs.<br/>'; self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } if (@self::$logger->stepProject['settings']['blog']['flg_mu2single'] == 1) { self::setReplaceUnit('wp-config.php', '/(WP_ALLOW_MULTISITE.*[,]{1})(.*)([\\)]{1})/i', "\${1}false\${3}", 1, 0); self::setReplaceUnit('wp-config.php', '/(MULTISITE.*[,]{1})(.*)([\\)]{1})/i', "\${1}false\${3}", 1, 0); self::setReplaceUnit('wp-config.php', '/(\\$table_prefix.*[\'"]{1})(.*)([\'"]{1})/i', "\${1}" . self::$logger->stepProject['settings']['blog']['db_tableprefix'] . '$3', 1, 0); self::setReplaceUnit('##all_files##', "#" . addslashes($_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::_subdirCreation()) . "#i", addslashes($_wpContentDir . self::$ds . 'uploads'), 1, 0); self::setReplaceUnit('##all_files##', "#" . addslashes(str_replace(self::$ds, '/', $_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::_subdirCreation())) . "#i", addslashes(str_replace(self::$ds, '/', $_wpContentDir . self::$ds . 'uploads' . self::$ds)), 1, 0); } $_backupFile = 'backup-prj' . self::$logger->stepProject['id'] . '-' . date("Y-m-d-H", self::$logger->logDate); if (!isset(self::$logger->stepProject['flg_type'])) { self::$logger->stepProject['flg_type'] = array('1' => '1'); } self::setOptions(self::$logger->stepProject['settings'], self::$logger->stepProject['flg_type'][1]); if (self::$logger->stepProject['step'] < 3) { // Move all files to archive $_flgStep3FirstRun = self::$logger->stepProject['arrAllFilesCount'] == count(self::$logger->stepProject['arrFiles']); if (@self::$logger->stepProject['settings']['user_data']['only_settings'] == 1) { $archivator = self::activateStepArchiveClass(false, 'wp-backups' . self::_subdirCreation(), $_flgStep3FirstRun); } else { $archivator = self::activateStepArchiveClass($_backupFile, substr(ABSPATH, 0, -1) . self::$ds . 'wp-backups' . self::$ds, $_flgStep3FirstRun); } $_summFileSize = 0; $_inStepCounter = 0; $_memoryLimit = ini_get('memory_limit'); switch (substr($_memoryLimit, -1)) { case 'M': case 'm': $_memoryLimit = (int) $_memoryLimit * 1048576; break; case 'K': case 'k': $_memoryLimit = (int) $_memoryLimit * 1024; break; case 'G': case 'g': $_memoryLimit = (int) $_memoryLimit * 1073741824; break; } if (count(self::$logger->stepProject['arrFiles']) > 0) { self::$logString .= 'Archiving:<br/>'; foreach (self::$logger->stepProject['arrFiles'] as $_fileKey => $_file) { $_fileSize = @filesize($_dirStart . self::$ds . $_file); if ($_summFileSize > 1024 * 1024 && $_inStepCounter > 1) { self::$logString .= 'Proceeding to next step.<br/>'; break; } $_summFileSize += $_fileSize; if (is_file($_dirStart . self::$ds . $_file)) { if (memory_get_usage() + 2 * $_fileSize < $_memoryLimit - 4194304) { // change only php ini html htaccess files sql if (in_array(substr(strrchr($_dirStart . self::$ds . $_file, '.'), 1), array('php', 'ini', 'html', 'htaccess', 'sql'))) { if (isset(self::$_arrChanges['##all_files##'])) { foreach (self::$_arrChanges['##all_files##'] as $_keyName => $_keyValues) { foreach ($_keyValues as $_oneValue) { if (!isset(self::$_arrChanges[$_file])) { self::$_arrChanges[$_file] = array(); } self::$_arrChanges[$_file][$_keyName][] = $_oneValue; } } } $handleFile = fopen($_dirStart . self::$ds . $_file, "r"); $_copyFileName = basename($_dirStart . self::$ds . $_file); $_copyDirName = substr($_file, 0, -strlen(basename($_dirStart . self::$ds . $_file)) - 1); $_copyFileTemp = $_pluginDir . 'temp' . self::$ds . $_copyFileName; $copyFile = fopen($_copyFileTemp, "w"); if ($handleFile === false || $copyFile === false) { $arrError = error_get_last(); self::$logger->setStepLog(); return self::_setErr('The plugin could not be activated because of your host server settings. ' . @$arrError['message'] . '. Please contact your host to get the issue resolved.'); } while (($buffer = fgets($handleFile)) !== false) { if ($buffer === false) { $arrError = error_get_last(); self::$logString .= $arrError . '<br/>'; self::$logger->setStepLog(); return self::_setErr('The plugin could not be activated because of your host server settings. ' . @$arrError['message'] . '. Please contact your host to get the issue resolved.'); } if (isset(self::$_arrChanges[$_file])) { if (isset(self::$_arrChanges[$_file]['string_b'])) { $buffer = preg_replace(self::$_arrChanges[$_file]['bufer_b'], self::$_arrChanges[$_file]['replace_b'], preg_replace(self::$_arrChanges[$_file]['string_b'], self::$_arrChanges[$_file]['bufer_a'], $buffer)); } if (isset(self::$_arrChanges[$_file]['string'])) { $buffer = preg_replace(self::$_arrChanges[$_file]['string'], self::$_arrChanges[$_file]['replace'], $buffer); } } if (fwrite($copyFile, $buffer) === false) { $arrError = error_get_last(); self::$logString .= $arrError . '<br/>'; self::$logger->setStepLog(); return self::_setErr('The plugin could not be activated because of your host server settings. ' . @$arrError['message'] . '. Please contact your host to get the issue resolved.'); } } if (!feof($handleFile)) { $arrError = error_get_last(); self::$logger->setStepLog(); return self::_setErr('The plugin could not be activated because of your host server settings. ' . @$arrError['message'] . '. Please contact your host to get the issue resolved.'); } fclose($handleFile); fclose($copyFile); if (!self::haveErrors($archivator, $archivator->add($_copyFileTemp, PCLZIP_OPT_ADD_PATH, $_copyDirName, PCLZIP_OPT_REMOVE_PATH, $_pluginDir . 'temp' . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { @unlink($_copyFileTemp); self::$logString .= 'Can\'t archiving data from ' . $_file . '<br/>' . self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t archiving data from ' . $_file . '!'); } @unlink($_copyFileTemp); self::$logString .= $_file . '<br/>'; } else { $_removePath = $_dirStart . self::$ds; $_addPath = ''; if (@self::$logger->stepProject['settings']['blog']['flg_mu2single'] == 1 && strpos($_dirStart . self::$ds . $_file, $_wpContentDir . self::$ds . 'uploads') !== false) { $_removePath = $_wpContentDir . self::$ds . 'uploads' . self::$ds . 'sites' . self::_subdirCreation(); $_addPath = $_wpContentDir . self::$ds . 'uploads'; } if (!self::haveErrors($archivator, $archivator->add($_dirStart . self::$ds . $_file, PCLZIP_OPT_ADD_PATH, $_addPath, PCLZIP_OPT_REMOVE_PATH, $_removePath, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= 'Can\'t archiving data from ' . $_file . '<br/>' . self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t archiving data from ' . $_file . '!'); } self::$logString .= $_file . '<br/>'; } self::$_filesCounter++; $_inStepCounter++; } else { self::$logString .= 'No archiving data from ' . $_file . ' - memory limit is end!<br/>Saving after restart!<br/>'; break; } } elseif (is_dir($_dirStart . self::$ds . $_file) && count(scandir($_dirStart . self::$ds . $_file)) < 3) { if (!self::haveErrors($archivator, $archivator->add($_dirStart . self::$ds . $_file, PCLZIP_OPT_REMOVE_PATH, $_dirStart . self::$ds, PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= 'Can\'t archiving data dir ' . $_file . '<br/>' . self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t archiving dir ' . $_file . '!'); } self::$_filesCounter++; self::$logString .= $_file . '<br/>'; } unset(self::$logger->stepProject['arrFiles'][$_fileKey]); } self::$logString .= 'Package of files saved.<br/>'; self::$logger->setStepLog(); return true; } else { self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } } if (@self::$logger->stepProject['settings']['user_data']['only_settings'] != 1) { if (self::$logger->stepProject['step'] < 4) { $archivator = self::activateStepArchiveClass($_backupFile, substr(ABSPATH, 0, -1) . self::$ds . 'wp-backups' . self::$ds); if (!self::haveErrors($archivator, $archivator->add($_dirStart . self::$ds . 'wp-backups' . self::$ds . 'dump_' . self::$logger->logDate . '.sql', PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, $_dirStart . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t archiving SQL dump file!'); } self::$logString .= 'Archiving SQL dump file.<br/>'; self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } if (self::$logger->stepProject['step'] < 5) { $archivator = self::activateStepArchiveClass(false, 'wp-backups' . self::_subdirCreation(), true); if (!self::haveErrors($archivator, $archivator->add(substr(ABSPATH, 0, -1) . self::$ds . 'wp-backups' . self::$ds . $_backupFile . self::$logger->stepProject['settings']['archive_type'], PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, $_dirStart . self::$ds . 'wp-backups' . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t compare data file!'); } if (is_file('wp-backups' . self::$ds . $_backupFile . self::$logger->stepProject['settings']['archive_type'])) { unlink('wp-backups' . self::$ds . $_backupFile . self::$logger->stepProject['settings']['archive_type']); } self::$logString .= 'Compare data file.<br/>'; self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } if (self::$logger->stepProject['step'] < 6) { $archivator = self::activateStepArchiveClass(true, 'wp-backups' . self::_subdirCreation()); $_indexFile = $_pluginDir . 'temp' . self::$ds . 'index.php'; $_archiveClassName = self::$logger->stepProject['settings']['archive_type'] == '.zip' ? 'PclZip' : 'TarArchive'; if (false === @file_put_contents($_indexFile, '<?php set_time_limit(0); ignore_user_abort(true); if( function_exists("version_compare")&&version_compare( phpversion(), "5.2", "<") ){ echo "Low version PHP, try to manually extract!"; die(); } include_once( "' . $_archiveClassName . '.php" ); $archivator=new ' . $_archiveClassName . '("' . $_backupFile . self::$logger->stepProject['settings']['archive_type'] . '"); @unlink("index.php"); $archivator->extract( PCLZIP_OPT_REPLACE_NEWER, PCLZIP_OPT_SET_CHMOD, ( substr( php_sapi_name(), 0, 3 )=="cgi"? 0644:0777 ) ); if( $archivator->error_code == 0 && empty( $archivator->error ) ){ $link=mysql_connect(\'' . self::$logger->stepProject['settings']['blog']['db_host'] . '\', \'' . self::$logger->stepProject['settings']['blog']['db_username'] . '\', \'' . self::$logger->stepProject['settings']['blog']['db_password'] . '\'); if(!$link){ die( mysql_error() ); } if(!mysql_select_db(\'' . self::$logger->stepProject['settings']['blog']['db_name'] . '\', $link)){ die( mysql_error() ); } mysql_set_charset("utf8",$link); $handle=@fopen( ".".DIRECTORY_SEPARATOR."wp-backups".DIRECTORY_SEPARATOR."dump_' . self::$logger->logDate . '.sql", "r" ); $arrError=array(); if($handle){ global $table_prefix; while( $buffer=fgets( $handle ) ){ $buffer=trim( $buffer ); if( empty( $buffer ) || ord($buffer{0})==35 ){ continue; } if( !empty( $buffer ) ){ str_replace( "##new_table_prefix##", $table_prefix, $buffer ); if( !mysql_query( $buffer, $link ) ){ $arrError[]=mysql_query("SHOW ENGINE INNODB STATUS;")."\\n\\n".mysql_error()."\\n\\n".$buffer; } } } fclose($handle); }else{ $arrError=error_get_last(); die( "The plugin could not be activated because of your host server settings. ".@$arrError["message"].". Please contact your host to get the issue resolved." ); } mysql_close($link); @unlink("' . $_backupFile . self::$logger->stepProject['settings']['archive_type'] . '"); @unlink("' . $_archiveClassName . '.php"); if( empty( $arrError ) ){ header("Refresh: 1;"); } }else{ echo( "Error: ".$archivator->errorInfo( true ) ); } ?>')) { self::$logger->setStepLog(); return self::_setErr('Can\'t create action file!'); } if (!self::haveErrors($archivator, $archivator->add($_indexFile, PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, $_pluginDir . 'temp' . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t compare action file!'); } if (is_file($_indexFile)) { unlink($_indexFile); } self::$logString .= 'Compare action file.<br/>'; self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } if (self::$logger->stepProject['step'] < 7) { $archivator = self::activateStepArchiveClass(true, 'wp-backups' . self::_subdirCreation()); if (self::$logger->stepProject['settings']['archive_type'] == '.zip') { if (!self::haveErrors($archivator, $archivator->add($_pluginDir . "library" . self::$ds . "PclZip.php", PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, $_pluginDir . "library" . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t compare class file!'); } } else { if (!self::haveErrors($archivator, $archivator->add($_pluginDir . "library" . self::$ds . "TarArchive.php", PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, $_pluginDir . "library" . self::$ds, PCLZIP_OPT_TEMP_FILE_THRESHOLD, 1024 * 1024 * 10, PCLZIP_OPT_NO_COMPRESSION, PCLZIP_OPT_TEMP_FILE_ON))) { self::$logString .= self::$error . '<br/>'; self::$logger->setStepLog(); return self::_setErr('Can\'t compare class file!'); } } self::$logString .= 'Compare class file.<br/>'; self::$logger->stepProject['step']++; self::$logger->setStepLog(); return true; } } if (is_file($_dirStart . self::$ds . 'wp-backups' . self::$ds . 'dump_' . self::$logger->logDate . '.sql')) { unlink($_dirStart . self::$ds . 'wp-backups' . self::$ds . 'dump_' . self::$logger->logDate . '.sql'); } self::$logger->deleteStepLog(); self::$logger->stepProject['settings']['file_loader'] = self::$logger->stepProject['settings']['file_name']; self::$logString .= 'Process completed!'; chdir($_tmpDir); return true; }