Linux puskom-ProLiant-DL385-Gen10 5.4.0-150-generic #167~18.04.1-Ubuntu SMP Wed May 24 00:51:42 UTC 2023 x86_64
/
home
/
puskom
/
mastur
/
backwpup
/
inc
/
//home/puskom/mastur/backwpup/inc/class-page-jobs.php
<?php /** * Class For BackWPup Jobs page. */ class BackWPup_Page_Jobs extends WP_List_Table { public static $logfile; private static $listtable; private $job_object; private $job_types; private $destinations; public function __construct() { parent::__construct([ 'plural' => 'jobs', 'singular' => 'job', 'ajax' => true, ]); } /** * @return bool|void */ public function ajax_user_can() { return current_user_can('backwpup'); } public 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(); if (!isset($_GET['order']) || !isset($_GET['orderby'])) { return; } if (strtolower($_GET['order']) === 'asc') { $order = SORT_ASC; } else { $order = SORT_DESC; } if (empty($_GET['orderby']) || !in_array(strtolower($_GET['orderby']), ['jobname', 'type', 'dest', 'next', 'last'], true)) { $orderby = 'jobname'; } else { $orderby = strtolower($_GET['orderby']); } //sorting $job_configs = []; $i = 0; foreach ($this->items as $item) { $job_configs[$i]['jobid'] = $item; $job_configs[$i]['jobname'] = BackWPup_Option::get($item, 'name'); $job_configs[$i]['type'] = BackWPup_Option::get($item, 'type'); $job_configs[$i]['dest'] = BackWPup_Option::get($item, 'destinations'); if ($order === SORT_ASC) { sort($job_configs[$i]['type']); sort($job_configs[$i]['dest']); } else { rsort($job_configs[$i]['type']); rsort($job_configs[$i]['dest']); } $job_configs[$i]['type'] = array_shift($job_configs[$i]['type']); $job_configs[$i]['dest'] = array_shift($job_configs[$i]['dest']); $job_configs[$i]['next'] = (int) wp_next_scheduled('backwpup_cron', ['arg' => $item]); $job_configs[$i]['last'] = BackWPup_Option::get($item, 'lastrun'); ++$i; } $tmp = []; foreach ($job_configs as &$ma) { $tmp[] = &$ma[$orderby]; } array_multisort($tmp, $order, $job_configs); $this->items = []; foreach ($job_configs as $item) { $this->items[] = $item['jobid']; } } public function no_items() { _e('No Jobs.', 'backwpup'); } /** * @return array */ public function get_bulk_actions() { if (!$this->has_items()) { return []; } $actions = []; $actions['delete'] = __('Delete', 'backwpup'); return apply_filters('backwpup_page_jobs_get_bulk_actions', $actions); } /** * @return array */ public function get_columns() { $jobs_columns = []; $jobs_columns['cb'] = '<input type="checkbox" />'; $jobs_columns['jobname'] = __('Job Name', 'backwpup'); $jobs_columns['type'] = __('Type', 'backwpup'); $jobs_columns['dest'] = __('Destinations', 'backwpup'); $jobs_columns['next'] = __('Next Run', 'backwpup'); $jobs_columns['last'] = __('Last Run', 'backwpup'); return $jobs_columns; } /** * @return array */ public function get_sortable_columns() { return [ 'jobname' => 'jobname', 'type' => 'type', 'dest' => 'dest', 'next' => 'next', 'last' => 'last', ]; } /** * The cb Column. * * @param $item * * @return string */ public function column_cb($item) { return '<input type="checkbox" name="jobs[]" value="' . esc_attr($item) . '" />'; } /** * The jobname Column. * * @param $item * * @return string */ public function column_jobname($item) { $job_normal_hide = ''; if (is_object($this->job_object)) { $job_normal_hide = ' style="display:none;"'; } $r = '<strong title="' . sprintf(__('Job ID: %d', 'backwpup'), $item) . '">' . esc_html(BackWPup_Option::get($item, 'name')) . '</strong>'; $actions = []; if (current_user_can('backwpup_jobs_edit')) { $actions['edit'] = '<a href="' . wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupeditjob&jobid=' . $item, 'edit-job') . '">' . esc_html__('Edit', 'backwpup') . '</a>'; $actions['copy'] = '<a href="' . wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupjobs&action=copy&jobid=' . $item, 'copy-job_' . $item) . '">' . esc_html__('Copy', 'backwpup') . '</a>'; $actions['delete'] = '<a class="submitdelete" href="' . wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupjobs&action=delete&jobs[]=' . $item, 'bulk-jobs') . '" onclick="return showNotice.warn();">' . esc_html__('Delete', 'backwpup') . '</a>'; } if (current_user_can('backwpup_jobs_start')) { $url = BackWPup_Job::get_jobrun_url('runnowlink', $item); $actions['runnow'] = '<a href="' . esc_attr($url['url']) . '">' . esc_html__('Run now', 'backwpup') . '</a>'; } if (current_user_can('backwpup_logs') && BackWPup_Option::get($item, 'logfile')) { $logfile = basename(BackWPup_Option::get($item, 'logfile')); if (is_object($this->job_object) && $this->job_object->job['jobid'] == $item) { $logfile = basename($this->job_object->logfile); } $log_name = str_replace(['.html', '.gz'], '', basename($logfile)); $actions['lastlog'] = '<a href="' . admin_url('admin-ajax.php') . '?&action=backwpup_view_log&log=' . $log_name . '&_ajax_nonce=' . wp_create_nonce('view-log_' . $log_name) . '&TB_iframe=true&width=640&height=440\" title="' . esc_attr($logfile) . '" class="thickbox">' . __('Last log', 'backwpup') . '</a>'; } $actions = apply_filters('backwpup_page_jobs_actions', $actions, $item, false); $r .= '<div class="job-normal"' . $job_normal_hide . '>' . $this->row_actions($actions) . '</div>'; if (is_object($this->job_object)) { $actionsrun = []; $actionsrun = apply_filters('backwpup_page_jobs_actions', $actionsrun, $item, true); $r .= '<div class="job-run">' . $this->row_actions($actionsrun) . '</div>'; } return $r; } /** * The type Column. * * @param $item * * @return string */ public function column_type($item) { $r = ''; if ($types = BackWPup_Option::get($item, 'type')) { foreach ($types as $type) { if (isset($this->job_types[$type])) { $r .= $this->job_types[$type]->info['name'] . '<br />'; } else { $r .= $type . '<br />'; } } } return $r; } /** * The destination Column. * * @param $item * * @return string */ public function column_dest($item) { $r = ''; $backup_to = false; foreach (BackWPup_Option::get($item, 'type') as $typeid) { if (isset($this->job_types[$typeid]) && $this->job_types[$typeid]->creates_file()) { $backup_to = true; break; } } if ($backup_to) { foreach (BackWPup_Option::get($item, 'destinations') as $destid) { if (isset($this->destinations[$destid]['info']['name'])) { $r .= $this->destinations[$destid]['info']['name'] . '<br />'; } else { $r .= $destid . '<br />'; } } } else { $r .= '<i>' . __('Not needed or set', 'backwpup') . '</i><br />'; } return $r; } /** * The next Column. * * @param $item * * @return string */ public function column_next($item) { $r = ''; $job_normal_hide = ''; if (is_object($this->job_object)) { $job_normal_hide = ' style="display:none;"'; } if (is_object($this->job_object) && $this->job_object->job['jobid'] == $item) { $runtime = current_time('timestamp') - $this->job_object->start_time; $r .= '<div class="job-run">' . sprintf(esc_html__('Running for: %s seconds', 'backwpup'), '<span id="runtime">' . $runtime . '</span>') . '</div>'; } if (is_object($this->job_object) && $this->job_object->job['jobid'] == $item) { $r .= '<div class="job-normal"' . $job_normal_hide . '>'; } if (BackWPup_Option::get($item, 'activetype') == 'wpcron') { if ($nextrun = wp_next_scheduled('backwpup_cron', ['arg' => $item]) + (get_option('gmt_offset') * 3600)) { $r .= '<span title="' . sprintf(esc_html__('Cron: %s', 'backwpup'), BackWPup_Option::get($item, 'cron')) . '">' . sprintf(__('%1$s at %2$s by WP-Cron', 'backwpup'), date_i18n(get_option('date_format'), $nextrun, true), date_i18n(get_option('time_format'), $nextrun, true)) . '</span><br />'; } else { $r .= __('Not scheduled!', 'backwpup') . '<br />'; } } elseif (BackWPup_Option::get($item, 'activetype') == 'easycron') { $easycron_status = BackWPup_EasyCron::status($item); if (!empty($easycron_status)) { $nextrun = BackWPup_Cron::cron_next($easycron_status['cron_expression']) + (get_option('gmt_offset') * 3600); $r .= '<span title="' . sprintf(esc_html__('Cron: %s', 'backwpup'), $easycron_status['cron_expression']) . '">' . sprintf(__('%1$s at %2$s by EasyCron', 'backwpup'), date_i18n(get_option('date_format'), $nextrun, true), date_i18n(get_option('time_format'), $nextrun, true)) . '</span><br />'; } else { $r .= __('Not scheduled!', 'backwpup') . '<br />'; } } elseif (BackWPup_Option::get($item, 'activetype') == 'link') { $r .= __('External link', 'backwpup') . '<br />'; } else { $r .= __('Inactive', 'backwpup'); } if (is_object($this->job_object) && $this->job_object->job['jobid'] == $item) { $r .= '</div>'; } return $r; } /** * The last Column. * * @param $item * * @return string */ public function column_last($item) { $r = ''; if (BackWPup_Option::get($item, 'lastrun')) { $lastrun = BackWPup_Option::get($item, 'lastrun'); $r .= sprintf(__('%1$s at %2$s', 'backwpup'), date_i18n(get_option('date_format'), $lastrun, true), date_i18n(get_option('time_format'), $lastrun, true)); if (BackWPup_Option::get($item, 'lastruntime')) { $r .= '<br />' . sprintf(__('Runtime: %d seconds', 'backwpup'), BackWPup_Option::get($item, 'lastruntime')); } } else { $r .= __('not yet', 'backwpup'); } $r .= '<br /><span class="last-action-links">'; if (current_user_can('backwpup_backups_download')) { $download_url = BackWPup_Option::get($item, 'lastbackupdownloadurl'); if (!empty($download_url)) { $r .= '<a href="' . wp_nonce_url($download_url, 'backwpup_action_nonce') . '" title="' . esc_attr(__('Download last backup', 'backwpup')) . '">' . esc_html__('Download', 'backwpup') . '</a> | '; } } if (current_user_can('backwpup_logs') && BackWPup_Option::get($item, 'logfile')) { $logfile = basename(BackWPup_Option::get($item, 'logfile')); if (is_object($this->job_object) && $this->job_object->job['jobid'] == $item) { $logfile = basename($this->job_object->logfile); } $log_name = str_replace(['.html', '.gz'], '', basename($logfile)); $r .= '<a class="thickbox" href="' . admin_url('admin-ajax.php') . '?&action=backwpup_view_log&log=' . $log_name . '&_ajax_nonce=' . wp_create_nonce('view-log_' . $log_name) . '&TB_iframe=true&width=640&height=440" title="' . esc_attr($logfile) . '">' . esc_html__('Log', 'backwpup') . '</a>'; } $r .= '</span>'; return $r; } 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', ['arg' => 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; foreach (BackWPup::get_registered_destinations() as $id => $dest) { if (!in_array($id, $job_conf_dests, true) || empty($dest['class'])) { continue; } /** @var BackWPup_Destinations $dest_class */ $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(); } public static function admin_print_styles() { ?> <style type="text/css" media="screen"> .column-last, .column-next, .column-type, .column-dest { width: 15%; } #TB_ajaxContent { background-color: black; color: #c0c0c0; } #showworking { white-space:nowrap; display: block; width: 100%; font-family:monospace; font-size:12px; line-height:15px; } #runningjob { padding:10px; position:relative; margin: 15px 0 25px 0; padding-bottom:25px; } h2#runnigtitle { margin-bottom: 15px; padding: 0; } #warningsid, #errorid { margin-right: 10px; } .infobuttons { position: absolute; right: 10px; bottom: 0; } .progressbar { margin-top: 20px; height: auto; background: #f6f6f6 url('<?php echo BackWPup::get_plugin_data('URL'); ?>/assets/images/progressbarhg.jpg'); } #lastmsg, #onstep, #lasterrormsg { text-align: center; margin-bottom: 20px; } #backwpup-page #lastmsg, #backwpup-page #onstep, #backwpup-page #lasterrormsg { font-family: "Open Sans", sans-serif; } .bwpu-progress { background-color: #1d94cf; color: #fff; padding: 5px 0; text-align: center; } #progresssteps { background-color: #007fb6; } .row-actions .lastlog { display: none; } @media screen and (max-width: 782px) { .column-type, .column-dest { display: none; } .row-actions .lastlog { display: inline-block; } .last-action-links { display: none; } } </style> <?php } public static function admin_print_scripts() { wp_enqueue_script('backwpupgeneral'); } public static function page() { echo '<div class="wrap" id="backwpup-page">'; echo '<h1>' . esc_html(sprintf(__('%s › Jobs', 'backwpup'), BackWPup::get_plugin_data('name'))) . ' <a href="' . wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupeditjob', 'edit-job') . '" class="add-new-h2">' . esc_html__('Add new', 'backwpup') . '</a></h1>'; BackWPup_Admin::display_messages(); $job_object = BackWPup_Job::get_working_data(); if (current_user_can('backwpup_jobs_start') && is_object($job_object)) { //read existing logfile $logfiledata = file_get_contents($job_object->logfile); preg_match('/<body[^>]*>/si', $logfiledata, $match); if (!empty($match[0])) { $startpos = strpos($logfiledata, $match[0]) + strlen($match[0]); } else { $startpos = 0; } $endpos = stripos($logfiledata, '</body>'); if (empty($endpos)) { $endpos = strlen($logfiledata); } $length = strlen($logfiledata) - (strlen($logfiledata) - $endpos) - $startpos; ?> <div id="runningjob"> <div id="runniginfos"> <h2 id="runningtitle"><?php esc_html(sprintf(__('Job currently running: %s', 'backwpup'), $job_object->job['name'])); ?></h2> <span id="warningsid"><?php esc_html_e('Warnings:', 'backwpup'); ?> <span id="warnings"><?php echo $job_object->warnings; ?></span></span> <span id="errorid"><?php esc_html_e('Errors:', 'backwpup'); ?> <span id="errors"><?php echo $job_object->errors; ?></span></span> <div class="infobuttons"><a href="#TB_inline?height=440&width=630&inlineId=tb-showworking" id="showworkingbutton" class="thickbox button button-primary button-primary-bwp" title="<?php esc_attr_e('Log of running job', 'backwpup'); ?>"><?php esc_html_e('Display working log', 'backwpup'); ?></a> <a href="<?php echo wp_nonce_url(network_admin_url('admin.php') . '?page=backwpupjobs&action=abort', 'abort-job'); ?>" id="abortbutton" class="backwpup-fancybox button button-bwp"><?php esc_html_e('Abort', 'backwpup'); ?></a> <a href="#" id="showworkingclose" title="<?php esc_html_e('Close working screen', 'backwpup'); ?>" class="button button-bwp" style="display:none" ><?php esc_html_e('Close', 'backwpup'); ?></a></div> </div> <input type="hidden" name="logpos" id="logpos" value="<?php echo strlen($logfiledata); ?>"> <div id="lasterrormsg"></div> <div class="progressbar"><div id="progressstep" class="bwpu-progress" style="width:<?php echo $job_object->step_percent; ?>%;"><?php echo esc_html($job_object->step_percent); ?>%</div></div> <div id="onstep"><?php echo esc_html($job_object->steps_data[$job_object->step_working]['NAME']); ?></div> <div class="progressbar"><div id="progresssteps" class="bwpu-progress" style="width:<?php echo $job_object->substep_percent; ?>%;"><?php echo esc_html($job_object->substep_percent); ?>%</div></div> <div id="lastmsg"><?php echo esc_html($job_object->lastmsg); ?></div> <div id="tb-showworking" style="display:none;"> <div id="showworking"><?php echo substr($logfiledata, $startpos, $length); ?></div> </div> </div> <?php } //display jos Table?> <form id="posts-filter" action="" method="get"> <input type="hidden" name="page" value="backwpupjobs" /> <?php echo wp_nonce_field('backwpup_ajax_nonce', 'backwpupajaxnonce', false); self::$listtable->display(); ?> <div id="ajax-response"></div> </form> </div> <?php if (!empty($job_object->logfile)) { ?> <script type="text/javascript"> //<![CDATA[ jQuery(document).ready(function ($) { backwpup_show_working = function () { var save_log_pos = 0; $.ajax({ type: 'GET', url: ajaxurl, cache: false, data:{ action: 'backwpup_working', logpos: $('#logpos').val(), logfile: '<?php echo basename($job_object->logfile); ?>', _ajax_nonce: '<?php echo wp_create_nonce('backwpupworking_ajax_nonce'); ?>' }, dataType: 'json', success:function (rundata) { if ( rundata == 0 ) { $("#abortbutton").remove(); $("#backwpup-adminbar-running").remove(); $(".job-run").hide(); $("#message").hide(); $(".job-normal").show(); $('#showworkingclose').show(); } if (0 < rundata.log_pos) { $('#logpos').val(rundata.log_pos); } if ('' != rundata.log_text) { $('#showworking').append(rundata.log_text); $('#TB_ajaxContent').scrollTop(rundata.log_pos * 15); } if (0 < rundata.error_count) { $('#errors').replaceWith('<span id="errors">' + rundata.error_count + '</span>'); } if (0 < rundata.warning_count) { $('#warnings').replaceWith('<span id="warnings">' + rundata.warning_count + '</span>'); } if (0 < rundata.step_percent) { $('#progressstep').replaceWith('<div id="progressstep" class="bwpu-progress">' + rundata.step_percent + '%</div>'); $('#progressstep').css('width', parseFloat(rundata.step_percent) + '%'); } if (0 < rundata.sub_step_percent) { $('#progresssteps').replaceWith('<div id="progresssteps" class="bwpu-progress">' + rundata.sub_step_percent + '%</div>'); $('#progresssteps').css('width', parseFloat(rundata.sub_step_percent) + '%'); } if (0 < rundata.running_time) { $('#runtime').replaceWith('<span id="runtime">' + rundata.running_time + '</span>'); } if ( '' != rundata.onstep ) { $('#onstep').replaceWith('<div id="onstep">' + rundata.on_step + '</div>'); } if ( '' != rundata.last_msg ) { $('#lastmsg').replaceWith('<div id="lastmsg">' + rundata.last_msg + '</div>'); } if ( '' != rundata.last_error_msg ) { $('#lasterrormsg').replaceWith('<div id="lasterrormsg">' + rundata.last_error_msg + '</div>'); } if ( rundata.job_done == 1 ) { $("#abortbutton").remove(); $("#backwpup-adminbar-running").remove(); $(".job-run").hide(); $("#message").hide(); $(".job-normal").show(); $('#showworkingclose').show(); } else { if ( rundata.restart_url !== '' ) { backwpup_trigger_cron( rundata.restart_url ); } setTimeout('backwpup_show_working()', 750); } }, error:function( ) { setTimeout('backwpup_show_working()', 750); } }); }; backwpup_trigger_cron = function ( cron_url ) { $.ajax({ type: 'POST', url: cron_url, dataType: 'text', cache: false, processData: false, timeout: 1 }); }; backwpup_show_working(); $('#showworkingclose').click( function() { $("#runningjob").hide( 'slow' ); return false; }); }); //]]> </script> <?php } } /** * Function to generate json data. */ public static function ajax_working() { check_ajax_referer('backwpupworking_ajax_nonce'); if (!current_user_can('backwpup_jobs_start')) { exit('-1'); } $log_folder = get_site_option('backwpup_cfg_logfolder'); $log_folder = BackWPup_File::get_absolute_path($log_folder); $logfile = isset($_GET['logfile']) ? $log_folder . basename(trim($_GET['logfile'])) : null; $logpos = isset($_GET['logpos']) ? absint($_GET['logpos']) : 0; $restart_url = ''; //check if logfile renamed if (file_exists($logfile . '.gz')) { $logfile .= '.gz'; } if (!is_readable($logfile) || strstr($_GET['logfile'], 'backwpup_log_') === false) { exit('0'); } $job_object = BackWPup_Job::get_working_data(); $done = 0; if (is_object($job_object)) { $warnings = $job_object->warnings; $errors = $job_object->errors; $step_percent = $job_object->step_percent; $substep_percent = $job_object->substep_percent; $runtime = current_time('timestamp') - $job_object->start_time; $onstep = $job_object->steps_data[$job_object->step_working]['NAME']; $lastmsg = $job_object->lastmsg; $lasterrormsg = $job_object->lasterrormsg; } else { $logheader = BackWPup_Job::read_logheader($logfile); $warnings = $logheader['warnings']; $runtime = $logheader['runtime']; $errors = $logheader['errors']; $step_percent = 100; $substep_percent = 100; $onstep = '<div class="backwpup-message backwpup-info"><p>' . esc_html__('Job completed', 'backwpup') . '</p></div>'; if ($errors > 0) { $lastmsg = '<div class="bwu-message-error"><p>' . esc_html__('ERROR:', 'backwpup') . ' ' . sprintf(esc_html__('Job has ended with errors in %s seconds. You must resolve the errors for correct execution.', 'backwpup'), $logheader['runtime']) . '</p></div>'; } elseif ($warnings > 0) { $lastmsg = '<div class="backwpup-message backwpup-warning"><p>' . esc_html__('WARNING:', 'backwpup') . ' ' . sprintf(esc_html__('Job has done with warnings in %s seconds. Please resolve them for correct execution.', 'backwpup'), $logheader['runtime']) . '</p></div>'; } else { $lastmsg = '<div class="updated"><p>' . sprintf(esc_html__('Job done in %s seconds.', 'backwpup'), $logheader['runtime']) . '</p></div>'; } $lasterrormsg = ''; $done = 1; } if ('.gz' == substr($logfile, -3)) { $logfiledata = file_get_contents('compress.zlib://' . $logfile, false, null, $logpos); } else { $logfiledata = file_get_contents($logfile, false, null, $logpos); } preg_match('/<body[^>]*>/si', $logfiledata, $match); if (!empty($match[0])) { $startpos = strpos($logfiledata, $match[0]) + strlen($match[0]); } else { $startpos = 0; } $endpos = stripos($logfiledata, '</body>'); if (false === $endpos) { $endpos = strlen($logfiledata); } $length = strlen($logfiledata) - (strlen($logfiledata) - $endpos) - $startpos; //check if restart must done on ALTERNATE_WP_CRON if (is_object($job_object) && defined('ALTERNATE_WP_CRON') && ALTERNATE_WP_CRON) { $restart = BackWPup_Job::get_jobrun_url('restartalt'); if ($job_object->pid === 0 && $job_object->uniqid === '') { $restart_url = $restart['url']; } $last_update = microtime(true) - $job_object->timestamp_last_update; if (empty($job_object->pid) && $last_update > 10) { $restart_url = $restart['url']; } } wp_send_json([ 'log_pos' => strlen($logfiledata) + $logpos, 'log_text' => substr($logfiledata, $startpos, $length), 'warning_count' => $warnings, 'error_count' => $errors, 'running_time' => $runtime, 'step_percent' => $step_percent, 'on_step' => $onstep, 'last_msg' => $lastmsg, 'last_error_msg' => $lasterrormsg, 'sub_step_percent' => $substep_percent, 'restart_url' => $restart_url, 'job_done' => $done, ]); } }