WordPress.org

Plugin Directory

Changeset 617727


Ignore:
Timestamp:
10/26/12 13:53:00 (18 months ago)
Author:
willmot
Message:

2.4 Feature release

Location:
wpremote
Files:
176 added
2 deleted
7 edited
6 copied

Legend:

Unmodified
Added
Removed
  • wpremote/tags/2.4/plugin.php

    r612780 r617727  
    33/* 
    44Plugin Name: WP Remote 
    5 Description: Manage your WordPress site with <a href="https://wpremote.com/">WP Remote</a>. Deactivate to clear your API Key. 
    6 Version: 2.3.1 
     5Description: Manage your WordPress site with <a href="https://wpremote.com/">WP Remote</a>. <strong>Deactivate to clear your API Key.</strong> 
     6Version: 2.4 
    77Author: Human Made Limited 
    88Author URI: http://hmn.md/ 
     
    2929define( 'WPRP_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); 
    3030 
     31if ( ! defined( 'WPR_API_URL' ) ) 
     32    define( 'WPR_API_URL', 'https://wpremote.com/api/json/' ); 
     33 
    3134// Don't activate on anything less than PHP 5.2.4 
    3235if ( version_compare( phpversion(), '5.2.4', '<' ) ) { 
     
    4043} 
    4144 
    42 require_once( WPRP_PLUGIN_PATH  .'/wprp.admin.php' ); 
     45require_once( WPRP_PLUGIN_PATH . '/wprp.admin.php' ); 
    4346 
    4447// Backups require 3.1 
    45 if ( version_compare( get_bloginfo( 'version' ), '3.1', '>=' ) && ! class_exists( 'WPR_HM_Backup' ) ) 
    46     require( WPRP_PLUGIN_PATH . '/hm-backup/hm-backup.php' ); 
     48if ( version_compare( get_bloginfo( 'version' ), '3.1', '>=' ) ) { 
     49 
     50    // deactivate backupwordpress 
     51    if ( defined( 'HMBKP_PLUGIN_PATH' ) ) { 
     52 
     53        $plugin_file = dirname( plugin_dir_path( HMBKP_PLUGIN_PATH ) ) . 'plugin.php'; 
     54 
     55        deactivate_plugins( array( 'backupwordpress/plugin.php' ), true ); 
     56 
     57        function wprp_backupwordpress_deactivated_notice() { 
     58 
     59            echo '<div class="updated fade"><p><strong>The BackUpWordPress Plugin has been de-activated</strong> The WP Remote Plugin includes BackUpWordPress.</p></div>'; 
     60 
     61        } 
     62        add_action( 'admin_notices', 'wprp_backupwordpress_deactivated_notice' ); 
     63 
     64    } else { 
     65 
     66        define( 'HMBKP_PLUGIN_PATH', trailingslashit( WPRP_PLUGIN_PATH ) . 'backupwordpress' ); 
     67        define( 'HMBKP_PLUGIN_URL', trailingslashit( plugins_url( WPRP_PLUGIN_SLUG ) ) . 'backupwordpress' ); 
     68 
     69        require( WPRP_PLUGIN_PATH . '/backupwordpress/plugin.php' ); 
     70 
     71        require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
     72 
     73    } 
     74 
     75    // unhook default schedules from being created 
     76    remove_action( 'admin_init', 'hmbkp_setup_default_schedules' ); 
     77    remove_filter( 'all_plugins', 'hmbkp_plugin_row', 10 ); 
     78    remove_filter( 'plugin_action_links', 'hmbkp_plugin_action_link', 10, 2 ); 
     79} 
    4780 
    4881// Don't include when doing a core update 
     
    132165        return; 
    133166 
    134     require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
    135167    require_once( WPRP_PLUGIN_PATH . '/wprp.plugins.php' ); 
    136168    require_once( WPRP_PLUGIN_PATH . '/wprp.themes.php' ); 
     
    214246} 
    215247add_filter( 'request_filesystem_credentials', '_wpr_set_filesystem_credentials' ); 
     248 
     249// we need the calculate filesize to work on no priv too 
     250add_action( 'wp_ajax_nopriv_wprp_calculate_backup_size', 'wprp_ajax_calculate_backup_size' ); 
     251 
     252function wprp_ajax_calculate_backup_size() { 
     253    require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
     254    WPRP_Backups::getInstance()->calculateEstimatedSize(); 
     255    exit; 
     256} 
  • wpremote/tags/2.4/readme.txt

    r612780 r617727  
    44Requires at least: 2.9 
    55Tested up to: 3.5 
    6 Stable tag: 2.3.1 
     6Stable tag: 2.4 
    77 
    88WP Remote is a free web app that enables you to easily manage all of your WordPress powered sites from one place. 
     
    3131 
    3232== Changelog == 
     33 
     34#### 2.4 
     35 
     36* Backups are now powered by BackUpWordPress. 
     37* The BackUpWordPress Plugin can no longer be run alongside WP Remote. 
     38* Emphasise that you can deactivate the plugin to clear your API key. 
    3339 
    3440#### 2.3.1 
  • wpremote/tags/2.4/wprp.admin.php

    r501736 r617727  
    3131                <input style="margin: -4px 5px; vertical-align: text-bottom; line-height: 13px; font-size: 12px;" type="text" class="code regular-text" id="wpr_api_key" name="wpr_api_key" /> 
    3232 
    33                 <input style="vertical-align: text-bottom; margin: -3px 0; line-height: 12px;" type="submit" value="Save API Key" class="button-primary" /> 
     33                <input style="margin: -6px 0 -3px; line-height: 12px; height: 12px;" type="submit" value="Save API Key" class="button-primary" /> 
    3434 
    3535            </p> 
     
    8080add_action( 'activate_' . WPRP_PLUGIN_SLUG . '/plugin.php', 'wprp_deactivate' ); 
    8181add_action( 'deactivate_' . WPRP_PLUGIN_SLUG . '/plugin.php', 'wprp_deactivate' ); 
     82 
     83/** 
     84 * Remove the BackUpWordPress menu from the Tools menu 
     85 *  
     86 */ 
     87function wprp_remove_backupwordpress_from_admin_menu() { 
     88 
     89    global $submenu; 
     90 
     91    if ( isset( $submenu['tools.php'][16] ) && $submenu['tools.php'][16][2] === 'backupwordpress' ) 
     92        unset( $submenu['tools.php'][16] ); 
     93} 
     94add_action( 'admin_menu', 'wprp_remove_backupwordpress_from_admin_menu', 11 ); 
  • wpremote/tags/2.4/wprp.api.php

    r612755 r617727  
    101101        case 'supports_backups' : 
    102102        case 'get_backup' : 
    103  
     103        case 'add_backup_schedule' : 
     104        case 'remove_backup_schedule' : 
     105        case 'get_backup_schedules' : 
    104106            $actions[$action] = _wprp_backups_api_call( $action ); 
    105107 
  • wpremote/tags/2.4/wprp.backups.php

    r595985 r617727  
    11<?php 
     2 
     3class WPRP_Backups { 
     4 
     5    private static $instance; 
     6 
     7    public static function getInstance() { 
     8 
     9        if ( empty( self::$instance ) ) 
     10            self::$instance = new WPRP_Backups(); 
     11 
     12        return self::$instance; 
     13    } 
     14 
     15    /** 
     16     * Do a backup of the site 
     17     *  
     18     * @return true|WP_Error 
     19     */ 
     20    public function doBackup() { 
     21        @ignore_user_abort( true ); 
     22 
     23        $schedule = $this->getManualBackupSchedule(); 
     24         
     25        $schedule->run();        
     26         
     27        $filepath = $schedule->get_archive_filepath(); 
     28 
     29        if ( ! file_exists( $filepath ) ) { 
     30            return new WP_Error( 'backup-failed', implode(', ', $schedule->get_errors() ) ); 
     31        } 
     32         
     33        return true; 
     34    } 
     35 
     36    /** 
     37     * Get the backup once it has run, will return status running as a WP Error 
     38     *  
     39     * @return WP_Error|string 
     40     */ 
     41    public function getBackup() { 
     42 
     43        $schedule = $this->getManualBackupSchedule(); 
     44 
     45        if ( $status = $schedule->get_status() ) 
     46            return new WP_Error( 'error-status', $status ); 
     47 
     48        $backup = reset( $schedule->get_backups() ); 
     49 
     50        if ( file_exists( $backup ) ) 
     51            return str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $backup ); 
     52 
     53        return new WP_Error( 'backup-failed', 'No backup was found' ); 
     54    } 
     55 
     56    public function cleanBackup( $schedule ) { 
     57 
     58        $schedules = new HMBKP_Schedules(); 
     59        $schedule = $schedules->get_schedule( $schedule ); 
     60 
     61        $backup = reset( $schedule->get_backups() ); 
     62 
     63        if ( file_exists( $backup ) ) 
     64            unlink( $backup ); 
     65    } 
     66 
     67    public function getEstimatedSize() { 
     68         
     69        if ( $size = get_transient( 'hmbkp_schedule_manual_filesize' ) ) 
     70            return HMBKP_Scheduled_Backup::human_filesize( $size, null, '%01u %s' ); 
     71 
     72        // we dont know the size yet, fire off a remote request to get it for later 
     73        // it can take some time so we have a small timeout then return "Calculating" 
     74        wp_remote_get(  
     75            $url = add_query_arg( array( 'action' => 'wprp_calculate_backup_size', 'backup_excludes' => $this->getManualBackupSchedule()->get_excludes() ), admin_url( 'admin-ajax.php' ) ),  
     76            array( 'timeout' => 0.1, 'sslverify' => false ) 
     77        ); 
     78 
     79        return 'Calculating'; 
     80 
     81    } 
     82 
     83    public function calculateEstimatedSize() { 
     84        $this->getManualBackupSchedule()->get_filesize(); 
     85    } 
     86 
     87    /** 
     88     * Enabled automatic backups for this install 
     89     *  
     90     * @param  array  $options { 'id' => string, type' => 'complete|files|database', 'reoccurance' => 'daily|...', 'excludes' => array() }  
     91     */ 
     92    public function addSchedule( $options = array() ) { 
     93 
     94        $schedules = new HMBKP_Schedules(); 
     95 
     96        if ( $schedules->get_schedule( $options['id'] ) ) 
     97            return; 
     98 
     99        $schedule = new HMBKP_Scheduled_Backup( $options['id'] ); 
     100        $schedule->set_type( $options['type'] ); 
     101        $schedule->set_excludes( $options['excludes'], true ); 
     102        $schedule->set_max_backups( 1 ); 
     103 
     104        if ( $options['start_date'] ) 
     105            $schedule->set_schedule_start_time( $options['start_date'] ); 
     106 
     107        $schedule->set_reoccurrence( $options['reoccurance'] ); 
     108 
     109        $schedule->save(); 
     110    } 
     111 
     112    /** 
     113     * Remove a schedule 
     114     *  
     115     * @param  int $id 
     116     */ 
     117    public function removeSchedule( $id ) { 
     118        $schedules = new HMBKP_Schedules(); 
     119 
     120        if ( ! $schedules->get_schedule( $id ) ) 
     121            return; 
     122 
     123        $schedules->get_schedule( $id )->cancel(); 
     124    } 
     125 
     126    /** 
     127     * Get an array of all the backup schedules 
     128     *  
     129     * @return array : array( 'id' => int, 'next_run_date' => int ) 
     130     */ 
     131    public function getSchedules() { 
     132 
     133        $schedules = new HMBKP_Schedules(); 
     134        $array = array(); 
     135 
     136        foreach ( $schedules->get_schedules() as $schedule ) 
     137            $array[] = array( 'id' => $schedule->get_id(), 'next_run_date' => $schedule->get_next_occurrence() ); 
     138 
     139        return $array; 
     140    } 
     141 
     142    /** 
     143     * Get the manual backup schedule from BackupWordPress 
     144     * @return HMBKP_Scheduled_Backup 
     145     */ 
     146    private function getManualBackupSchedule() { 
     147 
     148        $schedule = new HMBKP_Scheduled_Backup( 'manual' ); 
     149        $schedule->set_type( 'complete' ); 
     150        $schedule->set_max_backups( 1 ); 
     151 
     152        // Excludes 
     153        if ( ! empty( $_REQUEST['backup_excludes'] ) ) { 
     154             
     155            $excludes = array_map( 'urldecode', (array) $_REQUEST['backup_excludes'] ); 
     156            $schedule->set_excludes( $excludes, true ); 
     157        } 
     158 
     159        return $schedule; 
     160    } 
     161} 
     162 
     163class WPRP_Backup_Service extends HMBKP_Service { 
     164     
     165    /** 
     166     * Fire the email notification on the hmbkp_backup_complete 
     167     * 
     168     * @see  HM_Backup::do_action 
     169     * @param  string $action The action received from the backup 
     170     * @return void 
     171     */ 
     172    public function action( $action ) { 
     173         
     174        if ( $action == 'hmbkp_backup_complete' && strpos( $this->schedule->get_id(), 'wpremote' ) !== false ) { 
     175 
     176            $file = $this->schedule->get_archive_filepath(); 
     177            $file_url = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $file ); 
     178            $api_url = WPR_API_URL . 'backups/upload'; 
     179 
     180            $args = array(  
     181                'api_key'   => get_option( 'wpr_api_key' ), 
     182                'backup_url'=> $file_url, 
     183                'domain'    => get_bloginfo( 'url' ) 
     184            ); 
     185 
     186            wp_remote_post( $api_url, array( 'timeout' => 60, 'body' => $args ) ); 
     187        } 
     188    } 
     189 
     190    /** 
     191     * Abstract methods must be implemented 
     192     */ 
     193    public function form() {} 
     194 
     195    public function field() {} 
     196 
     197    public function update( &$new_data, $old_data ) {} 
     198 
     199    public function display() {} 
     200} 
     201HMBKP_Services::register( __FILE__, 'WPRP_Backup_Service' ); 
    2202 
    3203/** 
     
    9209function _wprp_backups_api_call( $action ) { 
    10210 
    11     if ( ! class_exists( 'WPR_HM_Backup' ) ) 
    12         return new WP_Error( 'Backups module not present' ); 
    13  
    14211    switch( $action ) : 
    15212         
     
    19216             
    20217        case 'do_backup' : 
    21          
    22             @ignore_user_abort( true ); 
    23              
    24             $backup = new WPR_HM_Backup(); 
    25             $upload_dir = wp_upload_dir(); 
    26              
    27             // Store the backup file in the uploads dir 
    28             $backup->set_path( $upload_dir['basedir'] . '/_wpremote_backups' ); 
    29              
    30             $running_file = $backup->get_path() . '/.backup_running'; 
    31             $index_php = $backup->get_path() . '/index.php'; 
    32              
    33             // Set a random backup filename 
    34             $backup->set_archive_filename( md5( time() ) . '.zip' ); 
    35              
    36             // delete the backups folder to cleanup old backups 
    37             _wprp_backups_rmdirtree( $backup->get_path() ); 
    38              
    39             if ( ! @mkdir( $backup->get_path() ) ) 
    40                 return new WP_Error( 'unable-to-create-backups-directory', 'Unable to write the .backup_running file - check your permissions on wp-content/uploads' ); 
    41                  
    42  
    43             // Write an index.php file so stop directory listing 
    44             if ( ! $handle = @fopen( $index_php, 'w' ) ) 
    45                 return new WP_Error( 'unable-to-write-index-php-file' ); 
    46      
    47             fwrite( $handle, '' ); 
    48      
    49             fclose( $handle ); 
    50              
    51             if ( ! file_exists( $index_php ) ) 
    52                 return new WP_Error( 'index-php-file-was-not-created' ); 
    53  
    54             // Write the backup runing file for tracking... 
    55             if ( ! $handle = @fopen( $running_file, 'w' ) ) 
    56                 return new WP_Error( 'unable-to-write-backup-running-file' ); 
    57      
    58             fwrite( $handle, $backup->get_archive_filename() ); 
    59      
    60             fclose( $handle ); 
    61              
    62             if ( ! file_exists( $running_file ) ) 
    63                 return new WP_Error( 'backup-running-file-was-not-created' ); 
    64              
    65             // Excludes 
    66             if ( ! empty( $_REQUEST['backup_excludes'] ) ) { 
    67              
    68                 $excludes = array_map( 'urldecode', (array) $_REQUEST['backup_excludes'] ); 
    69                 $backup->set_excludes( $excludes, true ); 
    70             } 
    71  
    72             if ( function_exists( 'hmbkp_path' ) ) 
    73                 $backup->set_excludes( array( hmbkp_path() ), true ); 
    74              
    75             $backup->backup(); 
    76              
    77             unlink( $backup->get_path() . '/.backup_completed' ); 
    78             unlink( $backup->get_path() . '/.backup_running' ); 
    79              
    80             // Write the backup runing file for tracking... 
    81             $completed_file = $backup->get_path() . '/.backup_completed'; 
    82  
    83             if ( ! $handle = @fopen( $completed_file, 'w' ) ) 
    84                 return new WP_Error( 'unable-to-write-backup-completed-file' ); 
    85              
    86             if ( $backup->get_errors() || ( $backup->get_warnings() && ! file_exists( $backup->get_archive_filepath() ) ) ) { 
    87                  
    88                 $errors = array_merge( $backup->get_errors(), $backup->get_warnings() ); 
    89                 fwrite( $handle, json_encode( $errors ) ); 
    90                  
    91             } else { 
    92              
    93                 fwrite( $handle, 'file:' . $backup->get_archive_filename() ); 
    94             } 
    95              
    96             fclose( $handle ); 
    97              
    98             return true; 
     218 
     219            return WPRP_Backups::getInstance()->doBackup(); 
    99220                     
    100221        case 'get_backup' : 
    101              
    102             $upload_dir = wp_upload_dir(); 
    103  
    104             // Store the backup file in the uploads dir 
    105             $path = $upload_dir['basedir'] . '/_wpremote_backups'; 
    106             $url = $upload_dir['baseurl'] . '/_wpremote_backups'; 
    107              
    108             if ( ! is_dir( $path ) ) 
    109                 return new WP_Error( 'backups-dir-does-not-exist' ); 
    110  
    111             if ( file_exists( $path . '/.backup_running' ) ) 
    112                 return new WP_Error( 'backup-running' ); 
    113  
    114             if ( ! file_exists( $path . '/.backup_completed' ) ) 
    115                 return new WP_Error( 'backup-not-started' ); 
    116              
    117             $file = file_get_contents( $path . '/.backup_completed' ); 
    118              
    119             if ( strpos( $file, 'file:' ) === 0 ) 
    120                 return $url . '/' . substr( $file, 5 ); 
    121              
    122             // must have errored, return errors in a WP_Error 
    123             return new WP_Error( 'backup-failed', json_decode( $file ) ); 
     222                 
     223            return WPRP_Backups::getInstance()->getBackup(); 
    124224                                         
    125225        case 'delete_backup' : 
    126226 
    127             $upload_dir = wp_upload_dir(); 
    128              
    129             _wprp_backups_rmdirtree( $upload_dir['basedir'] . '/_wpremote_backups' ); 
    130              
     227            return WPRP_Backups::getInstance()->cleanBackup( $_GET['schedule_id']); 
     228         
     229        case 'add_backup_schedule' : 
     230            return WPRP_Backups::getInstance()->addSchedule( $_GET ); 
     231 
     232        case 'remove_backup_schedule' : 
     233            return WPRP_Backups::getInstance()->removeSchedule( $_GET['id'] ); 
     234 
     235        case 'get_backup_schedules' : 
     236            return WPRP_Backups::getInstance()->getSchedules(); 
    131237        break; 
    132238 
     
    135241} 
    136242 
    137 function _wprp_backups_rmdirtree( $dir ) { 
    138  
    139     if ( is_file( $dir ) ) 
    140         unlink( $dir ); 
    141  
    142     if ( ! is_dir( $dir ) ) 
    143         return false; 
    144  
    145     $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ), RecursiveIteratorIterator::CHILD_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD ); 
    146  
    147     foreach ( $files as $file ) { 
    148  
    149         if ( $file->isDir() ) 
    150             @rmdir( $file->getPathname() ); 
    151  
    152         else 
    153             @unlink( $file->getPathname() ); 
    154  
    155     } 
    156  
    157     return @rmdir( $dir ); 
    158  
    159 } 
    160243 
    161244function _wprp_get_backups_info() { 
    162     if ( ! class_exists( 'WPR_HM_Backup' ) ) 
    163         return; 
    164  
    165     $hm_backup = new WPR_HM_Backup(); 
     245 
     246    $hm_backup = new HM_Backup(); 
     247 
    166248    $info = array( 
    167         'mysqldump_path' => $hm_backup->get_mysqldump_command_path(), 
    168         'zip_path' => $hm_backup->get_zip_command_path() 
     249        'mysqldump_path'    => $hm_backup->get_mysqldump_command_path(), 
     250        'zip_path'          => $hm_backup->get_zip_command_path(), 
     251        'estimated_size'    => WPRP_Backups::getInstance()->getEstimatedSize() 
    169252    ); 
    170253 
  • wpremote/trunk/plugin.php

    r612780 r617727  
    33/* 
    44Plugin Name: WP Remote 
    5 Description: Manage your WordPress site with <a href="https://wpremote.com/">WP Remote</a>. Deactivate to clear your API Key. 
    6 Version: 2.3.1 
     5Description: Manage your WordPress site with <a href="https://wpremote.com/">WP Remote</a>. <strong>Deactivate to clear your API Key.</strong> 
     6Version: 2.4 
    77Author: Human Made Limited 
    88Author URI: http://hmn.md/ 
     
    2929define( 'WPRP_PLUGIN_PATH', plugin_dir_path( __FILE__ ) ); 
    3030 
     31if ( ! defined( 'WPR_API_URL' ) ) 
     32    define( 'WPR_API_URL', 'https://wpremote.com/api/json/' ); 
     33 
    3134// Don't activate on anything less than PHP 5.2.4 
    3235if ( version_compare( phpversion(), '5.2.4', '<' ) ) { 
     
    4043} 
    4144 
    42 require_once( WPRP_PLUGIN_PATH  .'/wprp.admin.php' ); 
     45require_once( WPRP_PLUGIN_PATH . '/wprp.admin.php' ); 
    4346 
    4447// Backups require 3.1 
    45 if ( version_compare( get_bloginfo( 'version' ), '3.1', '>=' ) && ! class_exists( 'WPR_HM_Backup' ) ) 
    46     require( WPRP_PLUGIN_PATH . '/hm-backup/hm-backup.php' ); 
     48if ( version_compare( get_bloginfo( 'version' ), '3.1', '>=' ) ) { 
     49 
     50    // deactivate backupwordpress 
     51    if ( defined( 'HMBKP_PLUGIN_PATH' ) ) { 
     52 
     53        $plugin_file = dirname( plugin_dir_path( HMBKP_PLUGIN_PATH ) ) . 'plugin.php'; 
     54 
     55        deactivate_plugins( array( 'backupwordpress/plugin.php' ), true ); 
     56 
     57        function wprp_backupwordpress_deactivated_notice() { 
     58 
     59            echo '<div class="updated fade"><p><strong>The BackUpWordPress Plugin has been de-activated</strong> The WP Remote Plugin includes BackUpWordPress.</p></div>'; 
     60 
     61        } 
     62        add_action( 'admin_notices', 'wprp_backupwordpress_deactivated_notice' ); 
     63 
     64    } else { 
     65 
     66        define( 'HMBKP_PLUGIN_PATH', trailingslashit( WPRP_PLUGIN_PATH ) . 'backupwordpress' ); 
     67        define( 'HMBKP_PLUGIN_URL', trailingslashit( plugins_url( WPRP_PLUGIN_SLUG ) ) . 'backupwordpress' ); 
     68 
     69        require( WPRP_PLUGIN_PATH . '/backupwordpress/plugin.php' ); 
     70 
     71        require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
     72 
     73    } 
     74 
     75    // unhook default schedules from being created 
     76    remove_action( 'admin_init', 'hmbkp_setup_default_schedules' ); 
     77    remove_filter( 'all_plugins', 'hmbkp_plugin_row', 10 ); 
     78    remove_filter( 'plugin_action_links', 'hmbkp_plugin_action_link', 10, 2 ); 
     79} 
    4780 
    4881// Don't include when doing a core update 
     
    132165        return; 
    133166 
    134     require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
    135167    require_once( WPRP_PLUGIN_PATH . '/wprp.plugins.php' ); 
    136168    require_once( WPRP_PLUGIN_PATH . '/wprp.themes.php' ); 
     
    214246} 
    215247add_filter( 'request_filesystem_credentials', '_wpr_set_filesystem_credentials' ); 
     248 
     249// we need the calculate filesize to work on no priv too 
     250add_action( 'wp_ajax_nopriv_wprp_calculate_backup_size', 'wprp_ajax_calculate_backup_size' ); 
     251 
     252function wprp_ajax_calculate_backup_size() { 
     253    require_once( WPRP_PLUGIN_PATH . '/wprp.backups.php' ); 
     254    WPRP_Backups::getInstance()->calculateEstimatedSize(); 
     255    exit; 
     256} 
  • wpremote/trunk/readme.txt

    r612780 r617727  
    44Requires at least: 2.9 
    55Tested up to: 3.5 
    6 Stable tag: 2.3.1 
     6Stable tag: 2.4 
    77 
    88WP Remote is a free web app that enables you to easily manage all of your WordPress powered sites from one place. 
     
    3131 
    3232== Changelog == 
     33 
     34#### 2.4 
     35 
     36* Backups are now powered by BackUpWordPress. 
     37* The BackUpWordPress Plugin can no longer be run alongside WP Remote. 
     38* Emphasise that you can deactivate the plugin to clear your API key. 
    3339 
    3440#### 2.3.1 
  • wpremote/trunk/wprp.admin.php

    r501736 r617727  
    3131                <input style="margin: -4px 5px; vertical-align: text-bottom; line-height: 13px; font-size: 12px;" type="text" class="code regular-text" id="wpr_api_key" name="wpr_api_key" /> 
    3232 
    33                 <input style="vertical-align: text-bottom; margin: -3px 0; line-height: 12px;" type="submit" value="Save API Key" class="button-primary" /> 
     33                <input style="margin: -6px 0 -3px; line-height: 12px; height: 12px;" type="submit" value="Save API Key" class="button-primary" /> 
    3434 
    3535            </p> 
     
    8080add_action( 'activate_' . WPRP_PLUGIN_SLUG . '/plugin.php', 'wprp_deactivate' ); 
    8181add_action( 'deactivate_' . WPRP_PLUGIN_SLUG . '/plugin.php', 'wprp_deactivate' ); 
     82 
     83/** 
     84 * Remove the BackUpWordPress menu from the Tools menu 
     85 *  
     86 */ 
     87function wprp_remove_backupwordpress_from_admin_menu() { 
     88 
     89    global $submenu; 
     90 
     91    if ( isset( $submenu['tools.php'][16] ) && $submenu['tools.php'][16][2] === 'backupwordpress' ) 
     92        unset( $submenu['tools.php'][16] ); 
     93} 
     94add_action( 'admin_menu', 'wprp_remove_backupwordpress_from_admin_menu', 11 ); 
  • wpremote/trunk/wprp.api.php

    r612755 r617727  
    101101        case 'supports_backups' : 
    102102        case 'get_backup' : 
    103  
     103        case 'add_backup_schedule' : 
     104        case 'remove_backup_schedule' : 
     105        case 'get_backup_schedules' : 
    104106            $actions[$action] = _wprp_backups_api_call( $action ); 
    105107 
  • wpremote/trunk/wprp.backups.php

    r595985 r617727  
    11<?php 
     2 
     3class WPRP_Backups { 
     4 
     5    private static $instance; 
     6 
     7    public static function getInstance() { 
     8 
     9        if ( empty( self::$instance ) ) 
     10            self::$instance = new WPRP_Backups(); 
     11 
     12        return self::$instance; 
     13    } 
     14 
     15    /** 
     16     * Do a backup of the site 
     17     *  
     18     * @return true|WP_Error 
     19     */ 
     20    public function doBackup() { 
     21        @ignore_user_abort( true ); 
     22 
     23        $schedule = $this->getManualBackupSchedule(); 
     24         
     25        $schedule->run();        
     26         
     27        $filepath = $schedule->get_archive_filepath(); 
     28 
     29        if ( ! file_exists( $filepath ) ) { 
     30            return new WP_Error( 'backup-failed', implode(', ', $schedule->get_errors() ) ); 
     31        } 
     32         
     33        return true; 
     34    } 
     35 
     36    /** 
     37     * Get the backup once it has run, will return status running as a WP Error 
     38     *  
     39     * @return WP_Error|string 
     40     */ 
     41    public function getBackup() { 
     42 
     43        $schedule = $this->getManualBackupSchedule(); 
     44 
     45        if ( $status = $schedule->get_status() ) 
     46            return new WP_Error( 'error-status', $status ); 
     47 
     48        $backup = reset( $schedule->get_backups() ); 
     49 
     50        if ( file_exists( $backup ) ) 
     51            return str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $backup ); 
     52 
     53        return new WP_Error( 'backup-failed', 'No backup was found' ); 
     54    } 
     55 
     56    public function cleanBackup( $schedule ) { 
     57 
     58        $schedules = new HMBKP_Schedules(); 
     59        $schedule = $schedules->get_schedule( $schedule ); 
     60 
     61        $backup = reset( $schedule->get_backups() ); 
     62 
     63        if ( file_exists( $backup ) ) 
     64            unlink( $backup ); 
     65    } 
     66 
     67    public function getEstimatedSize() { 
     68         
     69        if ( $size = get_transient( 'hmbkp_schedule_manual_filesize' ) ) 
     70            return HMBKP_Scheduled_Backup::human_filesize( $size, null, '%01u %s' ); 
     71 
     72        // we dont know the size yet, fire off a remote request to get it for later 
     73        // it can take some time so we have a small timeout then return "Calculating" 
     74        wp_remote_get(  
     75            $url = add_query_arg( array( 'action' => 'wprp_calculate_backup_size', 'backup_excludes' => $this->getManualBackupSchedule()->get_excludes() ), admin_url( 'admin-ajax.php' ) ),  
     76            array( 'timeout' => 0.1, 'sslverify' => false ) 
     77        ); 
     78 
     79        return 'Calculating'; 
     80 
     81    } 
     82 
     83    public function calculateEstimatedSize() { 
     84        $this->getManualBackupSchedule()->get_filesize(); 
     85    } 
     86 
     87    /** 
     88     * Enabled automatic backups for this install 
     89     *  
     90     * @param  array  $options { 'id' => string, type' => 'complete|files|database', 'reoccurance' => 'daily|...', 'excludes' => array() }  
     91     */ 
     92    public function addSchedule( $options = array() ) { 
     93 
     94        $schedules = new HMBKP_Schedules(); 
     95 
     96        if ( $schedules->get_schedule( $options['id'] ) ) 
     97            return; 
     98 
     99        $schedule = new HMBKP_Scheduled_Backup( $options['id'] ); 
     100        $schedule->set_type( $options['type'] ); 
     101        $schedule->set_excludes( $options['excludes'], true ); 
     102        $schedule->set_max_backups( 1 ); 
     103 
     104        if ( $options['start_date'] ) 
     105            $schedule->set_schedule_start_time( $options['start_date'] ); 
     106 
     107        $schedule->set_reoccurrence( $options['reoccurance'] ); 
     108 
     109        $schedule->save(); 
     110    } 
     111 
     112    /** 
     113     * Remove a schedule 
     114     *  
     115     * @param  int $id 
     116     */ 
     117    public function removeSchedule( $id ) { 
     118        $schedules = new HMBKP_Schedules(); 
     119 
     120        if ( ! $schedules->get_schedule( $id ) ) 
     121            return; 
     122 
     123        $schedules->get_schedule( $id )->cancel(); 
     124    } 
     125 
     126    /** 
     127     * Get an array of all the backup schedules 
     128     *  
     129     * @return array : array( 'id' => int, 'next_run_date' => int ) 
     130     */ 
     131    public function getSchedules() { 
     132 
     133        $schedules = new HMBKP_Schedules(); 
     134        $array = array(); 
     135 
     136        foreach ( $schedules->get_schedules() as $schedule ) 
     137            $array[] = array( 'id' => $schedule->get_id(), 'next_run_date' => $schedule->get_next_occurrence() ); 
     138 
     139        return $array; 
     140    } 
     141 
     142    /** 
     143     * Get the manual backup schedule from BackupWordPress 
     144     * @return HMBKP_Scheduled_Backup 
     145     */ 
     146    private function getManualBackupSchedule() { 
     147 
     148        $schedule = new HMBKP_Scheduled_Backup( 'manual' ); 
     149        $schedule->set_type( 'complete' ); 
     150        $schedule->set_max_backups( 1 ); 
     151 
     152        // Excludes 
     153        if ( ! empty( $_REQUEST['backup_excludes'] ) ) { 
     154             
     155            $excludes = array_map( 'urldecode', (array) $_REQUEST['backup_excludes'] ); 
     156            $schedule->set_excludes( $excludes, true ); 
     157        } 
     158 
     159        return $schedule; 
     160    } 
     161} 
     162 
     163class WPRP_Backup_Service extends HMBKP_Service { 
     164     
     165    /** 
     166     * Fire the email notification on the hmbkp_backup_complete 
     167     * 
     168     * @see  HM_Backup::do_action 
     169     * @param  string $action The action received from the backup 
     170     * @return void 
     171     */ 
     172    public function action( $action ) { 
     173         
     174        if ( $action == 'hmbkp_backup_complete' && strpos( $this->schedule->get_id(), 'wpremote' ) !== false ) { 
     175 
     176            $file = $this->schedule->get_archive_filepath(); 
     177            $file_url = str_replace( WP_CONTENT_DIR, WP_CONTENT_URL, $file ); 
     178            $api_url = WPR_API_URL . 'backups/upload'; 
     179 
     180            $args = array(  
     181                'api_key'   => get_option( 'wpr_api_key' ), 
     182                'backup_url'=> $file_url, 
     183                'domain'    => get_bloginfo( 'url' ) 
     184            ); 
     185 
     186            wp_remote_post( $api_url, array( 'timeout' => 60, 'body' => $args ) ); 
     187        } 
     188    } 
     189 
     190    /** 
     191     * Abstract methods must be implemented 
     192     */ 
     193    public function form() {} 
     194 
     195    public function field() {} 
     196 
     197    public function update( &$new_data, $old_data ) {} 
     198 
     199    public function display() {} 
     200} 
     201HMBKP_Services::register( __FILE__, 'WPRP_Backup_Service' ); 
    2202 
    3203/** 
     
    9209function _wprp_backups_api_call( $action ) { 
    10210 
    11     if ( ! class_exists( 'WPR_HM_Backup' ) ) 
    12         return new WP_Error( 'Backups module not present' ); 
    13  
    14211    switch( $action ) : 
    15212         
     
    19216             
    20217        case 'do_backup' : 
    21          
    22             @ignore_user_abort( true ); 
    23              
    24             $backup = new WPR_HM_Backup(); 
    25             $upload_dir = wp_upload_dir(); 
    26              
    27             // Store the backup file in the uploads dir 
    28             $backup->set_path( $upload_dir['basedir'] . '/_wpremote_backups' ); 
    29              
    30             $running_file = $backup->get_path() . '/.backup_running'; 
    31             $index_php = $backup->get_path() . '/index.php'; 
    32              
    33             // Set a random backup filename 
    34             $backup->set_archive_filename( md5( time() ) . '.zip' ); 
    35              
    36             // delete the backups folder to cleanup old backups 
    37             _wprp_backups_rmdirtree( $backup->get_path() ); 
    38              
    39             if ( ! @mkdir( $backup->get_path() ) ) 
    40                 return new WP_Error( 'unable-to-create-backups-directory', 'Unable to write the .backup_running file - check your permissions on wp-content/uploads' ); 
    41                  
    42  
    43             // Write an index.php file so stop directory listing 
    44             if ( ! $handle = @fopen( $index_php, 'w' ) ) 
    45                 return new WP_Error( 'unable-to-write-index-php-file' ); 
    46      
    47             fwrite( $handle, '' ); 
    48      
    49             fclose( $handle ); 
    50              
    51             if ( ! file_exists( $index_php ) ) 
    52                 return new WP_Error( 'index-php-file-was-not-created' ); 
    53  
    54             // Write the backup runing file for tracking... 
    55             if ( ! $handle = @fopen( $running_file, 'w' ) ) 
    56                 return new WP_Error( 'unable-to-write-backup-running-file' ); 
    57      
    58             fwrite( $handle, $backup->get_archive_filename() ); 
    59      
    60             fclose( $handle ); 
    61              
    62             if ( ! file_exists( $running_file ) ) 
    63                 return new WP_Error( 'backup-running-file-was-not-created' ); 
    64              
    65             // Excludes 
    66             if ( ! empty( $_REQUEST['backup_excludes'] ) ) { 
    67              
    68                 $excludes = array_map( 'urldecode', (array) $_REQUEST['backup_excludes'] ); 
    69                 $backup->set_excludes( $excludes, true ); 
    70             } 
    71  
    72             if ( function_exists( 'hmbkp_path' ) ) 
    73                 $backup->set_excludes( array( hmbkp_path() ), true ); 
    74              
    75             $backup->backup(); 
    76              
    77             unlink( $backup->get_path() . '/.backup_completed' ); 
    78             unlink( $backup->get_path() . '/.backup_running' ); 
    79              
    80             // Write the backup runing file for tracking... 
    81             $completed_file = $backup->get_path() . '/.backup_completed'; 
    82  
    83             if ( ! $handle = @fopen( $completed_file, 'w' ) ) 
    84                 return new WP_Error( 'unable-to-write-backup-completed-file' ); 
    85              
    86             if ( $backup->get_errors() || ( $backup->get_warnings() && ! file_exists( $backup->get_archive_filepath() ) ) ) { 
    87                  
    88                 $errors = array_merge( $backup->get_errors(), $backup->get_warnings() ); 
    89                 fwrite( $handle, json_encode( $errors ) ); 
    90                  
    91             } else { 
    92              
    93                 fwrite( $handle, 'file:' . $backup->get_archive_filename() ); 
    94             } 
    95              
    96             fclose( $handle ); 
    97              
    98             return true; 
     218 
     219            return WPRP_Backups::getInstance()->doBackup(); 
    99220                     
    100221        case 'get_backup' : 
    101              
    102             $upload_dir = wp_upload_dir(); 
    103  
    104             // Store the backup file in the uploads dir 
    105             $path = $upload_dir['basedir'] . '/_wpremote_backups'; 
    106             $url = $upload_dir['baseurl'] . '/_wpremote_backups'; 
    107              
    108             if ( ! is_dir( $path ) ) 
    109                 return new WP_Error( 'backups-dir-does-not-exist' ); 
    110  
    111             if ( file_exists( $path . '/.backup_running' ) ) 
    112                 return new WP_Error( 'backup-running' ); 
    113  
    114             if ( ! file_exists( $path . '/.backup_completed' ) ) 
    115                 return new WP_Error( 'backup-not-started' ); 
    116              
    117             $file = file_get_contents( $path . '/.backup_completed' ); 
    118              
    119             if ( strpos( $file, 'file:' ) === 0 ) 
    120                 return $url . '/' . substr( $file, 5 ); 
    121              
    122             // must have errored, return errors in a WP_Error 
    123             return new WP_Error( 'backup-failed', json_decode( $file ) ); 
     222                 
     223            return WPRP_Backups::getInstance()->getBackup(); 
    124224                                         
    125225        case 'delete_backup' : 
    126226 
    127             $upload_dir = wp_upload_dir(); 
    128              
    129             _wprp_backups_rmdirtree( $upload_dir['basedir'] . '/_wpremote_backups' ); 
    130              
     227            return WPRP_Backups::getInstance()->cleanBackup( $_GET['schedule_id']); 
     228         
     229        case 'add_backup_schedule' : 
     230            return WPRP_Backups::getInstance()->addSchedule( $_GET ); 
     231 
     232        case 'remove_backup_schedule' : 
     233            return WPRP_Backups::getInstance()->removeSchedule( $_GET['id'] ); 
     234 
     235        case 'get_backup_schedules' : 
     236            return WPRP_Backups::getInstance()->getSchedules(); 
    131237        break; 
    132238 
     
    135241} 
    136242 
    137 function _wprp_backups_rmdirtree( $dir ) { 
    138  
    139     if ( is_file( $dir ) ) 
    140         unlink( $dir ); 
    141  
    142     if ( ! is_dir( $dir ) ) 
    143         return false; 
    144  
    145     $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir ), RecursiveIteratorIterator::CHILD_FIRST, RecursiveIteratorIterator::CATCH_GET_CHILD ); 
    146  
    147     foreach ( $files as $file ) { 
    148  
    149         if ( $file->isDir() ) 
    150             @rmdir( $file->getPathname() ); 
    151  
    152         else 
    153             @unlink( $file->getPathname() ); 
    154  
    155     } 
    156  
    157     return @rmdir( $dir ); 
    158  
    159 } 
    160243 
    161244function _wprp_get_backups_info() { 
    162     if ( ! class_exists( 'WPR_HM_Backup' ) ) 
    163         return; 
    164  
    165     $hm_backup = new WPR_HM_Backup(); 
     245 
     246    $hm_backup = new HM_Backup(); 
     247 
    166248    $info = array( 
    167         'mysqldump_path' => $hm_backup->get_mysqldump_command_path(), 
    168         'zip_path' => $hm_backup->get_zip_command_path() 
     249        'mysqldump_path'    => $hm_backup->get_mysqldump_command_path(), 
     250        'zip_path'          => $hm_backup->get_zip_command_path(), 
     251        'estimated_size'    => WPRP_Backups::getInstance()->getEstimatedSize() 
    169252    ); 
    170253 
Note: See TracChangeset for help on using the changeset viewer.