PluginProbe
ManageWP Worker / 3.9.12
ManageWP Worker v3.9.12
4.9.38 4.9.37 4.9.36 4.9.35 4.9.34 3.8.7 3.8.8 3.9.0 3.9.1 3.9.10 3.9.11 3.9.12 3.9.13 3.9.14 3.9.15 3.9.16 3.9.17 3.9.18 3.9.19 3.9.2 3.9.20 3.9.21 3.9.22 3.9.23 3.9.24 All 73 releases
worker / backup.class.php

backup.class.php in ManageWP Worker 3.9.12, at backup.class.php

1,688 lines 60.1 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /*************************************************************
3 *
4 * backup.class.php
5 *
6 * Manage Backups
7 *
8 *
9 * Copyright (c) 2011 Prelovac Media
10 * www.prelovac.com
11 **************************************************************/
12 define ('MWP_BACKUP_DIR', WP_CONTENT_DIR.'/managewp/backups');
13 define ('MWP_DB_DIR', MWP_BACKUP_DIR.'/mwp_db');
14
15 class MMB_Backup extends MMB_Core
16 {
17 var $site_name;
18 var $statuses;
19
20 function __construct()
21 {
22 parent::__construct();
23 $this->site_name = str_replace(array("_","/"), array("","-"),rtrim($this->remove_http(get_bloginfo('url')),"/"));
24 $this->statuses = array(
25 'db_dump' => 1,
26 'db_zip' => 2,
27 'files_zip' => 3,
28 's3' => 4,
29 'dropbox' => 5,
30 'ftp' => 6,
31 'email' => 7,
32 'finished' => 100
33 );
34 }
35
36 function get_backup_settings()
37 {
38 $backup_settings = get_option('mwp_backup_tasks');
39 if (!empty($backup_settings))
40 return $backup_settings;
41 else
42 return false;
43 }
44
45 function set_backup_task($params)
46 {
47 //$params => [$task_name, $args, $error]
48 if (!empty($params)) {
49 extract($params);
50
51 $before = $this->get_backup_settings();
52 if (!$before || empty($before))
53 $before = array();
54
55 if (isset($args['remove'])) {
56 unset($before[$task_name]);
57 $return = array(
58 'removed' => true
59 );
60 } else {
61 if(is_array($params['account_info'])){ //only if sends from master first time(secure data)
62 $args['account_info'] = $account_info;
63 }
64
65 $before[$task_name]['task_args'] = $args;
66 if (strlen($args['schedule']))
67 $before[$task_name]['task_args']['next'] = $this->schedule_next($args['type'], $args['schedule']);
68
69 $return = $before[$task_name];
70 }
71
72 //Update with error
73 if ($error) {
74 if(is_array($error)){
75 $before[$task_name]['task_results'][count($before[$task_name]['task_results'])-1]['error'] = $error['error'];
76 } else {
77 $before[$task_name]['task_results'][count($before[$task_name]['task_results'])]['error'] = $error;
78 }
79 }
80
81 if($time){ //set next result time before backup
82 if(is_array($before[$task_name]['task_results'])){
83 $before[$task_name]['task_results'] = array_values($before[$task_name]['task_results']);
84 }
85 $before[$task_name]['task_results'][count($before[$task_name]['task_results'])]['time'] = $time;
86 }
87
88 update_option('mwp_backup_tasks', $before);
89
90 if ($task_name == 'Backup Now') {
91 $result = $this->backup($args, $task_name);
92 $backup_settings = $this->get_backup_settings();
93
94 if (is_array($result) && array_key_exists('error', $result)) {
95 $return = $result;
96 } else {
97 $return = $backup_settings[$task_name];
98 }
99 }
100 return $return;
101 }
102 return false;
103 }
104
105 //Cron check
106 function check_backup_tasks()
107 {
108 $settings = $this->get_backup_settings();
109 if (is_array($settings) && !empty($settings)) {
110 foreach ($settings as $task_name => $setting) {
111 if ($setting['task_args']['next'] && $setting['task_args']['next'] < time()) {
112 //if ($setting['task_args']['next'] && $_GET['force_backup']) {
113 if($setting['task_args']['url'] && $setting['task_args']['task_id'] && $setting['task_args']['site_key']){
114 //Check orphan task
115 $check_data = array(
116 'task_name' => $task_name,
117 'task_id' => $setting['task_args']['task_id'],
118 'site_key' => $setting['task_args']['site_key']
119 );
120
121 $this->validate_task($check_data,$setting['task_args']['url']);
122 }
123
124 //Update task with next schedule
125 $this->set_backup_task(array(
126 'task_name' => $task_name,
127 'args' => $settings[$task_name]['task_args'],
128 'time' => time()
129 ));
130
131 $result = $this->backup($setting['task_args'], $task_name);
132 $error = '';
133 if (is_array($result) && array_key_exists('error', $result)) {
134 $error = $result;
135 $this->set_backup_task(array(
136 'task_name' => $task_name,
137 'args' => $settings[$task_name]['task_args'],
138 'error' => $error
139 ));
140 } else {
141 $error = '';
142 }
143 break; //Only one backup per cron
144 }
145 }
146 }
147
148 }
149
150
151
152 /*
153 * If Task Name not set then it's manual backup
154 * Backup args:
155 * type -> db, full
156 * what -> daily, weekly, monthly
157 * account_info -> ftp, amazons3, dropbox
158 * exclude-> array of paths to exclude from backup
159 */
160
161 function backup($args, $task_name = false)
162 {
163 if (!$args || empty($args))
164 return false;
165
166 extract($args); //extract settings
167
168 //Try increase memory limit and execution time
169 @ini_set('memory_limit', '300M');
170 @set_time_limit(600); //ten minutes
171
172 //Remove old backup(s)
173 $this->remove_old_backups($task_name);
174
175 $new_file_path = MWP_BACKUP_DIR;
176
177 if (!file_exists($new_file_path)) {
178 if (!mkdir($new_file_path, 0755, true))
179 return array(
180 'error' => 'Permission denied, make sure you have write permission to wp-content folder.'
181 );
182 }
183
184 @file_put_contents($new_file_path . '/index.php', ''); //safe
185
186 //Delete possible broken previous backups - don't need it anymore (works only for previous worker versions)
187 foreach (glob($new_file_path . "/*.zip") as $filename) {
188 $short = basename($filename);
189 preg_match('/^wp\-content(.*)/Ui', $short, $matches);
190 if ($matches)
191 @unlink($filename);
192 }
193
194 //Prepare .zip file name
195 $hash = md5(time());
196 $label = $type ? $type : 'manual';
197 $backup_file = $new_file_path . '/' . $this->site_name . '_' . $label . '_' . $what . '_' . date('Y-m-d') . '_' . $hash . '.zip';
198 $backup_url = WP_CONTENT_URL . '/managewp/backups/' . $this->site_name . '_' . $label . '_' . $what . '_' . date('Y-m-d') . '_' . $hash . '.zip';
199
200 //What to backup - db or full?
201 if(trim($what) == 'db') {
202 //Take database backup
203 $this->update_status($task_name,$this->statuses['db_dump']);
204 $db_result = $this->backup_db();
205 if ($db_result == false) {
206 return array(
207 'error' => 'Failed to backup database.'
208 );
209 } else if (is_array($db_result) && isset($db_result['error'])) {
210 return array(
211 'error' => $db_result['error']
212 );
213 } else {
214 $this->update_status($task_name,$this->statuses['db_dump'],true);
215 $this->update_status($task_name,$this->statuses['db_zip']);
216 chdir(MWP_BACKUP_DIR);
217 $zip = $this->get_zip();
218 $command = "$zip -r $backup_file 'mwp_db'";
219 ob_start();
220 $result = $this->mmb_exec($command);
221 ob_get_clean();
222 if (!$result) { // fallback to pclzip
223 define('PCLZIP_TEMPORARY_DIR', MWP_BACKUP_DIR.'/');
224 require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
225 $archive = new PclZip($backup_file);
226 $result = $archive->add($db_result, PCLZIP_OPT_REMOVE_PATH, MWP_BACKUP_DIR);
227 @unlink($db_result);
228 @rmdir(MWP_DB_DIR);
229 if (!$result){
230 return array(
231 'error' => 'Failed to zip database. pclZip error ('.$archive->error_code.'): .'.$archive->error_string
232 );
233 }
234 }
235
236 @unlink($db_result);
237 @rmdir(MWP_DB_DIR);
238 if (!$result){
239 return array(
240 'error' => 'Failed to zip database.'
241 );
242 }
243 $this->update_status($task_name,$this->statuses['db_zip'],true);
244 }
245 } elseif (trim($what) == 'full') {
246 $content_backup = $this->backup_full($task_name,$backup_file, $exclude);
247 if (is_array($content_backup) && array_key_exists('error', $content_backup)) {
248 return array(
249 'error' => $content_backup['error']
250 );
251 }
252 }
253
254 //Update backup info
255 if ($task_name) {
256 //backup task (scheduled)
257 $backup_settings = $this->get_backup_settings();
258 $paths = array();
259 $size = ceil(filesize($backup_file) / 1024);
260
261 if ($size > 1000) {
262 $paths['size'] = ceil($size / 1024)."Mb";
263 } else {
264 $paths['size'] = $size . 'kb';
265 }
266
267 if ($task_name != 'Backup Now') {
268 if (!$backup_settings[$task_name]['task_args']['del_host_file']) {
269 $paths['server'] = array(
270 'file_path' => $backup_file,
271 'file_url' => $backup_url
272 );
273 }
274 } else {
275 $paths['server'] = array(
276 'file_path' => $backup_file,
277 'file_url' => $backup_url
278 );
279 }
280
281 if (isset($backup_settings[$task_name]['task_args']['account_info']['mwp_ftp'])) {
282 $paths['ftp'] = basename($backup_url);
283 }
284
285 if (isset($backup_settings[$task_name]['task_args']['account_info']['mwp_amazon_s3'])) {
286 $paths['amazons3'] = basename($backup_url);
287 }
288
289 if (isset($backup_settings[$task_name]['task_args']['account_info']['mwp_dropbox'])) {
290 $paths['dropbox'] = basename($backup_url);
291 }
292
293 if ($backup_settings[$task_name]['task_args']['email_backup']) {
294 //$paths['email'] = $backup_settings[$task_name]['task_args']['email_backup'];
295 $paths['email'] = basename($backup_url);
296 }
297
298 $temp = $backup_settings[$task_name]['task_results'];
299 $temp = array_values($temp);
300 $paths['time'] = time();
301
302 if($task_name != 'Backup Now'){
303 $paths['status'] = $temp[count($temp)-1]['status'];
304 $temp[count($temp)-1] = $paths;
305
306 } else {
307 $temp[count($temp)] = $paths;
308 }
309 $backup_settings[$task_name]['task_results'] = $temp;
310 update_option('mwp_backup_tasks', $backup_settings);
311 }
312
313
314 //Additional: Email, ftp, amazon_s3, dropbox...
315 if (isset($optimize_tables) && !empty($optimize_tables)) {
316 $this->optimize_tables();
317 }
318
319 if ($task_name != 'Backup Now') {
320 if (isset($account_info['mwp_ftp']) && !empty($account_info['mwp_ftp'])) {
321 $this->update_status($task_name,$this->statuses['ftp']);
322 $account_info['mwp_ftp']['backup_file'] = $backup_file;
323 $ftp_result = $this->ftp_backup($account_info['mwp_ftp']);
324
325 if($ftp_result !== true && $del_host_file){
326 @unlink($backup_file);
327 }
328
329 if(is_array($ftp_result) && isset($ftp_result['error'])){
330 return $ftp_result;
331 }
332 $this->update_status($task_name,$this->statuses['ftp'],true);
333 }
334
335 if (isset($account_info['mwp_amazon_s3']) && !empty($account_info['mwp_amazon_s3'])) {
336 $this->update_status($task_name,$this->statuses['s3']);
337 $account_info['mwp_amazon_s3']['backup_file'] = $backup_file;
338 $amazons3_result = $this->amazons3_backup($account_info['mwp_amazon_s3']);
339 if($amazons3_result !== true && $del_host_file){
340 @unlink($backup_file);
341 }
342 if(is_array($amazons3_result) && isset($amazons3_result['error'])){
343 return $amazons3_result;
344 }
345 $this->update_status($task_name,$this->statuses['s3'],true);
346 }
347
348 if (isset($account_info['mwp_dropbox']) && !empty($account_info['mwp_dropbox'])) {
349 $this->update_status($task_name,$this->statuses['dropbox']);
350 $account_info['mwp_dropbox']['backup_file'] = $backup_file;
351 $dropbox_result = $this->dropbox_backup($account_info['mwp_dropbox']);
352 if($dropbox_result !== true && $del_host_file){
353 @unlink($backup_file);
354 }
355
356 if(is_array($dropbox_result) && isset($dropbox_result['error'])){
357 return $dropbox_result;
358 }
359
360 $this->update_status($task_name,$this->statuses['dropbox'],true);
361 }
362
363 if (isset($email_backup) && is_email($email_backup)) {
364 $this->update_status($task_name,$this->statuses['email']);
365 $mail_args = array(
366 'email' => $email_backup,
367 'task_name' => $task_name,
368 'file_path' => $backup_file
369 );
370 $this->email_backup($mail_args);
371 $this->update_status($task_name,$this->statuses['email'],true);
372 }
373
374 if ($del_host_file) {
375 @unlink($backup_file);
376 }
377
378 } //end additional
379
380 //$this->update_status($task_name,$this->statuses['finished'],true);
381 return $backup_url; //Return url to backup file
382 }
383
384 function backup_full($task_name,$backup_file, $exclude = array())
385 {
386 $this->update_status($task_name,$this->statuses['db_dump']);
387 $db_result = $this->backup_db();
388
389 if ($db_result == false) {
390 return array(
391 'error' => 'Failed to backup database.'
392 );
393 } else if (is_array($db_result) && isset($db_result['error'])) {
394 return array(
395 'error' => $db_result['error']
396 );
397 }
398
399 $this->update_status($task_name,$this->statuses['db_dump'],true);
400 $this->update_status($task_name,$this->statuses['db_zip']);
401
402 $zip = $this->get_zip();
403 //Add database file
404 chdir(MWP_BACKUP_DIR);
405 $command = "$zip -r $backup_file 'mwp_db'";
406 ob_start();
407 $result = $this->mmb_exec($command);
408 ob_get_clean();
409
410
411 if (!$result) {
412 define('PCLZIP_TEMPORARY_DIR', MWP_BACKUP_DIR.'/');
413 require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
414 $archive = new PclZip($backup_file);
415 $result_db = $archive->add($db_result, PCLZIP_OPT_REMOVE_PATH, MWP_BACKUP_DIR);
416
417 @unlink($db_result);
418 @rmdir(MWP_DB_DIR);
419
420 if(!$result_db){
421 return array(
422 'error' => 'Failed to zip database. pclZip error ('.$archive->error_code.'): .'.$archive->error_string
423 );
424 }
425 }
426
427 @unlink($db_result);
428 @rmdir(MWP_DB_DIR);
429
430 $this->update_status($task_name,$this->statuses['db_zip'],true);
431
432
433 //Always remove backup folders
434 $remove = array(
435 "wp-content/managewp/backups",
436 "wp-content/".md5('mmb-worker')."/mwp_backups"
437 );
438
439
440 //exclude paths
441 $exclude_data = "-x";
442 if (!empty($exclude)) {
443 foreach ($exclude as $data) {
444 if ($data)
445 $exclude_data .= " '$data/*'";
446 }
447 }
448
449 foreach ($remove as $data) {
450 $exclude_data .= " '$data/*'";
451 }
452
453 $this->update_status($task_name,$this->statuses['files_zip']);
454 chdir(ABSPATH);
455 $command = "$zip -r $backup_file './' $exclude_data";
456 ob_start();
457 $result = $this->mmb_exec($command);
458 ob_get_clean();
459
460 if (!$result) { //Try pclZip
461
462 if(!isset($archive)){
463 define('PCLZIP_TEMPORARY_DIR', MWP_BACKUP_DIR.'/');
464 require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
465 $archive = new PclZip($backup_file);
466 }
467
468 $result = $archive->add(ABSPATH, PCLZIP_OPT_REMOVE_PATH, ABSPATH);
469
470 if(!$result){
471 @unlink($backup_file);
472 return array(
473 'error' => 'Failed to zip files. pclZip error ('.$archive->error_code.'): .'.$archive->error_string
474 );
475 }
476
477 $exclude_data = array();
478 if (!empty($exclude) && $result) {
479 $exclude_data = array();
480 foreach ($exclude as $data) {
481 if ($data)
482 $exclude_data[] = $data . '/';
483 }
484 }
485
486 foreach ($remove as $rem) {
487 $exclude_data[] = $rem . '/';
488 }
489
490 $result_excl = $archive->delete(PCLZIP_OPT_BY_NAME, $exclude_data);
491 if(!$result){
492 @unlink($backup_file);
493 return array(
494 'error' => 'Failed to zip files. pclZip error ('.$archive->error_code.'): .'.$archive->error_string
495 );
496 }
497
498 }
499
500 $this->update_status($task_name,$this->statuses['files_zip'],true);
501 return true;
502 }
503
504
505 function backup_db()
506 {
507 $db_folder = MWP_DB_DIR.'/';
508 if (!file_exists($db_folder)) {
509 if (!mkdir($db_folder, 0755, true))
510 return array(
511 'error' => 'Error creating database backup folder ('.$db_folder.'). Make sure you have corrrect write permissions.'
512 );
513 }
514
515 $file = $db_folder . DB_NAME . '.sql';
516 $result = $this->backup_db_dump($file); // try mysqldump always then fallback to php dump
517 return $result;
518 }
519
520 function backup_db_dump($file)
521 {
522 global $wpdb;
523 $paths = $this->check_mysql_paths();
524 $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
525 $command = $brace . $paths['mysqldump'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" --add-drop-table --skip-lock-tables "' . DB_NAME . '" > ' . $brace . $file . $brace;
526 ob_start();
527 $result = $this->mmb_exec($command);
528 ob_get_clean();
529
530 if (!$result) { // Fallback to php
531 $result = $this->backup_db_php($file);
532 return $result;
533 }
534
535 if (filesize($file) == 0 || !is_file($file) || !$result) {
536 @unlink($file);
537 return false;
538 } else {
539 return $file;
540 }
541 }
542
543 function backup_db_php($file)
544 {
545 global $wpdb;
546 $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
547 foreach ($tables as $table) {
548 //drop existing table
549 $dump_data = "DROP TABLE IF EXISTS $table[0];";
550 //create table
551 $create_table = $wpdb->get_row("SHOW CREATE TABLE $table[0]", ARRAY_N);
552 $dump_data .= "\n\n" . $create_table[1] . ";\n\n";
553
554 $count = $wpdb->get_var("SELECT count(*) FROM $table[0]");
555 if ($count > 100)
556 $count = ceil($count / 100) - 1;
557 else
558 $count = 1;
559 for ($i = 0; $i < $count; $i++) {
560
561 $low_limit = $i * 100;
562 $qry = "SELECT * FROM $table[0] LIMIT $low_limit, 100";
563 $rows = $wpdb->get_results($qry, ARRAY_A);
564 if (is_array($rows)) {
565 foreach ($rows as $row) {
566 //insert single row
567 $dump_data .= "INSERT INTO $table[0] VALUES(";
568 $num_values = count($row);
569 $j = 1;
570 foreach ($row as $value) {
571 $value = addslashes($value);
572 $value = preg_replace("/\n/Ui", "\\n", $value);
573 $num_values == $j ? $dump_data .= "'" . $value . "'" : $dump_data .= "'" . $value . "', ";
574 $j++;
575 unset($value);
576 }
577 $dump_data .= ");\n";
578 }
579 }
580 }
581 $dump_data .= "\n\n\n";
582
583 unset($rows);
584 file_put_contents($file, $dump_data, FILE_APPEND);
585 unset($dump_data);
586 }
587
588 if (filesize($file) == 0 || !is_file($file)) {
589 @unlink($file);
590 return array(
591 'error' => 'Database backup failed. Try to enable MySQL dump on your server.'
592 );
593 }
594
595 return $file;
596
597 }
598
599 function restore($args)
600 {
601
602 global $wpdb;
603 if (empty($args)) {
604 return false;
605 }
606
607 extract($args);
608 @ini_set('memory_limit', '300M');
609 @set_time_limit(600);
610
611 $unlink_file = true; //Delete file after restore
612
613 //Detect source
614 if ($backup_url) {
615 //This is for clone (overwrite)
616 include_once ABSPATH . 'wp-admin/includes/file.php';
617 $backup_file = download_url($backup_url);
618 if (is_wp_error($backup_file)) {
619 return array(
620 'error' => $backup_file->get_error_message()
621 );
622 }
623 $what = 'full';
624 } else {
625 $tasks = $this->get_backup_settings();
626 $task = $tasks[$task_name];
627 if (isset($task['task_results'][$result_id]['server'])) {
628 $backup_file = $task['task_results'][$result_id]['server']['file_path'];
629 $unlink_file = false; //Don't delete file if stored on server
630 } elseif (isset($task['task_results'][$result_id]['ftp'])) {
631 $ftp_file = $task['task_results'][$result_id]['ftp'];
632 $args = $task['task_args']['account_info']['mwp_ftp'];
633 $args['backup_file'] = $ftp_file;
634 $backup_file = $this->get_ftp_backup($args);
635 if ($backup_file == false) {
636 return array(
637 'error' => 'Failed to download file from FTP.'
638 );
639 }
640 } elseif (isset($task['task_results'][$result_id]['amazons3'])) {
641 $amazons3_file = $task['task_results'][$result_id]['amazons3'];
642 $args = $task['task_args']['account_info']['mwp_amazon_s3'];
643 $args['backup_file'] = $ftp_file;
644 $backup_file = $this->get_amazons3_backup($args);
645 if ($backup_file == false) {
646 return array(
647 'error' => 'Failed to download file from Amazon S3.'
648 );
649 }
650 }
651
652 $what = $tasks[$task_name]['task_args']['what'];
653 }
654
655 if ($backup_file && file_exists($backup_file)) {
656 if ($overwrite) {
657 //Keep old db credentials before overwrite
658 if (!copy(ABSPATH . 'wp-config.php', ABSPATH . 'mwp-temp-wp-config.php')) {
659 @unlink($backup_file);
660 return array(
661 'error' => 'Error creating wp-config. Please check your write permissions.'
662 );
663 }
664
665 $db_host = DB_HOST;
666 $db_user = DB_USER;
667 $db_password = DB_PASSWORD;
668 $home = rtrim(get_option('home'),"/");
669 $site_url = get_option('site_url');
670
671 if(trim($clone_from_url) || trim($mwp_clone)){
672 $clone_options = array();
673 $clone_options['_worker_nossl_key'] = get_option('_worker_nossl_key');
674 $clone_options['_worker_public_key'] = get_option('_worker_public_key');
675 $clone_options['_action_message_id'] = get_option('_action_message_id');
676 }
677
678
679 }
680
681
682 chdir(ABSPATH);
683 $unzip=$this->get_unzip();
684 $command = "$unzip -o $backup_file";
685 ob_start();
686 $result = $this->mmb_exec($command);
687 ob_get_clean();
688
689 if (!$result) { //fallback to pclzip
690 define('PCLZIP_TEMPORARY_DIR', MWP_BACKUP_DIR.'/');
691 require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
692 $archive = new PclZip($backup_file);
693 $result = $archive->extract(PCLZIP_OPT_PATH, ABSPATH, PCLZIP_OPT_REPLACE_NEWER);
694 }
695
696 if ($unlink_file) {
697 @unlink($backup_file);
698 }
699
700 if (!$result) {
701 return array(
702 'error' => 'Failed to unzip files. pclZip error ('.$archive->error_code.'): .'.$archive->error_string
703 );
704 }
705
706 $db_result = $this->restore_db();
707
708 if (!$db_result) {
709 return array(
710 'error' => 'Error restoring database.'
711 );
712 }
713
714 } else {
715 return array(
716 'error' => 'Error restoring. Cannot find backup file.'
717 );
718 }
719
720 //Replace options and content urls
721 if ($overwrite) {
722
723 //Get New Table prefix
724 $new_table_prefix = trim($this->get_table_prefix());
725 //Retrieve old wp_config
726 @unlink(ABSPATH . 'wp-config.php');
727 //Replace table prefix
728 $lines = file(ABSPATH . 'mwp-temp-wp-config.php');
729
730 foreach ($lines as $line) {
731 if (strstr($line, '$table_prefix')) {
732 $line = '$table_prefix = "' . $new_table_prefix . '";' . PHP_EOL;
733 }
734 file_put_contents(ABSPATH . 'wp-config.php', $line, FILE_APPEND);
735 }
736
737 @unlink(ABSPATH . 'mwp-temp-wp-config.php');
738
739 //Replace options
740 $query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = 'home'";
741 $old = $wpdb->get_var($wpdb->prepare($query));
742 $old = rtrim($old,"/");
743 $query = "UPDATE " . $new_table_prefix . "options SET option_value = '$home' WHERE option_name = 'home'";
744 $wpdb->query($wpdb->prepare($query));
745 $query = "UPDATE " . $new_table_prefix . "options SET option_value = '$home' WHERE option_name = 'siteurl'";
746 $wpdb->query($wpdb->prepare($query));
747 //Replace content urls
748 $query = "UPDATE " . $new_table_prefix . "posts SET post_content = REPLACE (post_content, '$old','$home') WHERE post_content REGEXP 'src=\"(.*)$old(.*)\"' OR post_content REGEXP 'href=\"(.*)$old(.*)\"'";
749 $wpdb->query($wpdb->prepare($query));
750
751 if(trim($new_password)) {
752 $new_password = wp_hash_password($new_password);
753 }
754 if(!trim($clone_from_url) && !trim($mwp_clone)){
755 if($new_user && $new_password){
756
757 $query = "UPDATE " . $new_table_prefix . "users SET user_login = '$new_user', user_pass = '$new_password' WHERE user_login = '$old_user'";
758 $wpdb->query($wpdb->prepare($query));
759 }
760 } else {
761
762 if($clone_from_url){
763 if($new_user && $new_password){
764 $query = "UPDATE " . $new_table_prefix . "users SET user_pass = '$new_password' WHERE user_login = '$new_user'";
765 $wpdb->query($wpdb->prepare($query));
766 }
767 }
768
769 if($mwp_clone){
770 if($admin_email){
771 //Clean Install
772 $query = "UPDATE " . $new_table_prefix . "options SET option_value = '$admin_email' WHERE option_name = 'admin_email'";
773 $wpdb->query($wpdb->prepare($query));
774 $query = "SELECT * FROM " . $new_table_prefix ."users LIMIT 1";
775 $temp_user = $wpdb->get_row($query);
776 if(!empty($temp_user)){
777 $query = "UPDATE " . $new_table_prefix . "users SET user_email='$admin_email', user_login = '$new_user', user_pass = '$new_password' WHERE user_login = '$temp_user->user_login'";
778 $wpdb->query($wpdb->prepare($query));
779 }
780 }
781 }
782 }
783
784 if(is_array($clone_options)){
785
786 foreach($clone_options as $key => $option){
787 if(!empty($key)){
788 $query = "SELECT option_value FROM " . $new_table_prefix . "options WHERE option_name = '$key'";
789 $res = $wpdb->get_var($query);
790 if($res == false){
791 $query = "INSERT INTO " . $new_table_prefix . "options (option_value,option_name) VALUES('$option','$key')";
792 $wpdb->query($wpdb->prepare($query));
793 } else {
794 $query = "UPDATE " . $new_table_prefix . "options SET option_value = '$option' WHERE option_name = '$key'";
795 $wpdb->query($wpdb->prepare($query));
796 }
797 }
798 }
799 }
800 }
801
802 return true;
803 }
804
805 function restore_db()
806 {
807 global $wpdb;
808 $paths = $this->check_mysql_paths();
809 $file_path = ABSPATH . 'mwp_db';
810 $file_name = glob($file_path . '/*.sql');
811 $file_name = $file_name[0];
812 $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
813 $command = $brace .$paths['mysql'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" ' . DB_NAME . ' < ' . $brace . $file_name . $brace;
814
815 ob_start();
816 $result = $this->mmb_exec($command);
817 ob_get_clean();
818 if (!$result) {
819 //try php
820 $this->restore_db_php($file_name);
821 }
822
823
824 @unlink($file_name);
825 return true;
826 }
827
828 function restore_db_php($file_name)
829 {
830
831 global $wpdb;
832 $current_query = '';
833 // Read in entire file
834 $lines = file($file_name);
835 // Loop through each line
836 foreach ($lines as $line) {
837 // Skip it if it's a comment
838 if (substr($line, 0, 2) == '--' || $line == '')
839 continue;
840
841 // Add this line to the current query
842 $current_query .= $line;
843 // If it has a semicolon at the end, it's the end of the query
844 if (substr(trim($line), -1, 1) == ';') {
845 // Perform the query
846 $result = $wpdb->query($current_query);
847 if ($result === false)
848 return false;
849 // Reset temp variable to empty
850 $current_query = '';
851 }
852 }
853
854 @unlink($file_name);
855 return true;
856 }
857
858 function get_table_prefix()
859 {
860 $lines = file(ABSPATH . 'wp-config.php');
861 foreach ($lines as $line) {
862 if (strstr($line, '$table_prefix')) {
863 $pattern = "/(\'|\")[^(\'|\")]*/";
864 preg_match($pattern, $line, $matches);
865 $prefix = substr($matches[0], 1);
866 return $prefix;
867 break;
868 }
869 }
870 return 'wp_'; //default
871 }
872
873 function optimize_tables()
874 {
875 global $wpdb;
876 $query = 'SHOW TABLE STATUS FROM ' . DB_NAME;
877 $tables = $wpdb->get_results($wpdb->prepare($query), ARRAY_A);
878 foreach ($tables as $table) {
879 if (in_array($table['Engine'], array(
880 'MyISAM',
881 'ISAM',
882 'HEAP',
883 'MEMORY',
884 'ARCHIVE'
885 )))
886 $table_string .= $table['Name'] . ",";
887 elseif ($table['Engine'] == 'InnoDB') {
888 $optimize = $wpdb->query("ALTER TABLE {$table['Name']} ENGINE=InnoDB");
889 }
890 }
891
892 $table_string = rtrim($table_string);
893 $optimize = $wpdb->query("OPTIMIZE TABLE $table_string");
894
895 return $optimize ? true : false;
896 }
897
898 ### Function: Auto Detect MYSQL and MYSQL Dump Paths
899 function check_mysql_paths()
900 {
901 global $wpdb;
902 $paths = array(
903 'mysql' => '',
904 'mysqldump' => ''
905 );
906 if (substr(PHP_OS, 0, 3) == 'WIN') {
907 $mysql_install = $wpdb->get_row("SHOW VARIABLES LIKE 'basedir'");
908 if ($mysql_install) {
909 $install_path = str_replace('\\', '/', $mysql_install->Value);
910 $paths['mysql'] = $install_path . 'bin/mysql.exe';
911 $paths['mysqldump'] = $install_path . 'bin/mysqldump.exe';
912 } else {
913 $paths['mysql'] = 'mysql.exe';
914 $paths['mysqldump'] = 'mysqldump.exe';
915 }
916 } else {
917
918 $paths['mysql'] = $this->mmb_exec('which mysql', true);
919 if (empty( $paths['mysql']))
920 $paths['mysql']='mysql'; // try anyway
921
922 $paths['mysqldump'] = $this->mmb_exec('which mysqldump', true);
923 if (empty( $paths['mysqldump']))
924 $paths['mysqldump']='mysqldump'; // try anyway
925
926 }
927
928
929 return $paths;
930 }
931
932 //Check if exec, system, passthru functions exist
933 function check_sys()
934 {
935 if ($this->mmb_function_exists('exec'))
936 return 'exec';
937
938 if ($this->mmb_function_exists('system'))
939 return 'system';
940
941 if ($this->mmb_function_exists('passhtru'))
942 return 'passthru';
943
944 return false;
945
946 }
947
948 function mmb_exec($command, $string = false)
949 {
950 if ($command == '')
951 return false;
952
953 if ($this->mmb_function_exists('exec')) {
954 $log = @exec($command, $output, $return);
955
956 if ($string)
957 return $log;
958 return $return ? false : true;
959 } elseif ($this->mmb_function_exists('system')) {
960 $log = @system($command, $return);
961
962 if ($string)
963 return $log;
964 return $return ? false : true;
965 } elseif ($this->mmb_function_exists('passthru') && !$string) {
966 $log = passthru($command, $return);
967 return $return ? false : true;
968 }
969
970
971 return false;
972 }
973
974 function get_zip()
975 {
976 $zip=$this->mmb_exec('which zip', true);
977 if (!$zip)
978 $zip="zip";
979 return $zip;
980 }
981
982 function get_unzip()
983 {
984 $unzip=$this->mmb_exec('which unzip', true);
985 if (!$unzip)
986 $unzip="unzip";
987 return $unzip;
988 }
989
990 function check_backup_compat()
991 {
992 $reqs = array();
993 if (strpos($_SERVER['DOCUMENT_ROOT'], '/') === 0) {
994 $reqs['Server OS']['status'] = 'Linux (or compatible)';
995 $reqs['Server OS']['pass'] = true;
996 } else {
997 $reqs['Server OS']['status'] = 'Windows';
998 $reqs['Server OS']['pass'] = true;
999 $pass = false;
1000 }
1001 $reqs['PHP Version']['status'] = phpversion();
1002 if ((float) phpversion() >= 5.1) {
1003 $reqs['PHP Version']['pass'] = true;
1004 } else {
1005 $reqs['PHP Version']['pass'] = false;
1006 $pass = false;
1007 }
1008
1009
1010 if (is_writable(WP_CONTENT_DIR)) {
1011 $reqs['Backup Folder']['status'] = "writable";
1012 $reqs['Backup Folder']['pass'] = true;
1013 } else {
1014 $reqs['Backup Folder']['status'] = "not writable";
1015 $reqs['Backup Folder']['pass'] = false;
1016 }
1017
1018
1019 $file_path = MWP_BACKUP_DIR;
1020 $reqs['Backup Folder']['status'] .= ' (' . $file_path . ')';
1021
1022 if ($func = $this->check_sys()) {
1023 $reqs['Execute Function']['status'] = $func;
1024 $reqs['Execute Function']['pass'] = true;
1025 } else {
1026 $reqs['Execute Function']['status'] = "not found";
1027 $reqs['Execute Function']['info'] = "(will try PHP replacement)";
1028 $reqs['Execute Function']['pass'] = false;
1029 }
1030 $reqs['Zip']['status'] = $this->get_zip();
1031
1032 $reqs['Zip']['pass'] = true;
1033
1034
1035
1036 $reqs['Unzip']['status'] = $this->get_unzip();
1037
1038 $reqs['Unzip']['pass'] = true;
1039
1040 $paths=$this->check_mysql_paths();
1041
1042 if (!empty($paths['mysqldump'])) {
1043 $reqs['MySQL Dump']['status'] = $paths['mysqldump'];
1044 $reqs['MySQL Dump']['pass'] = true;
1045 } else {
1046 $reqs['MySQL Dump']['status'] = "not found";
1047 $reqs['MySQL Dump']['info'] = "(will try PHP replacement)";
1048 $reqs['MySQL Dump']['pass'] = false;
1049 }
1050
1051 return $reqs;
1052 }
1053
1054 function email_backup($args)
1055 {
1056 $email = $args['email'];
1057 $backup_file = $args['file_path'];
1058 $task_name = isset($args['task_name']) ? $args['task_name'] . ' on ' : '';
1059 if (file_exists($backup_file) && $email) {
1060 $attachments = array(
1061 $backup_file
1062 );
1063 $headers = 'From: ManageWP <no-reply@managewp.com>' . "\r\n";
1064 $subject = "ManageWP - " . $task_name . " - ".$this->site_name;
1065 ob_start();
1066 $result = wp_mail($email, $subject, $subject, $headers, $attachments);
1067 ob_end_clean();
1068
1069 }
1070
1071 if(!$result){
1072 return array(
1073 'error' => 'Email not sent. Maybe your backup is too big for email or email server is not available on your website.',
1074 );
1075 }
1076 return true;
1077
1078 }
1079
1080 function ftp_backup($args)
1081 {
1082 extract($args);
1083 //Args: $ftp_username, $ftp_password, $ftp_hostname, $backup_file, $ftp_remote_folder, $ftp_site_folder
1084 if($ftp_ssl ){
1085 if (function_exists('ftp_ssl_connect')) {
1086 $conn_id = ftp_ssl_connect($ftp_hostname);
1087 } else {
1088 return array(
1089 'error' => 'Your server doesn\'t support SFTP',
1090 'partial' => 1
1091 );
1092 }
1093 } else {
1094 if (function_exists('ftp_connect')) {
1095 $conn_id = ftp_connect($ftp_hostname);
1096 if ($conn_id === false) {
1097 return array(
1098 'error' => 'Failed to connect to ' . $ftp_hostname,
1099 'partial' => 1
1100 );
1101 }
1102 } else {
1103 return array(
1104 'error' => 'Your server doesn\'t support FTP',
1105 'partial' => 1
1106 );
1107 }
1108 }
1109 $login = @ftp_login($conn_id, $ftp_username, $ftp_password);
1110 if ($login === false) {
1111 return array(
1112 'error' => 'FTP login failed for ' . $ftp_username . ', ' . $ftp_password,
1113 'partial' => 1
1114 );
1115 }
1116
1117 @ftp_mkdir($conn_id, $ftp_remote_folder);
1118 if($ftp_site_folder){
1119 $ftp_remote_folder .= '/'.$this->site_name;
1120 }
1121 @ftp_mkdir($conn_id, $ftp_remote_folder);
1122
1123 $upload = @ftp_put($conn_id, $ftp_remote_folder . '/' . basename($backup_file), $backup_file, FTP_BINARY);
1124
1125 if($upload === false){ //Try ascii
1126 $upload = @ftp_put($conn_id, $ftp_remote_folder . '/' . basename($backup_file), $backup_file, FTP_ASCII);
1127 }
1128 ftp_close($conn_id);
1129
1130 if ($upload === false) {
1131 return array(
1132 'error' => 'Failed to upload file to FTP. Please check your specified path.',
1133 'partial' => 1
1134 );
1135 }
1136
1137 return true;
1138 }
1139
1140 function remove_ftp_backup($args)
1141 {
1142 extract($args);
1143 //Args: $ftp_username, $ftp_password, $ftp_hostname, $backup_file, $ftp_remote_folder
1144 if ($ftp_ssl && function_exists('ftp_ssl_connect')) {
1145 $conn_id = ftp_ssl_connect($ftp_hostname);
1146 } else if (function_exists('ftp_connect')) {
1147 $conn_id = ftp_connect($ftp_hostname);
1148 }
1149
1150 if($conn_id){
1151 $login = @ftp_login($conn_id, $ftp_username, $ftp_password);
1152 if($ftp_site_folder)
1153 $ftp_remote_folder .= '/'.$this->site_name;
1154
1155 $delete = ftp_delete($conn_id, $ftp_remote_folder . '/' . $backup_file);
1156
1157 ftp_close($conn_id);
1158 }
1159
1160 }
1161
1162 function get_ftp_backup($args)
1163 {
1164 extract($args);
1165 //Args: $ftp_username, $ftp_password, $ftp_hostname, $backup_file, $ftp_remote_folder
1166 if ($ftp_ssl && function_exists('ftp_ssl_connect')) {
1167 $conn_id = ftp_ssl_connect($ftp_hostname);
1168
1169 } else if (function_exists('ftp_connect')) {
1170 $conn_id = ftp_connect($ftp_hostname);
1171 if ($conn_id === false) {
1172 return false;
1173 }
1174 } else {
1175 }
1176 $login = @ftp_login($conn_id, $ftp_username, $ftp_password);
1177 if ($login === false) {
1178 return false;
1179 } else {
1180 }
1181
1182 if($ftp_site_folder)
1183 $ftp_remote_folder .= '/'.$this->site_name;
1184
1185 $temp = ABSPATH . 'mwp_temp_backup.zip';
1186 $get = ftp_get($conn_id, $temp, $ftp_remote_folder . '/' . $backup_file, FTP_BINARY);
1187 if ($get === false) {
1188 return false;
1189 } else {
1190 }
1191 ftp_close($conn_id);
1192
1193 return $temp;
1194 }
1195
1196 function dropbox_backup($args)
1197 {
1198 require_once('lib/dropbox.php');
1199 extract($args);
1200
1201 //$email, $password, $backup_file, $destination, $dropbox_site_folder
1202
1203 $size = ceil(filesize($backup_file) / 1024);
1204 if($size > 300000){
1205 return array(
1206 'error' => 'Cannot upload file to Dropbox. Dropbox has upload limit of 300Mb per file.',
1207 'partial' => 1
1208 );
1209 }
1210
1211 if($dropbox_site_folder == true)
1212 $dropbox_destination .= '/'.$this->site_name;
1213
1214 try {
1215 $uploader = new DropboxUploader($dropbox_username, $dropbox_password);
1216 $uploader->upload($backup_file, $dropbox_destination);
1217 }
1218 catch (Exception $e) {
1219 return array(
1220 'error' => $e->getMessage(),
1221 'partial' => 1
1222 );
1223 }
1224
1225 return true;
1226
1227 }
1228
1229 function amazons3_backup($args)
1230 {
1231 if($this->mmb_function_exists('curl_init')){
1232 require_once('lib/s3.php');
1233 extract($args);
1234
1235 if($as3_site_folder == true)
1236 $as3_directory .= '/'.$this->site_name;
1237
1238
1239 $s3 = new S3(trim($as3_access_key), trim(str_replace(' ', '+', $as3_secure_key)));
1240
1241 $s3->putBucket($as3_bucket, S3::ACL_PUBLIC_READ);
1242
1243 if ($s3->putObjectFile($backup_file, $as3_bucket, $as3_directory . '/' . basename($backup_file), S3::ACL_PRIVATE)) {
1244 return true;
1245 } else {
1246 return array(
1247 'error' => 'Failed to upload to Amazon S3. Please check your details and set upload/delete permissions on your bucket.',
1248 'partial' => 1
1249 );
1250 }
1251 } else {
1252 return array(
1253 'error' => 'You cannot use AmazonS3 on your server. Please enable curl first.',
1254 'partial' => 1
1255 );
1256 }
1257 }
1258
1259 function remove_amazons3_backup($args)
1260 {
1261 require_once('lib/s3.php');
1262 extract($args);
1263 if($as3_site_folder == true)
1264 $as3_directory .= '/'.$this->site_name;
1265
1266 $s3 = new S3($as3_access_key, str_replace(' ', '+', $as3_secure_key));
1267 $s3->deleteObject($as3_bucket, $as3_directory . '/' . $backup_file);
1268 }
1269
1270 function get_amazons3_backup($args)
1271 {
1272 require_once('lib/s3.php');
1273 extract($args);
1274 $s3 = new S3($as3_access_key, str_replace(' ', '+', $as3_secure_key));
1275 if($as3_site_folder == true)
1276 $as3_directory .= '/'.$this->site_name;
1277
1278 $s3->getObject($as3_bucket, $as3_directory . '/' . $backup_file, $temp);
1279 $temp = ABSPATH . 'mwp_temp_backup.zip';
1280 return $temp;
1281 }
1282
1283 function schedule_next($type, $schedule)
1284 {
1285 $schedule = explode("|", $schedule);
1286 if (empty($schedule))
1287 return false;
1288 switch ($type) {
1289
1290 case 'daily':
1291
1292 if ($schedule[1]) {
1293 $delay_time = $schedule[1] * 60;
1294 }
1295
1296 $current_hour = date("H");
1297 $schedule_hour = $schedule[0];
1298 if ($current_hour >= $schedule_hour)
1299 $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + 1, date("Y"));
1300 else
1301 $time = mktime($schedule_hour, 0, 0, date("m"), date("d"), date("Y"));
1302 break;
1303
1304
1305 case 'weekly':
1306 if ($schedule[2]) {
1307 $delay_time = $schedule[2] * 60;
1308 }
1309 $current_weekday = date('w');
1310 $schedule_weekday = $schedule[1];
1311 $current_hour = date("H");
1312 $schedule_hour = $schedule[0];
1313
1314 if ($current_weekday > $schedule_weekday)
1315 $weekday_offset = 7 - ($week_day - $task_schedule[1]);
1316 else
1317 $weekday_offset = $schedule_weekday - $current_weekday;
1318
1319
1320 if (!$weekday_offset) { //today is scheduled weekday
1321 if ($current_hour >= $schedule_hour)
1322 $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + 7, date("Y"));
1323 else
1324 $time = mktime($schedule_hour, 0, 0, date("m"), date("d"), date("Y"));
1325 } else {
1326 $time = mktime($schedule_hour, 0, 0, date("m"), date("d") + $weekday_offset, date("Y"));
1327 }
1328
1329 break;
1330
1331 case 'monthly':
1332 if ($schedule[2]) {
1333 $delay_time = $schedule[2] * 60;
1334 }
1335 $current_monthday = date('j');
1336 $schedule_monthday = $schedule[1];
1337 $current_hour = date("H");
1338 $schedule_hour = $schedule[0];
1339
1340 if ($current_monthday > $schedule_monthday) {
1341 $time = mktime($schedule_hour, 0, 0, date("m") + 1, $schedule_monthday, date("Y"));
1342 } else if ($current_monthday < $schedule_monthday) {
1343 $time = mktime($schedule_hour, 0, 0, date("m"), $schedule_monthday, date("Y"));
1344 } else if ($current_monthday == $schedule_monthday) {
1345 if ($current_hour >= $schedule_hour)
1346 $time = mktime($schedule_hour, 0, 0, date("m") + 1, $schedule_monthday, date("Y"));
1347 else
1348 $time = mktime($schedule_hour, 0, 0, date("m"), $schedule_monthday, date("Y"));
1349 break;
1350 }
1351
1352 break;
1353 default:
1354 break;
1355 }
1356
1357 if ($delay_time) {
1358 $time += $delay_time;
1359 }
1360
1361
1362 return $time;
1363
1364 }
1365
1366 //Parse task arguments for info on master
1367 function get_backup_stats()
1368 {
1369 $stats = array();
1370 $tasks = get_option('mwp_backup_tasks');
1371 if (is_array($tasks) && !empty($tasks)) {
1372 foreach ($tasks as $task_name => $info) {
1373
1374 if(is_array($info['task_results']) && !empty($info['task_results']))
1375 {
1376 foreach($info['task_results'] as $key => $result){
1377 if(isset($result['server']) && !isset($result['error'])){
1378 if(!file_exists($result['server']['file_path'])){
1379 $info['task_results'][$key]['error'] = 'Backup created but manually removed from server.';
1380 }
1381 }
1382 }
1383 }
1384
1385 $stats[$task_name] = array_values($info['task_results']);
1386
1387 }
1388 }
1389 return $stats;
1390 }
1391
1392 function get_next_schedules(){
1393 $stats = array();
1394 $tasks = get_option('mwp_backup_tasks');
1395 if (is_array($tasks) && !empty($tasks)) {
1396 foreach ($tasks as $task_name => $info) {
1397 $stats[$task_name] = $info['task_args']['next'];
1398 }
1399 }
1400 return $stats;
1401 }
1402
1403 function remove_old_backups($task_name)
1404 {
1405
1406 //Check for previous failed backups first
1407 $this->cleanup();
1408
1409 //Remove by limit
1410 $backups = $this->get_backup_settings();
1411 if($task_name == 'Backup Now'){
1412 $num = 0;
1413 } else {
1414 $num = 1;
1415 }
1416
1417
1418 if ((count($backups[$task_name]['task_results']) - $num) >= $backups[$task_name]['task_args']['limit']) {
1419 //how many to remove ?
1420 $remove_num = (count($backups[$task_name]['task_results']) - $num - $backups[$task_name]['task_args']['limit']) + 1;
1421 for ($i = 0; $i < $remove_num; $i++) {
1422 //Remove from the server
1423 if (isset($backups[$task_name]['task_results'][$i]['server'])) {
1424 @unlink($backups[$task_name]['task_results'][$i]['server']['file_path']);
1425 }
1426
1427 //Remove from ftp
1428 if (isset($backups[$task_name]['task_results'][$i]['ftp'])) {
1429 $ftp_file = $backups[$task_name]['task_results'][$i]['ftp'];
1430 $args = $backups[$task_name]['task_args']['account_info']['mwp_ftp'];
1431 $args['backup_file'] = $ftp_file;
1432 $this->remove_ftp_backup($args);
1433 }
1434
1435 if (isset($backups[$task_name]['task_results'][$i]['amazons3'])) {
1436 $amazons3_file = $backups[$task_name]['task_results'][$i]['amazons3'];
1437 $args = $backups[$task_name]['task_args']['account_info']['mwp_amazon_s3'];
1438 $args['backup_file'] = $amazons3_file;
1439 $this->remove_amazons3_backup($args);
1440 }
1441
1442 if (isset($backups[$task_name]['task_results'][$i]['dropbox'])) {
1443 //To do: dropbox remove
1444 }
1445
1446 //Remove database backup info
1447 unset($backups[$task_name]['task_results'][$i]);
1448
1449 } //end foreach
1450
1451 $backups[$task_name]['task_results'] = array_values($backups[$task_name]['task_results']);
1452 update_option('mwp_backup_tasks', $backups);
1453 }
1454 }
1455
1456 /**
1457 * Delete specified backup
1458 * Args: $task_name, $result_id
1459 */
1460
1461 function delete_backup($args)
1462 {
1463 if (empty($args))
1464 return false;
1465 extract($args);
1466
1467 $tasks = $this->get_backup_settings();
1468 $task = $tasks[$task_name];
1469 $backups = $task['task_results'];
1470 $backup = $backups[$result_id];
1471
1472 if (isset($backup['server'])) {
1473 @unlink($backup['server']['file_path']);
1474 }
1475
1476 //Remove from ftp
1477 if (isset($backup['ftp'])) {
1478 $ftp_file = $backup['ftp'];
1479 $args = $tasks[$task_name]['task_args']['account_info']['mwp_ftp'];
1480 $args['backup_file'] = $ftp_file;
1481 $this->remove_ftp_backup($args);
1482 }
1483
1484 if (isset($backup['amazons3'])) {
1485 $amazons3_file = $backup['amazons3'];
1486 $args = $tasks[$task_name]['task_args']['account_info']['mwp_amazon_s3'];
1487 $args['backup_file'] = $amazons3_file;
1488 $this->remove_amazons3_backup($args);
1489 }
1490
1491 if (isset($backup['dropbox'])) {
1492 }
1493
1494 unset($backups[$result_id]);
1495
1496 if (count($backups)) {
1497 $tasks[$task_name]['task_results'] = $backups;
1498 } else {
1499 unset($tasks[$task_name]['task_results']);
1500 }
1501
1502 update_option('mwp_backup_tasks', $tasks);
1503 return true;
1504
1505 }
1506
1507 function cleanup()
1508 {
1509 $tasks = $this->get_backup_settings();
1510 $backup_folder = WP_CONTENT_DIR . '/' . md5('mmb-worker') . '/mwp_backups/';
1511 $backup_folder_new = MWP_BACKUP_DIR.'/';
1512 $files = glob($backup_folder . "*");
1513 $new = glob($backup_folder_new . "*");
1514
1515 //Failed db files first
1516 $db_folder = MWP_DB_DIR.'/';
1517 $db_files = glob($db_folder . "*");
1518 if (is_array($db_files) && !empty($db_files)) {
1519 foreach ($db_files as $file) {
1520 @unlink($file);
1521 }
1522 @rmdir(MWP_DB_DIR);
1523 }
1524
1525
1526 //clean_old folder?
1527 if((basename($files[0]) == 'index.php' && count($files) == 1) || (empty($files))){
1528 foreach($files as $file){
1529 @unlink($file);
1530 }
1531 @rmdir(WP_CONTENT_DIR . '/' . md5('mmb-worker'). '/mwp_backups');
1532 @rmdir(WP_CONTENT_DIR . '/' . md5('mmb-worker'));
1533 }
1534
1535
1536 foreach($new as $b){
1537 $files[] = $b;
1538 }
1539 $deleted = array();
1540
1541 if (is_array($files) && count($files)) {
1542 $results = array();
1543 if (!empty($tasks)) {
1544 foreach ((array) $tasks as $task) {
1545 if (isset($task['task_results']) && count($task['task_results'])) {
1546 foreach ($task['task_results'] as $backup) {
1547 if (isset($backup['server'])) {
1548 $results[] = $backup['server']['file_path'];
1549 }
1550 }
1551 }
1552 }
1553 }
1554
1555 $num_deleted = 0;
1556 foreach ($files as $file) {
1557 if (!in_array($file, $results) && basename($file) != 'index.php') {
1558 @unlink($file);
1559 $deleted[] = basename($file);
1560 $num_deleted++;
1561 }
1562 }
1563 }
1564
1565
1566
1567 return $deleted;
1568 }
1569
1570
1571 function remote_backup_now($args)
1572 {
1573 if (!empty($args))
1574 extract($args);
1575 $tasks = $this->get_backup_settings();
1576 $task = $tasks['Backup Now'];
1577
1578 if (!empty($task)) {
1579 extract($task['task_args']);
1580 }
1581
1582 $results = $task['task_results'];
1583
1584 if (is_array($results) && count($results)) {
1585 $backup_file = $results[count($results) - 1]['server']['file_path'];
1586 }
1587
1588 if ($backup_file && file_exists($backup_file)) {
1589 if ($email) {
1590 $mail_args = array(
1591 'email' => $email_backup,
1592 'task_name' => 'Backup Now',
1593 'file_path' => $backup_file
1594 );
1595
1596 $return = $this->email_backup($mail_args);
1597
1598 //delete from server?
1599 if ($return == true && $del_host_file) {
1600 @unlink($backup_file);
1601
1602 unset($tasks['Backup Now']['task_results'][count($results) - 1]['server']);
1603 update_option('mwp_backup_tasks', $tasks);
1604
1605 }
1606 } else {
1607 //FTP, Amazon S3 or Dropbox
1608 if (isset($account_info['mwp_ftp']) && !empty($account_info['mwp_ftp'])) {
1609 $account_info['mwp_ftp']['backup_file'] = $backup_file;
1610 $return = $this->ftp_backup($account_info['mwp_ftp']);
1611 }
1612
1613 if (isset($account_info['mwp_amazon_s3']) && !empty($account_info['mwp_amazon_s3'])) {
1614 $account_info['mwp_amazon_s3']['backup_file'] = $backup_file;
1615 $return = $this->amazons3_backup($account_info['mwp_amazon_s3']);
1616 }
1617
1618 if (isset($account_info['mwp_dropbox']) && !empty($account_info['mwp_dropbox'])) {
1619 $account_info['mwp_dropbox']['backup_file'] = $backup_file;
1620 $return = $this->dropbox_backup($account_info['mwp_dropbox']);
1621 }
1622
1623 if ($return == true && $del_host_file && !$email_backup) {
1624 @unlink($backup_file);
1625 unset($tasks['Backup Now']['task_results'][count($results) - 1]['server']);
1626 update_option('mwp_backup_tasks', $tasks);
1627 }
1628
1629 }
1630
1631 } else {
1632 $return = array(
1633 'error' => 'Backup file not found on your server. Please try again.'
1634 );
1635 }
1636
1637 return $return;
1638
1639 }
1640
1641 function validate_task($args,$url){
1642 if( !class_exists( 'WP_Http' ) ){
1643 include_once( ABSPATH . WPINC. '/class-http.php' );
1644 }
1645 $params = array();
1646 $params['body'] = $args;
1647 $result= wp_remote_post($url, $params);
1648 if(is_array($result) && $result['body'] == 'mwp_delete_task'){
1649 $tasks = $this->get_backup_settings();
1650 unset($tasks[$args['task_name']]);
1651 update_option('mwp_backup_tasks',$tasks);
1652 $this->cleanup();
1653 exit;
1654 }
1655 }
1656
1657 function update_status($task_name, $status, $completed = false){
1658 /* Statuses:
1659 0 - Backup started
1660 1 - DB dump
1661 2 - DB ZIP
1662 3 - Files ZIP
1663 4 - Amazon S3
1664 5 - Dropbox
1665 6 - FTP
1666 7 - Email
1667 100 - Finished
1668 */
1669 if($task_name != 'Backup Now'){
1670 $tasks = $this->get_backup_settings();
1671 $index = count($tasks[$task_name]['task_results']) - 1;
1672 if(!is_array($tasks[$task_name]['task_results'][$index]['status'])){
1673 $tasks[$task_name]['task_results'][$index]['status'] = array();
1674 }
1675 if(!$completed){
1676 $tasks[$task_name]['task_results'][$index]['status'][] = (int)$status * (-1);
1677 } else {
1678 $status_index = count($tasks[$task_name]['task_results'][$index]['status']) - 1;
1679 $tasks[$task_name]['task_results'][$index]['status'][$status_index] = abs($tasks[$task_name]['task_results'][$index]['status'][$status_index]);
1680 }
1681
1682 update_option('mwp_backup_tasks',$tasks);
1683 }
1684 }
1685
1686 }
1687
1688 ?>