/** * Check Jobs worked and Cleanup logs and so on */ public static function check_cleanup() { $job_object = BackWPup_Job::get_working_data(); $log_folder = get_site_option('backwpup_cfg_logfolder'); $log_folder = BackWPup_File::get_absolute_path($log_folder); // check aborted jobs for longer than a tow hours, abort them courtly and send mail if (is_object($job_object) && !empty($job_object->logfile)) { $not_worked_time = microtime(TRUE) - $job_object->timestamp_last_update; if ($not_worked_time > 3600) { $job_object->log(E_USER_ERROR, __('Aborted, because no progress for one hour!', 'backwpup'), __FILE__, __LINE__); unlink(BackWPup::get_plugin_data('running_file')); $job_object->update_working_data(); } } //Compress not compressed logs if (is_readable($log_folder) && function_exists('gzopen') && get_site_option('backwpup_cfg_gzlogs') && !is_object($job_object)) { //Compress old not compressed logs if ($dir = opendir($log_folder)) { $jobids = BackWPup_Option::get_job_ids(); while (FALSE !== ($file = readdir($dir))) { if (is_writeable($log_folder . $file) && '.html' == substr($file, -5)) { $compress = new BackWPup_Create_Archive($log_folder . $file . '.gz'); if ($compress->add_file($log_folder . $file)) { unlink($log_folder . $file); //change last logfile in jobs foreach ($jobids as $jobid) { $job_logfile = BackWPup_Option::get($jobid, 'logfile'); if (!empty($job_logfile) && $job_logfile === $log_folder . $file) { BackWPup_Option::update($jobid, 'logfile', $log_folder . $file . '.gz'); } } } unset($compress); } } closedir($dir); } } //Jobs cleanings if (!is_object($job_object)) { //remove restart cron wp_clear_scheduled_hook('backwpup_cron', array('id' => 'restart')); //temp cleanup BackWPup_Job::clean_temp_folder(); } //check scheduling jobs that not found will removed because there are single scheduled $activejobs = BackWPup_Option::get_job_ids('activetype', 'wpcron'); if (!empty($activejobs)) { foreach ($activejobs as $jobid) { $cron_next = wp_next_scheduled('backwpup_cron', array('id' => $jobid)); if (!$cron_next || $cron_next < time()) { wp_unschedule_event($cron_next, 'backwpup_cron', array('id' => $jobid)); $cron_next = BackWPup_Cron::cron_next(BackWPup_Option::get($jobid, 'cron')); wp_schedule_single_event($cron_next, 'backwpup_cron', array('id' => $jobid)); } } } }
public static function update($backwpup_jobid) { $params = array('id' => NULL, 'email_me' => 0, 'log_output_length' => 0, 'testfirst' => 0); if (empty($backwpup_jobid)) { $params['id'] = get_site_option('backwpup_cfg_easycronjobid'); $params['cron_job_name'] = sprintf('WordPress on %s', home_url()); $params['cron_expression'] = '*/5 * * * *'; $url = BackWPup_Job::get_jobrun_url('runext', 0); $url = remove_query_arg('_nonce', $url['url']); $url = remove_query_arg('doing_wp_cron', $url); $url = remove_query_arg('backwpup_run', $url); $url = add_query_arg(array('doing_wp_cron' => ''), $url); $cookies = get_site_transient('backwpup_cookies'); $params['url'] = $url; if (!empty($cookies)) { $params['cookies'] = http_build_query($cookies); } } else { $params['id'] = BackWPup_Option::get($backwpup_jobid, 'easycronjobid'); if (empty($params['id'])) { $params['id'] = NULL; } $params['cron_job_name'] = sprintf('BackWPup %s on %s', BackWPup_Option::get($backwpup_jobid, 'name'), home_url()); $params['cron_expression'] = BackWPup_Option::get($backwpup_jobid, 'cron'); $url = BackWPup_Job::get_jobrun_url('runext', $backwpup_jobid); $cookies = get_site_transient('backwpup_cookies'); $params['url'] = $url['url']; if (!empty($cookies)) { $params['cookies'] = http_build_query($cookies); } } if (empty($params['id'])) { $message = self::query_api('add', $params); } else { $message = self::query_api('edit', $params); } delete_site_transient('backwpup_easycron_' . $params['id']); if ($message['status'] == 'success' && !empty($message['cron_job_id'])) { if (empty($backwpup_jobid)) { update_site_option('backwpup_cfg_easycronjobid', $message['cron_job_id']); } else { BackWPup_Option::update($backwpup_jobid, 'easycronjobid', $message['cron_job_id']); } return TRUE; } else { if ($message['error']['code'] == 25) { if (empty($backwpup_jobid)) { delete_site_option('backwpup_cfg_easycronjobid'); } else { BackWPup_Option::delete($backwpup_jobid, 'easycronjobid'); } } } return FALSE; }
/** * */ public static function load() { //Create Table self::$listtable = new self(); switch (self::$listtable->current_action()) { case 'delete': //Delete Job if (!current_user_can('backwpup_jobs_edit')) { break; } if (is_array($_GET['jobs'])) { check_admin_referer('bulk-jobs'); foreach ($_GET['jobs'] as $jobid) { wp_clear_scheduled_hook('backwpup_cron', array('id' => absint($jobid))); BackWPup_Option::delete_job(absint($jobid)); } } break; case 'copy': //Copy Job if (!current_user_can('backwpup_jobs_edit')) { break; } $old_job_id = absint($_GET['jobid']); check_admin_referer('copy-job_' . $old_job_id); //create new $newjobid = BackWPup_Option::get_job_ids(); sort($newjobid); $newjobid = end($newjobid) + 1; $old_options = BackWPup_Option::get_job($old_job_id); foreach ($old_options as $key => $option) { if ($key === "jobid") { $option = $newjobid; } if ($key === "name") { $option = __('Copy of', 'backwpup') . ' ' . $option; } if ($key === "activetype") { $option = ''; } if ($key === "archivename") { $option = str_replace($old_job_id, $newjobid, $option); } if ($key === "logfile" || $key === "lastbackupdownloadurl" || $key === "lastruntime" || $key === "lastrun") { continue; } BackWPup_Option::update($newjobid, $key, $option); } break; case 'runnow': $jobid = absint($_GET['jobid']); if ($jobid) { if (!current_user_can('backwpup_jobs_start')) { wp_die(__('Sorry, you don\'t have permissions to do that.', 'backwpup')); } check_admin_referer('backwpup_job_run-runnowlink'); //check temp folder $temp_folder_message = BackWPup_File::check_folder(BackWPup::get_plugin_data('TEMP'), TRUE); BackWPup_Admin::message($temp_folder_message, TRUE); //check log folder $log_folder = get_site_option('backwpup_cfg_logfolder'); $log_folder = BackWPup_File::get_absolute_path($log_folder); $log_folder_message = BackWPup_File::check_folder($log_folder); BackWPup_Admin::message($log_folder_message, TRUE); //check backup destinations $job_types = BackWPup::get_job_types(); $job_conf_types = BackWPup_Option::get($jobid, 'type'); $creates_file = FALSE; foreach ($job_types as $id => $job_type_class) { if (in_array($id, $job_conf_types, true) && $job_type_class->creates_file()) { $creates_file = TRUE; break; } } if ($creates_file) { $job_conf_dests = BackWPup_Option::get($jobid, 'destinations'); $destinations = 0; /* @var BackWPup_Destinations $dest_class */ foreach (BackWPup::get_registered_destinations() as $id => $dest) { if (!in_array($id, $job_conf_dests, true) || empty($dest['class'])) { continue; } $dest_class = BackWPup::get_destination($id); $job_settings = BackWPup_Option::get_job($jobid); if (!$dest_class->can_run($job_settings)) { BackWPup_Admin::message(sprintf(__('The job "%s" destination "%s" is not configured properly', 'backwpup'), esc_attr(BackWPup_Option::get($jobid, 'name')), $id), TRUE); } $destinations++; } if ($destinations < 1) { BackWPup_Admin::message(sprintf(__('The job "%s" needs properly configured destinations to run!', 'backwpup'), esc_attr(BackWPup_Option::get($jobid, 'name'))), TRUE); } } //only start job if messages empty $log_messages = BackWPup_Admin::get_messages(); if (empty($log_messages)) { $old_log_file = BackWPup_Option::get($jobid, 'logfile'); BackWPup_Job::get_jobrun_url('runnow', $jobid); usleep(250000); //wait a quarter second $new_log_file = BackWPup_Option::get($jobid, 'logfile', null, false); //sleep as long as job not started $i = 0; while ($old_log_file === $new_log_file) { usleep(250000); //wait a quarter second for next try $new_log_file = BackWPup_Option::get($jobid, 'logfile', null, false); //wait maximal 10 sec. if ($i >= 40) { BackWPup_Admin::message(sprintf(__('Job "%s" has started, but not responded for 10 seconds. Please check <a href="%s">information</a>.', 'backwpup'), esc_attr(BackWPup_Option::get($jobid, 'name')), network_admin_url('admin.php') . '?page=backwpupsettings#backwpup-tab-information'), true); break 2; } $i++; } BackWPup_Admin::message(sprintf(__('Job "%s" started.', 'backwpup'), esc_attr(BackWPup_Option::get($jobid, 'name')))); } } break; case 'abort': //Abort Job if (!current_user_can('backwpup_jobs_start')) { break; } check_admin_referer('abort-job'); if (!file_exists(BackWPup::get_plugin_data('running_file'))) { break; } //abort BackWPup_Job::user_abort(); BackWPup_Admin::message(__('Job will be terminated.', 'backwpup')); break; default: do_action('backwpup_page_jobs_load', self::$listtable->current_action()); break; } self::$listtable->prepare_items(); }
/** * @param $jobid */ public function edit_form_post_save($jobid) { BackWPup_Option::update($jobid, 'dbcheckwponly', !empty($_POST['dbcheckwponly'])); BackWPup_Option::update($jobid, 'dbcheckrepair', !empty($_POST['dbcheckrepair'])); }
/** * @param $job_object * @return bool */ public function job_run_archive(&$job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; $job_object->log(sprintf(__('%d. Trying to send backup file to S3 Service …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); try { $s3 = new AmazonS3(array('key' => $job_object->job['s3accesskey'], 'secret' => BackWPup_Encryption::decrypt($job_object->job['s3secretkey']), 'certificate_authority' => TRUE)); $base_url = $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']); if (stristr($base_url, 'amazonaws.com')) { $s3->set_region(str_replace(array('http://', 'https://'), '', $base_url)); } else { $s3->set_hostname(str_replace(array('http://', 'https://'), '', $base_url)); $s3->allow_hostname_override(FALSE); if (substr($base_url, -1) == '/') { $s3->enable_path_style(TRUE); } } if (stristr($base_url, 'http://')) { $s3->disable_ssl(); } if ($s3->if_bucket_exists($job_object->job['s3bucket'])) { $job_object->log(sprintf(__('Connected to S3 Bucket "%1$s" in %2$s', 'backwpup'), $job_object->job['s3bucket'], $base_url), E_USER_NOTICE); } else { $job_object->log(sprintf(__('S3 Bucket "%s" does not exist!', 'backwpup'), $job_object->job['s3bucket']), E_USER_ERROR); return TRUE; } //transfer file to S3 $job_object->log(__('Starting upload to S3 Service …', 'backwpup'), E_USER_NOTICE); //Transfer Backup to S3 if ($job_object->job['s3storageclass'] == 'REDUCED_REDUNDANCY') { //set reduced redundancy or not $storage = AmazonS3::STORAGE_REDUCED; } else { $storage = AmazonS3::STORAGE_STANDARD; } if (empty($job_object->job['s3ssencrypt'])) { $job_object->job['s3ssencrypt'] = NULL; } //set progress bar $s3->register_streaming_read_callback(array($job_object, 'curl_read_callback')); $result = $s3->create_object($job_object->job['s3bucket'], $job_object->job['s3dir'] . $job_object->backup_file, array('fileUpload' => $job_object->backup_folder . $job_object->backup_file, 'acl' => AmazonS3::ACL_PRIVATE, 'storage' => $storage, 'encryption' => $job_object->job['s3ssencrypt'])); if ($result->status >= 200 and $result->status < 300) { $job_object->substeps_done = 1 + $job_object->backup_filesize; $job_object->log(sprintf(__('Backup transferred to %s.', 'backwpup'), $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . $job_object->job['s3dir'] . $job_object->backup_file), E_USER_NOTICE); if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job['s3dir'] . $job_object->backup_file . '&jobid=' . $job_object->job['jobid']); } } else { $job_object->log(sprintf(__('Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup'), $result->status, $result->body), E_USER_ERROR); } } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine()); return FALSE; } try { $backupfilelist = array(); $filecounter = 0; $files = array(); $objects = $s3->list_objects($job_object->job['s3bucket'], array('prefix' => $job_object->job['s3dir'])); if (is_object($objects)) { foreach ($objects->body->Contents as $object) { $file = basename((string) $object->Key); $changetime = strtotime((string) $object->LastModified) + get_option('gmt_offset') * 3600; if ($job_object->is_backup_archive($file)) { $backupfilelist[$changetime] = $file; } $files[$filecounter]['folder'] = $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . dirname((string) $object->Key); $files[$filecounter]['file'] = (string) $object->Key; $files[$filecounter]['filename'] = basename($object->Key); $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloads3&file=' . (string) $object->Key . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = (int) $object->Size; $files[$filecounter]['time'] = $changetime; $filecounter++; } } if ($job_object->job['s3maxbackups'] > 0 && is_object($s3)) { //Delete old backups if (count($backupfilelist) > $job_object->job['s3maxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['s3maxbackups']) { break; } //delete files on S3 $delete_s3 = $s3->delete_object($job_object->job['s3bucket'], $job_object->job['s3dir'] . $file); if ($delete_s3) { foreach ($files as $key => $filedata) { if ($filedata['file'] == $job_object->job['s3dir'] . $file) { unset($files[$key]); } } $numdeltefiles++; } else { $job_object->log(sprintf(__('Cannot delete backup from %s.', 'backwpup'), $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . $job_object->job['s3dir'] . $file), E_USER_ERROR); } } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_s3', $files, 60 * 60 * 24 * 7); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done = 2 + $job_object->backup_filesize; return TRUE; }
/** * Save Form data */ public static function save_post_form($tab, $jobid) { if (!current_user_can('backwpup_jobs_edit')) { return __('Sorry, you don\'t have permissions to do that.', 'backwpup'); } $destinations = BackWPup::get_registered_destinations(); $job_types = BackWPup::get_job_types(); switch ($tab) { case 'job': BackWPup_Option::update($jobid, 'jobid', $jobid); if (isset($_POST['type']) && is_array($_POST['type'])) { foreach ((array) $_POST['type'] as $typeid) { if (empty($job_types[$typeid])) { unset($_POST['type'][$typeid]); } } if (is_array($_POST['type'])) { sort($_POST['type']); } } else { $_POST['type'] = array(); } //test if job type makes backup /* @var BackWPup_JobTypes $job_type */ $makes_file = FALSE; foreach ($job_types as $type_id => $job_type) { if (in_array($type_id, $_POST['type'])) { if ($job_type->creates_file()) { $makes_file = TRUE; break; } } } if (!$makes_file) { $_POST['destinations'] = array(); } BackWPup_Option::update($jobid, 'type', $_POST['type']); if (isset($_POST['destinations']) && is_array($_POST['destinations'])) { foreach ((array) $_POST['destinations'] as $key => $destid) { if (empty($destinations[$destid])) { //remove all destinations that not exists unset($_POST['destinations'][$key]); } if (class_exists('BackWPup_Pro', FALSE) && $_POST['backuptype'] == 'sync') { //if sync remove all not sync destinations if (!$destinations[$destid]['can_sync']) { unset($_POST['destinations'][$key]); } } } if (is_array($_POST['destinations'])) { sort($_POST['destinations']); } } else { $_POST['destinations'] = array(); } BackWPup_Option::update($jobid, 'destinations', $_POST['destinations']); $name = esc_html(trim($_POST['name'])); if (empty($name) || $_POST['name'] == __('New Job', 'backwpup')) { $name = sprintf(__('Job with ID %d', 'backwpup'), $jobid); } BackWPup_Option::update($jobid, 'name', $name); $emails = explode(',', $_POST['mailaddresslog']); foreach ($emails as $key => $email) { $emails[$key] = sanitize_email(trim($email)); if (!is_email($emails[$key])) { unset($emails[$key]); } } $mailaddresslog = implode(', ', $emails); BackWPup_Option::update($jobid, 'mailaddresslog', $mailaddresslog); $_POST['mailaddresssenderlog'] = trim($_POST['mailaddresssenderlog']); if (empty($_POST['mailaddresssenderlog'])) { BackWPup_Option::delete($jobid, 'mailaddresssenderlog'); } else { BackWPup_Option::update($jobid, 'mailaddresssenderlog', $_POST['mailaddresssenderlog']); } BackWPup_Option::update($jobid, 'mailerroronly', isset($_POST['mailerroronly']) && $_POST['mailerroronly'] == 1 ? TRUE : FALSE); if (class_exists('BackWPup_Pro', FALSE)) { BackWPup_Option::update($jobid, 'backuptype', esc_html($_POST['backuptype'])); } else { BackWPup_Option::update($jobid, 'backuptype', 'archive'); } BackWPup_Option::update($jobid, 'archiveformat', esc_html($_POST['archiveformat'])); BackWPup_Option::update($jobid, 'archivename', BackWPup_Job::sanitize_file_name($_POST['archivename'])); break; case 'cron': if ($_POST['activetype'] == '' || $_POST['activetype'] == 'wpcron' || $_POST['activetype'] == 'easycron' || $_POST['activetype'] == 'link') { BackWPup_Option::update($jobid, 'activetype', $_POST['activetype']); } BackWPup_Option::update($jobid, 'cronselect', $_POST['cronselect'] == 'advanced' ? 'advanced' : 'basic'); if (isset($_POST['cronselect']) && $_POST['cronselect'] == 'advanced') { //save advanced if (empty($_POST['cronminutes']) || $_POST['cronminutes'][0] == '*') { if (!empty($_POST['cronminutes'][1])) { $_POST['cronminutes'] = array('*/' . $_POST['cronminutes'][1]); } else { $_POST['cronminutes'] = array('*'); } } if (empty($_POST['cronhours']) || $_POST['cronhours'][0] == '*') { if (!empty($_POST['cronhours'][1])) { $_POST['cronhours'] = array('*/' . $_POST['cronhours'][1]); } else { $_POST['cronhours'] = array('*'); } } if (empty($_POST['cronmday']) || $_POST['cronmday'][0] == '*') { if (!empty($_POST['cronmday'][1])) { $_POST['cronmday'] = array('*/' . $_POST['cronmday'][1]); } else { $_POST['cronmday'] = array('*'); } } if (empty($_POST['cronmon']) || $_POST['cronmon'][0] == '*') { if (!empty($_POST['cronmon'][1])) { $_POST['cronmon'] = array('*/' . $_POST['cronmon'][1]); } else { $_POST['cronmon'] = array('*'); } } if (empty($_POST['cronwday']) || $_POST['cronwday'][0] == '*') { if (!empty($_POST['cronwday'][1])) { $_POST['cronwday'] = array('*/' . $_POST['cronwday'][1]); } else { $_POST['cronwday'] = array('*'); } } $cron = implode(",", $_POST['cronminutes']) . ' ' . implode(",", $_POST['cronhours']) . ' ' . implode(",", $_POST['cronmday']) . ' ' . implode(",", $_POST['cronmon']) . ' ' . implode(",", $_POST['cronwday']); BackWPup_Option::update($jobid, 'cron', $cron); } else { //Save basic if ($_POST['cronbtype'] == 'mon') { BackWPup_Option::update($jobid, 'cron', $_POST['moncronminutes'] . ' ' . $_POST['moncronhours'] . ' ' . $_POST['moncronmday'] . ' * *'); } if ($_POST['cronbtype'] == 'week') { BackWPup_Option::update($jobid, 'cron', $_POST['weekcronminutes'] . ' ' . $_POST['weekcronhours'] . ' * * ' . $_POST['weekcronwday']); } if ($_POST['cronbtype'] == 'day') { BackWPup_Option::update($jobid, 'cron', $_POST['daycronminutes'] . ' ' . $_POST['daycronhours'] . ' * * *'); } if ($_POST['cronbtype'] == 'hour') { BackWPup_Option::update($jobid, 'cron', $_POST['hourcronminutes'] . ' * * * *'); } } //reschedule wp_clear_scheduled_hook('backwpup_cron', array('id' => $jobid)); if (BackWPup_Option::get($jobid, 'activetype') == 'wpcron') { $cron_next = BackWPup_Cron::cron_next(BackWPup_Option::get($jobid, 'cron')); wp_schedule_single_event($cron_next, 'backwpup_cron', array('id' => $jobid)); } $easy_cron_job_id = BackWPup_Option::get($jobid, 'easycronjobid'); if (BackWPup_Option::get($jobid, 'activetype') == 'easycron') { BackWPup_EasyCron::update($jobid); } elseif (!empty($easy_cron_job_id)) { BackWPup_EasyCron::delete($jobid); } break; default: if (strstr($tab, 'dest-')) { $dest_class = BackWPup::get_destination(str_replace('dest-', '', $tab)); $dest_class->edit_form_post_save($jobid); } if (strstr($tab, 'jobtype-')) { $id = strtoupper(str_replace('jobtype-', '', $tab)); $job_types[$id]->edit_form_post_save($jobid); } } //saved message $messages = BackWPup_Admin::get_messages(); if (empty($messages['error'])) { $url = BackWPup_Job::get_jobrun_url('runnowlink', $jobid); BackWPup_Admin::message(sprintf(__('Changes for job <i>%s</i> saved.', 'backwpup'), BackWPup_Option::get($jobid, 'name')) . ' <a href="' . network_admin_url('admin.php') . '?page=backwpupjobs">' . __('Jobs overview', 'backwpup') . '</a> | <a href="' . $url['url'] . '">' . __('Run now', 'backwpup') . '</a>'); } }
/** * @param $job_object BackWPup_Job * @return bool */ public function job_run_archive(BackWPup_Job $job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; $job_object->log(sprintf(__('%d. Try to send backup to SugarSync …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); try { $sugarsync = new BackWPup_Destination_SugarSync_API($job_object->job['sugarrefreshtoken']); //Check Quota $user = $sugarsync->user(); if (!empty($user->nickname)) { $job_object->log(sprintf(__('Authenticated to SugarSync with nickname %s', 'backwpup'), $user->nickname), E_USER_NOTICE); } $sugarsyncfreespase = (double) $user->quota->limit - (double) $user->quota->usage; //float fixes bug for display of no free space if ($job_object->backup_filesize > $sugarsyncfreespase) { $job_object->log(sprintf(_x('Not enough disk space available on SugarSync. Available: %s.', 'Available space on SugarSync', 'backwpup'), size_format($sugarsyncfreespase, 2)), E_USER_ERROR); $job_object->substeps_todo = 1 + $job_object->backup_filesize; return TRUE; } else { $job_object->log(sprintf(__('%s available at SugarSync', 'backwpup'), size_format($sugarsyncfreespase, 2)), E_USER_NOTICE); } //Create and change folder $sugarsync->mkdir($job_object->job['sugardir'], $job_object->job['sugarroot']); $dirid = $sugarsync->chdir($job_object->job['sugardir'], $job_object->job['sugarroot']); //Upload to SugarSync $job_object->substeps_done = 0; $job_object->log(__('Starting upload to SugarSync …', 'backwpup'), E_USER_NOTICE); self::$backwpup_job_object =& $job_object; $reponse = $sugarsync->upload($job_object->backup_folder . $job_object->backup_file); if (is_object($reponse)) { if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadsugarsync&file=' . (string) $reponse . '&jobid=' . $job_object->job['jobid']); } $job_object->substeps_done++; $job_object->log(sprintf(__('Backup transferred to %s', 'backwpup'), 'https://' . $user->nickname . '.sugarsync.com/' . $sugarsync->showdir($dirid) . $job_object->backup_file), E_USER_NOTICE); } else { $job_object->log(__('Cannot transfer backup to SugarSync!', 'backwpup'), E_USER_ERROR); return FALSE; } $backupfilelist = array(); $files = array(); $filecounter = 0; $dir = $sugarsync->showdir($dirid); $getfiles = $sugarsync->getcontents('file'); if (is_object($getfiles)) { foreach ($getfiles->file as $getfile) { $getfile->displayName = utf8_decode((string) $getfile->displayName); if ($job_object->is_backup_archive($getfile->displayName)) { $backupfilelist[strtotime((string) $getfile->lastModified)] = (string) $getfile->ref; } $files[$filecounter]['folder'] = 'https://' . (string) $user->nickname . '.sugarsync.com/' . $dir; $files[$filecounter]['file'] = (string) $getfile->ref; $files[$filecounter]['filename'] = (string) $getfile->displayName; $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadsugarsync&file=' . (string) $getfile->ref . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = (int) $getfile->size; $files[$filecounter]['time'] = strtotime((string) $getfile->lastModified) + get_option('gmt_offset') * 3600; $filecounter++; } } if (!empty($job_object->job['sugarmaxbackups']) && $job_object->job['sugarmaxbackups'] > 0) { //Delete old backups if (count($backupfilelist) > $job_object->job['sugarmaxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['sugarmaxbackups']) { break; } $sugarsync->delete($file); //delete files on Cloud foreach ($files as $key => $filedata) { if ($filedata['file'] == $file) { unset($files[$key]); } } $numdeltefiles++; } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on SugarSync folder', '%d files deleted on SugarSync folder', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('BackWPup_' . $job_object->job['jobid'] . '_SUGARSYNC', $files, 60 * 60 * 24 * 7); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('SugarSync API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done++; return TRUE; }
private static function upgrade_from_version_two() { //load options $cfg = get_option('backwpup'); //only exists in Version 2 $jobs = get_option('backwpup_jobs'); //delete old options delete_option('backwpup'); delete_option('backwpup_jobs'); //add new option default structure and without auto load cache if (!is_multisite()) { add_option('backwpup_jobs', array(), NULL, 'no'); } //upgrade cfg //if old value switch it to new if (!empty($cfg['dirlogs'])) { $cfg['logfolder'] = $cfg['dirlogs']; } if (!empty($cfg['httpauthpassword'])) { if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $cfg['httpauthpassword'])) { $cfg['httpauthpassword'] = base64_decode($cfg['httpauthpassword']); } $cfg['httpauthpassword'] = BackWPup_Encryption::encrypt($cfg['httpauthpassword']); } // delete old not needed vars unset($cfg['dirtemp'], $cfg['dirlogs'], $cfg['logfilelist'], $cfg['jobscriptruntime'], $cfg['jobscriptruntimelong'], $cfg['last_activate'], $cfg['disablewpcron'], $cfg['phpzip'], $cfg['apicronservice'], $cfg['mailsndemail'], $cfg['mailsndname'], $cfg['mailmethod'], $cfg['mailsendmail'], $cfg['mailhost'], $cfg['mailpass'], $cfg['mailhostport'], $cfg['mailsecure'], $cfg['mailuser']); //save in options foreach ($cfg as $cfgname => $cfgvalue) { update_site_option('backwpup_cfg_' . $cfgname, $cfgvalue); } //Put old jobs to new if exists foreach ($jobs as $jobid => $jobvalue) { //convert general settings if (empty($jobvalue['jobid'])) { $jobvalue['jobid'] = $jobid; } if (empty($jobvalue['activated'])) { $jobvalue['activetype'] = ''; } else { $jobvalue['activetype'] = 'wpcron'; } if (!isset($jobvalue['cronselect']) && !isset($jobvalue['cron'])) { $jobvalue['cronselect'] = 'basic'; } elseif (!isset($jobvalue['cronselect']) && isset($jobvalue['cron'])) { $jobvalue['cronselect'] = 'advanced'; } $jobvalue['backuptype'] = 'archive'; $jobvalue['type'] = explode('+', $jobvalue['type']); //save as array foreach ($jobvalue['type'] as $key => $type) { if ($type == 'DB') { $jobvalue['type'][$key] = 'DBDUMP'; } if ($type == 'OPTIMIZE') { unset($jobvalue['type'][$key]); } if ($type == 'CHECK') { $jobvalue['type'][$key] = 'DBCHECK'; } if ($type == 'MAIL') { $jobvalue['type'][$key] = 'EMAIL'; } } $jobvalue['archivename'] = $jobvalue['fileprefix'] . '%Y-%m-%d_%H-%i-%s'; $jobvalue['archiveformat'] = $jobvalue['fileformart']; //convert active destinations $jobvalue['destinations'] = array(); if (!empty($jobvalue['backupdir']) && $jobvalue['backupdir'] != '/') { $jobvalue['destinations'][] = 'FOLDER'; } if (!empty($jobvalue['mailaddress'])) { $jobvalue['destinations'][] = 'MAIL'; } if (!empty($jobvalue['ftphost']) && !empty($jobvalue['ftpuser']) && !empty($jobvalue['ftppass'])) { $jobvalue['destinations'][] = 'FTP'; } if (!empty($jobvalue['dropetoken']) && !empty($jobvalue['dropesecret'])) { $jobvalue['destinations'][] = 'DROPBOX'; } if (!empty($jobvalue['sugarrefreshtoken']) && !empty($jobvalue['sugarroot'])) { $jobvalue['destinations'][] = 'SUGARSYNC'; } if (!empty($jobvalue['awsAccessKey']) && !empty($jobvalue['awsSecretKey']) && !empty($jobvalue['awsBucket'])) { $jobvalue['destinations'][] = 'S3'; } if (!empty($jobvalue['GStorageAccessKey']) and !empty($jobvalue['GStorageSecret']) && !empty($jobvalue['GStorageBucket']) && !in_array('S3', $jobvalue['destinations'])) { $jobvalue['destinations'][] = 'S3'; } if (!empty($jobvalue['rscUsername']) && !empty($jobvalue['rscAPIKey']) && !empty($jobvalue['rscContainer'])) { $jobvalue['destinations'][] = 'RSC'; } if (!empty($jobvalue['msazureHost']) && !empty($jobvalue['msazureAccName']) && !empty($jobvalue['msazureKey']) && !empty($jobvalue['msazureContainer'])) { $jobvalue['destinations'][] = 'MSAZURE'; } //convert dropbox $jobvalue['dropboxtoken'] = ''; //new app key are set must reauth $jobvalue['dropboxsecret'] = ''; $jobvalue['dropboxroot'] = 'dropbox'; $jobvalue['dropboxmaxbackups'] = $jobvalue['dropemaxbackups']; $jobvalue['dropboxdir'] = $jobvalue['dropedir']; unset($jobvalue['dropetoken'], $jobvalue['dropesecret'], $jobvalue['droperoot'], $jobvalue['dropemaxbackups'], $jobvalue['dropedir']); //convert amazon S3 $jobvalue['s3accesskey'] = $jobvalue['awsAccessKey']; $jobvalue['s3secretkey'] = BackWPup_Encryption::encrypt($jobvalue['awsSecretKey']); $jobvalue['s3bucket'] = $jobvalue['awsBucket']; //get aws region $jobvalue['s3region'] = 'us-east-1'; $jobvalue['s3base_url'] = ''; $jobvalue['s3storageclass'] = !empty($jobvalue['awsrrs']) ? 'REDUCED_REDUNDANCY' : ''; $jobvalue['s3dir'] = $jobvalue['awsdir']; $jobvalue['s3maxbackups'] = $jobvalue['awsmaxbackups']; unset($jobvalue['awsAccessKey'], $jobvalue['awsSecretKey'], $jobvalue['awsBucket'], $jobvalue['awsrrs'], $jobvalue['awsdir'], $jobvalue['awsmaxbackups']); //convert google storage $jobvalue['s3accesskey'] = $jobvalue['GStorageAccessKey']; $jobvalue['s3secretkey'] = BackWPup_Encryption::encrypt($jobvalue['GStorageSecret']); $jobvalue['s3bucket'] = $jobvalue['GStorageBucket']; $jobvalue['s3region'] = 'google-storage'; $jobvalue['s3base_url'] = ''; $jobvalue['s3ssencrypt'] = ''; $jobvalue['s3dir'] = $jobvalue['GStoragedir']; $jobvalue['s3maxbackups'] = $jobvalue['GStoragemaxbackups']; unset($jobvalue['GStorageAccessKey'], $jobvalue['GStorageSecret'], $jobvalue['GStorageBucket'], $jobvalue['GStoragedir'], $jobvalue['GStoragemaxbackups']); //convert MS Azure storage $jobvalue['msazureaccname'] = $jobvalue['msazureAccName']; $jobvalue['msazurekey'] = BackWPup_Encryption::encrypt($jobvalue['msazureKey']); $jobvalue['msazurecontainer'] = $jobvalue['msazureContainer']; unset($jobvalue['msazureHost'], $jobvalue['msazureAccName'], $jobvalue['msazureKey'], $jobvalue['msazureContainer']); //convert FTP if (preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $jobvalue['ftppass'])) { $jobvalue['ftppass'] = base64_decode($jobvalue['ftppass']); } $jobvalue['ftppass'] = BackWPup_Encryption::encrypt($jobvalue['ftppass']); if (!empty($jobvalue['ftphost']) && strstr($jobvalue['ftphost'], ':')) { list($jobvalue['ftphost'], $jobvalue['ftphostport']) = explode(':', $jobvalue['ftphost'], 2); } //convert Sugarsync //convert Mail $jobvalue['emailaddress'] = $jobvalue['mailaddress']; $jobvalue['emailefilesize'] = $jobvalue['mailefilesize']; unset($jobvalue['mailaddress'], $jobvalue['mailefilesize']); //convert RSC $jobvalue['rscusername'] = $jobvalue['rscUsername']; $jobvalue['rscapikey'] = $jobvalue['rscAPIKey']; $jobvalue['rsccontainer'] = $jobvalue['rscContainer']; //convert jobtype DB Dump $jobvalue['dbdumpexclude'] = $jobvalue['dbexclude']; unset($jobvalue['dbexclude'], $jobvalue['dbshortinsert']); //convert jobtype DBDUMP, DBCHECK $jobvalue['dbcheckrepair'] = TRUE; unset($jobvalue['maintenance']); //convert jobtype wpexport //convert jobtype file $excludes = array(); foreach ($jobvalue['backuprootexcludedirs'] as $folder) { $excludes[] = basename($folder); } $jobvalue['backuprootexcludedirs'] = $excludes; $excludes = array(); foreach ($jobvalue['backupcontentexcludedirs'] as $folder) { $excludes[] = basename($folder); } $jobvalue['backupcontentexcludedirs'] = $excludes; $excludes = array(); foreach ($jobvalue['backuppluginsexcludedirs'] as $folder) { $excludes[] = basename($folder); } $jobvalue['backuppluginsexcludedirs'] = $excludes; $excludes = array(); foreach ($jobvalue['backupthemesexcludedirs'] as $folder) { $excludes[] = basename($folder); } $jobvalue['backupthemesexcludedirs'] = $excludes; $excludes = array(); foreach ($jobvalue['backupuploadsexcludedirs'] as $folder) { $excludes[] = basename($folder); } $jobvalue['backupuploadsexcludedirs'] = $excludes; //delete not longer needed unset($jobvalue['cronnextrun'], $jobvalue['fileprefix'], $jobvalue['fileformart'], $jobvalue['scheduleintervaltype'], $jobvalue['scheduleintervalteimes'], $jobvalue['scheduleinterval'], $jobvalue['dropemail'], $jobvalue['dropepass'], $jobvalue['dropesignmethod']); //save in options foreach ($jobvalue as $jobvaluename => $jobvaluevalue) { BackWPup_Option::update($jobvalue['jobid'], $jobvaluename, $jobvaluevalue); } } set_site_transient('backwpup_upgrade_from_version_two', TRUE, 3600 * 24 * 7); }
/** * @param $job_object * @return bool */ public function job_run_archive(BackWPup_Job $job_object) { $job_object->substeps_todo = 1; if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', add_query_arg(array('page' => 'backwpupbackups', 'action' => 'downloadfolder', 'file' => basename($job_object->backup_file), 'jobid' => $job_object->job['jobid']), network_admin_url('admin.php'))); } //Delete old Backupfiles $backupfilelist = array(); $files = array(); if (is_writable($job_object->backup_folder) && ($dir = opendir($job_object->backup_folder))) { //make file list while (FALSE !== ($file = readdir($dir))) { if (is_writeable($job_object->backup_folder . $file) && !is_dir($job_object->backup_folder . $file) && !is_link($job_object->backup_folder . $file)) { //list for deletion if ($job_object->is_backup_archive($file)) { $backupfilelist[filemtime($job_object->backup_folder . $file)] = $file; } } } closedir($dir); } if ($job_object->job['maxbackups'] > 0) { if (count($backupfilelist) > $job_object->job['maxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['maxbackups']) { break; } unlink($job_object->backup_folder . $file); foreach ($files as $key => $filedata) { if ($filedata['file'] == $job_object->backup_folder . $file) { unset($files[$key]); } } $numdeltefiles++; } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One backup file deleted', '%d backup files deleted', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } $job_object->substeps_done++; return TRUE; }
/** * */ public static function load() { //Create Table self::$listtable = new self(); switch (self::$listtable->current_action()) { case 'delete': //Delete Job if (!current_user_can('backwpup_jobs_edit')) { break; } if (is_array($_GET['jobs'])) { check_admin_referer('bulk-jobs'); foreach ($_GET['jobs'] as $jobid) { wp_clear_scheduled_hook('backwpup_cron', array('id' => $jobid)); BackWPup_Option::delete_job($jobid); } } break; case 'copy': //Copy Job if (!current_user_can('backwpup_jobs_edit')) { break; } $old_job_id = (int) $_GET['jobid']; check_admin_referer('copy-job_' . $_GET['jobid']); //create new $newjobid = BackWPup_Option::get_job_ids(); sort($newjobid); $newjobid = end($newjobid) + 1; $old_options = BackWPup_Option::get_job($old_job_id); foreach ($old_options as $key => $option) { if ($key == "jobid") { $option = $newjobid; } if ($key == "name") { $option = __('Copy of', 'backwpup') . ' ' . $option; } if ($key == "activetype") { $option = ''; } if ($key == "archivename") { $option = str_replace($_GET['jobid'], $newjobid, $option); } if ($key == "logfile" || $key == "lastbackupdownloadurl" || $key == "lastruntime" || $key == "lastrun") { continue; } BackWPup_Option::update($newjobid, $key, $option); } break; case 'runnow': $_GET['jobid'] = (int) $_GET['jobid']; if (!empty($_GET['jobid'])) { if (!current_user_can('backwpup_jobs_start')) { wp_die(__('Sorry, you don\'t have permissions to do that.', 'backwpup')); } check_admin_referer('backwpup_job_run-runnowlink'); //check temp folder $temp_folder_message = BackWPup_File::check_folder(BackWPup::get_plugin_data('TEMP'), TRUE); BackWPup_Admin::message($temp_folder_message, TRUE); //check log folder $log_folder = get_site_option('backwpup_cfg_logfolder'); $log_folder = BackWPup_File::get_absolute_path($log_folder); $log_folder_message = BackWPup_File::check_folder($log_folder); BackWPup_Admin::message($log_folder_message, TRUE); //check backup destinations $job_types = BackWPup::get_job_types(); $job_conf_types = BackWPup_Option::get($_GET['jobid'], 'type'); $creates_file = FALSE; foreach ($job_types as $id => $job_type_class) { if (in_array($id, $job_conf_types) && $job_type_class->creates_file()) { $creates_file = TRUE; break; } } if ($creates_file) { $job_conf_dests = BackWPup_Option::get($_GET['jobid'], 'destinations'); $destinations = 0; /* @var BackWPup_Destinations $dest_class */ foreach (BackWPup::get_registered_destinations() as $id => $dest) { if (!in_array($id, $job_conf_dests) || empty($dest['class'])) { continue; } $dest_class = BackWPup::get_destination($id); $job_settings = BackWPup_Option::get_job($_GET['jobid']); if (!$dest_class->can_run($job_settings)) { BackWPup_Admin::message(sprintf(__('The job "%s" destination "%s" is not configured properly', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name')), $id), TRUE); } $destinations++; } if ($destinations < 1) { BackWPup_Admin::message(sprintf(__('The job "%s" needs properly configured destinations to run!', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name'))), TRUE); } } //check server callback $raw_response = BackWPup_Job::get_jobrun_url('test'); $test_result = ''; if (is_wp_error($raw_response)) { $test_result .= sprintf(__('The HTTP response test get an error "%s"', 'backwpup'), $raw_response->get_error_message()); } $response_code = wp_remote_retrieve_response_code($raw_response); if ($response_code < 200 && $response_code > 204) { $test_result .= sprintf(__('The HTTP response test get a false http status (%s)', 'backwpup'), wp_remote_retrieve_response_code($raw_response)); } else { $response_body = wp_remote_retrieve_body($raw_response); if (FALSE === strstr($response_body, 'BackWPup Test')) { $test_result .= sprintf(__('Not expected HTTP response body: %s', 'backwpup'), esc_attr(strip_tags($response_body))); } } if (!empty($test_result)) { BackWPup_Admin::message($test_result, TRUE); } //only start job if messages empty $log_messages = BackWPup_Admin::get_messages(); if (empty($log_messages)) { $old_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile'); BackWPup_Job::get_jobrun_url('runnow', $_GET['jobid']); usleep(250000); //wait a quarter second $new_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile', NULL, FALSE); //sleep as long as job not started $i = 0; while ($old_log_file == $new_log_file) { usleep(250000); //wait a quarter second for next try $new_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile', NULL, FALSE); //wait maximal 10 sec. if ($i >= 40) { BackWPup_Admin::message(sprintf(__('Job “%s” has started, but not responded for 10 seconds.', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name'))), TRUE); break 2; } $i++; } BackWPup_Admin::message(sprintf(__('Job "%s" started.', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name')))); } } break; case 'abort': //Abort Job if (!current_user_can('backwpup_jobs_start')) { break; } check_admin_referer('abort-job'); if (!file_exists(BackWPup::get_plugin_data('running_file'))) { break; } //abort BackWPup_Job::user_abort(); BackWPup_Admin::message(__('Job will be terminated.', 'backwpup')); break; default: do_action('backwpup_page_jobs_load', self::$listtable->current_action()); break; } self::$listtable->prepare_items(); }
/** * @param $jobid */ public function edit_form_post_save($jobid) { BackWPup_Option::update($jobid, 'dbcheckwponly', isset($_POST['dbcheckwponly']) && $_POST['dbcheckwponly'] == 1 ? TRUE : FALSE); BackWPup_Option::update($jobid, 'dbcheckrepair', isset($_POST['dbcheckrepair']) && $_POST['dbcheckrepair'] == 1 ? TRUE : FALSE); }
/** * */ public static function load() { //Create Table self::$listtable = new self(); switch (self::$listtable->current_action()) { case 'delete': //Delete Job if (!current_user_can('backwpup_jobs_edit')) { break; } if (is_array($_GET['jobs'])) { check_admin_referer('bulk-jobs'); foreach ($_GET['jobs'] as $jobid) { wp_clear_scheduled_hook('backwpup_cron', array('id' => $jobid)); BackWPup_Option::delete_job($jobid); } } break; case 'copy': //Copy Job if (!current_user_can('backwpup_jobs_edit')) { break; } $old_job_id = (int) $_GET['jobid']; check_admin_referer('copy-job_' . $_GET['jobid']); //create new $newjobid = BackWPup_Option::get_job_ids(); sort($newjobid); $newjobid = end($newjobid) + 1; $old_options = BackWPup_Option::get_job($old_job_id); foreach ($old_options as $key => $option) { if ($key == "jobid") { $option = $newjobid; } if ($key == "name") { $option = __('Copy of', 'backwpup') . ' ' . $option; } if ($key == "activetype") { $option = ''; } if ($key == "archivename") { $option = str_replace($_GET['jobid'], $newjobid, $option); } if ($key == "logfile" || $key == "lastbackupdownloadurl" || $key == "lastruntime" || $key == "lastrun") { continue; } BackWPup_Option::update($newjobid, $key, $option); } break; case 'start_cli': //Get cmd start file if (!current_user_can('backwpup_jobs_start')) { break; } check_admin_referer('start_cli'); if (empty($_GET['jobid'])) { break; } if (FALSE === strpos(PHP_OS, "WIN")) { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET['jobid'] . ".sh;"); if (defined('PHP_BINDIR')) { echo "#!/bin/sh" . PHP_EOL; } echo "@\$1php -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '" . $_SERVER['SERVER_ADDR'] . "'; \$_SERVER[ 'REMOTE_ADDR' ] = '" . $_SERVER['REMOTE_ADDR'] . "'; \$_SERVER[ 'HTTP_HOST' ] = '" . $_SERVER['HTTP_HOST'] . "'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '" . BackWPup::get_plugin_data('name') . "'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET['jobid'] . " );\""; die; } else { header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Content-Type: application/octet-stream"); header("Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET['jobid'] . ".cmd;"); echo "@%1php.exe -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '" . $_SERVER['SERVER_ADDR'] . "'; \$_SERVER[ 'REMOTE_ADDR' ] = '" . $_SERVER['REMOTE_ADDR'] . "'; \$_SERVER[ 'HTTP_HOST' ] = '" . $_SERVER['HTTP_HOST'] . "'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '" . BackWPup::get_plugin_data('name') . "'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET['jobid'] . " );\""; die; } break; case 'runnow': if (!empty($_GET['jobid'])) { if (!current_user_can('backwpup_jobs_start')) { wp_die(__('Sorry, you don\'t have permissions to do that.', 'backwpup')); } check_admin_referer('backwpup_job_run-runnowlink'); //check temp folder BackWPup_Job::check_folder(BackWPup::get_plugin_data('TEMP'), TRUE); //check log folder BackWPup_Job::check_folder(get_site_option('backwpup_cfg_logfolder')); //check server callback $raw_response = BackWPup_Job::get_jobrun_url('test'); $test_result = ''; if (is_wp_error($raw_response)) { $test_result .= sprintf(__('The HTTP response test get an error "%s"', 'backwpup'), $raw_response->get_error_message()); } elseif (200 != wp_remote_retrieve_response_code($raw_response) && 204 != wp_remote_retrieve_response_code($raw_response)) { $test_result .= sprintf(__('The HTTP response test get a false http status (%s)', 'backwpup'), wp_remote_retrieve_response_code($raw_response)); } if (!empty($test_result)) { BackWPup_Admin::message($test_result, TRUE); } //only start job if messages empty $log_messages = BackWPup_Admin::get_messages(); if (empty($log_messages)) { $old_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile'); BackWPup_Job::get_jobrun_url('runnow', $_GET['jobid']); usleep(250000); //wait a quarter second $new_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile', NULL, FALSE); //sleep as long as job not started $i = 0; while ($old_log_file == $new_log_file) { usleep(250000); //wait a quarter second for next try $new_log_file = BackWPup_Option::get($_GET['jobid'], 'logfile', NULL, FALSE); //wait maximal 10 sec. if ($i >= 40) { BackWPup_Admin::message(sprintf(__('Job start for "%s" not answered after 10 seconds.', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name'))), TRUE); break 2; } $i++; } BackWPup_Admin::message(sprintf(__('Job "%s" started.', 'backwpup'), esc_attr(BackWPup_Option::get($_GET['jobid'], 'name')))); } } break; case 'abort': //Abort Job if (!current_user_can('backwpup_jobs_start')) { break; } check_admin_referer('abort-job'); if (!file_exists(BackWPup::get_plugin_data('running_file'))) { break; } //abort BackWPup_Job::user_abort(); BackWPup_Admin::message(__('Job will be terminated.', 'backwpup')); break; default: do_action('backwpup_page_jobs_load', self::$listtable->current_action()); break; } self::$listtable->prepare_items(); }
/** * @param $id */ public function edit_form_post_save($id) { $fileexclude = explode(',', stripslashes(str_replace(array("\r\n", "\r"), ',', $_POST['fileexclude']))); foreach ($fileexclude as $key => $value) { $fileexclude[$key] = str_replace('//', '/', str_replace('\\', '/', trim($value))); if (empty($fileexclude[$key])) { unset($fileexclude[$key]); } } sort($fileexclude); BackWPup_Option::update($id, 'fileexclude', implode(',', $fileexclude)); $dirinclude = explode(',', stripslashes(str_replace(array("\r\n", "\r"), ',', $_POST['dirinclude']))); foreach ($dirinclude as $key => $value) { $dirinclude[$key] = trailingslashit(str_replace('//', '/', str_replace('\\', '/', trim($value)))); if ($dirinclude[$key] == '/' || empty($dirinclude[$key]) || !is_dir($dirinclude[$key])) { unset($dirinclude[$key]); } } sort($dirinclude); BackWPup_Option::update($id, 'dirinclude', implode(',', $dirinclude)); BackWPup_Option::update($id, 'backupexcludethumbs', isset($_POST['backupexcludethumbs']) && $_POST['backupexcludethumbs'] == 1 ? TRUE : FALSE); BackWPup_Option::update($id, 'backupspecialfiles', isset($_POST['backupspecialfiles']) && $_POST['backupspecialfiles'] == 1 ? TRUE : FALSE); BackWPup_Option::update($id, 'backuproot', isset($_POST['backuproot']) && $_POST['backuproot'] == 1 ? TRUE : FALSE); if (!isset($_POST['backuprootexcludedirs']) || !is_array($_POST['backuprootexcludedirs'])) { $_POST['backuprootexcludedirs'] = array(); } sort($_POST['backuprootexcludedirs']); BackWPup_Option::update($id, 'backuprootexcludedirs', $_POST['backuprootexcludedirs']); BackWPup_Option::update($id, 'backupcontent', isset($_POST['backupcontent']) && $_POST['backupcontent'] == 1 ? TRUE : FALSE); if (!isset($_POST['backupcontentexcludedirs']) || !is_array($_POST['backupcontentexcludedirs'])) { $_POST['backupcontentexcludedirs'] = array(); } sort($_POST['backupcontentexcludedirs']); BackWPup_Option::update($id, 'backupcontentexcludedirs', $_POST['backupcontentexcludedirs']); BackWPup_Option::update($id, 'backupplugins', isset($_POST['backupplugins']) && $_POST['backupplugins'] == 1 ? TRUE : FALSE); if (!isset($_POST['backuppluginsexcludedirs']) || !is_array($_POST['backuppluginsexcludedirs'])) { $_POST['backuppluginsexcludedirs'] = array(); } sort($_POST['backuppluginsexcludedirs']); BackWPup_Option::update($id, 'backuppluginsexcludedirs', $_POST['backuppluginsexcludedirs']); BackWPup_Option::update($id, 'backupthemes', isset($_POST['backupthemes']) && $_POST['backupthemes'] == 1 ? TRUE : FALSE); if (!isset($_POST['backupthemesexcludedirs']) || !is_array($_POST['backupthemesexcludedirs'])) { $_POST['backupthemesexcludedirs'] = array(); } sort($_POST['backupthemesexcludedirs']); BackWPup_Option::update($id, 'backupthemesexcludedirs', $_POST['backupthemesexcludedirs']); BackWPup_Option::update($id, 'backupuploads', isset($_POST['backupuploads']) && $_POST['backupuploads'] == 1 ? TRUE : FALSE); if (!isset($_POST['backupuploadsexcludedirs']) || !is_array($_POST['backupuploadsexcludedirs'])) { $_POST['backupuploadsexcludedirs'] = array(); } sort($_POST['backupuploadsexcludedirs']); BackWPup_Option::update($id, 'backupuploadsexcludedirs', $_POST['backupuploadsexcludedirs']); }
public function edit_form_post_save($id) { BackWPup_Option::update($id, 'widgetlistfile', BackWPup_Job::sanitize_file_name($_POST['widgetlistfile'])); }
protected function insert_or_update_jobs() { $settings = $_POST['settings']; if (!is_array($settings) || !isset($settings['value'])) { return array('error' => __('Missing array settings', $this->plugin_translate)); } if (!isset($settings['tab'])) { return array('error' => __('Missing tab', $this->plugin_translate)); } if (!isset($settings['job_id'])) { return array('error' => __('Missing job id', $this->plugin_translate)); } if (!class_exists('BackWPup')) { return array('error' => __('Install BackWPup on child website', $this->plugin_translate)); } if ($settings['job_id'] > 0) { $job_id = intval($settings['job_id']); } else { //generate jobid if not exists $newjobid = BackWPup_Option::get_job_ids(); sort($newjobid); $job_id = end($newjobid) + 1; } update_site_option('backwpup_messages', array()); foreach ($settings['value'] as $key => $val) { $_POST[$key] = $val; } BackWPup_Page_Editjob::save_post_form($settings['tab'], $job_id); $return = $this->check_backwpup_messages(); if (isset($return['error'])) { return array('success' => 1, 'error_message' => __('Cannot save jobs: ' . $return['error'], $this->plugin_translate)); } if (isset($settings['value']['sugarrefreshtoken'])) { BackWPup_Option::update($job_id, 'sugarrefreshtoken', $settings['value']['sugarrefreshtoken']); } if (isset($settings['value']['gdriverefreshtoken'])) { BackWPup_Option::update($job_id, 'gdriverefreshtoken', $settings['value']['gdriverefreshtoken']); } if (isset($settings['value']['dbdumpspecialsetalltables']) && $settings['value']['dbdumpspecialsetalltables']) { BackWPup_Option::update($job_id, 'dbdumpexclude', array()); } if (isset($settings['value']['dropboxtoken']) && isset($settings['value']['dropboxroot'])) { BackWPup_Option::update($job_id, 'dropboxtoken', $settings['value']['dropboxtoken']); BackWPup_Option::update($job_id, 'dropboxroot', $settings['value']['dropboxroot']); } $changes_array = array(); foreach ($settings['value'] as $key => $val) { $temp_value = BackWPup_Option::get($job_id, $key); if (is_string($temp_value)) { if (isset($this->exclusions[$settings['tab']])) { if (!in_array($key, $this->exclusions[$settings['tab']]) && strcmp($temp_value, $val) != 0) { $changes_array[$key] = $temp_value; } } else { if (strcmp($temp_value, $val) != 0) { $changes_array[$key] = $temp_value; } } } } return array('success' => 1, 'job_id' => $job_id, 'changes' => $changes_array, 'message' => $return['message']); }
/** * @param $job_object * @return bool */ public function job_run_archive(BackWPup_Job $job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { $job_object->log(sprintf(__('%d. Try to send backup file to an FTP server …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); } if (!empty($job_object->job['ftpssl'])) { //make SSL FTP connection if (function_exists('ftp_ssl_connect')) { $ftp_conn_id = ftp_ssl_connect($job_object->job['ftphost'], $job_object->job['ftphostport'], $job_object->job['ftptimeout']); if ($ftp_conn_id) { $job_object->log(sprintf(__('Connected via explicit SSL-FTP to server: %s', 'backwpup'), $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport']), E_USER_NOTICE); } else { $job_object->log(sprintf(__('Cannot connect via explicit SSL-FTP to server: %s', 'backwpup'), $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport']), E_USER_ERROR); return FALSE; } } else { $job_object->log(__('PHP function to connect with explicit SSL-FTP to server does not exist!', 'backwpup'), E_USER_ERROR); return TRUE; } } else { //make normal FTP connection if SSL not work $ftp_conn_id = ftp_connect($job_object->job['ftphost'], $job_object->job['ftphostport'], $job_object->job['ftptimeout']); if ($ftp_conn_id) { $job_object->log(sprintf(__('Connected to FTP server: %s', 'backwpup'), $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport']), E_USER_NOTICE); } else { $job_object->log(sprintf(__('Cannot connect to FTP server: %s', 'backwpup'), $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport']), E_USER_ERROR); return FALSE; } } //FTP Login $job_object->log(sprintf(__('FTP client command: %s', 'backwpup'), 'USER ' . $job_object->job['ftpuser']), E_USER_NOTICE); if ($loginok = @ftp_login($ftp_conn_id, $job_object->job['ftpuser'], BackWPup_Encryption::decrypt($job_object->job['ftppass']))) { $job_object->log(sprintf(__('FTP server response: %s', 'backwpup'), 'User ' . $job_object->job['ftpuser'] . ' logged in.'), E_USER_NOTICE); } else { //if PHP ftp login don't work use raw login $return = ftp_raw($ftp_conn_id, 'USER ' . $job_object->job['ftpuser']); $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), $return[0]), E_USER_NOTICE); if (substr(trim($return[0]), 0, 3) <= 400) { $job_object->log(sprintf(__('FTP client command: %s', 'backwpup'), 'PASS *******'), E_USER_NOTICE); $return = ftp_raw($ftp_conn_id, 'PASS ' . BackWPup_Encryption::decrypt($job_object->job['ftppass'])); if (substr(trim($return[0]), 0, 3) <= 400) { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), $return[0]), E_USER_NOTICE); $loginok = TRUE; } else { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), $return[0]), E_USER_ERROR); } } } if (!$loginok) { return FALSE; } //SYSTYPE $job_object->log(sprintf(__('FTP client command: %s', 'backwpup'), 'SYST'), E_USER_NOTICE); $systype = ftp_systype($ftp_conn_id); if ($systype) { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), $systype), E_USER_NOTICE); } else { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), __('Error getting SYSTYPE', 'backwpup')), E_USER_ERROR); } //set actual ftp dir to ftp dir if (empty($job_object->job['ftpdir'])) { $job_object->job['ftpdir'] = trailingslashit(ftp_pwd($ftp_conn_id)); } // prepend actual ftp dir if relative dir if (substr($job_object->job['ftpdir'], 0, 1) != '/') { $job_object->job['ftpdir'] = trailingslashit(ftp_pwd($ftp_conn_id)) . $job_object->job['ftpdir']; } //test ftp dir and create it if not exists if ($job_object->job['ftpdir'] != '/') { @ftp_chdir($ftp_conn_id, '/'); //go to root $ftpdirs = explode('/', trim($job_object->job['ftpdir'], '/')); foreach ($ftpdirs as $ftpdir) { if (empty($ftpdir)) { continue; } if (!@ftp_chdir($ftp_conn_id, $ftpdir)) { if (@ftp_mkdir($ftp_conn_id, $ftpdir)) { $job_object->log(sprintf(__('FTP Folder "%s" created!', 'backwpup'), $ftpdir), E_USER_NOTICE); ftp_chdir($ftp_conn_id, $ftpdir); } else { $job_object->log(sprintf(__('FTP Folder "%s" cannot be created!', 'backwpup'), $ftpdir), E_USER_ERROR); return FALSE; } } } } // Get the current working directory $current_ftp_dir = trailingslashit(ftp_pwd($ftp_conn_id)); if ($job_object->substeps_done == 0) { $job_object->log(sprintf(__('FTP current folder is: %s', 'backwpup'), $current_ftp_dir), E_USER_NOTICE); } //get file size to resume upload @clearstatcache(); $job_object->substeps_done = @ftp_size($ftp_conn_id, $job_object->job['ftpdir'] . $job_object->backup_file); if ($job_object->substeps_done == -1) { $job_object->substeps_done = 0; } //PASV $job_object->log(sprintf(__('FTP client command: %s', 'backwpup'), 'PASV'), E_USER_NOTICE); if ($job_object->job['ftppasv']) { if (ftp_pasv($ftp_conn_id, TRUE)) { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), __('Entering passive mode', 'backwpup')), E_USER_NOTICE); } else { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), __('Cannot enter passive mode', 'backwpup')), E_USER_WARNING); } } else { if (ftp_pasv($ftp_conn_id, FALSE)) { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), __('Entering normal mode', 'backwpup')), E_USER_NOTICE); } else { $job_object->log(sprintf(__('FTP server reply: %s', 'backwpup'), __('Cannot enter normal mode', 'backwpup')), E_USER_WARNING); } } if ($job_object->substeps_done < $job_object->backup_filesize) { $job_object->log(__('Starting upload to FTP  …', 'backwpup'), E_USER_NOTICE); if ($fp = fopen($job_object->backup_folder . $job_object->backup_file, 'rb')) { //go to actual file pos fseek($fp, $job_object->substeps_done); $ret = ftp_nb_fput($ftp_conn_id, $current_ftp_dir . $job_object->backup_file, $fp, FTP_BINARY, $job_object->substeps_done); while ($ret == FTP_MOREDATA) { $job_object->substeps_done = ftell($fp); $job_object->update_working_data(); $job_object->do_restart_time(); $ret = ftp_nb_continue($ftp_conn_id); } if ($ret != FTP_FINISHED) { $job_object->log(__('Cannot transfer backup to FTP server!', 'backwpup'), E_USER_ERROR); return FALSE; } else { $job_object->substeps_done = $job_object->backup_filesize + 1; $job_object->log(sprintf(__('Backup transferred to FTP server: %s', 'backwpup'), $current_ftp_dir . $job_object->backup_file), E_USER_NOTICE); if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', "ftp://" . $job_object->job['ftpuser'] . ":" . BackWPup_Encryption::decrypt($job_object->job['ftppass']) . "@" . $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport'] . $current_ftp_dir . $job_object->backup_file); } } fclose($fp); } else { $job_object->log(__('Can not open source file for transfer.', 'backwpup'), E_USER_ERROR); return FALSE; } } $backupfilelist = array(); $filecounter = 0; $files = array(); if ($filelist = ftp_nlist($ftp_conn_id, '.')) { foreach ($filelist as $file) { if (basename($file) != '.' && basename($file) != '..') { if ($job_object->is_backup_archive($file)) { $time = ftp_mdtm($ftp_conn_id, $file); if ($time != -1) { $backupfilelist[$time] = basename($file); } else { $backupfilelist[] = basename($file); } } $files[$filecounter]['folder'] = 'ftp://' . $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport'] . $job_object->job['ftpdir']; $files[$filecounter]['file'] = $job_object->job['ftpdir'] . basename($file); $files[$filecounter]['filename'] = basename($file); $files[$filecounter]['downloadurl'] = 'ftp://' . rawurlencode($job_object->job['ftpuser']) . ':' . rawurlencode(BackWPup_Encryption::decrypt($job_object->job['ftppass'])) . '@' . $job_object->job['ftphost'] . ':' . $job_object->job['ftphostport'] . $job_object->job['ftpdir'] . basename($file); $files[$filecounter]['filesize'] = ftp_size($ftp_conn_id, $file); $files[$filecounter]['time'] = ftp_mdtm($ftp_conn_id, $file); $filecounter++; } } } if (!empty($job_object->job['ftpmaxbackups']) && $job_object->job['ftpmaxbackups'] > 0) { //Delete old backups if (count($backupfilelist) > $job_object->job['ftpmaxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['ftpmaxbackups']) { break; } if (ftp_delete($ftp_conn_id, $file)) { //delete files on ftp foreach ($files as $key => $filedata) { if ($filedata['file'] == $job_object->job['ftpdir'] . $file) { unset($files[$key]); } } $numdeltefiles++; } else { $job_object->log(sprintf(__('Cannot delete "%s" on FTP server!', 'backwpup'), $job_object->job['ftpdir'] . $file), E_USER_ERROR); } } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on FTP server', '%d files deleted on FTP server', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_ftp', $files, YEAR_IN_SECONDS); $job_object->substeps_done++; ftp_close($ftp_conn_id); return TRUE; }
/** * @param $id */ public function edit_form_post_save($id) { BackWPup_Option::update($id, 'wpexportcontent', $_POST['wpexportcontent']); BackWPup_Option::update($id, 'wpexportfile', BackWPup_Job::sanitize_file_name($_POST['wpexportfile'])); if ($_POST['wpexportfilecompression'] == '' || $_POST['wpexportfilecompression'] == '.gz' || $_POST['wpexportfilecompression'] == '.bz2') { BackWPup_Option::update($id, 'wpexportfilecompression', $_POST['wpexportfilecompression']); } }
/** * @param $id */ public function edit_form_post_save($id) { BackWPup_Option::update($id, 'pluginlistfile', sanitize_file_name($_POST['pluginlistfile'])); if ($_POST['pluginlistfilecompression'] == '' || $_POST['pluginlistfilecompression'] == '.gz' || $_POST['pluginlistfilecompression'] == '.bz2') { BackWPup_Option::update($id, 'pluginlistfilecompression', $_POST['pluginlistfilecompression']); } }
/** * @param $id */ public function edit_form_post_save($id) { global $wpdb; /* @var wpdb $wpdb */ if ($_POST['dbdumpfilecompression'] == '' || $_POST['dbdumpfilecompression'] == '.gz') { BackWPup_Option::update($id, 'dbdumpfilecompression', $_POST['dbdumpfilecompression']); } BackWPup_Option::update($id, 'dbdumpfile', sanitize_file_name($_POST['dbdumpfile'])); //selected tables $dbdumpexclude = array(); $checked_db_tables = array(); if (isset($_POST['tabledb'])) { foreach ($_POST['tabledb'] as $dbtable) { $checked_db_tables[] = rawurldecode($dbtable); } } $dbtables = $wpdb->get_results('SHOW TABLES FROM `' . DB_NAME . '`', ARRAY_N); foreach ($dbtables as $dbtable) { if (!in_array($dbtable[0], $checked_db_tables)) { $dbdumpexclude[] = $dbtable[0]; } } BackWPup_Option::update($id, 'dbdumpexclude', $dbdumpexclude); }
/** * @param $job_object BAckWPup_Job * @return bool */ public function job_run_archive(BackWPup_Job $job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { $job_object->log(sprintf(__('%d. Trying to send backup file to S3 Service …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); } try { $s3 = Aws\S3\S3Client::factory(array('key' => $job_object->job['s3accesskey'], 'secret' => BackWPup_Encryption::decrypt($job_object->job['s3secretkey']), 'region' => $job_object->job['s3region'], 'base_url' => $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']), 'scheme' => 'https', 'ssl.certificate_authority' => BackWPup::get_plugin_data('cacert'))); if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY'] && $job_object->substeps_done < $job_object->backup_filesize) { if ($s3->doesBucketExist($job_object->job['s3bucket'])) { $bucketregion = $s3->getBucketLocation(array('Bucket' => $job_object->job['s3bucket'])); $job_object->log(sprintf(__('Connected to S3 Bucket "%1$s" in %2$s', 'backwpup'), $job_object->job['s3bucket'], $bucketregion->get('Location')), E_USER_NOTICE); } else { $job_object->log(sprintf(__('S3 Bucket "%s" does not exist!', 'backwpup'), $job_object->job['s3bucket']), E_USER_ERROR); return TRUE; } if ($job_object->job['s3multipart'] && empty($job_object->steps_data[$job_object->step_working]['UploadId'])) { //Check for aboded Multipart Uploads $job_object->log(__('Checking for not aborted multipart Uploads …', 'backwpup')); $multipart_uploads = $s3->listMultipartUploads(array('Bucket' => $job_object->job['s3bucket'], 'Prefix' => (string) $job_object->job['s3dir'])); $uploads = $multipart_uploads->get('Uploads'); if (!empty($uploads)) { foreach ($uploads as $upload) { $s3->abortMultipartUpload(array('Bucket' => $job_object->job['s3bucket'], 'Key' => $upload['Key'], 'UploadId' => $upload['UploadId'])); $job_object->log(sprintf(__('Upload for %s aborted.', 'backwpup'), $upload['Key'])); } } } //transfer file to S3 $job_object->log(__('Starting upload to S3 Service …', 'backwpup')); } if (!$job_object->job['s3multipart'] || $job_object->backup_filesize < 1048576 * 6) { //Prepare Upload if (!($up_file_handle = fopen($job_object->backup_folder . $job_object->backup_file, 'rb'))) { $job_object->log(__('Can not open source file for transfer.', 'backwpup'), E_USER_ERROR); return FALSE; } $create_args = array(); $create_args['Bucket'] = $job_object->job['s3bucket']; $create_args['ACL'] = 'private'; //encrxption if (!empty($job_object->job['s3ssencrypt'])) { $create_args['ServerSideEncryption'] = $job_object->job['s3ssencrypt']; } //Storage Class if (!empty($job_object->job['s3storageclass'])) { $create_args['StorageClass'] = $job_object->job['s3storageclass']; } $create_args['Metadata'] = array('BackupTime' => date('Y-m-d H:i:s', $job_object->start_time)); $create_args['Body'] = $up_file_handle; $create_args['Key'] = $job_object->job['s3dir'] . $job_object->backup_file; $create_args['ContentType'] = $job_object->get_mime_type($job_object->backup_folder . $job_object->backup_file); try { $s3->putObject($create_args); } catch (Aws\Common\Exception\MultipartUploadException $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } } else { //Prepare Upload if ($file_handle = fopen($job_object->backup_folder . $job_object->backup_file, 'rb')) { fseek($file_handle, $job_object->substeps_done); try { if (empty($job_object->steps_data[$job_object->step_working]['UploadId'])) { $args = array('ACL' => 'private', 'Bucket' => $job_object->job['s3bucket'], 'ContentType' => $job_object->get_mime_type($job_object->backup_folder . $job_object->backup_file), 'Key' => $job_object->job['s3dir'] . $job_object->backup_file); if (!empty($job_object->job['s3ssencrypt'])) { $args['ServerSideEncryption'] = $job_object->job['s3ssencrypt']; } if (!empty($job_object->job['s3storageclass'])) { $args['StorageClass'] = empty($job_object->job['s3storageclass']) ? '' : $job_object->job['s3storageclass']; } $upload = $s3->createMultipartUpload($args); $job_object->steps_data[$job_object->step_working]['UploadId'] = $upload->get('UploadId'); $job_object->steps_data[$job_object->step_working]['Parts'] = array(); $job_object->steps_data[$job_object->step_working]['Part'] = 1; } while (!feof($file_handle)) { $chunk_upload_start = microtime(TRUE); $part_data = fread($file_handle, 1048576 * 5); //5MB Minimum part size $part = $s3->uploadPart(array('Bucket' => $job_object->job['s3bucket'], 'UploadId' => $job_object->steps_data[$job_object->step_working]['UploadId'], 'Key' => $job_object->job['s3dir'] . $job_object->backup_file, 'PartNumber' => $job_object->steps_data[$job_object->step_working]['Part'], 'Body' => $part_data)); $chunk_upload_time = microtime(TRUE) - $chunk_upload_start; $job_object->substeps_done = $job_object->substeps_done + strlen($part_data); $job_object->steps_data[$job_object->step_working]['Parts'][] = array('ETag' => $part->get('ETag'), 'PartNumber' => $job_object->steps_data[$job_object->step_working]['Part']); $job_object->steps_data[$job_object->step_working]['Part']++; $time_remaining = $job_object->do_restart_time(); if ($time_remaining < $chunk_upload_time) { $job_object->do_restart_time(TRUE); } $job_object->update_working_data(); } $s3->completeMultipartUpload(array('Bucket' => $job_object->job['s3bucket'], 'UploadId' => $job_object->steps_data[$job_object->step_working]['UploadId'], 'Key' => $job_object->job['s3dir'] . $job_object->backup_file, 'Parts' => $job_object->steps_data[$job_object->step_working]['Parts'])); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); if (!empty($job_object->steps_data[$job_object->step_working]['uploadId'])) { $s3->abortMultipartUpload(array('Bucket' => $job_object->job['s3bucket'], 'UploadId' => $job_object->steps_data[$job_object->step_working]['uploadId'], 'Key' => $job_object->job['s3dir'] . $job_object->backup_file)); } unset($job_object->steps_data[$job_object->step_working]['UploadId']); unset($job_object->steps_data[$job_object->step_working]['Parts']); unset($job_object->steps_data[$job_object->step_working]['Part']); $job_object->substeps_done = 0; if (is_resource($file_handle)) { fclose($file_handle); } return FALSE; } fclose($file_handle); } else { $job_object->log(__('Can not open source file for transfer.', 'backwpup'), E_USER_ERROR); return FALSE; } } $result = $s3->headObject(array('Bucket' => $job_object->job['s3bucket'], 'Key' => $job_object->job['s3dir'] . $job_object->backup_file)); if ($result->get('ContentLength') == filesize($job_object->backup_folder . $job_object->backup_file)) { $job_object->substeps_done = 1 + $job_object->backup_filesize; $job_object->log(sprintf(__('Backup transferred to %s.', 'backwpup'), $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . $job_object->job['s3dir'] . $job_object->backup_file), E_USER_NOTICE); if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job['s3dir'] . $job_object->backup_file . '&jobid=' . $job_object->job['jobid']); } } else { $job_object->log(sprintf(__('Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup'), $result->get("status"), $result->get("Message")), E_USER_ERROR); } } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } try { $backupfilelist = array(); $filecounter = 0; $files = array(); $args = array('Bucket' => $job_object->job['s3bucket'], 'Prefix' => (string) $job_object->job['s3dir']); $objects = $s3->getIterator('ListObjects', $args); if (is_object($objects)) { foreach ($objects as $object) { $file = basename($object['Key']); $changetime = strtotime($object['LastModified']) + get_option('gmt_offset') * 3600; if ($job_object->is_backup_archive($file)) { $backupfilelist[$changetime] = $file; } $files[$filecounter]['folder'] = $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . dirname($object['Key']); $files[$filecounter]['file'] = $object['Key']; $files[$filecounter]['filename'] = basename($object['Key']); if (!empty($object['StorageClass'])) { $files[$filecounter]['info'] = sprintf(__('Storage Class: %s', 'backwpup'), $object['StorageClass']); } $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloads3&file=' . $object['Key'] . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = $object['Size']; $files[$filecounter]['time'] = $changetime; $filecounter++; } } if ($job_object->job['s3maxbackups'] > 0 && is_object($s3)) { //Delete old backups if (count($backupfilelist) > $job_object->job['s3maxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['s3maxbackups']) { break; } //delete files on S3 $args = array('Bucket' => $job_object->job['s3bucket'], 'Key' => $job_object->job['s3dir'] . $file); if ($s3->deleteObject($args)) { foreach ($files as $key => $filedata) { if ($filedata['file'] == $job_object->job['s3dir'] . $file) { unset($files[$key]); } } $numdeltefiles++; } else { $job_object->log(sprintf(__('Cannot delete backup from %s.', 'backwpup'), $this->get_s3_base_url($job_object->job['s3region'], $job_object->job['s3base_url']) . '/' . $job_object->job['s3bucket'] . '/' . $job_object->job['s3dir'] . $file), E_USER_ERROR); } } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_s3', $files, YEAR_IN_SECONDS); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('S3 Service API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done = 2 + $job_object->backup_filesize; return TRUE; }
/** * * Called on job stop makes cleanup and terminates the script * */ private function end() { $this->step_working = 'END'; $this->substeps_todo = 1; if (!file_exists(BackWPup::get_plugin_data('running_file'))) { $this->log(__('Aborted by user!', 'backwpup'), E_USER_ERROR); } //delete old logs if (get_site_option('backwpup_cfg_maxlogs')) { $log_file_list = array(); $log_folder = trailingslashit(dirname($this->logfile)); if (is_readable($log_folder) && ($dir = opendir($log_folder))) { //make file list while (($file = readdir($dir)) !== false) { if (strpos($file, 'backwpup_log_') == 0 && false !== strpos($file, '.html')) { $log_file_list[filemtime($log_folder . $file)] = $file; } } closedir($dir); } if (sizeof($log_file_list) > 0) { krsort($log_file_list, SORT_NUMERIC); $num_delete_files = 0; $i = -1; foreach ($log_file_list as $log_file) { $i++; if ($i < get_site_option('backwpup_cfg_maxlogs')) { continue; } unlink($log_folder . $log_file); $num_delete_files++; } if ($num_delete_files > 0) { $this->log(sprintf(_n('One old log deleted', '%d old logs deleted', $num_delete_files, 'backwpup'), $num_delete_files)); } } } //Display job working time if ($this->errors > 0) { $this->log(sprintf(__('Job has ended with errors in %s seconds. You must resolve the errors for correct execution.', 'backwpup'), current_time('timestamp') - $this->start_time), E_USER_ERROR); } elseif ($this->warnings > 0) { $this->log(sprintf(__('Job finished with warnings in %s seconds. Please resolve them for correct execution.', 'backwpup'), current_time('timestamp') - $this->start_time), E_USER_WARNING); } else { $this->log(sprintf(__('Job done in %s seconds.', 'backwpup'), current_time('timestamp') - $this->start_time)); } //Update job options $this->job['lastruntime'] = current_time('timestamp') - $this->start_time; BackWPup_Option::update($this->job['jobid'], 'lastruntime', $this->job['lastruntime']); //write header info if (!empty($this->logfile)) { if ($fd = fopen($this->logfile, 'r+')) { $filepos = ftell($fd); $found = 0; while (!feof($fd)) { $line = fgets($fd); if (stripos($line, '<meta name="backwpup_jobruntime"') !== false) { fseek($fd, $filepos); fwrite($fd, str_pad('<meta name="backwpup_jobruntime" content="' . $this->job['lastruntime'] . '" />', 100) . PHP_EOL); $found++; } if (stripos($line, '<meta name="backwpup_backupfilesize"') !== false) { fseek($fd, $filepos); fwrite($fd, str_pad('<meta name="backwpup_backupfilesize" content="' . $this->backup_filesize . '" />', 100) . PHP_EOL); $found++; } if ($found >= 2) { break; } $filepos = ftell($fd); } fclose($fd); } //Send mail with log $sendmail = false; if ($this->job['mailaddresslog']) { $sendmail = true; } if ($this->errors === 0 && $this->job['mailerroronly']) { $sendmail = false; } if ($sendmail) { //special subject $status = __('SUCCESSFUL', 'backwpup'); if ($this->warnings > 0) { $status = __('WARNING', 'backwpup'); } if ($this->errors > 0) { $status = __('ERROR', 'backwpup'); } $subject = sprintf(__('[%3$s] BackWPup log %1$s: %2$s', 'backwpup'), date_i18n('d-M-Y H:i', $this->start_time, true), esc_attr($this->job['name']), $status); $headers = array(); $headers[] = 'Content-Type: text/html; charset=' . get_bloginfo('charset'); if ($this->job['mailaddresssenderlog']) { $this->job['mailaddresssenderlog'] = str_replace(array('<', '>'), array('<', '>'), $this->job['mailaddresssenderlog']); $bracket_pos = strpos($this->job['mailaddresssenderlog'], '<'); $at_pos = strpos($this->job['mailaddresssenderlog'], '@'); if ($bracket_pos === false || $at_pos === false) { $this->job['mailaddresssenderlog'] = str_replace(array('<', '>'), '', $this->job['mailaddresssenderlog']) . ' <' . get_bloginfo('admin_email') . '>'; } $headers[] = 'From: ' . $this->job['mailaddresssenderlog']; } wp_mail($this->job['mailaddresslog'], $subject, file_get_contents($this->logfile), $headers); } } //set done $this->substeps_done = 1; $this->steps_done[] = 'END'; //clean up temp self::clean_temp_folder(); //remove shutdown action remove_action('shutdown', array($this, 'shutdown')); restore_exception_handler(); restore_error_handler(); //logfile end file_put_contents($this->logfile, "</body>" . PHP_EOL . "</html>", FILE_APPEND); BackWPup_Cron::check_cleanup(); exit; }
/** * @param $job_object BAckWPup_Job * @return bool */ public function job_run_archive(BackWPup_Job $job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; $job_object->substeps_done = 0; $job_object->log(sprintf(__('%d. Trying to send backup file to Rackspace cloud …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); try { $conn = new OpenCloud\Rackspace(self::get_auth_url_by_region($job_object->job['rscregion']), array('username' => $job_object->job['rscusername'], 'apiKey' => BackWPup_Encryption::decrypt($job_object->job['rscapikey']))); //connect to cloud files $ostore = $conn->objectStoreService('cloudFiles', $job_object->job['rscregion'], 'publicURL'); $container = $ostore->getContainer($job_object->job['rsccontainer']); $job_object->log(sprintf(__('Connected to Rackspace cloud files container %s', 'backwpup'), $job_object->job['rsccontainer'])); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Rackspace Cloud API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } try { //Transfer Backup to Rackspace Cloud $job_object->substeps_done = 0; $job_object->log(__('Upload to Rackspace cloud started …', 'backwpup'), E_USER_NOTICE); if ($handle = fopen($job_object->backup_folder . $job_object->backup_file, 'rb')) { $uploded = $container->uploadObject($job_object->job['rscdir'] . $job_object->backup_file, $handle); fclose($handle); } else { $job_object->log(__('Can not open source file for transfer.', 'backwpup'), E_USER_ERROR); return FALSE; } // $transfer = $container->setupObjectTransfer( array( // 'name' => $job_object->job[ 'rscdir' ] . $job_object->backup_file, // 'path' => $job_object->backup_folder . $job_object->backup_file, // 'concurrency' => 1, // 'partSize' => 4 * 1024 * 1024 // ) ); // $uploded = $transfer->upload(); if ($uploded) { $job_object->log(__('Backup File transferred to RSC://', 'backwpup') . $job_object->job['rsccontainer'] . '/' . $job_object->job['rscdir'] . $job_object->backup_file, E_USER_NOTICE); $job_object->substeps_done = 1 + $job_object->backup_filesize; if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadrsc&file=' . $job_object->job['rscdir'] . $job_object->backup_file . '&jobid=' . $job_object->job['jobid']); } } else { $job_object->log(__('Cannot transfer backup to Rackspace cloud.', 'backwpup'), E_USER_ERROR); return FALSE; } } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Rackspace Cloud API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } try { $backupfilelist = array(); $filecounter = 0; $files = array(); $objlist = $container->objectList(array('prefix' => $job_object->job['rscdir'])); while ($object = $objlist->next()) { $file = basename($object->getName()); if ($job_object->job['rscdir'] . $file == $object->getName()) { //only in the folder and not in complete bucket if ($job_object->is_backup_archive($file)) { $backupfilelist[strtotime($object->getLastModified())] = $object; } } $files[$filecounter]['folder'] = "RSC://" . $job_object->job['rsccontainer'] . "/" . dirname($object->getName()) . "/"; $files[$filecounter]['file'] = $object->getName(); $files[$filecounter]['filename'] = basename($object->getName()); $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadrsc&file=' . $object->getName() . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = $object->getContentLength(); $files[$filecounter]['time'] = strtotime($object->getLastModified()); $filecounter++; } if (!empty($job_object->job['rscmaxbackups']) && $job_object->job['rscmaxbackups'] > 0) { //Delete old backups if (count($backupfilelist) > $job_object->job['rscmaxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['rscmaxbackups']) { break; } foreach ($files as $key => $filedata) { if ($filedata['file'] == $file->getName()) { unset($files[$key]); } } $file->delete(); $numdeltefiles++; } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on Rackspace cloud container.', '%d files deleted on Rackspace cloud container.', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_rsc', $files, 60 * 60 * 24 * 7); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Rackspace Cloud API: %s', 'backwpup'), $e->getMessage()), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done++; return TRUE; }
/** * @param $job_object * @return bool */ public function job_run_archive(&$job_object) { $job_object->substeps_todo = $job_object->backup_filesize + 2; if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { $job_object->log(sprintf(__('%d. Try sending backup to a Microsoft Azure (Blob) …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); } try { set_include_path(get_include_path() . PATH_SEPARATOR . BackWPup::get_plugin_data('plugindir') . '/vendor/PEAR/'); /* @var $blobRestProxy WindowsAzure\Blob\BlobRestProxy */ //https causes an error SSL: Connection reset by peer that is why http $blobRestProxy = WindowsAzure\Common\ServicesBuilder::getInstance()->createBlobService('DefaultEndpointsProtocol=http;AccountName=' . $job_object->job['msazureaccname'] . ';AccountKey=' . BackWPup_Encryption::decrypt($job_object->job['msazurekey'])); if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { //test vor existing container $containers = $blobRestProxy->listContainers()->getContainers(); $container_url = ''; foreach ($containers as $container) { if ($container->getName() == $job_object->job['msazurecontainer']) { $container_url = $container->getUrl(); break; } } if (empty($container_url)) { $job_object->log(sprintf(__('MS Azure container "%s" does not exist!', 'backwpup'), $job_object->job['msazurecontainer']), E_USER_ERROR); return TRUE; } else { $job_object->log(sprintf(__('Connected to MS Azure container "%s".', 'backwpup'), $job_object->job['msazurecontainer']), E_USER_NOTICE); } $job_object->log(__('Starting upload to MS Azure …', 'backwpup'), E_USER_NOTICE); } //Prepare Upload $file_handel = fopen($job_object->backup_folder . $job_object->backup_file, 'rb'); fseek($file_handel, $job_object->substeps_done); if (empty($job_object->steps_data[$job_object->step_working]['BlockList'])) { $job_object->steps_data[$job_object->step_working]['BlockList'] = array(); } while (!feof($file_handel)) { $chunk_upload_start = microtime(TRUE); $block_count = count($job_object->steps_data[$job_object->step_working]['BlockList']) + 1; $data = fread($file_handel, 1048576 * 4); //4MB $block_id = md5($data) . str_pad($block_count, 6, "0", STR_PAD_LEFT); $blobRestProxy->createBlobBlock($job_object->job['msazurecontainer'], $job_object->job['msazuredir'] . $job_object->backup_file, $block_id, $data); $job_object->steps_data[$job_object->step_working]['BlockList'][] = $block_id; $chunk_upload_time = microtime(TRUE) - $chunk_upload_start; $job_object->substeps_done = $job_object->substeps_done + strlen($data); $time_remaining = $job_object->do_restart_time(); if ($time_remaining < $chunk_upload_time) { $job_object->do_restart_time(TRUE); } $job_object->update_working_data(); } fclose($file_handel); //crate blog list $blocklist = new WindowsAzure\Blob\Models\BlockList(); foreach ($job_object->steps_data[$job_object->step_working]['BlockList'] as $block_id) { $blocklist->addUncommittedEntry($block_id); } unset($job_object->steps_data[$job_object->step_working]['BlockList']); //Commit Blocks $blobRestProxy->commitBlobBlocks($job_object->job['msazurecontainer'], $job_object->job['msazuredir'] . $job_object->backup_file, $blocklist->getEntries()); $job_object->substeps_done++; $job_object->log(sprintf(__('Backup transferred to %s', 'backwpup'), $container_url . '/' . $job_object->job['msazuredir'] . $job_object->backup_file), E_USER_NOTICE); if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadmsazure&file=' . $job_object->job['msazuredir'] . $job_object->backup_file . '&jobid=' . $job_object->job['jobid']); } } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Microsoft Azure API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine()); $job_object->substeps_done = 0; unset($job_object->steps_data[$job_object->step_working]['BlockList']); if (isset($file_handel) && is_resource($file_handel)) { fclose($file_handel); } return FALSE; } try { $backupfilelist = array(); $filecounter = 0; $files = array(); $blob_options = new WindowsAzure\Blob\Models\ListBlobsOptions(); $blob_options->setPrefix($job_object->job['msazuredir']); $blobs = $blobRestProxy->listBlobs($job_object->job['msazurecontainer'], $blob_options)->getBlobs(); if (is_array($blobs)) { foreach ($blobs as $blob) { $file = basename($blob->getName()); if ($job_object->is_backup_archive($file)) { $backupfilelist[$blob->getProperties()->getLastModified()->getTimestamp()] = $file; } $files[$filecounter]['folder'] = $container_url . "/" . dirname($blob->getName()) . "/"; $files[$filecounter]['file'] = $blob->getName(); $files[$filecounter]['filename'] = basename($blob->getName()); $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloadmsazure&file=' . $blob->getName() . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = $blob->getProperties()->getContentLength(); $files[$filecounter]['time'] = $blob->getProperties()->getLastModified()->getTimestamp() + get_option('gmt_offset') * 3600; $filecounter++; } } // Delete old backups if (!empty($job_object->job['msazuremaxbackups']) && $job_object->job['msazuremaxbackups'] > 0) { if (count($backupfilelist) > $job_object->job['msazuremaxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['msazuremaxbackups']) { break; } $blobRestProxy->deleteBlob($job_object->job['msazurecontainer'], $job_object->job['msazuredir'] . $file); foreach ($files as $key => $filedata) { if ($filedata['file'] == $job_object->job['msazuredir'] . $file) { unset($files[$key]); } } $numdeltefiles++; } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted on Microsoft Azure container.', '%d files deleted on Microsoft Azure container.', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_msazure', $files, 60 * 60 * 24 * 7); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Microsoft Azure API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done = $job_object->backup_filesize + 2; return TRUE; }
/** * @param $jobid */ public function edit_form_post_save($jobid) { BackWPup_Option::update($jobid, 'emailaddress', isset($_POST['emailaddress']) ? sanitize_email($_POST['emailaddress']) : ''); BackWPup_Option::update($jobid, 'emailefilesize', isset($_POST['emailefilesize']) ? (int) $_POST['emailefilesize'] : 0); BackWPup_Option::update($jobid, 'emailsndemail', sanitize_email($_POST['emailsndemail'])); BackWPup_Option::update($jobid, 'emailmethod', $_POST['emailmethod'] == '' || $_POST['emailmethod'] == 'mail' || $_POST['emailmethod'] == 'sendmail' || $_POST['emailmethod'] == 'smtp' ? $_POST['emailmethod'] : ''); BackWPup_Option::update($jobid, 'emailsendmail', $_POST['emailsendmail']); BackWPup_Option::update($jobid, 'emailsndemailname', $_POST['emailsndemailname']); BackWPup_Option::update($jobid, 'emailhost', $_POST['emailhost']); BackWPup_Option::update($jobid, 'emailhostport', (int) $_POST['emailhostport']); BackWPup_Option::update($jobid, 'emailsecure', $_POST['emailsecure'] == 'ssl' || $_POST['emailsecure'] == 'tls' ? $_POST['emailsecure'] : ''); BackWPup_Option::update($jobid, 'emailuser', $_POST['emailuser']); BackWPup_Option::update($jobid, 'emailpass', BackWPup_Encryption::encrypt($_POST['emailpass'])); }
/** * @param $job_object * @return bool */ public function job_run_archive(&$job_object) { $job_object->substeps_todo = 2 + $job_object->backup_filesize; if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { $job_object->log(sprintf(__('%d. Try to send backup file to Dropbox …', 'backwpup'), $job_object->steps_data[$job_object->step_working]['STEP_TRY']), E_USER_NOTICE); } try { $dropbox = new BackWPup_Destination_Dropbox_API($job_object->job['dropboxroot']); // set the tokens $dropbox->setOAuthTokens($job_object->job['dropboxtoken'], BackWPup_Encryption::decrypt($job_object->job['dropboxsecret'])); //get account info if ($job_object->steps_data[$job_object->step_working]['SAVE_STEP_TRY'] != $job_object->steps_data[$job_object->step_working]['STEP_TRY']) { $info = $dropbox->accountInfo(); if (!empty($info['uid'])) { $job_object->log(sprintf(__('Authenticated with Dropbox of user %s', 'backwpup'), $info['display_name'] . ' (' . $info['email'] . ')'), E_USER_NOTICE); } else { $job_object->log(__('Not Authenticated with Dropbox!', 'backwpup'), E_USER_ERROR); return FALSE; } // put the file $job_object->log(__('Uploading to Dropbox …', 'backwpup'), E_USER_NOTICE); } self::$backwpup_job_object =& $job_object; if ($job_object->substeps_done < $job_object->backup_filesize) { //only if upload not complete $response = $dropbox->upload($job_object->backup_folder . $job_object->backup_file, $job_object->job['dropboxdir'] . $job_object->backup_file); if ($response['bytes'] == $job_object->backup_filesize) { if (!empty($job_object->job['jobid'])) { BackWPup_Option::update($job_object->job['jobid'], 'lastbackupdownloadurl', network_admin_url('admin.php') . '?page=backwpupbackups&action=downloaddropbox&file=' . ltrim($response['path'], '/') . '&jobid=' . $job_object->job['jobid']); } $job_object->substeps_done = 1 + $job_object->backup_filesize; $job_object->log(sprintf(__('Backup transferred to %s', 'backwpup'), 'https://api-content.dropbox.com/1/files/' . $job_object->job['dropboxroot'] . $response['path']), E_USER_NOTICE); } else { if ($response['bytes'] != $job_object->backup_filesize) { $job_object->log(__('Uploaded file size and local file size don\'t match.', 'backwpup'), E_USER_ERROR); } else { $job_object->log(sprintf(__('Error transfering backup to %s.', 'backwpup') . ' ' . $response['error'], __('Dropbox', 'backwpup')), E_USER_ERROR); } return FALSE; } } $backupfilelist = array(); $filecounter = 0; $files = array(); $metadata = $dropbox->metadata($job_object->job['dropboxdir']); if (is_array($metadata)) { foreach ($metadata['contents'] as $data) { if ($data['is_dir'] != TRUE) { $file = basename($data['path']); if ($job_object->is_backup_archive($file)) { $backupfilelist[strtotime($data['modified'])] = $file; } $files[$filecounter]['folder'] = "https://api-content.dropbox.com/1/files/" . $job_object->job['dropboxroot'] . dirname($data['path']) . "/"; $files[$filecounter]['file'] = $data['path']; $files[$filecounter]['filename'] = basename($data['path']); $files[$filecounter]['downloadurl'] = network_admin_url('admin.php') . '?page=backwpupbackups&action=downloaddropbox&file=' . $data['path'] . '&jobid=' . $job_object->job['jobid']; $files[$filecounter]['filesize'] = $data['bytes']; $files[$filecounter]['time'] = strtotime($data['modified']) + get_option('gmt_offset') * 3600; $filecounter++; } } } if ($job_object->job['dropboxmaxbackups'] > 0 && is_object($dropbox)) { //Delete old backups if (count($backupfilelist) > $job_object->job['dropboxmaxbackups']) { ksort($backupfilelist); $numdeltefiles = 0; while ($file = array_shift($backupfilelist)) { if (count($backupfilelist) < $job_object->job['dropboxmaxbackups']) { break; } $response = $dropbox->fileopsDelete($job_object->job['dropboxdir'] . $file); //delete files on Cloud if ($response['is_deleted'] == 'true') { foreach ($files as $key => $filedata) { if ($filedata['file'] == '/' . $job_object->job['dropboxdir'] . $file) { unset($files[$key]); } } $numdeltefiles++; } else { $job_object->log(sprintf(__('Error while deleting file from Dropbox: %s', 'backwpup'), $file), E_USER_ERROR); } } if ($numdeltefiles > 0) { $job_object->log(sprintf(_n('One file deleted from Dropbox', '%d files deleted on Dropbox', $numdeltefiles, 'backwpup'), $numdeltefiles), E_USER_NOTICE); } } } set_site_transient('backwpup_' . $job_object->job['jobid'] . '_dropbox', $files, 60 * 60 * 24 * 7); } catch (Exception $e) { $job_object->log(E_USER_ERROR, sprintf(__('Dropbox API: %s', 'backwpup'), htmlentities($e->getMessage())), $e->getFile(), $e->getLine()); return FALSE; } $job_object->substeps_done++; return TRUE; }
/** * * Called on job stop makes cleanup and terminates the script * */ private function end() { $this->step_working = 'END'; $this->substeps_todo = 1; $abort = FALSE; if (!file_exists(BackWPup::get_plugin_data('running_file'))) { if (!$this->user_abort) { $abort = TRUE; } $this->log(__('Aborted by user!', 'backwpup'), E_USER_ERROR); } //delete old logs if (get_site_option('backwpup_cfg_maxlogs')) { $log_file_list = array(); $log_folder = trailingslashit(dirname($this->logfile)); if (is_readable($log_folder) && ($dir = opendir($log_folder))) { //make file list while (($file = readdir($dir)) !== FALSE) { if (strpos($file, 'backwpup_log_') == 0 && FALSE !== strpos($file, '.html')) { $log_file_list[filemtime($log_folder . $file)] = $file; } } closedir($dir); } if (sizeof($log_file_list) > 0) { krsort($log_file_list, SORT_NUMERIC); $num_delete_files = 0; $i = -1; foreach ($log_file_list as $log_file) { $i++; if ($i < get_site_option('backwpup_cfg_maxlogs')) { continue; } unlink($log_folder . $log_file); $num_delete_files++; } if ($num_delete_files > 0) { $this->log(sprintf(_n('One old log deleted', '%d old logs deleted', $num_delete_files, 'backwpup'), $num_delete_files)); } } } //Display job working time if ($this->errors > 0) { $this->log(sprintf(__('Job has ended with errors in %s seconds. You must resolve the errors for correct execution.', 'backwpup'), current_time('timestamp') - $this->start_time), E_USER_ERROR); } elseif ($this->warnings > 0) { $this->log(sprintf(__('Job finished with warnings in %s seconds. Please resolve them for correct execution.', 'backwpup'), current_time('timestamp') - $this->start_time), E_USER_WARNING); } else { $this->log(sprintf(__('Job done in %s seconds.', 'backwpup'), current_time('timestamp') - $this->start_time, E_USER_NOTICE)); } //Update job options if (!empty($this->job['jobid'])) { $this->job['lastruntime'] = current_time('timestamp') - $this->start_time; BackWPup_Option::update($this->job['jobid'], 'lastruntime', $this->job['lastruntime']); } //write header info if (!empty($this->logfile)) { if ($fd = fopen($this->logfile, 'r+')) { $filepos = ftell($fd); $found = 0; while (!feof($fd)) { $line = fgets($fd); if (stripos($line, '<meta name="backwpup_jobruntime"') !== FALSE) { fseek($fd, $filepos); fwrite($fd, str_pad('<meta name="backwpup_jobruntime" content="' . $this->job['lastruntime'] . '" />', 100) . PHP_EOL); $found++; } if (stripos($line, '<meta name="backwpup_backupfilesize"') !== FALSE) { fseek($fd, $filepos); fwrite($fd, str_pad('<meta name="backwpup_backupfilesize" content="' . $this->backup_filesize . '" />', 100) . PHP_EOL); $found++; } if ($found >= 2) { break; } $filepos = ftell($fd); } fclose($fd); } //logfile end file_put_contents($this->logfile, "</body>" . PHP_EOL . "</html>", FILE_APPEND); //Send mail with log $sendmail = FALSE; if ($this->errors > 0 && !empty($this->job['mailerroronly']) && !empty($this->job['mailaddresslog'])) { $sendmail = TRUE; } if (empty($this->job['mailerroronly']) && !empty($this->job['mailaddresslog'])) { $sendmail = TRUE; } if ($sendmail) { //special subject $status = __('SUCCESSFUL', 'backwpup'); $priority = 3; //Normal if ($this->warnings > 0) { $status = __('WARNING', 'backwpup'); $priority = 2; //High } if ($this->errors > 0) { $status = __('ERROR', 'backwpup'); $priority = 1; //Highest } $subject = sprintf(__('[%3$s] BackWPup log %1$s: %2$s', 'backwpup'), date_i18n('d-M-Y H:i', $this->start_time, TRUE), esc_attr($this->job['name']), $status); $headers = array(); $headers[] = 'Content-Type: text/html; charset=' . get_bloginfo('charset'); /* $headers[] = 'X-Priority: ' . $priority; */ // Priority not working with header setting if (!empty($this->job['mailaddresssenderlog'])) { if (FALSE === ($start_mail = strpos($this->job['mailaddresssenderlog'], '<'))) { if (FALSE === strpos($this->job['mailaddresssenderlog'], '@')) { $this->job['mailaddresssenderlog'] = '"' . str_replace(array('<', '>', '@'), '', $this->job['mailaddresssenderlog']) . '" <' . get_bloginfo('admin_email') . '>'; } } elseif (FALSE === strpos($this->job['mailaddresssenderlog'], '>', $start_mail)) { $this->job['mailaddresssenderlog'] = '"' . str_replace(array('<', '>', '@'), '', substr($this->job['mailaddresssenderlog'], 0, $start_mail)) . '" <' . get_bloginfo('admin_email') . '>'; } $headers[] = 'From: ' . $this->job['mailaddresssenderlog']; } wp_mail($this->job['mailaddresslog'], $subject, file_get_contents($this->logfile), $headers); } } //set done $this->substeps_done = 1; $this->steps_done[] = 'END'; //clean up temp self::clean_temp_folder(); //remove shutdown action remove_action('shutdown', array($this, 'shutdown')); restore_exception_handler(); restore_error_handler(); if (!empty($this->run['PHP'])) { @ini_set('log_errors', $this->run['PHP']['INI']['LOG_ERRORS']); @ini_set('error_log', $this->run['PHP']['INI']['ERROR_LOG']); @ini_set('display_errors', $this->run['PHP']['INI']['DISPLAY_ERRORS']); @ini_set('html_errors', $this->run['PHP']['INI']['HTML_ERRORS']); @ini_set('zlib.output_compression', $this->run['PHP']['INI']['ZLIB_OUTPUT_COMPRESSION']); @ini_set('implicit_flush', $this->run['PHP']['INI']['IMPLICIT_FLUSH']); @ini_set('error_reporting', $this->run['PHP']['INI']['ERROR_REPORTING']); @ini_set('report_memleaks', $this->run['PHP']['INI']['REPORT_MEMLEAKS']); if (!empty($this->run['PHP']['ENV']['TEMPDIR'])) { @putenv('TMPDIR=' . $this->run['PHP']['ENV']['TEMPDIR']); } } BackWPup_Cron::check_cleanup(); if ($abort) { exit; } }