/** * */ function prepare_items() { $this->items = BackWPup_Option::get_job_ids(); $this->job_object = BackWPup_Job::get_working_data(); $this->job_types = BackWPup::get_job_types(); $this->destinations = BackWPup::get_registered_destinations(); }
/** * Admin init function */ public function admin_init() { //only add action if ajax call if (defined('DOING_AJAX') && DOING_AJAX && defined('WP_ADMIN') && WP_ADMIN) { //ajax calls add_action('wp_ajax_backwpup_working', array('BackWPup_Page_Jobs', 'ajax_working')); add_action('wp_ajax_backwpup_cron_text', array('BackWPup_Page_Editjob', 'ajax_cron_text')); //ajax or view logs add_action('wp_ajax_backwpup_view_log', array('BackWPup_Page_Logs', 'ajax_view_log')); //ajax calls for job types if ($jobtypes = BackWPup::get_job_types()) { foreach ($jobtypes as $id => $jobtypeclass) { add_action('wp_ajax_backwpup_jobtype_' . strtolower($id), array($jobtypeclass, 'edit_ajax')); } } //ajax calls for destinations if ($dests = BackWPup::get_registered_destinations()) { foreach ($dests as $id => $dest) { if (!empty($dest['class'])) { add_action('wp_ajax_backwpup_dest_' . strtolower($id), array(BackWPup::get_destination($id), 'edit_ajax')); } } } } //display about page after Update if (!defined('DOING_AJAX') && !get_site_option('backwpup_about_page', FALSE) && !isset($_GET['activate-multi'])) { update_site_option('backwpup_about_page', TRUE); wp_redirect(network_admin_url('admin.php') . '?page=backwpupabout'); exit; } }
/** * */ function prepare_items() { $this->job_types = BackWPup::get_job_types(); $per_page = $this->get_items_per_page('backwpuplogs_per_page'); if (empty($per_page) || $per_page < 1) { $per_page = 20; } //load logs $logfiles = array(); if (is_readable($this->log_folder) && ($dir = opendir($this->log_folder))) { while (($file = readdir($dir)) !== FALSE) { $log_file = $this->log_folder . '/' . $file; if (is_file($log_file) && is_readable($log_file) && FALSE !== strpos($file, 'backwpup_log_') && FALSE !== strpos($file, '.html')) { $logfiles[] = $file; } } closedir($dir); } //ordering $order = isset($_GET['order']) ? $_GET['order'] : 'desc'; $orderby = isset($_GET['orderby']) ? $_GET['orderby'] : 'time'; if ($orderby == 'time') { if ($order == 'asc') { sort($logfiles); } else { rsort($logfiles); } } //by page $start = intval(($this->get_pagenum() - 1) * $per_page); $end = $start + $per_page; if ($end > count($logfiles)) { $end = count($logfiles); } $this->items = array(); $i = -1; foreach ($logfiles as $mtime => $logfile) { $i++; if ($i < $start) { continue; } if ($i >= $end) { break; } $this->items[$mtime] = BackWPup_Job::read_logheader($this->log_folder . '/' . $logfile); $this->items[$mtime]['file'] = $logfile; } $this->set_pagination_args(array('total_items' => count($logfiles), 'per_page' => $per_page, 'orderby' => $orderby, 'order' => $order)); }
/** * * Get default option for BackWPup option * * @param string $key Option key * * @internal param int $id The job id * * @return bool|mixed */ public static function defaults_job($key = '') { $key = sanitize_key(trim($key)); //set defaults $default['type'] = array('DBDUMP', 'FILE', 'WPPLUGIN'); $default['destinations'] = array(); $default['name'] = __('New Job', 'backwpup'); $default['activetype'] = ''; $default['logfile'] = ''; $default['lastbackupdownloadurl'] = ''; $default['cronselect'] = 'basic'; $default['cron'] = '0 3 * * *'; $default['mailaddresslog'] = sanitize_email(get_bloginfo('admin_email')); $default['mailaddresssenderlog'] = 'BackWPup ' . get_bloginfo('name') . ' <' . sanitize_email(get_bloginfo('admin_email')) . '>'; $default['mailerroronly'] = true; $default['backuptype'] = 'archive'; $default['archiveformat'] = '.tar.gz'; $default['archivename'] = 'backwpup_' . BackWPup::get_plugin_data('hash') . '_%Y-%m-%d_%H-%i-%s'; //defaults vor destinations foreach (BackWPup::get_registered_destinations() as $dest_key => $dest) { if (!empty($dest['class'])) { $dest_object = BackWPup::get_destination($dest_key); $default = array_merge($default, $dest_object->option_defaults()); } } //defaults vor job types foreach (BackWPup::get_job_types() as $job_type) { $default = array_merge($default, $job_type->option_defaults()); } //return all if (empty($key)) { return $default; } //return one default setting if (isset($default[$key])) { return $default[$key]; } else { return false; } }
/** * */ public static function page() { if (!empty($_GET['jobid'])) { $jobid = (int) $_GET['jobid']; } else { //generate jobid if not exists $newjobid = BackWPup_Option::get_job_ids(); sort($newjobid); $jobid = end($newjobid) + 1; } $destinations = BackWPup::get_registered_destinations(); $job_types = BackWPup::get_job_types(); ?> <div class="wrap" id="backwpup-page"> <?php echo '<h2><span id="backwpup-page-icon"> </span>' . sprintf(__('%1$s Job: %2$s', 'backwpup'), BackWPup::get_plugin_data('name'), '<span id="h2jobtitle">' . esc_html(BackWPup_Option::get($jobid, 'name')) . '</span>') . '</h2>'; //default tabs $tabs = array('job' => array('name' => __('General', 'backwpup'), 'display' => TRUE), 'cron' => array('name' => __('Schedule', 'backwpup'), 'display' => TRUE)); //add jobtypes to tabs $job_job_types = BackWPup_Option::get($jobid, 'type'); foreach ($job_types as $typeid => $typeclass) { $tabid = 'jobtype-' . strtolower($typeid); $tabs[$tabid]['name'] = $typeclass->info['name']; $tabs[$tabid]['display'] = TRUE; if (!in_array($typeid, $job_job_types)) { $tabs[$tabid]['display'] = FALSE; } } //add destinations to tabs $jobdests = BackWPup_Option::get($jobid, 'destinations'); foreach ($destinations as $destid => $dest) { $tabid = 'dest-' . strtolower($destid); $tabs[$tabid]['name'] = sprintf(__('To: %s', 'backwpup'), $dest['info']['name']); $tabs[$tabid]['display'] = TRUE; if (!in_array($destid, $jobdests)) { $tabs[$tabid]['display'] = FALSE; } } //display tabs echo '<h2 class="nav-tab-wrapper">'; foreach ($tabs as $id => $tab) { $addclass = ''; if ($id == $_GET['tab']) { $addclass = ' nav-tab-active'; } $display = ''; if (!$tab['display']) { $display = ' style="display:none;"'; } echo '<a href="' . wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupeditjob&tab=' . $id . '&jobid=' . $jobid, 'edit-job') . '" class="nav-tab' . $addclass . '" id="tab-' . $id . '" data-nexttab="' . $id . '" ' . $display . '>' . $tab['name'] . '</a>'; } echo '</h2>'; //display messages BackWPup_Admin::display_messages(); echo '<form name="editjob" id="editjob" method="post" action="' . admin_url('admin-post.php') . '">'; echo '<input type="hidden" id="jobid" name="jobid" value="' . $jobid . '" />'; echo '<input type="hidden" name="tab" value="' . $_GET['tab'] . '" />'; echo '<input type="hidden" name="nexttab" value="' . $_GET['tab'] . '" />'; echo '<input type="hidden" name="page" value="backwpupeditjob" />'; echo '<input type="hidden" name="action" value="backwpup" />'; echo '<input type="hidden" name="anchor" value="" />'; wp_nonce_field('backwpupeditjob_page'); wp_nonce_field('backwpup_ajax_nonce', 'backwpupajaxnonce', FALSE); switch ($_GET['tab']) { case 'job': echo '<div class="table" id="info-tab-job">'; ?> <h3 class="title"><?php _e('Job Name', 'backwpup'); ?> </h3> <p></p> <table class="form-table"> <tr> <th scope="row"><label for="name"><?php _e('Please name this job.', 'backwpup'); ?> </label></th> <td> <input name="name" type="text" id="name" data-empty="<?php _e('New Job', 'backwpup'); ?> " value="<?php echo BackWPup_Option::get($jobid, 'name'); ?> " class="regular-text" /> </td> </tr> </table> <h3 class="title"><?php _e('Job Tasks', 'backwpup'); ?> </h3> <p></p> <table class="form-table"> <tr> <th scope="row"><?php _e('This job is a …', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"><span><?php _e('Job tasks', 'backwpup'); ?> </span> </legend><?php foreach ($job_types as $id => $typeclass) { $addclass = ''; if ($typeclass->creates_file()) { $addclass .= ' filetype'; } $title = ''; if (!empty($typeclass->info['help'])) { $title = ' title="' . esc_attr($typeclass->info['help']) . '"'; $addclass .= ' help-tip'; } echo '<label for="jobtype-select-' . strtolower($id) . '"><input class="jobtype-select checkbox' . $addclass . '"' . $title . ' id="jobtype-select-' . strtolower($id) . '" type="checkbox" ' . checked(TRUE, in_array($id, BackWPup_Option::get($jobid, 'type')), FALSE) . ' name="type[]" value="' . $id . '" /> ' . $typeclass->info['description'] . '</label><br />'; } ?> </fieldset> </td> </tr> </table> <h3 class="title hasdests"><?php _e('Backup File Creation', 'backwpup'); ?> </h3> <p class="hasdests"></p> <table class="form-table hasdests"> <?php if (class_exists('BackWPup_Pro', FALSE)) { ?> <tr> <th scope="row"><?php _e('Backup type', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"> <span><?php _e('Backup type', 'backwpup'); ?> </span></legend> <label for="idbackuptype-sync"><input class="radio" type="radio"<?php checked('sync', BackWPup_Option::get($jobid, 'backuptype'), TRUE); ?> name="backuptype" id="idbackuptype-sync" value="sync"/> <?php _e('Synchronize file by file to destination', 'backwpup'); ?> </label><br/> <label for="idbackuptype-archive"><input class="radio" type="radio"<?php checked('archive', BackWPup_Option::get($jobid, 'backuptype'), TRUE); ?> name="backuptype" id="idbackuptype-archive" value="archive"/> <?php _e('Create a backup archive', 'backwpup'); ?> </label><br/> </fieldset> </td> </tr> <?php } ?> <tr class="nosync"> <th scope="row"><label for="archivename"><?php _e('Archive name', 'backwpup'); ?> </label></th> <td> <input name="archivename" type="text" id="archivename" value="<?php echo BackWPup_Option::get($jobid, 'archivename'); ?> " class="regular-text code help-tip" title="<?php echo "<strong>" . esc_attr__('Replacement patterns:', 'backwpup') . "</strong><br />"; echo esc_attr__('%d = Two digit day of the month, with leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%j = Day of the month, without leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%m = Day of the month, with leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%n = Representation of the month (without leading zeros)', 'backwpup') . '<br />'; echo esc_attr__('%Y = Four digit representation for the year', 'backwpup') . '<br />'; echo esc_attr__('%y = Two digit representation of the year', 'backwpup') . '<br />'; echo esc_attr__('%a = Lowercase ante meridiem (am) and post meridiem (pm)', 'backwpup') . '<br />'; echo esc_attr__('%A = Uppercase ante meridiem (AM) and post meridiem (PM)', 'backwpup') . '<br />'; echo esc_attr__('%B = Swatch Internet Time', 'backwpup') . '<br />'; echo esc_attr__('%g = Hour in 12-hour format, without leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%G = Hour in 24-hour format, without leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%h = Hour in 12-hour format, with leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%H = Hour in 24-hour format, with leading zeros', 'backwpup') . '<br />'; echo esc_attr__('%i = Two digit representation of the minute', 'backwpup') . '<br />'; echo esc_attr__('%s = Two digit representation of the second', 'backwpup') . '<br />'; ?> " /> <?php $current_time = current_time('timestamp'); $datevars = array('%d', '%j', '%m', '%n', '%Y', '%y', '%a', '%A', '%B', '%g', '%G', '%h', '%H', '%i', '%s'); $datevalues = array(date('d', $current_time), date('j', $current_time), date('m', $current_time), date('n', $current_time), date('Y', $current_time), date('y', $current_time), date('a', $current_time), date('A', $current_time), date('B', $current_time), date('g', $current_time), date('G', $current_time), date('h', $current_time), date('H', $current_time), date('i', $current_time), date('s', $current_time)); $archivename = str_replace($datevars, $datevalues, BackWPup_Job::sanitize_file_name(BackWPup_Option::get($jobid, 'archivename'))); echo '<p>Preview: <code><span id="archivefilename">' . $archivename . '</span><span id="archiveformat">' . BackWPup_Option::get($jobid, 'archiveformat') . '</span></code></p>'; ?> </td> </tr> <tr class="nosync"> <th scope="row"><?php _e('Archive Format', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"><span><?php _e('Archive Format', 'backwpup'); ?> </span></legend> <?php if (function_exists('gzopen') || class_exists('ZipArchive')) { echo '<label for="idarchiveformat-zip"><input class="radio help-tip" title="' . __('PHP Zip functions will be used if available (needs less memory). Otherwise the PCLZip class will be used.', 'backwpup') . '" type="radio"' . checked('.zip', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-zip" value=".zip" /> ' . __('Zip', 'backwpup') . '</label><br />'; } else { echo '<label for="idarchiveformat-zip"><input class="radio help-tip" title="' . __('Disabled due to missing PHP function.', 'backwpup') . '" type="radio"' . checked('.zip', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-zip" value=".zip" disabled="disabled" /> ' . __('Zip', 'backwpup') . '</label><br />'; } echo '<label for="idarchiveformat-tar"><input class="radio help-tip" title="' . __('A tarballed, not compressed archive (fast and less memory)', 'backwpup') . '" type="radio"' . checked('.tar', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-tar" value=".tar" /> ' . __('Tar', 'backwpup') . '</label><br />'; if (function_exists('gzopen')) { echo '<label for="idarchiveformat-targz"><input class="radio help-tip" title="' . __('A tarballed, GZipped archive (fast and less memory)', 'backwpup') . '" type="radio"' . checked('.tar.gz', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-targz" value=".tar.gz" /> ' . __('Tar GZip', 'backwpup') . '</label><br />'; } else { echo '<label for="idarchiveformat-targz"><input class="radio help-tip" title="' . __('Disabled due to missing PHP function.', 'backwpup') . '" type="radio"' . checked('.tar.gz', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-targz" value=".tar.gz" disabled="disabled" /> ' . __('Tar GZip', 'backwpup') . '</label><br />'; } if (function_exists('bzopen')) { echo '<label for="idarchiveformat-tarbz2"><input class="radio help-tip" title="' . __('A tarballed, BZipped archive (fast and less memory)', 'backwpup') . '" type="radio"' . checked('.tar.bz2', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-tarbz2" value=".tar.bz2" /> ' . __('Tar BZip2', 'backwpup') . '</label><br />'; } else { echo '<label for="idarchiveformat-tarbz2"><input class="radio help-tip" title="' . __('Disabled due to missing PHP function.', 'backwpup') . '" type="radio"' . checked('.tar.bz2', BackWPup_Option::get($jobid, 'archiveformat'), FALSE) . ' name="archiveformat" id="idarchiveformat-tarbz2" value=".tar.bz2" disabled="disabled" /> ' . __('Tar BZip2', 'backwpup') . '</label><br />'; } ?> </fieldset> </td> </tr> </table> <h3 class="title hasdests"><?php _e('Job Destination', 'backwpup'); ?> </h3> <p class="hasdests"></p> <table class="form-table hasdests"> <tr> <th scope="row"><?php _e('Where should your backup file be stored?', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"><span><?php _e('Where should your backup file be stored?', 'backwpup'); ?> </span> </legend><?php foreach ($destinations as $id => $dest) { $syncclass = ''; if (!$dest['can_sync']) { $syncclass = 'nosync'; } $title = ''; $helpclass = ''; if (!empty($dest['info']['help'])) { $title = ' title="' . esc_attr($dest['info']['help']) . '"'; $helpclass = ' help-tip'; } echo '<span class="' . $syncclass . '"><label for="dest-select-' . strtolower($id) . '"><input class="checkbox' . $helpclass . '"' . $title . ' id="dest-select-' . strtolower($id) . '" type="checkbox" ' . checked(TRUE, in_array($id, BackWPup_Option::get($jobid, 'destinations')), FALSE) . ' name="destinations[]" value="' . $id . '" ' . disabled(!empty($dest['error']), TRUE, FALSE) . ' /> ' . $dest['info']['description']; if (!empty($dest['error'])) { echo '<br /><span class="description">' . $dest['error'] . '</span>'; } echo '</label><br /></span>'; } ?> </fieldset> </td> </tr> </table> <h3 class="title"><?php _e('Log Files', 'backwpup'); ?> </h3> <p></p> <table class="form-table"> <tr> <th scope="row"><label for="mailaddresslog"><?php _e('Send log to email address', 'backwpup'); ?> </label></th> <td> <input name="mailaddresslog" type="text" id="mailaddresslog" value="<?php echo BackWPup_Option::get($jobid, 'mailaddresslog'); ?> " class="regular-text help-tip" title="<?php esc_attr_e('Leave empty to not have log sent. Or separate with , for more than one receiver.', 'backwpup'); ?> " /> </td> </tr> <tr> <th scope="row"><label for="mailaddresssenderlog"><?php _e('Email FROM field', 'backwpup'); ?> </label></th> <td> <input name="mailaddresssenderlog" type="text" id="mailaddresssenderlog" value="<?php echo BackWPup_Option::get($jobid, 'mailaddresssenderlog'); ?> " class="regular-text help-tip" title="<?php esc_attr_e('Email "From" field (Name < you@your-email-address.tld >)', 'backwpup'); ?> " /> </td> </tr> <tr> <th scope="row"><?php _e('Errors only', 'backwpup'); ?> </th> <td> <label for="idmailerroronly"> <input class="checkbox" value="1" id="idmailerroronly" type="checkbox" <?php checked(BackWPup_Option::get($jobid, 'mailerroronly'), TRUE); ?> name="mailerroronly" /> <?php _e('Send email with log only when errors occur during job execution.', 'backwpup'); ?> </label> </td> </tr> </table> <?php echo '</div>'; break; case 'cron': echo '<div class="table" id="info-tab-cron">'; ?> <h3 class="title"><?php _e('Job Schedule', 'backwpup'); ?> </h3> <p></p> <table class="form-table"> <tr> <th scope="row"><?php _e('Start job', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"><span><?php _e('Start job', 'backwpup'); ?> </span></legend> <label for="idactivetype"><input class="radio" type="radio"<?php checked('', BackWPup_Option::get($jobid, 'activetype'), TRUE); ?> name="activetype" id="idactivetype" value="" /> <?php _e('manually only', 'backwpup'); ?> </label><br/> <label for="idactivetype-wpcron"><input class="radio" type="radio"<?php checked('wpcron', BackWPup_Option::get($jobid, 'activetype'), TRUE); ?> name="activetype" id="idactivetype-wpcron" value="wpcron" /> <?php _e('with WordPress cron', 'backwpup'); ?> </label><br/> <?php $disabled = ''; $easycron_api = get_site_option('backwpup_cfg_easycronapikey'); if (empty($easycron_api)) { $disabled = ' disabled="disabled"'; } ?> <label for="idactivetype-easycron"><input class="radio help-tip" type="radio"<?php checked('easycron', BackWPup_Option::get($jobid, 'activetype'), TRUE); ?> name="activetype" id="idactivetype-easycron"<?php echo $disabled; ?> value="easycron" title="<?php _e('Use EasyCron.com Cron jobs.'); ?> " /> <?php _e('with <a href="https://www.easycron.com?ref=36673" class="help-tip" title="Affiliate Link!">EasyCron.com</a>', 'backwpup'); ?> <?php if (empty($easycron_api)) { echo ' <strong>' . sprintf(__('Setup <a href="https://www.easycron.com?ref=36673" class="help-tip" title="Affiliate Link!">Account</a> / <a href="%s">API Key</a> first.', 'backwpup'), network_admin_url('admin.php') . '?page=backwpupsettings#backwpup-tab-apikey') . '</strong>'; } ?> </label><br/> <?php $url = BackWPup_Job::get_jobrun_url('runext', BackWPup_Option::get($jobid, 'jobid')); ?> <label for="idactivetype-link"><input class="radio help-tip" type="radio"<?php checked('link', BackWPup_Option::get($jobid, 'activetype'), TRUE); ?> name="activetype" id="idactivetype-link" value="link" title="<?php esc_attr_e('Copy the link for an external start. This option has to be activated to make the link work.', 'backwpup'); ?> " /> <?php _e('with a link', 'backwpup'); ?> <code><a href="<?php echo $url['url']; ?> " target="_blank"><?php echo $url['url']; ?> </a></code></label> <br /> </fieldset> </td> </tr> <tr> <th scope="row"><?php _e('Start job with CLI', 'backwpup'); ?> </th> <td class="help-tip" title="<?php esc_attr_e('Use WP-CLI commands to let the job start with the server’s cron on command line interface.', 'backwpup'); ?> "> <?php _e('Use <a href="http://wp-cli.org/">WP-CLI</a> to run jobs from commandline.', 'backwpup'); ?> </td> </tr> </table> <h3 class="title wpcron"><?php _e('Schedule execution time', 'backwpup'); ?> </h3> <?php BackWPup_Page_Editjob::ajax_cron_text(array('cronstamp' => BackWPup_Option::get($jobid, 'cron'), 'crontype' => BackWPup_Option::get($jobid, 'cronselect'))); ?> <table class="form-table wpcron"> <tr> <th scope="row"><?php _e('Scheduler type', 'backwpup'); ?> </th> <td> <fieldset> <legend class="screen-reader-text"><span><?php _e('Scheduler type', 'backwpup'); ?> </span></legend> <label for="idcronselect-basic"><input class="radio" type="radio"<?php checked('basic', BackWPup_Option::get($jobid, 'cronselect'), TRUE); ?> name="cronselect" id="idcronselect-basic" value="basic" /> <?php _e('basic', 'backwpup'); ?> </label><br/> <label for="idcronselect-advanced"><input class="radio" type="radio"<?php checked('advanced', BackWPup_Option::get($jobid, 'cronselect'), TRUE); ?> name="cronselect" id="idcronselect-advanced" value="advanced" /> <?php _e('advanced', 'backwpup'); ?> </label><br/> </fieldset> </td> </tr> <?php list($cronstr['minutes'], $cronstr['hours'], $cronstr['mday'], $cronstr['mon'], $cronstr['wday']) = explode(' ', BackWPup_Option::get($jobid, 'cron'), 5); if (strstr($cronstr['minutes'], '*/')) { $minutes = explode('/', $cronstr['minutes']); } else { $minutes = explode(',', $cronstr['minutes']); } if (strstr($cronstr['hours'], '*/')) { $hours = explode('/', $cronstr['hours']); } else { $hours = explode(',', $cronstr['hours']); } if (strstr($cronstr['mday'], '*/')) { $mday = explode('/', $cronstr['mday']); } else { $mday = explode(',', $cronstr['mday']); } if (strstr($cronstr['mon'], '*/')) { $mon = explode('/', $cronstr['mon']); } else { $mon = explode(',', $cronstr['mon']); } if (strstr($cronstr['wday'], '*/')) { $wday = explode('/', $cronstr['wday']); } else { $wday = explode(',', $cronstr['wday']); } ?> <tr class="wpcronbasic"<?php if (BackWPup_Option::get($jobid, 'cronselect') != 'basic') { echo ' style="display:none;"'; } ?> > <th scope="row"><?php _e('Scheduler', 'backwpup'); ?> </th> <td> <table id="wpcronbasic"> <tr> <th> <?php _e('Type', 'backwpup'); ?> </th> <th> </th> <th> <?php _e('Hour', 'backwpup'); ?> </th> <th> <?php _e('Minute', 'backwpup'); ?> </th> </tr> <tr> <td><label for="idcronbtype-mon"><?php echo '<input class="radio" type="radio"' . checked(TRUE, is_numeric($mday[0]), FALSE) . ' name="cronbtype" id="idcronbtype-mon" value="mon" /> ' . __('monthly', 'backwpup'); ?> </label></td> <td><select name="moncronmday"><?php for ($i = 1; $i <= 31; $i++) { echo '<option ' . selected(in_array("{$i}", $mday, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . __('on', 'backwpup') . ' ' . $i . '</option>'; } ?> </select></td> <td><select name="moncronhours"><?php for ($i = 0; $i < 24; $i++) { echo '<option ' . selected(in_array("{$i}", $hours, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> <td><select name="moncronminutes"><?php for ($i = 0; $i < 60; $i = $i + 5) { echo '<option ' . selected(in_array("{$i}", $minutes, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> </tr> <tr> <td><label for="idcronbtype-week"><?php echo '<input class="radio" type="radio"' . checked(TRUE, is_numeric($wday[0]), FALSE) . ' name="cronbtype" id="idcronbtype-week" value="week" /> ' . __('weekly', 'backwpup'); ?> </label></td> <td><select name="weekcronwday"> <?php echo '<option ' . selected(in_array("0", $wday, TRUE), TRUE, FALSE) . ' value="0" />' . __('Sunday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("1", $wday, TRUE), TRUE, FALSE) . ' value="1" />' . __('Monday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("2", $wday, TRUE), TRUE, FALSE) . ' value="2" />' . __('Tuesday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("3", $wday, TRUE), TRUE, FALSE) . ' value="3" />' . __('Wednesday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("4", $wday, TRUE), TRUE, FALSE) . ' value="4" />' . __('Thursday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("5", $wday, TRUE), TRUE, FALSE) . ' value="5" />' . __('Friday', 'backwpup') . '</option>'; echo '<option ' . selected(in_array("6", $wday, TRUE), TRUE, FALSE) . ' value="6" />' . __('Saturday', 'backwpup') . '</option>'; ?> </select></td> <td><select name="weekcronhours"><?php for ($i = 0; $i < 24; $i++) { echo '<option ' . selected(in_array("{$i}", $hours, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> <td><select name="weekcronminutes"><?php for ($i = 0; $i < 60; $i = $i + 5) { echo '<option ' . selected(in_array("{$i}", $minutes, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> </tr> <tr> <td><label for="idcronbtype-day"><?php echo '<input class="radio" type="radio"' . checked("**", $mday[0] . $wday[0], FALSE) . ' name="cronbtype" id="idcronbtype-day" value="day" /> ' . __('daily', 'backwpup'); ?> </label></td> <td></td> <td><select name="daycronhours"><?php for ($i = 0; $i < 24; $i++) { echo '<option ' . selected(in_array("{$i}", $hours, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> <td><select name="daycronminutes"><?php for ($i = 0; $i < 60; $i = $i + 5) { echo '<option ' . selected(in_array("{$i}", $minutes, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> </tr> <tr> <td><label for="idcronbtype-hour"><?php echo '<input class="radio" type="radio"' . checked("*", $hours[0], FALSE, FALSE) . ' name="cronbtype" id="idcronbtype-hour" value="hour" /> ' . __('hourly', 'backwpup'); ?> </label></td> <td></td> <td></td> <td><select name="hourcronminutes"><?php for ($i = 0; $i < 60; $i = $i + 5) { echo '<option ' . selected(in_array("{$i}", $minutes, TRUE), TRUE, FALSE) . ' value="' . $i . '" />' . $i . '</option>'; } ?> </select></td> </tr> </table> </td> </tr> <tr class="wpcronadvanced"<?php if (BackWPup_Option::get($jobid, 'cronselect') != 'advanced') { echo ' style="display:none;"'; } ?> > <th scope="row"><?php _e('Scheduler', 'backwpup'); ?> </th> <td> <div id="cron-min-box"> <b><?php _e('Minutes:', 'backwpup'); ?> </b><br/> <?php echo '<label for="idcronminutes"><input class="checkbox" type="checkbox"' . checked(in_array("*", $minutes, TRUE), TRUE, FALSE) . ' name="cronminutes[]" id="idcronminutes" value="*" /> ' . __('Any (*)', 'backwpup') . '</label><br />'; ?> <div id="cron-min"><?php for ($i = 0; $i < 60; $i = $i + 5) { echo '<label for="idcronminutes-' . $i . '"><input class="checkbox" type="checkbox"' . checked(in_array("{$i}", $minutes, TRUE), TRUE, FALSE) . ' name="cronminutes[]" id="idcronminutes-' . $i . '" value="' . $i . '" /> ' . $i . '</label><br />'; } ?> </div> </div> <div id="cron-hour-box"> <b><?php _e('Hours:', 'backwpup'); ?> </b><br/> <?php echo '<label for="idcronhours"><input class="checkbox" type="checkbox"' . checked(in_array("*", $hours, TRUE), TRUE, FALSE) . ' name="cronhours[]" for="idcronhours" value="*" /> ' . __('Any (*)', 'backwpup') . '</label><br />'; ?> <div id="cron-hour"><?php for ($i = 0; $i < 24; $i++) { echo '<label for="idcronhours-' . $i . '"><input class="checkbox" type="checkbox"' . checked(in_array("{$i}", $hours, TRUE), TRUE, FALSE) . ' name="cronhours[]" id="idcronhours-' . $i . '" value="' . $i . '" /> ' . $i . '</label><br />'; } ?> </div> </div> <div id="cron-day-box"> <b><?php _e('Day of Month:', 'backwpup'); ?> </b><br/> <label for="idcronmday"><input class="checkbox" type="checkbox"<?php checked(in_array("*", $mday, TRUE), TRUE, TRUE); ?> name="cronmday[]" id="idcronmday" value="*"/> <?php _e('Any (*)', 'backwpup'); ?> </label> <br/> <div id="cron-day"> <?php for ($i = 1; $i <= 31; $i++) { echo '<label for="idcronmday-' . $i . '"><input class="checkbox" type="checkbox"' . checked(in_array("{$i}", $mday, TRUE), TRUE, FALSE) . ' name="cronmday[]" id="idcronmday-' . $i . '" value="' . $i . '" /> ' . $i . '</label><br />'; } ?> </div> </div> <div id="cron-month-box"> <b><?php _e('Month:', 'backwpup'); ?> </b><br/> <?php echo '<label for="idcronmon"><input class="checkbox" type="checkbox"' . checked(in_array("*", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon" value="*" /> ' . __('Any (*)', 'backwpup') . '</label><br />'; ?> <div id="cron-month"> <?php echo '<label for="idcronmon-1"><input class="checkbox" type="checkbox"' . checked(in_array("1", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-1" value="1" /> ' . __('January', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-2"><input class="checkbox" type="checkbox"' . checked(in_array("2", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-2" value="2" /> ' . __('February', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-3"><input class="checkbox" type="checkbox"' . checked(in_array("3", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-3" value="3" /> ' . __('March', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-4"><input class="checkbox" type="checkbox"' . checked(in_array("4", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-4" value="4" /> ' . __('April', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-5"><input class="checkbox" type="checkbox"' . checked(in_array("5", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-5" value="5" /> ' . __('May', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-6"><input class="checkbox" type="checkbox"' . checked(in_array("6", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-6" value="6" /> ' . __('June', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-7"><input class="checkbox" type="checkbox"' . checked(in_array("7", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-7" value="7" /> ' . __('July', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-8"><input class="checkbox" type="checkbox"' . checked(in_array("8", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-8" value="8" /> ' . __('August', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-9"><input class="checkbox" type="checkbox"' . checked(in_array("9", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-9" value="9" /> ' . __('September', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-10"><input class="checkbox" type="checkbox"' . checked(in_array("10", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-10" value="10" /> ' . __('October', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-11"><input class="checkbox" type="checkbox"' . checked(in_array("11", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-11" value="11" /> ' . __('November', 'backwpup') . '</label><br />'; echo '<label for="idcronmon-12"><input class="checkbox" type="checkbox"' . checked(in_array("12", $mon, TRUE), TRUE, FALSE) . ' name="cronmon[]" id="idcronmon-12" value="12" /> ' . __('December', 'backwpup') . '</label><br />'; ?> </div> </div> <div id="cron-weekday-box"> <b><?php _e('Day of Week:', 'backwpup'); ?> </b><br/> <?php echo '<label for="idcronwday"><input class="checkbox" type="checkbox"' . checked(in_array("*", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday" value="*" /> ' . __('Any (*)', 'backwpup') . '</label><br />'; ?> <div id="cron-weekday"> <?php echo '<label for="idcronwday-0"><input class="checkbox" type="checkbox"' . checked(in_array("0", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-0" value="0" /> ' . __('Sunday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-1"><input class="checkbox" type="checkbox"' . checked(in_array("1", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-1" value="1" /> ' . __('Monday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-2"><input class="checkbox" type="checkbox"' . checked(in_array("2", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-2" value="2" /> ' . __('Tuesday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-3"><input class="checkbox" type="checkbox"' . checked(in_array("3", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-3" value="3" /> ' . __('Wednesday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-4"><input class="checkbox" type="checkbox"' . checked(in_array("4", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-4" value="4" /> ' . __('Thursday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-5"><input class="checkbox" type="checkbox"' . checked(in_array("5", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-5" value="5" /> ' . __('Friday', 'backwpup') . '</label><br />'; echo '<label for="idcronwday-6"><input class="checkbox" type="checkbox"' . checked(in_array("6", $wday, TRUE), TRUE, FALSE) . ' name="cronwday[]" id="idcronwday-6" value="6" /> ' . __('Saturday', 'backwpup') . '</label><br />'; ?> </div> </div> <br class="clear"/> </td> </tr> </table> <?php echo '</div>'; break; default: echo '<div class="table" id="info-tab-' . $_GET['tab'] . '">'; if (strstr($_GET['tab'], 'dest-')) { $dest_object = BackWPup::get_destination(str_replace('dest-', '', $_GET['tab'])); $dest_object->edit_tab($jobid); } if (strstr($_GET['tab'], 'jobtype-')) { $id = strtoupper(str_replace('jobtype-', '', $_GET['tab'])); $job_types[$id]->edit_tab($jobid); } echo '</div>'; } echo '<p class="submit">'; submit_button(__('Save changes', 'backwpup'), 'primary', 'save', FALSE, array('tabindex' => '2', 'accesskey' => 'p')); echo '</p></form>'; ?> </div> <script type="text/javascript"> //<![CDATA[ jQuery(document).ready(function ($) { // auto post if things changed var changed = false; $( '#editjob' ).change( function () { changed = true; }); $( '.nav-tab' ).click( function () { if ( changed ) { $( 'input[name="nexttab"]' ).val( $(this).data( "nexttab" ) ); $( '#editjob' ).submit(); return false; } }); <?php //add inline js if (strstr($_GET['tab'], 'dest-')) { $dest_object = BackWPup::get_destination(str_replace('dest-', '', $_GET['tab'])); $dest_object->edit_inline_js(); } if (strstr($_GET['tab'], 'jobtype-')) { $id = strtoupper(str_replace('jobtype-', '', $_GET['tab'])); $job_types[$id]->edit_inline_js(); } ?> }); //]]> </script> <?php }
/** * Run baby run */ public function run() { global $wpdb; /* @var wpdb $wpdb */ //disable output buffering if ($level = ob_get_level()) { for ($i = 0; $i < $level; $i++) { ob_end_clean(); } } // Job can't run it is not created if (empty($this->steps_todo) || empty($this->logfile)) { $running_file = BackWPup::get_plugin_data('running_file'); if (file_exists($running_file)) { unlink($running_file); } return; } //Check double running and inactivity $last_update = microtime(true) - $this->timestamp_last_update; if (!empty($this->pid) && $last_update > 300) { $this->log(__('Job restarts due to inactivity for more than 5 minutes.', 'backwpup'), E_USER_WARNING); } elseif (!empty($this->pid)) { return; } // set timestamp of script start $this->timestamp_script_start = microtime(true); //set Pid $this->pid = self::get_pid(); $this->uniqid = uniqid('', true); //Early write new working file $this->write_running_file(); if ($this->is_debug()) { @ini_set('error_log', $this->logfile); error_reporting(-1); } @ini_set('display_errors', '0'); @ini_set('log_errors', '1'); @ini_set('html_errors', '0'); @ini_set('report_memleaks', '1'); @ini_set('zlib.output_compression', '0'); @ini_set('implicit_flush', '0'); //set temp folder $can_set_temp_env = true; $protected_env_vars = explode(',', ini_get('safe_mode_protected_env_vars')); //removed in php 5.4.0 foreach ($protected_env_vars as $protected_env) { if (strtoupper(trim($protected_env)) == 'TMPDIR') { $can_set_temp_env = false; } } if ($can_set_temp_env) { @putenv('TMPDIR=' . BackWPup::get_plugin_data('TEMP')); } //Write Wordpress DB errors to log $wpdb->suppress_errors(false); $wpdb->hide_errors(); //set wp max memory limit @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT)); //set error handler if (!empty($this->logfile)) { if ($this->is_debug()) { set_error_handler(array($this, 'log')); } else { set_error_handler(array($this, 'log'), E_ALL ^ E_NOTICE); } } set_exception_handler(array($this, 'exception_handler')); // execute function on job shutdown register_shutdown_function( array( $this, 'shutdown' ) ); add_action('shutdown', array($this, 'shutdown')); if (function_exists('pcntl_signal')) { $signals = array('SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGABRT', 'SIGBUS', 'SIGFPE', 'SIGSEGV', 'SIGTERM', 'SIGSTKFLT', 'SIGUSR1', 'SIGUSR2', 'SIGXCPU', 'SIGXFSZ', 'SIGPWR', 'SIGSYS'); $signals = apply_filters('backwpup_job_signals_to_handel', $signals); declare (ticks=1); $this->signal = 0; foreach ($signals as $signal) { if (defined($signal)) { pcntl_signal(constant($signal), array($this, 'signal_handler'), false); } } } $job_types = BackWPup::get_job_types(); //go step by step foreach ($this->steps_todo as $this->step_working) { //Check if step already done if (in_array($this->step_working, $this->steps_done, true)) { continue; } //calc step percent if (count($this->steps_done) > 0) { $this->step_percent = round(count($this->steps_done) / count($this->steps_todo) * 100); } else { $this->step_percent = 1; } // do step tries while (true) { if ($this->steps_data[$this->step_working]['STEP_TRY'] >= get_site_option('backwpup_cfg_jobstepretry')) { $this->log(__('Step aborted: too many attempts!', 'backwpup'), E_USER_ERROR); $this->temp = array(); $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; $this->do_restart(); break; } $this->steps_data[$this->step_working]['STEP_TRY']++; $done = false; //executes the methods of job process if ($this->step_working == 'CREATE_ARCHIVE') { $done = $this->create_archive(); } elseif ($this->step_working == 'CREATE_MANIFEST') { $done = $this->create_manifest(); } elseif ($this->step_working == 'END') { $this->end(); break 2; } elseif (strstr($this->step_working, 'JOB_')) { $done = $job_types[str_replace('JOB_', '', $this->step_working)]->job_run($this); } elseif (strstr($this->step_working, 'DEST_SYNC_')) { $done = BackWPup::get_destination(str_replace('DEST_SYNC_', '', $this->step_working))->job_run_sync($this); } elseif (strstr($this->step_working, 'DEST_')) { $done = BackWPup::get_destination(str_replace('DEST_', '', $this->step_working))->job_run_archive($this); } elseif (!empty($this->steps_data[$this->step_working]['CALLBACK'])) { $done = $this->steps_data[$this->step_working]['CALLBACK']($this); } // set step as done if ($done === true) { $this->temp = array(); $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; $this->update_working_data(true); } if (count($this->steps_done) < count($this->steps_todo) - 1) { $this->do_restart(); } if ($done === true) { break; } } } }
/** * */ 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(); }
/** * Run baby run */ public function run() { global $wpdb; /* @var wpdb $wpdb */ // Job can't run it is not created if (empty($this->steps_todo) || empty($this->logfile)) { $running_file = BackWPup::get_plugin_data('running_file'); if (file_exists($running_file)) { unlink($running_file); } return; } //Check double running and inactivity $last_update = microtime(TRUE) - $this->timestamp_last_update; if (!empty($this->pid) && $last_update > 300) { $this->log(__('Job restarts due to inactivity for more than 5 minutes.', 'backwpup'), E_USER_WARNING); } elseif (!empty($this->pid)) { return; } // set timestamp of script start $this->timestamp_script_start = microtime(TRUE); //set Pid $this->pid = self::get_pid(); $this->uniqid = uniqid('', TRUE); //Early write new working file $this->write_running_file(); //set function for PHP user defined error handling $this->run['PHP']['INI']['ERROR_LOG'] = ini_get('error_log'); $this->run['PHP']['INI']['ERROR_REPORTING'] = ini_get('error_reporting'); $this->run['PHP']['INI']['LOG_ERRORS'] = ini_get('log_errors'); $this->run['PHP']['INI']['DISPLAY_ERRORS'] = ini_get('display_errors'); $this->run['PHP']['INI']['HTML_ERRORS'] = ini_get('html_errors'); $this->run['PHP']['INI']['REPORT_MEMLEAKS'] = ini_get('report_memleaks'); $this->run['PHP']['INI']['ZLIB_OUTPUT_COMPRESSION'] = ini_get('zlib.output_compression'); $this->run['PHP']['INI']['IMPLICIT_FLUSH'] = ini_get('implicit_flush'); if ($this->is_debug()) { @ini_set('error_log', $this->logfile); error_reporting(-1); } @ini_set('display_errors', '0'); @ini_set('log_errors', '1'); @ini_set('html_errors', '0'); @ini_set('report_memleaks', '1'); @ini_set('zlib.output_compression', '0'); @ini_set('implicit_flush', '0'); //increase MySQL timeout @ini_set('mysql.connect_timeout', '360'); //set temp folder $can_set_temp_env = TRUE; $protected_env_vars = explode(',', ini_get('safe_mode_protected_env_vars')); //removed in php 5.4.0 foreach ($protected_env_vars as $protected_env) { if (strtoupper(trim($protected_env)) == 'TMPDIR') { $can_set_temp_env = FALSE; } } if ($can_set_temp_env) { $this->run['PHP']['ENV']['TEMPDIR'] = getenv('TMPDIR'); @putenv('TMPDIR=' . BackWPup::get_plugin_data('TEMP')); } //Write Wordpress DB errors to log $wpdb->suppress_errors(FALSE); $wpdb->hide_errors(); //set wp max memory limit @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT)); //set error handler if (!empty($this->logfile)) { if ($this->is_debug()) { set_error_handler(array($this, 'log')); } else { set_error_handler(array($this, 'log'), E_ALL ^ E_NOTICE); } } set_exception_handler(array($this, 'exception_handler')); //not loading Textdomains and unload loaded if (!strstr($this->log_level, 'translated')) { add_filter('override_load_textdomain', create_function('', 'return TRUE;')); $GLOBALS['l10n'] = array(); } // execute function on job shutdown register_shutdown_function( array( $this, 'shutdown' ) ); add_action('shutdown', array($this, 'shutdown')); //remove_action('shutdown', array( $this, 'shutdown' )); if (function_exists('pcntl_signal')) { $signals = array('SIGHUP', 'SIGINT', 'SIGQUIT', 'SIGILL', 'SIGTRAP', 'SIGABRT', 'SIGBUS', 'SIGFPE', 'SIGSEGV', 'SIGALRM', 'SIGTERM', 'SIGSTKFLT', 'SIGUSR1', 'SIGUSR2', 'SIGCHLD', 'SIGCONT', 'SIGTSTP', 'SIGTTIN', 'SIGTTOU', 'SIGURG', 'SIGXCPU', 'SIGXFSZ', 'SIGVTALRM', 'SIGPROF', 'SIGWINCH', 'SIGIO', 'SIGPWR', 'SIGSYS'); declare (ticks=1); foreach ($signals as $signal) { if (defined($signal)) { pcntl_signal(constant($signal), array($this, 'shutdown'), FALSE); } } } //clear output buffer while (@ob_end_clean()) { } @flush(); $job_types = BackWPup::get_job_types(); //go step by step foreach ($this->steps_todo as $this->step_working) { //Check if step already done if (in_array($this->step_working, $this->steps_done)) { continue; } //calc step percent if (count($this->steps_done) > 0) { $this->step_percent = round(count($this->steps_done) / count($this->steps_todo) * 100); } else { $this->step_percent = 1; } // do step tries while (TRUE) { if ($this->steps_data[$this->step_working]['STEP_TRY'] >= get_site_option('backwpup_cfg_jobstepretry')) { $this->log(__('Step aborted: too many attempts!', 'backwpup'), E_USER_ERROR); $this->temp = array(); $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; $this->do_restart(); break; } $this->steps_data[$this->step_working]['STEP_TRY']++; $done = FALSE; //executes the methods of job process if ($this->step_working == 'CREATE_ARCHIVE') { $done = $this->create_archive(); } elseif ($this->step_working == 'CREATE_MANIFEST') { $done = $this->create_manifest(); } elseif ($this->step_working == 'END') { $this->end(); break 2; } elseif (strstr($this->step_working, 'JOB_')) { $done = $job_types[str_replace('JOB_', '', $this->step_working)]->job_run($this); } elseif (strstr($this->step_working, 'DEST_SYNC_')) { $done = BackWPup::get_destination(str_replace('DEST_SYNC_', '', $this->step_working))->job_run_sync($this); } elseif (strstr($this->step_working, 'DEST_')) { $done = BackWPup::get_destination(str_replace('DEST_', '', $this->step_working))->job_run_archive($this); } elseif (!empty($this->steps_data[$this->step_working]['CALLBACK'])) { $done = $this->steps_data[$this->step_working]['CALLBACK']($this); } // set step as done if ($done === TRUE) { $this->temp = array(); $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; $this->write_running_file(); } if (count($this->steps_done) < count($this->steps_todo) - 1) { $this->do_restart(); } if ($done === TRUE) { break; } } } }
/** * */ 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(); }
/** * Run baby run */ public function run() { global $wpdb; /* @var wpdb $wpdb */ // Job can't run it is not created if (empty($this->steps_todo)) { return; } //Check double running and inactivity $last_update = microtime(TRUE) - $this->timestamp_last_update; if (!empty($this->pid) && $last_update > 300) { $this->log(__('Job restarts due to inactivity for more than 5 minutes.', 'backwpup'), E_USER_WARNING); } elseif (!empty($this->pid)) { return; } // set timestamp of script start $this->timestamp_script_start = microtime(TRUE); //set Pid $this->pid = self::get_pid(); //set function for PHP user defined error handling $this->temp['PHP']['INI']['ERROR_LOG'] = ini_get('error_log'); $this->temp['PHP']['INI']['ERROR_REPORTING'] = ini_get('error_reporting'); $this->temp['PHP']['INI']['LOG_ERRORS'] = ini_get('log_errors'); $this->temp['PHP']['INI']['DISPLAY_ERRORS'] = ini_get('display_errors'); $this->temp['PHP']['INI']['HTML_ERRORS'] = ini_get('html_errors'); $this->temp['PHP']['INI']['REPORT_MEMLEAKS'] = ini_get('report_memleaks'); $this->temp['PHP']['INI']['ZLIB_OUTPUT_COMPRESSION'] = ini_get('zlib.output_compression'); $this->temp['PHP']['INI']['IMPLICIT_FLUSH'] = ini_get('implicit_flush'); @ini_set('error_log', $this->logfile); error_reporting(E_ALL ^ E_STRICT); @ini_set('display_errors', 'Off'); @ini_set('log_errors', 'On'); @ini_set('html_errors', 'Off'); @ini_set('report_memleaks', 'On'); @ini_set('zlib.output_compression', 'Off'); @ini_set('implicit_flush', 'Off'); //increase MySQL timeout @ini_set('mysql.connect_timeout', '300'); $wpdb->query("SET session wait_timeout = 300"); //set temp folder $can_set_temp_env = TRUE; $protected_env_vars = explode(',', ini_get('safe_mode_protected_env_vars')); foreach ($protected_env_vars as $protected_env) { if (strtoupper(trim($protected_env)) == 'TMPDIR') { $can_set_temp_env = FALSE; } } if ($can_set_temp_env) { $this->temp['PHP']['ENV']['TEMPDIR'] = getenv('TMPDIR'); @putenv('TMPDIR=' . BackWPup::get_plugin_data('TEMP')); } //Write Wordpress DB errors to log $wpdb->suppress_errors(FALSE); $wpdb->hide_errors(); //set wp max memory limit @ini_set('memory_limit', apply_filters('admin_memory_limit', WP_MAX_MEMORY_LIMIT)); //set error handler set_error_handler(array($this, 'log'), E_ALL ^ E_STRICT); set_exception_handler(array($this, 'exception_handler')); //not loading Textdomains and unload loaded if (get_site_option('backwpup_cfg_jobnotranslate')) { add_filter('override_load_textdomain', create_function('', 'return TRUE;')); $GLOBALS['l10n'] = array(); } // execute function on job shutdown register_shutdown_function( array( $this, 'shutdown' ) ); add_action('shutdown', array($this, 'shutdown')); //remove_action('shutdown', array( $this, 'shutdown' )); if (function_exists('pcntl_signal')) { declare (ticks=1); //set ticks pcntl_signal(15, array($this, 'shutdown')); //SIGTERM //pcntl_signal(9, array($this,'shutdown')); //SIGKILL pcntl_signal(2, array($this, 'shutdown')); //SIGINT } //clear output buffer while (@ob_end_clean()) { } @flush(); $job_types = BackWPup::get_job_types(); //go step by step foreach ($this->steps_todo as $this->step_working) { //Check if step already done if (in_array($this->step_working, $this->steps_done)) { continue; } //calc step percent if (count($this->steps_done) > 0) { $this->step_percent = round(count($this->steps_done) / count($this->steps_todo) * 100); } else { $this->step_percent = 1; } // do step tries while ($this->steps_data[$this->step_working]['STEP_TRY'] < get_site_option('backwpup_cfg_jobstepretry')) { // break if try has marked as done for no more tries if (in_array($this->step_working, $this->steps_done)) { break; } $this->steps_data[$this->step_working]['STEP_TRY']++; $this->update_working_data(TRUE); $done = FALSE; //executes the methods of job process if ($this->step_working == 'CREATE_ARCHIVE') { $done = $this->create_archive(); } elseif ($this->step_working == 'CREATE_MANIFEST') { $done = $this->create_manifest(); } elseif ($this->step_working == 'END') { $this->end(); break 2; } elseif (strstr($this->step_working, 'JOB_')) { $done = $job_types[str_replace('JOB_', '', $this->step_working)]->job_run($this); } elseif (strstr($this->step_working, 'DEST_SYNC_')) { $done = BackWPup::get_destination(str_replace('DEST_SYNC_', '', $this->step_working))->job_run_sync($this); } elseif (strstr($this->step_working, 'DEST_')) { $done = BackWPup::get_destination(str_replace('DEST_', '', $this->step_working))->job_run_archive($this); } elseif (!empty($this->steps_data[$this->step_working]['CALLBACK'])) { $done = $this->steps_data[$this->step_working]['CALLBACK']($this); } // set step as done or if step has too many tries if ($done === TRUE) { $this->temp = array(); //Clean temp $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; } if (!$done && $this->steps_data[$this->step_working]['STEP_TRY'] >= get_site_option('backwpup_cfg_jobstepretry')) { $this->log(__('Step aborted: too many attempts!', 'backwpup'), E_USER_ERROR); $this->temp = array(); //Clean temp $this->steps_done[] = $this->step_working; $this->substeps_done = 0; $this->substeps_todo = 0; } //restart on every job step expect end and only on http connection if (get_site_option('backwpup_cfg_jobsteprestart')) { $this->do_restart(); } } } }