PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0.3.2
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0.3.2
6.2.2 6.2.1 6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 All 155 releases
mainwp / pages / page-mainwp-manage-backups-handler.php

page-mainwp-manage-backups-handler.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 5.0.3.2, at pages/page-mainwp-manage-backups-handler.php

620 lines 23.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Legacy Backups Handler.
4 *
5 * @package MainWP/Dashboard
6 */
7
8 namespace MainWP\Dashboard;
9
10 /**
11 * Class MainWP_Manage_Backups_Handler
12 *
13 * @package MainWP\Dashboard
14 */
15 class MainWP_Manage_Backups_Handler {
16
17 /**
18 * Instance variable.
19 *
20 * @var null $instance.
21 */
22 private static $instance = null;
23
24 /**
25 * Create instance.
26 *
27 * @return self $instance.
28 */
29 public static function instance() {
30 if ( null === self::$instance ) {
31 self::$instance = new self();
32 }
33
34 return self::$instance;
35 }
36
37 /**
38 * Get Class Name.
39 *
40 * @return string __CLASS__
41 */
42 public static function get_class_name() {
43 return __CLASS__;
44 }
45
46 /**
47 * Validate Backup Tasks.
48 *
49 * @param array $pBackupTasks Backup tasks.
50 *
51 * @return bool true|false.
52 *
53 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_task_with_values()
54 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_group_by_id()
55 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
56 */
57 public static function validate_backup_tasks( $pBackupTasks ) {
58 if ( ! is_array( $pBackupTasks ) ) {
59 return true;
60 }
61
62 $nothingChanged = true;
63 foreach ( $pBackupTasks as $backupTask ) {
64 if ( '' === $backupTask->groups ) {
65 $newSiteIds = '';
66 $siteIds = ( '' === $backupTask->sites ? array() : explode( ',', $backupTask->sites ) );
67 foreach ( $siteIds as $siteId ) {
68 $site = MainWP_DB::instance()->get_website_by_id( $siteId );
69 if ( ! empty( $site ) ) {
70 $newSiteIds .= ',' . $siteId;
71 }
72 }
73
74 $newSiteIds = trim( $newSiteIds, ',' );
75
76 if ( $newSiteIds !== $backupTask->sites ) {
77 $nothingChanged = false;
78 MainWP_DB_Backup::instance()->update_backup_task_with_values( $backupTask->id, array( 'sites' => $newSiteIds ) );
79 }
80 } else {
81 $newGroupIds = '';
82 $groupIds = explode( ',', $backupTask->groups );
83 foreach ( $groupIds as $groupId ) {
84 $group = MainWP_DB_Common::instance()->get_group_by_id( $groupId );
85 if ( ! empty( $group ) ) {
86 $newGroupIds .= ',' . $groupId;
87 }
88 }
89 $newGroupIds = trim( $newGroupIds, ',' );
90
91 if ( $newGroupIds !== $backupTask->groups ) {
92 $nothingChanged = false;
93 MainWP_DB_Backup::instance()->update_backup_task_with_values( $backupTask->id, array( 'groups' => $newGroupIds ) );
94 }
95 }
96 }
97
98 return $nothingChanged;
99 }
100
101 /**
102 * Can Edit Backup Task.
103 *
104 * @param object $task Backup task.
105 *
106 * @return bool true|false.
107 *
108 * @uses \MainWP\Dashboard\MainWP_System::is_single_user()
109 */
110 public static function can_edit_backuptask( &$task ) {
111 if ( null === $task ) {
112 return false;
113 }
114
115 if ( MainWP_System::instance()->is_single_user() ) {
116 return true;
117 }
118
119 /**
120 * Current user global.
121 *
122 * @global string
123 */
124 global $current_user;
125
126 return ( $task->userid === $current_user->ID );
127 }
128
129 /**
130 * Update backup task.
131 *
132 * @uses \MainWP\Dashboard\MainWP_DB_Backup::add_backup_task()
133 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
134 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_task()
135 */
136 public static function update_backup() {
137
138 /**
139 * Current user global.
140 *
141 * @global string
142 */
143 global $current_user;
144
145 //phpcs:disable WordPress.Security.NonceVerification.Missing -- nonce verified.
146 $name = isset( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : '';
147
148 if ( '' === $name ) {
149 die( wp_json_encode( array( 'error' => esc_html__( 'Invalid backup task name. Please, enter a new name and try again.', 'mainwp' ) ) ) );
150 }
151
152 $backupId = isset( $_POST['id'] ) ? intval( $_POST['id'] ) : 0;
153 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $backupId );
154
155 if ( ! self::can_edit_backuptask( $task ) ) {
156 die( wp_json_encode( array( 'error' => esc_html__( 'Insufficient permissions. Is this task set by you?', 'mainwp' ) ) ) );
157 }
158
159 $schedule = isset( $_POST['schedule'] ) ? sanitize_text_field( wp_unslash( $_POST['schedule'] ) ) : '';
160 $type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
161 $excludedFolder = isset( $_POST['exclude'] ) ? trim( wp_unslash( $_POST['exclude'] ), "\n" ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- ok.
162 $excludedFolder = explode( "\n", $excludedFolder );
163 $excludedFolder = array_map( array( MainWP_Utility::get_class_name(), 'trim_slashes' ), $excludedFolder );
164 $excludedFolder = array_map( 'htmlentities', $excludedFolder );
165 $excludedFolder = implode( ',', $excludedFolder );
166 $sites = '';
167 $groups = '';
168
169 if ( isset( $_POST['sites'] ) && is_array( $_POST['sites'] ) ) {
170 foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['sites'] ) ) as $site ) {
171 if ( '' !== $sites ) {
172 $sites .= ',';
173 }
174 $sites .= $site;
175 }
176 }
177
178 if ( isset( $_POST['groups'] ) && is_array( $_POST['groups'] ) ) {
179 foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['groups'] ) ) as $group ) {
180 if ( '' !== $groups ) {
181 $groups .= ',';
182 }
183 $groups .= $group;
184 }
185 }
186
187 do_action( 'mainwp_update_backuptask', $task->id );
188
189 $archiveFormat = isset( $_POST['archiveFormat'] ) ? sanitize_text_field( wp_unslash( $_POST['archiveFormat'] ) ) : 'site';
190 $maximumFileDescriptorsOverride = isset( $_POST['maximumFileDescriptorsOverride'] ) && 1 === (int) $_POST['maximumFileDescriptorsOverride'];
191 $maximumFileDescriptorsAuto = isset( $_POST['maximumFileDescriptorsAuto'] ) && 1 === (int) $_POST['maximumFileDescriptorsAuto'];
192 $maximumFileDescriptors = isset( $_POST['maximumFileDescriptors'] ) ? intval( $_POST['maximumFileDescriptors'] ) : 150;
193 $loadFilesBeforeZip = isset( $_POST['loadFilesBeforeZip'] ) ? 1 : 0;
194
195 $subfolder = isset( $_POST['subfolder'] ) ? sanitize_text_field( wp_unslash( $_POST['subfolder'] ) ) : '';
196 $filename = isset( $_POST['filename'] ) ? sanitize_text_field( wp_unslash( $_POST['filename'] ) ) : '';
197 $excludebackup = isset( $_POST['excludebackup'] ) ? sanitize_text_field( wp_unslash( $_POST['excludebackup'] ) ) : '';
198 $excludecache = isset( $_POST['excludecache'] ) ? sanitize_text_field( wp_unslash( $_POST['excludecache'] ) ) : '';
199 $excludenonwp = isset( $_POST['excludenonwp'] ) ? sanitize_text_field( wp_unslash( $_POST['excludenonwp'] ) ) : '';
200 $excludezip = isset( $_POST['excludezip'] ) ? sanitize_text_field( wp_unslash( $_POST['excludezip'] ) ) : '';
201
202 //phpcs:enable.Missing
203
204 if ( MainWP_DB_Backup::instance()->update_backup_task( $task->id, $current_user->ID, htmlentities( $name ), $schedule, $type, $excludedFolder, $sites, $groups, $subfolder, $filename, $excludebackup, $excludecache, $excludenonwp, $excludezip, $archiveFormat, $maximumFileDescriptorsOverride, $maximumFileDescriptorsAuto, $maximumFileDescriptors, $loadFilesBeforeZip ) === false ) {
205 die( wp_json_encode( array( 'error' => esc_html__( 'Undefined error occurred. Please try again.', 'mainwp' ) ) ) );
206 } else {
207 die( wp_json_encode( array( 'result' => esc_html__( 'Task updated successfully.', 'mainwp' ) ) ) );
208 }
209 }
210
211 /** Add backup task. */
212 public static function add_backup() {
213
214 /**
215 * Current user global.
216 *
217 * @global string
218 */
219 global $current_user;
220
221 //phpcs:disable WordPress.Security.NonceVerification -- ok.
222 $name = isset( $_POST['name'] ) ? sanitize_text_field( wp_unslash( $_POST['name'] ) ) : '';
223
224 if ( empty( $name ) ) {
225 die( wp_json_encode( array( 'error' => esc_html__( 'Invalid backup task name. Please, enter a new name and try again.', 'mainwp' ) ) ) );
226 }
227
228 $schedule = isset( $_POST['schedule'] ) ? sanitize_text_field( wp_unslash( $_POST['schedule'] ) ) : '';
229 $type = isset( $_POST['type'] ) ? sanitize_text_field( wp_unslash( $_POST['type'] ) ) : '';
230 $excludedFolder = isset( $_POST['exclude'] ) ? trim( wp_unslash( $_POST['exclude'] ), "\n" ) : ''; //phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- ok.
231 $excludedFolder = explode( "\n", $excludedFolder );
232 $excludedFolder = array_map( array( MainWP_Utility::get_class_name(), 'trim_slashes' ), $excludedFolder );
233 $excludedFolder = array_map( 'htmlentities', $excludedFolder );
234 $excludedFolder = implode( ',', $excludedFolder );
235
236 $sites = '';
237 $groups = '';
238
239 if ( isset( $_POST['sites'] ) ) {
240 foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['sites'] ) ) as $site ) {
241 if ( '' !== $sites ) {
242 $sites .= ',';
243 }
244 $sites .= $site;
245 }
246 }
247
248 if ( isset( $_POST['groups'] ) ) {
249 foreach ( array_map( 'sanitize_text_field', wp_unslash( $_POST['groups'] ) ) as $group ) {
250 if ( '' !== $groups ) {
251 $groups .= ',';
252 }
253 $groups .= $group;
254 }
255 }
256
257 $archiveFormat = isset( $_POST['archiveFormat'] ) ? sanitize_text_field( wp_unslash( $_POST['archiveFormat'] ) ) : 'site';
258 $maximumFileDescriptorsOverride = isset( $_POST['maximumFileDescriptorsOverride'] ) && 1 === (int) $_POST['maximumFileDescriptorsOverride'];
259 $maximumFileDescriptorsAuto = isset( $_POST['maximumFileDescriptorsAuto'] ) && 1 === (int) $_POST['maximumFileDescriptorsAuto'];
260 $maximumFileDescriptors = isset( $_POST['maximumFileDescriptors'] ) ? intval( $_POST['maximumFileDescriptors'] ) : 150;
261 $loadFilesBeforeZip = isset( $_POST['loadFilesBeforeZip'] ) ? 1 : 0;
262
263 $subfolder = isset( $_POST['subfolder'] ) ? sanitize_text_field( wp_unslash( $_POST['subfolder'] ) ) : '';
264 $filename = isset( $_POST['filename'] ) ? sanitize_text_field( wp_unslash( $_POST['filename'] ) ) : '';
265 $excludebackup = isset( $_POST['excludebackup'] ) ? sanitize_text_field( wp_unslash( $_POST['excludebackup'] ) ) : '';
266 $excludecache = isset( $_POST['excludecache'] ) ? sanitize_text_field( wp_unslash( $_POST['excludecache'] ) ) : '';
267 $excludenonwp = isset( $_POST['excludenonwp'] ) ? sanitize_text_field( wp_unslash( $_POST['excludenonwp'] ) ) : '';
268 $excludezip = isset( $_POST['excludezip'] ) ? sanitize_text_field( wp_unslash( $_POST['excludezip'] ) ) : '';
269 //phpcs:enable
270
271 $task = MainWP_DB_Backup::instance()->add_backup_task( $current_user->ID, htmlentities( $name ), $schedule, $type, $excludedFolder, $sites, $groups, $subfolder, $filename, 0, $excludebackup, $excludecache, $excludenonwp, $excludezip, $archiveFormat, $maximumFileDescriptorsOverride, $maximumFileDescriptorsAuto, $maximumFileDescriptors, $loadFilesBeforeZip );
272
273 if ( ! $task ) {
274 die( wp_json_encode( array( 'error' => esc_html__( 'Undefined error occurred. Please try again.', 'mainwp' ) ) ) );
275 } else {
276 do_action( 'mainwp_add_backuptask', $task->id );
277
278 die( wp_json_encode( array( 'result' => esc_html__( 'Task created successfully.', 'mainwp' ) ) ) );
279 }
280 }
281
282 /**
283 * Execute the backup task.
284 *
285 * @param mixed $task Task to perform.
286 * @param integer $nrOfSites Number of Child Sites to perform the task on.
287 * @param bool $updateRun ture|false.
288 *
289 * @return mixed $errorOutput.
290 *
291 * @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup_site()
292 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_run()
293 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
294 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_task_with_values()
295 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_completed_sites()
296 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_errors()
297 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_completed()
298 * @uses \MainWP\Dashboard\MainWP_DB_Common::get_user_notification_email()
299 * @uses \MainWP\Dashboard\MainWP_Format::format_email()
300 * @uses \MainWP\Dashboard\MainWP_Error_Helper::get_error_message()
301 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_group_id()
302 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
303 * @uses \MainWP\Dashboard\MainWP_Utility::format_timestamp()
304 * @uses \MainWP\Dashboard\MainWP_Utility::get_nice_url()
305 * @uses \MainWP\Dashboard\MainWP_Utility::sanitize()
306 */
307 public static function execute_backup_task( $task, $nrOfSites = 0, $updateRun = true ) { // phpcs:ignore -- not quite complex function.
308
309 if ( $updateRun ) {
310 MainWP_DB_Backup::instance()->update_backup_run( $task->id );
311 }
312
313 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $task->id );
314
315 $completed_sites = $task->completed_sites;
316
317 if ( '' !== $completed_sites ) {
318 $completed_sites = json_decode( $completed_sites, true );
319 }
320
321 if ( ! is_array( $completed_sites ) ) {
322 $completed_sites = array();
323 }
324
325 $sites = array();
326
327 if ( empty( $task->groups ) ) {
328 if ( '' !== $task->sites ) {
329 $sites = explode( ',', $task->sites );
330 }
331 } else {
332 $groups = explode( ',', $task->groups );
333 foreach ( $groups as $groupid ) {
334 $group_sites = MainWP_DB::instance()->get_websites_by_group_id( $groupid );
335 foreach ( $group_sites as $group_site ) {
336 if ( in_array( $group_site->id, $sites ) ) {
337 continue;
338 }
339 $sites[] = $group_site->id;
340 }
341 }
342 }
343 $errorOutput = null;
344
345 $lastStartNotification = $task->lastStartNotificationSent;
346 if ( $updateRun && ( 1 === get_option( 'mainwp_notificationOnBackupStart' ) ) && ( $lastStartNotification < $task->last_run ) ) {
347 $email = MainWP_DB_Common::instance()->get_user_notification_email( $task->userid );
348 if ( '' !== $email ) {
349 $output = 'A scheduled backup has started with MainWP on ' . MainWP_Utility::format_timestamp( MainWP_Utility::get_timestamp() ) . ' for the following ' . count( $sites ) . ' sites:<br />';
350
351 foreach ( $sites as $siteid ) {
352 $website = MainWP_DB::instance()->get_website_by_id( $siteid );
353 $output .= '&nbsp;&bull;&nbsp;<a href="' . $website->url . '">' . MainWP_Utility::get_nice_url( $website->url ) . '</a><br />';
354 }
355
356 $output .= '<br />Backup details:<br /><br />';
357 $output .= '<strong>Backup task</strong> - ' . $task->name . '<br />';
358 $output .= '<strong>Backup type</strong> - ' . ( 'db' === $task->type ? 'DATABASE BACKUP' : 'FULL BACKUP' ) . '<br />';
359 $output .= '<strong>Backup schedule</strong> - ' . strtoupper( $task->schedule ) . '<br />';
360
361 $mail_title = 'A Scheduled Backup has been Started - MainWP';
362 $formated_content = MainWP_Format::format_email( $email, $output, $mail_title );
363 wp_mail( $email, $mail_title, $formated_content, 'content-type: text/html' );
364 MainWP_DB_Backup::instance()->update_backup_task_with_values( $task->id, array( 'lastStartNotificationSent' => time() ) );
365 }
366 }
367
368 $currentCount = 0;
369
370 foreach ( $sites as $siteid ) {
371 if ( isset( $completed_sites[ $siteid ] ) && ( true === $completed_sites[ $siteid ] ) ) {
372 continue;
373 }
374 $website = MainWP_DB::instance()->get_website_by_id( $siteid );
375
376 try {
377 $subfolder = str_replace( '%task%', MainWP_Utility::sanitize( $task->name ), $task->subfolder );
378
379 $backupResult = MainWP_Backup_Handler::backup_site( $siteid, $task, $subfolder );
380
381 if ( false === $backupResult ) {
382 continue;
383 }
384
385 if ( null === $errorOutput ) {
386 $errorOutput = '';
387 }
388 $error = false;
389 $tmpErrorOutput = '';
390 if ( isset( $backupResult['error'] ) ) {
391 $tmpErrorOutput .= $backupResult['error'] . '<br />';
392 $error = true;
393 }
394 if ( isset( $backupResult['ftp'] ) && 'success' !== $backupResult['ftp'] ) {
395 $tmpErrorOutput .= 'FTP: ' . $backupResult['ftp'] . '<br />';
396 $error = true;
397 }
398 if ( isset( $backupResult['dropbox'] ) && 'success' !== $backupResult['dropbox'] ) {
399 $tmpErrorOutput .= 'Dropbox: ' . $backupResult['dropbox'] . '<br />';
400 $error = true;
401 }
402
403 if ( isset( $backupResult['amazon'] ) && 'success' !== $backupResult['amazon'] ) {
404 $tmpErrorOutput .= 'Amazon: ' . $backupResult['amazon'] . '<br />';
405 $error = true;
406 }
407
408 if ( $error ) {
409 $errorOutput .= 'Site: <strong>' . MainWP_Utility::get_nice_url( $website->url ) . '</strong><br />';
410 $errorOutput .= $tmpErrorOutput . '<br />';
411 }
412 } catch ( \Exception $e ) {
413 if ( null === $errorOutput ) {
414 $errorOutput = '';
415 }
416 $errorOutput .= 'Site: <strong>' . MainWP_Utility::get_nice_url( $website->url ) . '</strong><br />';
417 $errorOutput .= MainWP_Error_Helper::get_error_message( $e ) . '<br />';
418 $_error_output = MainWP_Error_Helper::get_error_message( $e );
419 }
420
421 $_backup_result = isset( $backupResult ) ? $backupResult : ( isset( $_error_output ) ? $_error_output : '' );
422 do_action( 'mainwp_managesite_schedule_backup', $website, array( 'type' => $task->type ), $_backup_result );
423
424 ++$currentCount;
425
426 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $task->id );
427
428 $completed_sites = $task->completed_sites;
429
430 if ( '' !== $completed_sites ) {
431 $completed_sites = json_decode( $completed_sites, true );
432 }
433 if ( ! is_array( $completed_sites ) ) {
434 $completed_sites = array();
435 }
436
437 $completed_sites[ $siteid ] = true;
438 MainWP_DB_Backup::instance()->update_completed_sites( $task->id, $completed_sites );
439
440 if ( ( 0 !== $nrOfSites ) && ( $nrOfSites <= $currentCount ) ) {
441 break;
442 }
443 }
444
445 if ( null !== $errorOutput ) {
446 MainWP_DB_Backup::instance()->update_backup_errors( $task->id, $errorOutput );
447 }
448
449 if ( count( $completed_sites ) === count( $sites ) ) {
450 MainWP_DB_Backup::instance()->update_backup_completed( $task->id );
451
452 if ( 1 === get_option( 'mainwp_notificationOnBackupFail' ) ) {
453 $email = MainWP_DB_Common::instance()->get_user_notification_email( $task->userid );
454 if ( '' !== $email ) {
455 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $task->id );
456 if ( '' !== $task->backup_errors ) {
457 $errorOutput = 'Errors occurred while executing task: <strong>' . $task->name . '</strong><br /><br />' . $task->backup_errors;
458 $mail_title = 'A scheduled backup had an Error - MainWP';
459 $formated_content = MainWP_Format::format_email( $email, $errorOutput, $mail_title );
460 wp_mail( $email, $mail_title, $formated_content, 'content-type: text/html' );
461
462 MainWP_DB_Backup::instance()->update_backup_errors( $task->id, '' );
463 }
464 }
465 }
466 }
467
468 return empty( $errorOutput );
469 }
470
471 /**
472 * Prepare Child Site to be backed up.
473 *
474 * @param mixed $pTaskId Task ID.
475 * @param mixed $pSiteId Child Site ID.
476 * @param mixed $pFileNameUID Filename Unique ID.
477 *
478 * @return self MainWP_Manage_Sites_Handler()
479 *
480 * @throws MainWP_Exception Error message.
481 *
482 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
483 * @uses \MainWP\Dashboard\MainWP_Backup_Handler::backup()
484 * @uses \MainWP\Dashboard\MainWP_Utility::sanitize()
485 */
486 public static function backup( $pTaskId, $pSiteId, $pFileNameUID ) {
487 $backupTask = MainWP_DB_Backup::instance()->get_backup_task_by_id( $pTaskId );
488
489 $subfolder = str_replace( '%task%', MainWP_Utility::sanitize( $backupTask->name ), $backupTask->subfolder );
490
491 if ( 'site' === $backupTask->archiveFormat ) {
492 $loadFilesBeforeZip = false;
493 $maximumFileDescriptorsOverride = false;
494 $maximumFileDescriptorsAuto = false;
495 $maximumFileDescriptors = 150;
496 $archiveFormat = false;
497 } elseif ( 'global' === $backupTask->archiveFormat ) {
498 $loadFilesBeforeZip = false;
499 $maximumFileDescriptorsOverride = false;
500 $maximumFileDescriptorsAuto = false;
501 $maximumFileDescriptors = 150;
502 $archiveFormat = 'global';
503 } else {
504 $loadFilesBeforeZip = $backupTask->loadFilesBeforeZip;
505 $maximumFileDescriptorsOverride = ( 'zip' === $backupTask->archiveFormat ) && ( 1 === (int) $backupTask->maximumFileDescriptorsOverride );
506 $maximumFileDescriptorsAuto = ( 'zip' === $backupTask->archiveFormat ) && ( 1 === (int) $backupTask->maximumFileDescriptorsAuto );
507 $maximumFileDescriptors = $backupTask->maximumFileDescriptors;
508 $archiveFormat = $backupTask->archiveFormat;
509 }
510
511 return MainWP_Backup_Handler::backup( $pSiteId, $backupTask->type, $subfolder, $backupTask->exclude, $backupTask->excludebackup, $backupTask->excludecache, $backupTask->excludenonwp, $backupTask->excludezip, $backupTask->filename, $pFileNameUID, $archiveFormat, $maximumFileDescriptorsOverride, $maximumFileDescriptorsAuto, $maximumFileDescriptors, $loadFilesBeforeZip );
512 }
513
514 /**
515 * Get backup tasks and site ID.
516 *
517 * @param mixed $pTaskId Task ID.
518 *
519 * @return array $allSites All Sites array.
520 * $remoteDestinations Remote destinations array.
521 *
522 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
523 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_run_manually()
524 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_id()
525 * @uses \MainWP\Dashboard\MainWP_DB::get_website_by_group_id()
526 */
527 public static function get_backup_task_sites( $pTaskId ) {
528 $sites = array();
529 $backupTask = MainWP_DB_Backup::instance()->get_backup_task_by_id( $pTaskId );
530 if ( empty( $backupTask->groups ) ) {
531 if ( '' !== $backupTask->sites ) {
532 $sites = explode( ',', $backupTask->sites );
533 }
534 } else {
535 $groups = explode( ',', $backupTask->groups );
536 foreach ( $groups as $groupid ) {
537 $group_sites = MainWP_DB::instance()->get_websites_by_group_id( $groupid );
538 foreach ( $group_sites as $group_site ) {
539 if ( in_array( $group_site->id, $sites ) ) {
540 continue;
541 }
542 $sites[] = $group_site->id;
543 }
544 }
545 }
546
547 $allSites = array();
548 foreach ( $sites as $site ) {
549 $website = MainWP_DB::instance()->get_website_by_id( $site );
550 $allSites[] = array(
551 'id' => $website->id,
552 'name' => $website->name,
553 'fullsize' => $website->totalsize * 1024,
554 'dbsize' => $website->dbsize,
555 );
556 }
557
558 $remoteDestinations = apply_filters( 'mainwp_backuptask_remotedestinations', array(), $backupTask );
559 MainWP_DB_Backup::instance()->update_backup_run_manually( $pTaskId );
560
561 return array(
562 'sites' => $allSites,
563 'remoteDestinations' => $remoteDestinations,
564 );
565 }
566
567 /**
568 * Remove Backup.
569 *
570 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
571 * @uses \MainWP\Dashboard\MainWP_DB_Backup::remove_backup_task()
572 */
573 public static function remove_backup() {
574 if ( isset( $_POST['id'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Missing
575 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( intval( $_POST['id'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Missing
576 if ( self::can_edit_backuptask( $task ) ) {
577 MainWP_DB_Backup::instance()->remove_backup_task( $task->id );
578 die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
579 }
580 }
581 die( wp_json_encode( array( 'notask' => true ) ) );
582 }
583
584 /**
585 * Resume Backup.
586 *
587 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
588 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_task_with_values()
589 */
590 public static function resume_backup() {
591 $id = isset( $_POST['id'] ) ? intval( $_POST['id'] ) : false; //phpcs:ignore WordPress.Security.NonceVerification.Missing
592 if ( $id ) {
593 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $id );
594 if ( self::can_edit_backuptask( $task ) ) {
595 MainWP_DB_Backup::instance()->update_backup_task_with_values( $task->id, array( 'paused' => 0 ) );
596 die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
597 }
598 }
599 die( wp_json_encode( array( 'notask' => true ) ) );
600 }
601
602 /**
603 * Pause Backup.
604 *
605 * @uses \MainWP\Dashboard\MainWP_DB_Backup::get_backup_task_by_id()
606 * @uses \MainWP\Dashboard\MainWP_DB_Backup::update_backup_task_with_values()
607 */
608 public static function pause_backup() {
609 $id = isset( $_POST['id'] ) ? intval( $_POST['id'] ) : false; //phpcs:ignore WordPress.Security.NonceVerification.Missing
610 if ( $id ) {
611 $task = MainWP_DB_Backup::instance()->get_backup_task_by_id( $id );
612 if ( self::can_edit_backuptask( $task ) ) {
613 MainWP_DB_Backup::instance()->update_backup_task_with_values( $task->id, array( 'paused' => 1 ) );
614 die( wp_json_encode( array( 'result' => 'SUCCESS' ) ) );
615 }
616 }
617 die( wp_json_encode( array( 'notask' => true ) ) );
618 }
619 }
620