$file_size = $file_stats['size'];
        $file_modified = $file_stats['mtime'];
    }
    unset($file_stats);
    $integrity = array('status' => 'Unknown', 'tests' => array(), 'scan_time' => 0, 'detected_type' => 'unknown', 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => false);
    $backup_options_options['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
    $backup_options->save();
    return $backup_options_options['integrity'];
}
//***** BEGIN CALCULATING STATUS DETAILS.
$backup_type = '';
if (!isset(pb_backupbuddy::$classes['zipbuddy'])) {
    require_once pb_backupbuddy::plugin_path() . '/lib/zipbuddy/zipbuddy.php';
    pb_backupbuddy::$classes['zipbuddy'] = new pluginbuddy_zipbuddy(backupbuddy_core::getBackupDirectory());
}
$previous_status_serial = pb_backupbuddy::get_status_serial();
// Store current status serial setting to reset back later.
if (true !== $skipLogRedirect) {
    pb_backupbuddy::status('details', 'Redirecting status logging temporarily.');
    pb_backupbuddy::set_status_serial('zipbuddy_test');
    // Redirect logging output to a certain log file.
}
// Look for comment.
pb_backupbuddy::status('details', 'Verifying comment in zip archive.');
$raw_comment = pb_backupbuddy::$classes['zipbuddy']->get_comment($file);
$comment = backupbuddy_core::normalize_comment_data($raw_comment);
$comment = $comment['note'];
$tests = array();
pb_backupbuddy::status('details', 'NOTE: It is normal to see several "File not found" messages in the next several log lines.');
// Check for DAT file.
$pass = false;
Ejemplo n.º 2
0
 function backup_integrity_check($file, $fileoptions = '', $options = array())
 {
     $options = array_merge(array('skip_database_dump' => '0'), $options);
     pb_backupbuddy::status('details', 'Started backup_integrity_check() function.');
     $serial = $this->get_serial_from_file($file);
     // User selected to rescan a file.
     if (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         pb_backupbuddy::alert('Rescanning backup integrity for backup file `' . basename($file) . '`');
     }
     if ($fileoptions != '') {
         $backup_options =& $fileoptions;
     } else {
         require_once pb_backupbuddy::plugin_path() . '/classes/fileoptions.php';
         $backup_options = new pb_backupbuddy_fileoptions(pb_backupbuddy::$options['log_directory'] . 'fileoptions/' . $serial . '.txt', $read_only = false, $ignore_lock = false, $create_file = true);
         // Will create file to hold integrity data if nothing exists.
         if (true !== ($result = $backup_options->is_ok())) {
             pb_backupbuddy::status('error', __('Fatal Error #9034 C. Unable to access fileoptions data.', 'it-l10n-backupbuddy') . ' Error on file `' . pb_backupbuddy::$options['log_directory'] . 'fileoptions/' . $serial . '.txt' . '`: ' . $result);
             pb_backupbuddy::status('action', 'halt_script');
             // Halt JS on page.
             return false;
         }
         if (isset($backup_options->options['profile'])) {
             $options = $backup_options->options['profile'];
             $options = array_merge(pb_backupbuddy::settings('profile_defaults'), $options);
         }
     }
     if (isset($backup_options->options['integrity']) && count($backup_options->options['integrity']) > 0 && pb_backupbuddy::_GET('reset_integrity') != $serial) {
         // Already have integrity data and NOT resetting this one.
         pb_backupbuddy::status('details', 'Integrity data for backup `' . $serial . '` is cached; not scanning again.');
         return true;
     } elseif (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         // Resetting this one.
         pb_backupbuddy::status('details', 'Resetting backup integrity stats for backup with serial `' . $serial . '`.');
     } else {
         // No integrity data; not resetting. Just keep going...
     }
     if (pb_backupbuddy::$options['profiles'][0]['integrity_check'] == '0' && pb_backupbuddy::_GET('reset_integrity') == '') {
         // Integrity checking disabled. Allows run if manually rescanning on backups page.
         pb_backupbuddy::status('details', 'Integrity check disabled. Skipping scan.');
         $file_stats = @stat($file);
         if ($file_stats === false) {
             // stat failure.
             pb_backupbuddy::status('error', 'Error #4539774. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
             $file_size = 0;
             $file_modified = 0;
         } else {
             // stat success.
             $file_size = $file_stats['size'];
             $file_modified = $file_stats['mtime'];
         }
         unset($file_stats);
         $integrity = array('status' => 'Unknown', 'tests' => array(), 'scan_time' => 0, 'detected_type' => 'unknown', 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => false);
         $backup_options->options['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
         $backup_options->save();
         return true;
     }
     //***** BEGIN CALCULATING STATUS DETAILS.
     $backup_type = '';
     if (!isset(pb_backupbuddy::$classes['zipbuddy'])) {
         require_once pb_backupbuddy::plugin_path() . '/lib/zipbuddy/zipbuddy.php';
         pb_backupbuddy::$classes['zipbuddy'] = new pluginbuddy_zipbuddy(pb_backupbuddy::$options['backup_directory']);
     }
     pb_backupbuddy::status('details', 'Redirecting status logging temporarily.');
     $previous_status_serial = pb_backupbuddy::get_status_serial();
     // Store current status serial setting to reset back later.
     pb_backupbuddy::set_status_serial('zipbuddy_test');
     // Redirect logging output to a certain log file.
     // Look for comment.
     pb_backupbuddy::status('details', 'Verifying comment in zip archive.');
     $raw_comment = pb_backupbuddy::$classes['zipbuddy']->get_comment($file);
     $comment = pb_backupbuddy::$classes['core']->normalize_comment_data($raw_comment);
     $comment = $comment['note'];
     $tests = array();
     // Check for DAT file.
     $pass = false;
     pb_backupbuddy::status('details', 'Verifying DAT file in zip archive.');
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/backupbuddy_dat.php') === true) {
         // Post 2.0 full backup
         $backup_type = 'full';
         $pass = true;
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/backupbuddy_dat.php') === true) {
         // Pre 2.0 full backup
         $backup_type = 'full';
         $pass = true;
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'backupbuddy_dat.php') === true) {
         // DB backup
         $backup_type = 'db';
         $pass = true;
     }
     $tests[] = array('test' => 'BackupBackup data file exists', 'pass' => $pass);
     // Skip database checks if needed.
     //if ( $options['skip_database_dump'] != '1' ) {
     // Check for DB SQL file.
     $pass = false;
     pb_backupbuddy::status('details', 'Verifying database SQL file in zip archive.');
     if ($options['skip_database_dump'] == '1') {
         pb_backupbuddy::status('warning', 'WARNING: Database .SQL file does NOT exist because the database dump has been set to be SKIPPED based on settings. Use with cuation!');
     } else {
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/db_1.sql') === true) {
             // post 2.0 full backup
             $backup_type = 'full';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/db.sql') === true) {
             // pre 2.0 full backup
             $backup_type = 'full';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db_1.sql') === true) {
             // db only backup 2.0+
             $backup_type = 'db';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db.sql') === true) {
             // db only backup pre-2.0
             $backup_type = 'db';
             $pass = true;
         }
     }
     $tests[] = array('test' => 'Database SQL file exists', 'pass' => $pass);
     // NOTE: As of 4.0 ALL db dumps append into db_1.sql. Future: break out into individual files. Check DB SQL files for BREAKOUT tables.
     /*
     if ( isset( $backup_options->options['breakout_tables'] ) && ( count( $backup_options->options['breakout_tables'] ) > 0 ) ) {
     	foreach( $backup_options->options['breakout_tables'] as $breakout_table ) {
     		$pass = false;
     		if ( pb_backupbuddy::$classes['zipbuddy']->file_exists( $file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/' . $breakout_table . '.sql' ) === true ) { // Full backup.
     			$pass = true;
     		}
     		if ( pb_backupbuddy::$classes['zipbuddy']->file_exists( $file, $breakout_table . '.sql' ) === true ) { // DB backup.
     			$pass = true;
     		}
     		$tests[] = array(
     			'test'		=>	'Breakout Database SQL file exists (' . $breakout_table . '.sql)',
     			'pass'		=>	$pass,
     		);
     	}
     }
     */
     // }
     if ('full' == $backup_type) {
         // Check for WordPress config file.
         $pass = false;
         pb_backupbuddy::status('details', 'Verifying WordPress wp-config.php configuration file in zip archive.');
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-config.php') === true) {
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/wp-config.php') === true) {
             $pass = true;
         }
         $tests[] = array('test' => 'WordPress wp-config.php exists (full backups only)', 'pass' => $pass);
     }
     // Get zip scan log details.
     pb_backupbuddy::status('details', 'Retrieving zip scan log.');
     $temp_details = pb_backupbuddy::get_status('zipbuddy_test');
     // Get zipbuddy scan log.
     $scan_log = array();
     foreach ($temp_details as $temp_detail) {
         $scan_log[] = $temp_detail[4];
     }
     pb_backupbuddy::set_status_serial($previous_status_serial);
     // Stop redirecting log to a specific file & set back to what it was prior.
     pb_backupbuddy::status('details', 'Stopped temporary redirection of status logging.');
     pb_backupbuddy::status('details', 'Calculating integrity scan status,');
     // Check for any failed tests.
     $is_ok = true;
     $integrity_description = '';
     foreach ($tests as $test) {
         if ($test['pass'] !== true) {
             $is_ok = false;
             $error = 'Error #389434. Integrity test FAILED. Test: `' . $test['test'] . '`. ';
             pb_backupbuddy::status('error', $error);
             $integrity_description .= $error;
         }
     }
     if (true === $is_ok) {
         $integrity_status = 'Pass';
     } else {
         $integrity_status = 'Fail';
     }
     pb_backupbuddy::status('details', 'Status: `' . $integrity_status . '`. Description: `' . $integrity_description . '`.');
     //***** END CALCULATING STATUS DETAILS.
     // Get file information from file system.
     pb_backupbuddy::status('details', 'Getting file details such as size, timestamp, etc.');
     $file_stats = @stat($file);
     if ($file_stats === false) {
         // stat failure.
         pb_backupbuddy::status('error', 'Error #4539774b. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
         $file_size = 0;
         $file_modified = 0;
     } else {
         // stat success.
         $file_size = $file_stats['size'];
         $file_modified = $file_stats['ctime'];
         // Created time.
     }
     unset($file_stats);
     // Compile array of results for saving into data structure.
     $integrity = array('is_ok' => $is_ok, 'tests' => $tests, 'scan_time' => time(), 'scan_log' => $scan_log, 'detected_type' => $backup_type, 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => $comment);
     pb_backupbuddy::status('details', 'Saving backup file integrity check details.');
     $backup_options->options['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
     $backup_options->save();
     return $is_ok;
 }
Ejemplo n.º 3
0
 function backup_integrity_check($file)
 {
     pb_backupbuddy::status('details', 'Started backup_integrity_check() function.');
     $serial = $this->get_serial_from_file($file);
     // User selected to rescan a file.
     if (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         pb_backupbuddy::alert('Rescanning backup integrity for backup file `' . basename($file) . '`');
     }
     if (isset(pb_backupbuddy::$options['backups'][$serial]['integrity']) && count(pb_backupbuddy::$options['backups'][$serial]['integrity']) > 0 && pb_backupbuddy::_GET('reset_integrity') != $serial) {
         // Already have integrity data and NOT resetting this one.
         pb_backupbuddy::status('details', 'Integrity data for backup `' . $serial . '` is cached; not scanning again.');
         return true;
     } elseif (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         // Resetting this one.
         pb_backupbuddy::status('details', 'Resetting backup integrity stats for backup with serial `' . $serial . '`.');
     } else {
         // No integrity data; not resetting. Just keep going...
     }
     if (pb_backupbuddy::$options['integrity_check'] == '0') {
         // Integrity checking disabled.
         pb_backupbuddy::status('details', 'Integrity check disabled. Skipping scan.');
         $file_stats = @stat($file);
         if ($file_stats === false) {
             // stat failure.
             pb_backupbuddy::status('error', 'Error #4539774. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
             $file_size = 0;
             $file_modified = 0;
         } else {
             // stat success.
             $file_size = $file_stats['size'];
             $file_modified = $file_stats['mtime'];
         }
         unset($file_stats);
         $integrity = array('status' => 'Unknown', 'status_details' => __('Integrity checking disabled based on settings. This file has not been verified.', 'it-l10n-backupbuddy'), 'scan_time' => 0, 'detected_type' => 'unknown', 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => false);
         pb_backupbuddy::$options['backups'][$serial]['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
         pb_backupbuddy::save();
         return true;
     }
     //***** BEGIN CALCULATING STATUS DETAILS.
     // Status defaults.
     $status_details = array('found_dat' => false, 'found_sql' => false, 'found_wpconfig' => false, 'scan_log' => '');
     $backup_type = '';
     if (!isset(pb_backupbuddy::$classes['zipbuddy'])) {
         require_once pb_backupbuddy::plugin_path() . '/lib/zipbuddy/zipbuddy.php';
         pb_backupbuddy::$classes['zipbuddy'] = new pluginbuddy_zipbuddy(pb_backupbuddy::$options['backup_directory']);
     }
     pb_backupbuddy::status('details', 'Redirecting status logging temporarily.');
     $previous_status_serial = pb_backupbuddy::get_status_serial();
     // Store current status serial setting to reset back later.
     pb_backupbuddy::set_status_serial('zipbuddy_test');
     // Redirect logging output to a certain log file.
     // Look for comment.
     pb_backupbuddy::status('details', 'Verifying comment in zip archive.');
     $raw_comment = pb_backupbuddy::$classes['zipbuddy']->get_comment($file);
     $comment = pb_backupbuddy::$classes['core']->normalize_comment_data($raw_comment);
     $comment = $comment['note'];
     // Check for DAT file.
     pb_backupbuddy::status('details', 'Verifying DAT file in zip archive.');
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/backupbuddy_dat.php') === true) {
         // Post 2.0 full backup
         $status_details['found_dat'] = true;
         $backup_type = 'full';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/backupbuddy_dat.php') === true) {
         // Pre 2.0 full backup
         $status_details['found_dat'] = true;
         $backup_type = 'full';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'backupbuddy_dat.php') === true) {
         // DB backup
         $status_details['found_dat'] = true;
         $backup_type = 'db';
     }
     // Check for DB SQL file.
     pb_backupbuddy::status('details', 'Verifying database SQL file in zip archive.');
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/db_1.sql') === true) {
         // post 2.0 full backup
         $status_details['found_sql'] = true;
         $backup_type = 'full';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/db.sql') === true) {
         // pre 2.0 full backup
         $status_details['found_sql'] = true;
         $backup_type = 'full';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db_1.sql') === true) {
         // db only backup 2.0+
         $status_details['found_sql'] = true;
         $backup_type = 'db';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db.sql') === true) {
         // db only backup pre-2.0
         $status_details['found_sql'] = true;
         $backup_type = 'db';
     }
     // Check for WordPress config file.
     pb_backupbuddy::status('details', 'Verifying WordPress wp-config.php configuration file in zip archive.');
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-config.php') === true) {
         $status_details['found_wpconfig'] = true;
         $backup_type = 'full';
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/wp-config.php') === true) {
         $status_details['found_wpconfig'] = true;
         $backup_type = 'full';
     }
     // Get zip scan log details.
     pb_backupbuddy::status('details', 'Retrieving zip scan log.');
     $temp_details = pb_backupbuddy::get_status('zipbuddy_test');
     // Get zipbuddy scan log.
     foreach ($temp_details as $temp_detail) {
         $status_details['scan_log'][] = $temp_detail[4];
     }
     pb_backupbuddy::set_status_serial($previous_status_serial);
     // Stop redirecting log to a specific file & set back to what it was prior.
     pb_backupbuddy::status('details', 'Stopped temporary redirection of status logging.');
     // Calculate status descriptions.
     pb_backupbuddy::status('details', 'Calculating integrity scan status,');
     $integrity_status = 'pass';
     // Default.
     if ($status_details['found_dat'] !== true) {
         $integrity_status = 'fail';
         $integrity_description .= __('Error #7843564: Missing DAT file.', 'it-l10n-backupbuddy');
     }
     if ($status_details['found_sql'] !== true) {
         $integrity_status = 'fail';
         $integrity_description .= __('Error #4664236: Missing database SQL file.', 'it-l10n-backupbuddy');
     }
     if ($backup_type == 'full' && $status_details['found_wpconfig'] !== true) {
         $integrity_status = 'fail';
         $integrity_description .= __('Error #47834674: Missing wp-config.php file.', 'it-l10n-backupbuddy');
     }
     if ($integrity_status == 'pass') {
         // All tests passed.
         $integrity_description = __('All tests passed.', 'it-l10n-backupbuddy');
     }
     pb_backupbuddy::status('details', 'Status: `' . $integrity_status . '`. Description: `' . $integrity_description . '`.');
     //$integrity_description .= '<br><br>' . __('Technical Details', 'it-l10n-backupbuddy' ) . ':<br />' . $integrity_zipresult_details;
     //***** END CALCULATING STATUS DETAILS.
     // Get file information from file system.
     pb_backupbuddy::status('details', 'Getting file details such as size, timestamp, etc.');
     $file_stats = @stat($file);
     if ($file_stats === false) {
         // stat failure.
         pb_backupbuddy::status('error', 'Error #4539774b. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
         $file_size = 0;
         $file_modified = 0;
     } else {
         // stat success.
         $file_size = $file_stats['size'];
         $file_modified = $file_stats['ctime'];
         // Created time.
     }
     unset($file_stats);
     // Compile array of results for saving into data structure.
     $integrity = array('status' => $integrity_status, 'status_details' => $status_details, 'scan_time' => time(), 'detected_type' => $backup_type, 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => $comment);
     pb_backupbuddy::status('details', 'Saving backup file integrity check details.');
     pb_backupbuddy::$options['backups'][$serial]['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
     pb_backupbuddy::save();
     //pb_backupbuddy::$classes['zipbuddy']->clear_status();
     if ($integrity_status == 'pass') {
         // 100% success
         return true;
     } else {
         return false;
     }
 }
Ejemplo n.º 4
0
 public static function backup_integrity_check($file, $fileoptions = '', $options = array(), $skipLogRedirect = false)
 {
     pb_backupbuddy::status('details', 'Started backup_integrity_check() function.');
     $serial = self::get_serial_from_file($file);
     // User selected to rescan a file.
     if (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         pb_backupbuddy::alert('Rescanning backup integrity for backup file `' . basename($file) . '`');
         pb_backupbuddy::flush();
     }
     $options = array_merge(array('skip_database_dump' => '0'), $options);
     $scan_notes = array();
     // Get backup fileoptions.
     if ($fileoptions != '') {
         $backup_options =& $fileoptions;
     } else {
         require_once pb_backupbuddy::plugin_path() . '/classes/fileoptions.php';
         $backup_options = new pb_backupbuddy_fileoptions(backupbuddy_core::getLogDirectory() . 'fileoptions/' . $serial . '.txt', $read_only = false, $ignore_lock = false, $create_file = true);
         // Will create file to hold integrity data if nothing exists.
         if (true !== ($result = $backup_options->is_ok())) {
             pb_backupbuddy::status('error', __('Fatal Error #9034 C. Unable to access fileoptions data.', 'it-l10n-backupbuddy') . ' Error on file `' . backupbuddy_core::getLogDirectory() . 'fileoptions/' . $serial . '.txt' . '`: ' . $result);
             pb_backupbuddy::status('haltScript', '');
             // Halt JS on page.
             return false;
         }
     }
     if (isset($backup_options->options['profile'])) {
         $options = $backup_options->options['profile'];
         $options = array_merge(pb_backupbuddy::settings('profile_defaults'), $options);
     }
     // Return if cached.
     if (isset($backup_options->options['integrity']) && count($backup_options->options['integrity']) > 0 && pb_backupbuddy::_GET('reset_integrity') != $serial) {
         // Already have integrity data and NOT resetting this one.
         pb_backupbuddy::status('details', 'Integrity data for backup `' . $serial . '` is cached; not scanning again.');
         return $backup_options->options['integrity'];
     } elseif (pb_backupbuddy::_GET('reset_integrity') == $serial) {
         // Resetting this one.
         pb_backupbuddy::status('details', 'Resetting backup integrity stats for backup with serial `' . $serial . '`.');
     } else {
         // No integrity data; not resetting. Just keep going...
     }
     // Integrity check disabled. Skip.
     if (pb_backupbuddy::$options['profiles'][0]['integrity_check'] == '0' && pb_backupbuddy::_GET('reset_integrity') == '' && isset($options['integrity_check']) && $options['integrity_check'] == '0') {
         // Integrity checking disabled. Allows run if manually rescanning on backups page.
         pb_backupbuddy::status('details', 'Integrity check disabled. Skipping scan.');
         $file_stats = @stat($file);
         if ($file_stats === false) {
             // stat failure.
             pb_backupbuddy::status('error', 'Error #4539774. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
             $file_size = 0;
             $file_modified = 0;
         } else {
             // stat success.
             $file_size = $file_stats['size'];
             $file_modified = $file_stats['mtime'];
         }
         unset($file_stats);
         $integrity = array('status' => 'Unknown', 'tests' => array(), 'scan_time' => 0, 'detected_type' => 'unknown', 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => false);
         $backup_options->options['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
         $backup_options->save();
         return $backup_options->options['integrity'];
     }
     //***** BEGIN CALCULATING STATUS DETAILS.
     $backup_type = '';
     if (!isset(pb_backupbuddy::$classes['zipbuddy'])) {
         require_once pb_backupbuddy::plugin_path() . '/lib/zipbuddy/zipbuddy.php';
         pb_backupbuddy::$classes['zipbuddy'] = new pluginbuddy_zipbuddy(backupbuddy_core::getBackupDirectory());
     }
     $previous_status_serial = pb_backupbuddy::get_status_serial();
     // Store current status serial setting to reset back later.
     if (true !== $skipLogRedirect) {
         pb_backupbuddy::status('details', 'Redirecting status logging temporarily.');
         pb_backupbuddy::set_status_serial('zipbuddy_test');
         // Redirect logging output to a certain log file.
     }
     // Look for comment.
     pb_backupbuddy::status('details', 'Verifying comment in zip archive.');
     $raw_comment = pb_backupbuddy::$classes['zipbuddy']->get_comment($file);
     $comment = backupbuddy_core::normalize_comment_data($raw_comment);
     $comment = $comment['note'];
     $tests = array();
     pb_backupbuddy::status('details', 'NOTE: It is normal to see several "File not found" messages in the next several log lines.');
     // Check for DAT file.
     $pass = false;
     pb_backupbuddy::status('details', 'Verifying DAT file in zip archive.');
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/backupbuddy_dat.php') === true) {
         // Post 2.0 full backup
         $backup_type = 'full';
         $pass = true;
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/backupbuddy_dat.php') === true) {
         // Pre 2.0 full backup
         $backup_type = 'full';
         $pass = true;
     }
     if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'backupbuddy_dat.php') === true) {
         // DB backup
         $backup_type = 'db';
         $pass = true;
     }
     $tests[] = array('test' => 'BackupBuddy data file', 'pass' => $pass);
     if (isset($options['type']) && 'files' == $options['type']) {
         pb_backupbuddy::status('details', 'Files only backup type so skipping scan of database files in backup as it is not applicable.');
     } else {
         // Non-files only backup so check for DB.
         // Check for DB .sql file.
         $pass = false;
         $db_test_note = '';
         pb_backupbuddy::status('details', 'Verifying database SQL file in zip archive.');
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/db_1.sql') === true) {
             // post 2.0 full backup
             $backup_type = 'full';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/temp_' . $serial . '/db.sql') === true) {
             // pre 2.0 full backup
             $backup_type = 'full';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db_1.sql') === true) {
             // db only backup 2.0+
             $backup_type = 'db';
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'db.sql') === true) {
             // db only backup pre-2.0
             $backup_type = 'db';
             $pass = true;
         }
         if ('1' == $options['skip_database_dump']) {
             if (false === $pass) {
                 pb_backupbuddy::status('warning', 'WARNING: Database .SQL does NOT exist because database dump was set to be skipped based on settings. Use with caution. The database was NOT backed up.');
             } else {
                 // DB dump set to be skipped but was found. Just in case...
                 pb_backupbuddy::status('warning', 'Warning #58458749. Database dump was set to be skip _BUT_ database file WAS found?');
             }
             $pass = true;
             $db_test_note = ' <span class="pb_label pb_label-warning">' . __('Database skipped', 'it-l10n-backupbuddy') . '</span>';
             $scan_notes[] = '<span class="pb_label pb_label-warning">' . __('Database skipped', 'it-l10n-backupbuddy') . '</span>';
         }
         $tests[] = array('test' => 'Database SQL file' . $db_test_note, 'pass' => $pass);
     }
     // Use filename to determine backup type if detectable as it is more authoritive than the above guesses.
     if (false !== stristr($file, '-db-')) {
         $backup_type = 'db';
     } elseif (false !== stristr($file, '-full-')) {
         $backup_type = 'full';
     } elseif (false !== stristr($file, '-files-')) {
         $backup_type = 'files';
     } else {
         // Filename determination was not conclusive. Leave as-is based on deduced backup type determined earlier.
     }
     // Check for wp-config.php file if full backup.
     if ('full' == $backup_type) {
         $pass = false;
         pb_backupbuddy::status('details', 'Verifying WordPress wp-config.php configuration file in zip archive.');
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-config.php') === true) {
             $pass = true;
         }
         if (pb_backupbuddy::$classes['zipbuddy']->file_exists($file, 'wp-content/uploads/backupbuddy_temp/' . $serial . '/wp-config.php') === true) {
             $pass = true;
         }
         if (false === $pass) {
             if (isset($options['excludes'])) {
                 if (false !== stristr($options['excludes'], 'wp-config.')) {
                     pb_backupbuddy::status('warning', 'Warning: An exclusion containing wp-config.php was found. Exclusions: `' . str_replace(array("\r", "\r\n", "\n"), '; ', $options['excludes']) . '`.');
                 }
             }
         }
         $tests[] = array('test' => 'WordPress wp-config.php file (full backups only)', 'pass' => $pass);
     }
     // end if full backup.
     // Get zip scan log details.
     pb_backupbuddy::status('details', 'Retrieving zip scan log.');
     $temp_details = pb_backupbuddy::get_status('zipbuddy_test');
     // Get zipbuddy scan log.
     $scan_log = array();
     foreach ($temp_details as $temp_detail) {
         $scan_log[] = json_decode($temp_detail)->{'data'};
     }
     if (true !== $skipLogRedirect) {
         pb_backupbuddy::set_status_serial($previous_status_serial);
         // Stop redirecting log to a specific file & set back to what it was prior.
         pb_backupbuddy::status('details', 'Stopped temporary redirection of status logging.');
     }
     pb_backupbuddy::status('details', 'Calculating integrity scan status,');
     // Check for any failed tests.
     $is_ok = true;
     $integrity_description = '';
     foreach ($tests as $test) {
         if ($test['pass'] !== true) {
             $is_ok = false;
             $error = 'Error #389434. Integrity test FAILED. Test: `' . $test['test'] . '`. ';
             pb_backupbuddy::status('error', $error);
             $integrity_description .= $error;
         }
     }
     if (true === $is_ok) {
         $integrity_status = 'Pass';
     } else {
         $integrity_status = 'Fail';
     }
     pb_backupbuddy::status('details', 'Status: `' . $integrity_status . '`. Description: `' . $integrity_description . '`.');
     //***** END CALCULATING STATUS DETAILS.
     // Get file information from file system.
     pb_backupbuddy::status('details', 'Getting file details such as size, timestamp, etc.');
     $file_stats = @stat($file);
     if ($file_stats === false) {
         // stat failure.
         pb_backupbuddy::status('error', 'Error #4539774b. Unable to get file details ( via stat() ) for file `' . $file . '`. The file may be corrupt or too large for the server.');
         $file_size = 0;
         $file_modified = 0;
     } else {
         // stat success.
         $file_size = $file_stats['size'];
         $file_modified = $file_stats['mtime'];
         // Created time.
     }
     unset($file_stats);
     // Compile array of results for saving into data structure.
     $integrity = array('is_ok' => $is_ok, 'tests' => $tests, 'scan_time' => time(), 'scan_log' => $scan_log, 'scan_notes' => $scan_notes, 'detected_type' => $backup_type, 'size' => $file_size, 'modified' => $file_modified, 'file' => basename($file), 'comment' => $comment);
     pb_backupbuddy::status('details', 'Saving backup file integrity check details.');
     $backup_options->options['integrity'] = array_merge(pb_backupbuddy::settings('backups_integrity_defaults'), $integrity);
     $backup_options->save();
     return $backup_options->options['integrity'];
 }
Ejemplo n.º 5
0
 public static function run_periodic_process($preferredStep = '', $preferredStepArgs = array())
 {
     require_once pb_backupbuddy::plugin_path() . '/destinations/live/live.php';
     $previous_status_serial = pb_backupbuddy::get_status_serial();
     // Hold current serial.
     pb_backupbuddy::set_status_serial('live_periodic');
     // Redirect logging output to a certain log file.
     global $wp_version;
     $liveID = backupbuddy_live::getLiveID();
     $logging_disabled = isset(pb_backupbuddy::$options['remote_destinations'][$liveID]['disable_logging']) && '1' == pb_backupbuddy::$options['remote_destinations'][$liveID]['disable_logging'];
     if (!$logging_disabled) {
         pb_backupbuddy::status('details', '-----');
         pb_backupbuddy::status('details', 'Live periodic process starting with BackupBuddy v' . pb_backupbuddy::settings('version') . ' with WordPress v' . $wp_version . '.');
     }
     // Make sure we are not PAUSED.
     if ('1' == pb_backupbuddy::$options['remote_destinations'][$liveID]['pause_periodic']) {
         pb_backupbuddy::status('details', 'Aborting periodic process as it is currently PAUSED based on settings.');
         // Undo log redirect.
         pb_backupbuddy::set_status_serial($previous_status_serial);
         return false;
     }
     // Logging disabled.
     if ($logging_disabled) {
         pb_backupbuddy::set_status_serial($previous_status_serial);
     }
     require_once pb_backupbuddy::plugin_path() . '/classes/core.php';
     require_once pb_backupbuddy::plugin_path() . '/classes/fileoptions.php';
     // Register a shutdown function to catch PHP errors and log them.
     register_shutdown_function('backupbuddy_live_periodic::shutdown_function');
     // Load state into self::$_state & fileoptions object into self::$_stateObj.
     if (false === self::_load_state()) {
         return false;
     }
     // No PHP runtime calculated yet. Try to see if test is finished.
     if (0 == pb_backupbuddy::$options['tested_php_runtime']) {
         backupbuddy_core::php_runtime_test_results();
     }
     // Update stats and save.
     if (0 === self::$_state['step']['start_time']) {
         self::$_state['step']['start_time'] = microtime(true);
     }
     self::$_state['step']['last_run_start'] = microtime(true);
     // Load destination settings.
     $destination_settings = self::get_destination_settings();
     // If wait_on_transfers was the last step running and time limit has passed then we can start from the beginning.
     if ('wait_on_transfers' == self::$_state['step']['function'] && self::$_state['stats']['wait_on_transfers_start'] > 0 && time() - self::$_state['stats']['wait_on_transfers_start'] > $destination_settings['max_wait_on_transfers_time'] * 60) {
         pb_backupbuddy::status('warning', 'Ran out of max time (`' . round((time() - self::$_state['stats']['wait_on_transfers_start']) / 60) . '` of `' . $destination_settings['max_wait_on_transfers_time'] . '` max mins) waiting for pending transfers to finish. Resetting back to beginning of periodic process.');
         self::$_state['step'] = self::$_stepDefaults;
         // Clear step state.
     }
     // Increment attempts if running the same function exactly as before. Set preferredStep args if we are indeed on this step.
     //sort( self::$_state['step']['args'] ); // Make sure order is same.
     //sort( $preferredStepArgs ); // Make sure order is same.
     if ('' == $preferredStep || self::$_state['step']['function'] == $preferredStep && self::$_state['step']['args'] == $preferredStepArgs) {
         // If preferredStep is blank OR ( preferredStep matches next step AND arguments are the same ).
         self::$_state['step']['attempts']++;
     }
     if ('' != $preferredStep) {
         self::_set_next_step($preferredStep, $preferredStepArgs);
     }
     // If restart transient is set then restart the Live process all the way back to daily_init. This is done when settings are saved so they will take effect immediately.
     if (false !== ($jump_step = get_transient('backupbuddy_live_jump'))) {
         pb_backupbuddy::status('details', 'Restart transient exists. Clearing.');
         delete_transient('backupbuddy_live_jump');
         $jump_step_name = $jump_step[0];
         $jump_step_args = array();
         if (isset($jump_step[1]) && is_array($jump_step[1])) {
             $jump_step_args = $jump_step[1];
         }
         self::_set_next_step($jump_step_name);
         pb_backupbuddy::status('details', 'Reset next step to `' . $jump_step_name . '` with args `' . print_r($jump_step_args, true) . '` due to backupbuddy_live_jump transient.');
     }
     // Check if a manual snapshot is requested.
     if (false !== get_transient('backupbuddy_live_snapshot')) {
         pb_backupbuddy::status('details', 'Manual Live Snapshot requested.');
         delete_transient('backupbuddy_live_snapshot');
         self::_request_manual_snapshot();
     }
     // Set first activity (creation of Live basically).
     if (0 == self::$_state['stats']['first_activity']) {
         self::$_state['stats']['first_activity'] = time();
     }
     // Save attempt.
     self::$_stateObj->save();
     // Run step function and process results.
     $schedule_next_step = false;
     $start_time = microtime(true);
     $run_function = self::$_state['step']['function'];
     pb_backupbuddy::status('details', 'Starting Live periodic function `' . $run_function . '`.');
     if (!is_callable('self::_step_' . $run_function)) {
         pb_backupbuddy::status('error', 'Error #439347494: Invalid step called: `' . $run_function . '` Unknown function: `self::_step_' . $run_function . '`.');
     }
     $function_response = call_user_func_array('self::_step_' . $run_function, self::$_state['step']['args']);
     // Run step function. Returns true on success, string error message on fatal failure, and array( 'status message', array( ARGS ) ) when chunking back to same step.
     self::$_state['step']['last_run_finish'] = microtime(true);
     self::$_state['stats']['last_activity'] = microtime(true);
     pb_backupbuddy::status('details', 'Ended Live periodic function `' . $run_function . '`.');
     // Process stepfunction results.
     if (is_array($function_response)) {
         // Chunking back to same step since we got an array. Index 0 = last_status, index 1 = args. Keeps same step function.
         $schedule_next_step = true;
         self::$_state['step']['chunks']++;
         self::$_state['step']['last_status'] = $function_response[0];
         self::$_state['step']['args'] = $function_response[1];
         pb_backupbuddy::status('details', 'Function needs chunked.');
         if ('update_files_list' != $run_function && pb_backupbuddy::$options['log_level'] == '3') {
             // Full logging enabled. Hide for update_files_list function due to its huge size.
             pb_backupbuddy::status('details', 'Response args due to logging level: `' . print_r($function_response, true) . '`.');
         }
     } elseif (is_string($function_response)) {
         // Fatal error.
         pb_backupbuddy::status('error', 'Error #32893283: One or more errors encountered running Live step function. Details: `' . $function_response . '`. See log above for more details.');
         backupbuddy_core::addNotification('live_error', 'BackupBuddy Stash Live Error', $function_response);
         if (FALSE === stristr($function_response, 'Error')) {
             // Make sure error-prefixed if not.
             $function_response = 'Error #489348: ' . $function_response;
         }
         self::$_state['step']['last_status'] = $function_response;
     } elseif (true === $function_response) {
         // Success finishing this step.
         // Interupted by a jump for the next step.
         if (false !== ($jump_step = get_transient('backupbuddy_live_jump'))) {
             pb_backupbuddy::status('details', 'Restart transient exists. Clearing.');
             delete_transient('backupbuddy_live_jump');
             $jump_step_name = $jump_step[0];
             $jump_step_args = array();
             if (isset($jump_step[1]) && is_array($jump_step[1])) {
                 $jump_step_args = $jump_step[1];
             }
             self::_set_next_step($jump_step_name);
             pb_backupbuddy::status('details', 'Reset next step to `' . $jump_step_name . '` with args `' . print_r($jump_step_args, true) . '` due to backupbuddy_live_jump transient.');
             $schedule_next_step = true;
         } else {
             // Normal next step running (if any).
             if (!isset(self::$_nextFunction[$run_function])) {
                 $schedule_next_step = false;
                 pb_backupbuddy::status('details', 'Function reported success. No more Live steps to directly run. Finishing until next periodic restart.');
                 self::$_state['step'] = self::$_stepDefaults;
                 // Clear step state.
             } else {
                 $schedule_next_step = true;
                 $nextFunction = self::$_nextFunction[$run_function];
                 self::_set_next_step($nextFunction);
                 pb_backupbuddy::status('details', 'Function reported success. Scheduled next function to run, `' . $nextFunction . '`.');
             }
         }
     } elseif (false === $function_response) {
         pb_backupbuddy::status('error', 'Error #3298338: Live (periodic) function `' . $run_function . '` failed without error message. Ending Live periodic process for this run without running more steps. See log above for details.');
         $schedule_next_step = false;
     } else {
         // Unknown response.
         pb_backupbuddy::status('error', 'Error #98238392: Unknown periodic Live step function response `' . print_r($function_response, true) . '` for function `' . $run_function . '`. Fatal error.');
         backupbuddy_core::addNotification('live_error', 'BackupBuddy Stash Live Error', $function_response);
         self::$_state['step']['last_status'] = 'Error: ' . $function_response;
         $schedule_next_step = false;
     }
     // Save state.
     self::$_stateObj->save();
     // Unlock fileoptions files if any remain locked.
     if (is_object(self::$_stateObj)) {
         self::$_stateObj->unlock();
     }
     if (is_object(self::$_catalogObj)) {
         self::$_catalogObj->unlock();
     }
     if (is_object(self::$_tablesObj)) {
         self::$_tablesObj->unlock();
     }
     // Schedule the next step in the WP cron to run whichever step has been set in the state.
     if (true === $schedule_next_step) {
         pb_backupbuddy::status('details', 'Scheduling next step.');
         // Schedule to run Live one more time for next chunk.
         $cronArgs = array();
         $schedule_result = backupbuddy_core::schedule_single_event(time() - 60, 'live_periodic', $cronArgs);
         // Schedules 60sec in the past to push near the top. Traditional backup process is 155sec in the past for first priority.
         if (true === $schedule_result) {
             pb_backupbuddy::status('details', 'Next Live Periodic chunk step cron event scheduled.');
         } else {
             pb_backupbuddy::status('error', 'Next Live Periodic chunk step cron event FAILED to be scheduled.');
         }
         // Only chains the first cron.
         if ('1' != pb_backupbuddy::$options['skip_spawn_cron_call']) {
             pb_backupbuddy::status('details', 'Spawning cron now.');
             update_option('_transient_doing_cron', 0);
             // Prevent cron-blocking for next item.
             spawn_cron(time() + 150);
             // Adds > 60 seconds to get around once per minute cron running limit.
         }
         // Schedule cron kicker (detects if it has not been too soon so we can call this judicously).
         self::_request_kick_cron();
     } else {
         // Nothing left to do for now. Take a nap and wait until the next time that the periodic functionality launches and starts the process all over again.
         pb_backupbuddy::status('details', 'No more steps remain for this run. Not scheduling next step.');
     }
     // Undo log redirect.
     pb_backupbuddy::set_status_serial($previous_status_serial);
     return true;
 }