private static function _verb_runBackup() { $backupSerial = pb_backupbuddy::random_string(10); $profileArray = pb_backupbuddy::_POST('profile'); if (false === ($profileArray = base64_decode($profileArray))) { $message = 'Error #8343728: Unable to base64 decode profile data.'; pb_backupbuddy::status('error', $message, $backupSerial); die(json_encode(array('success' => false, 'error' => $message))); } if (NULL === ($profileArray = json_decode($profileArray, true))) { $message = 'Error #3272383: Unable to json decode profile data.'; pb_backupbuddy::status('error', $message, $backupSerial); die(json_encode(array('success' => false, 'error' => $message))); } // Appends session tokens from the pulling site so they wont get logged out when this database is restored there. if (isset($profileArray['sessionTokens']) && is_array($profileArray['sessionTokens'])) { pb_backupbuddy::status('details', 'Remote session tokens need updated.', $backupSerial); //error_log( 'needtoken' ); if (!is_numeric($profileArray['sessionID'])) { $message = 'Error #328989893. Invalid session ID. Must be numeric.'; pb_backupbuddy::status('error', $message); die(json_encode(array('success' => false, 'error' => $message))); } // Get current session tokens. global $wpdb; $sql = "SELECT meta_value FROM `" . DB_NAME . "`.`" . $wpdb->prefix . "usermeta` WHERE `user_id` = '" . $profileArray['sessionID'] . "' AND `meta_key` = 'session_tokens';"; $results = $wpdb->get_var($sql); $oldSessionTokens = @unserialize($results); // Add remote tokens. if (!is_array($oldSessionTokens)) { $oldSessionTokens = array(); } $newSessionTokens = array_merge($oldSessionTokens, $profileArray['sessionTokens']); // Re-serialize. $newSessionTokens = serialize($newSessionTokens); // Save merged tokens here. $sql = "UPDATE `" . DB_NAME . "`.`" . $wpdb->prefix . "usermeta` SET meta_value= %s WHERE `user_id` = '" . $profileArray['sessionID'] . "' AND `meta_key` = 'session_tokens';"; $stringedSessionTokens = serialize($profileArray['sessionTokens']); if (false === $wpdb->query($wpdb->prepare($sql, $stringedSessionTokens))) { $message = 'Error #43734784: Unable to update remote session token.'; pb_backupbuddy::status('error', $message, $backupSerial); die(json_encode(array('success' => false, 'error' => $message))); } pb_backupbuddy::status('details', 'Updated remote session tokens.', $backupSerial); } if (true !== ($maybeMessage = backupbuddy_api::runBackup($profileArray, $triggerTitle = 'deployment_pulling', $backupMode = '', $backupSerial))) { $message = 'Error #48394873: Unable to launch backup at source. Details: `' . $maybeMessage . '`.'; pb_backupbuddy::status('error', $message, $backupSerial); die(json_encode(array('success' => false, 'error' => $message))); } else { $archiveFilename = basename(backupbuddy_core::calculateArchiveFilename($backupSerial, $profileArray['type'])); die(json_encode(array('success' => true, 'backupSerial' => $backupSerial, 'backupFile' => $archiveFilename))); } }
function start_backup_process($profile, $trigger = 'manual', $pre_backup = array(), $post_backup = array(), $schedule_title = '', $serial_override = '', $export_plugins = array(), $deployDirection = '', $deployDestinationSettings = '') { // Load profile defaults. $profile = array_merge(pb_backupbuddy::settings('profile_defaults'), $profile); foreach ($profile as $profile_item_name => &$profile_item) { // replace non-overridden defaults with actual default value. if ('-1' == $profile_item) { // Set to use default so go grab default. if (isset(pb_backupbuddy::$options['profiles'][0][$profile_item_name])) { $profile_item = pb_backupbuddy::$options['profiles'][0][$profile_item_name]; // Grab value from defaults profile and replace with it. } } } // Handle backup mode. $backup_mode = pb_backupbuddy::$options['backup_mode']; // Load global default mode. if ('1' == $profile['backup_mode']) { // Profile forces classic. $backup_mode = '1'; } elseif ('2' == $profile['backup_mode']) { // Profiles forces modern. $backup_mode = '2'; } $profile['backup_mode'] = $backup_mode; unset($backup_mode); // If classic mode then we need to redirect output to displaying inline via JS instead of AJAX-based. if ('1' == $profile['backup_mode']) { //global $pb_backupbuddy_js_status; //$pb_backupbuddy_js_status = true; } if ($serial_override != '') { $serial = $serial_override; } else { $serial = pb_backupbuddy::random_string(10); } pb_backupbuddy::set_status_serial($serial); // Default logging serial. global $wp_version; pb_backupbuddy::status('details', 'BackupBuddy v' . pb_backupbuddy::settings('version') . ' using WordPress v' . $wp_version . ' on ' . PHP_OS . '.'); //pb_backupbuddy::status( 'details', __('Peak memory usage', 'it-l10n-backupbuddy' ) . ': ' . round( memory_get_peak_usage() / 1048576, 3 ) . ' MB' ); $type = $profile['type']; $archiveFile = backupbuddy_core::calculateArchiveFilename($serial, $type, $profile); //if ( 'pull' != $deployDirection ) { if ($this->pre_backup($serial, $archiveFile, $profile, $trigger, $pre_backup, $post_backup, $schedule_title, $export_plugins, $deployDirection, $deployDestinationSettings) === false) { pb_backupbuddy::status('details', 'pre_backup() function failed.'); return false; } /* } else { // PULL deployment. pb_backupbuddy::status( 'details', 'About to load fileoptions data in create mode.' ); require_once( pb_backupbuddy::plugin_path() . '/classes/fileoptions.php' ); pb_backupbuddy::status( 'details', 'Fileoptions instance #40.' ); $this->_backup_options = new pb_backupbuddy_fileoptions( backupbuddy_core::getLogDirectory() . 'fileoptions/' . $serial . '.txt', $read_only = false, $ignore_lock = false, $create_file = true ); if ( true !== ( $result = $this->_backup_options->is_ok() ) ) { pb_backupbuddy::status( 'error', __('Fatal Error #38293. Unable to access fileoptions data.', 'it-l10n-backupbuddy' ) . ' Error: ' . $result ); pb_backupbuddy::status( 'haltScript', '' ); // Halt JS on page. return false; } pb_backupbuddy::status( 'details', 'Fileoptions data loaded.' ); $this->_backup = &$this->_backup_options->options; // Set reference. $this->_backup['serial'] = $serial; } */ if ($trigger == 'scheduled' && pb_backupbuddy::$options['email_notify_scheduled_start'] != '') { pb_backupbuddy::status('details', __('Sending scheduled backup start email notification if applicable.', 'it-l10n-backupbuddy')); backupbuddy_core::mail_notify_scheduled($serial, 'start', __('Scheduled backup', 'it-l10n-backupbuddy') . ' (' . $this->_backup['schedule_title'] . ') has begun.'); } if ($profile['backup_mode'] == '2') { // Modern mode with crons. pb_backupbuddy::status('message', 'Running in modern backup mode based on settings. Mode value: `' . $profile['backup_mode'] . '`. Trigger: `' . $trigger . '`.'); unset($this->_backup_options); // File unlocking is handled on deconstruction. Make sure unlocked before firing off another cron spawn. // If using alternate cron on a manually triggered backup then skip running the cron on this pageload to avoid header already sent warnings. if ($trigger != 'manual' || defined('ALTERNATE_WP_CRON') && ALTERNATE_WP_CRON) { $this->cron_next_step(false); } else { //$this->cron_next_step( true ); $this->cron_next_step(false); // as of Aug 9, 2013 no longer spawn the cron. Caused very odd issue of double code runs. } } else { // Classic mode; everything runs in this single PHP page load. pb_backupbuddy::status('message', 'Running in classic backup mode based on settings.'); $this->process_backup($this->_backup['serial'], $trigger); } return true; }