public function append_zip(ZipArchive $zip, $root, $local_prefix, FW_Backup_Interface_Feedback $feedback, $exclude = array()) { /** * @var FW_Extension_Backup $backup */ $feedback->set_task(__('Scanning file system...', 'fw')); $fs = new FW_Backup_Helper_File_System(); $backup = fw()->extensions->get('backup'); $exclude[] = $backup->get_backup_dir(); $upload_dir = wp_upload_dir(); $exclude[] = $upload_dir['basedir'] . '/fw-style.css'; list($file_list, $file_size) = $fs->file_list_exclude($root, $exclude); $feedback->set_task(sprintf(__('%d file(s) found [%s]', 'fw'), count($file_list), $fs->format_bytes(array_sum($file_size)))); $fs->append_zip($zip, $file_list, $root, $local_prefix, $feedback); }
public function run_with_initialized_file_system() { $fs = new FW_Backup_Helper_File_System(); $db = new FW_Backup_Helper_Database(); $auto_install_dir = $this->backup()->get_auto_install_dir(); $upload_dir = wp_upload_dir(); $upload_dir = $upload_dir['basedir']; try { // Do Full Backup before Auto Install if (apply_filters('fw_ext_backup_do_backup_on_demo_content_install', true)) { $this->backup()->action()->do_backup_background_cron('cron_full'); } // Replace uploads directory $t = $fs->replace($fs->map($upload_dir), $fs->map("{$auto_install_dir}/uploads")); // Move backup directory from trashed dir into new upload dir if ($t) { $fs->move_existing("{$t}/backup", $fs->map("{$upload_dir}/backup")); // Remove trashed dir because we made Full Backup of the site $fs->rmdir($t); } if (file_exists("{$auto_install_dir}/database.txt")) { $file_with_sql = "{$auto_install_dir}/database.txt"; } else { $file_with_sql = "{$auto_install_dir}/database.sql"; } $db->import($file_with_sql, true, true, true); do_action('fw_ext_backup_after_import_demo_content'); return array('success' => true); } catch (FW_Backup_Exception $exception) { return array('success' => false, 'data' => array('message' => $exception->getMessage())); } }
public function run() { $fs = new FW_Backup_Helper_File_System(); $db = new FW_Backup_Helper_Database(); $auto_install_dir = $this->backup()->get_auto_install_dir(); $upload_dir = wp_upload_dir(); $upload_dir = $upload_dir['basedir']; // This forces *Restore* page to be opened event if // request_filesystem_credentials is not required. In the // latter case JavaScript will submit the page automatically // which opens up a *Restore in Progress* popup. if ($_SERVER['REQUEST_METHOD'] != 'POST') { throw new FW_Backup_Exception_Method_Not_Allowed(); } $restore = new FW_Backup_Process_Restore(); $restore->request_filesystem_credentials(); try { $fs->check_permissions(); // Do Full Backup before Auto Install $this->backup()->action()->do_backup_background_cron('cron_full'); // Replace uploads directory $t = $fs->replace($fs->map($upload_dir), $fs->map("{$auto_install_dir}/uploads")); // Move backup directory from trashed dir into new upload dir if ($t) { $fs->move_existing("{$t}/backup", $fs->map("{$upload_dir}/backup")); // Remove trashed dir because we made Full Backup of the site $fs->rmdir($t); } if (file_exists("{$auto_install_dir}/database.txt")) { $file_with_sql = "{$auto_install_dir}/database.txt"; } else { $file_with_sql = "{$auto_install_dir}/database.sql"; } $db->import($file_with_sql, true, true, true); } catch (FW_Backup_Exception $exception) { FW_Flash_Messages::add('auto-install', $exception->getMessage(), 'error'); // otherwise flash messages wont show wp_redirect($this->backup()->action()->url_backup_auto_install_page()); exit; } // get rid of update notifications wp_redirect(admin_url('update-core.php?force-check=1&auto-install-redirect=' . esc_url(admin_url()))); exit; }
public function run($post_id) { /** * @var WP_Filesystem_Base $wp_filesystem */ global $wp_filesystem; set_time_limit(0); $fs = new FW_Backup_Helper_File_System(); $db = new FW_Backup_Helper_Database(); $backup_info = $this->backup()->get_backup_info($post_id); if (!$backup_info || !$backup_info->is_completed()) { throw new FW_Backup_Exception('Cannot restore from incomplete backup'); } $storage = $this->backup()->get_storage($backup_info->get_storage(), $backup_info->get_cron_job()); // Ensure that storage layer is workable (e.g. was configured properly) $storage->ping(new FW_Backup_Feedback_Void()); if ($backup_info->has_fs()) { $this->request_filesystem_credentials(); } // This forces *Restore* page to be opened event if // request_filesystem_credentials is not required. In the // latter case JavaScript will submit the page automatically // which opens up a *Restore in Progress* popup. if ($_SERVER['REQUEST_METHOD'] != 'POST') { throw new FW_Backup_Exception_Method_Not_Allowed(); } if ($backup_info->has_fs()) { if ($wp_filesystem->abspath() == '/') { throw new FW_Backup_Exception('WordPress was located at root directory (/). Restoration for this scenario was not implemented.'); } $fs->check_permissions(); } if ($backup_info->has_db()) { $db->check_permissions(); } // 2) Do restore try { $f = new FW_Backup_Feedback_Void(); $zip_file = $storage->fetch($backup_info->get_storage_file(), $f); // Try to open it as .zip archive $zip = new ZipArchive(); if ($zip->open($zip_file) !== true) { throw new FW_Backup_Exception('Cannot open .zip file'); } // Restore files (should come before database: rename wordpress dir can fail) if ($backup_info->has_fs()) { $wp = rtrim($wp_filesystem->abspath(), '/'); $wp_new = rtrim(dirname($wp), '/') . '/' . uniqid(); $wp_backup = $wp . '-' . date('Y_m_d-H_i_s', current_time('timestamp')); $backup_rel = substr($this->backup()->get_backup_dir(), strlen(ABSPATH)); // Extract archive into temporary location unzip_file($zip_file, $wp_new); // Get rid of database.txt file, if any if ($wp_filesystem->exists("{$wp_new}/database.txt")) { $wp_filesystem->delete("{$wp_new}/database.txt"); } // In imported backup files wp-config.php can contain database // credentials which cannot work on this host. Also, database prefix // can be different from the value in original wp-config.php if ($backup_info->is_imported()) { $wp_filesystem->copy("{$wp}/wp-config.php", "{$wp_new}/wp-config.php", true); } // Replace WordPress dir by version from backup $move = true && $wp_filesystem->move($wp, $wp_backup) && $wp_filesystem->move($wp_new, $wp) && $wp_filesystem->move("{$wp_backup}/{$backup_rel}", "{$wp}/{$backup_rel}"); if (!$move) { throw new FW_Backup_Exception('Replacing wordpress dir by version from backup failed'); } } // Restore database if ($backup_info->has_db()) { $fp_db = $zip->getStream('database.txt'); $db->import_fp($fp_db, false, $backup_info->is_imported(), false); fclose($fp_db); } } catch (FW_Backup_Exception $exception) { } unset($zip); if (isset($zip_file)) { unlink($zip_file); } if (isset($exception)) { throw $exception; } }