2014-03-19 23:58:52 +07:00
< ? php
class MainWPClone
{
public static function init ()
{
self :: init_ajax ();
add_action ( 'check_admin_referer' , array ( 'MainWPClone' , 'permalinkChanged' ));
if ( get_option ( 'mainwp_child_clone_permalink' ) || get_option ( 'mainwp_child_restore_permalink' )) add_action ( 'admin_notices' , array ( 'MainWPClone' , 'permalinkAdminNotice' ));
}
2014-03-31 21:38:19 +02:00
public static function init_menu ( $the_branding )
{
if ( empty ( $the_branding ))
$the_branding = " MainWP " ;
$page = add_options_page ( 'MainWPClone' , __ ( $the_branding . ' Clone' , 'mainwp-child' ), 'manage_options' , 'MainWPClone' , array ( 'MainWPClone' , 'render' ));
2014-03-19 23:58:52 +07:00
add_action ( 'admin_print_scripts-' . $page , array ( 'MainWPClone' , 'print_scripts' ));
}
2014-03-31 21:38:19 +02:00
public static function init_restore_menu ( $the_branding )
2014-03-19 23:58:52 +07:00
{
2014-03-31 21:38:19 +02:00
if ( empty ( $the_branding ))
$the_branding = " MainWP " ;
$page = add_options_page ( 'MainWPClone' , __ ( $the_branding . ' Restore' , 'mainwp-child' ), 'manage_options' , 'MainWPRestore' , array ( 'MainWPClone' , 'renderNormalRestore' ));
2014-03-19 23:58:52 +07:00
add_action ( 'admin_print_scripts-' . $page , array ( 'MainWPClone' , 'print_scripts' ));
}
public static function print_scripts ()
{
global $wp_version ;
if ( version_compare ( '3.6' , $wp_version , '>' ))
{
wp_enqueue_script ( 'jquery-ui' , 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js' , array ( 'jquery' ));
wp_enqueue_style ( 'jquery-ui-style' , 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/themes/smoothness/jquery-ui.css' );
}
else
{
wp_enqueue_script ( 'jquery-ui-tooltip' );
wp_enqueue_script ( 'jquery-ui-autocomplete' );
wp_enqueue_script ( 'jquery-ui-progressbar' );
wp_enqueue_script ( 'jquery-ui-dialog' );
wp_enqueue_style ( 'jquery-ui-style' , 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/themes/smoothness/jquery-ui.css' );
}
}
public static function renderHeader ()
{
self :: renderStyle ();
?>
< div class = " mainwp-child-container " >
< ? php
}
public static function renderFooter ()
{
?>
</ div >
< ? php
}
public static function render ()
{
$uploadError = false ;
$uploadFile = false ;
if ( isset ( $_REQUEST [ 'upload' ]))
{
if ( isset ( $_FILES [ 'file' ]))
{
if ( ! function_exists ( 'wp_handle_upload' )) require_once ( ABSPATH . 'wp-admin/includes/file.php' );
$uploadedfile = $_FILES [ 'file' ];
$upload_overrides = array ( 'test_form' => false );
$movefile = wp_handle_upload ( $uploadedfile , $upload_overrides );
if ( $movefile )
{
$uploadFile = str_replace ( ABSPATH , '' , $movefile [ 'file' ]);
}
else
{
$uploadError = __ ( 'File could not be uploaded.' , 'mainwp-child' );
}
}
else
{
$uploadError = __ ( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' , 'mainwp-child' );
}
}
$sitesToClone = get_option ( 'mainwp_child_clone_sites' );
$uploadSizeInBytes = min ( MainWPHelper :: return_bytes ( ini_get ( 'upload_max_filesize' )), MainWPHelper :: return_bytes ( ini_get ( 'post_max_size' )));
$uploadSize = MainWPHelper :: human_filesize ( $uploadSizeInBytes );
self :: renderHeader ();
?> <div id="icon-options-general" class="icon32"><br></div><h2><?php _e('Clone or Restore','mainwp-child'); ?></h2><?php
if ( $sitesToClone == '0' )
{
echo '<div class="mainwp-child_info-box-red"><strong>' . __ ( 'Cloning is currently off - To turn on return to your main dashboard and turn cloning on on the Migrate/Clone page.' , 'mainwp-child' ) . '</strong></div>' ;
return ;
}
2014-04-01 20:47:27 +02:00
MainWPHelper :: getWPFilesystem ();
global $wp_filesystem ;
if (( ! empty ( $wp_filesystem ) && ! $wp_filesystem -> is_writable ( WP_CONTENT_DIR )) || ( empty ( $wp_filesystem ) && ! is_writable ( WP_CONTENT_DIR )))
2014-03-19 23:58:52 +07:00
{
echo '<div class="mainwp-child_info-box-red"><strong>' . __ ( 'Your content directory is not writable. Please set 0755 permission to ' , 'mainwp-child' ) . basename ( WP_CONTENT_DIR ) . '. (' . WP_CONTENT_DIR . ')</strong></div>' ;
$error = true ;
}
?>
< div class = " mainwp-child_info-box-green " style = " display: none; " >< ? php _e ( 'Cloning process completed successfully! You will now need to click ' , 'mainwp-child' ); ?> <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('here','mainwp-child'); ?></a><?php _e(' to re-login to the admin and re-save permalinks.','mainwp-child'); ?></div>
< ? php
if ( $uploadFile )
{
_e ( 'Upload successful.' , 'mainwp-child' ); ?> <a href="#" id="mainwp-child_uploadclonebutton" class="button-primary" file="<?php echo $uploadFile; ?>"><?php _e('Clone/Restore Website','mainwp-child'); ?></a><?php
}
else
{
if ( $uploadError )
{
?> <div class="mainwp-child_info-box-red"><?php echo $uploadError; ?></div><?php
}
if ( empty ( $sitesToClone ))
{
echo '<div class="mainwp-child_info-box-yellow"><strong>' . __ ( 'Cloning is currently on but no sites have been allowed, to allow sites return to your main dashboard and turn cloning on on the Migrate/Clone page.' , 'mainwp-child' ) . '</strong></div>' ;
}
else
{
?>
< form method = " post " action = " " >
< div class = " mainwp-child_select_sites_box " >
< div class = " postbox " >
< div class = " mainwp-child_displayby " >< ? php _e ( 'Display by:' , 'mainwp-child' ); ?> <a class="mainwp-child_action left mainwp-child_action_down" href="#" id="mainwp-child_displayby_sitename"><?php _e('Site Name','mainwp-child'); ?></a><a class="mainwp-child_action right" href="#" id="mainwp-child_displayby_url"><?php _e('URL','mainwp-child'); ?></a></div><h2><?php _e('Clone Options','mainwp-child'); ?></h2>
< div class = " inside " >
< div id = " mainwp-child_clonesite_select_site " >
< ? php
foreach ( $sitesToClone as $siteId => $siteToClone )
{
?>
< div class = " clonesite_select_site_item " id = " <?php echo $siteId ; ?> " rand = " <?php echo MainWPHelper::randString(5); ?> " >
< div class = " mainwp-child_size_label " size = " <?php echo $siteToClone['size'] ; ?> " >< ? php echo $siteToClone [ 'size' ]; ?> MB</div>
< div class = " mainwp-child_name_label " >< ? php echo $siteToClone [ 'name' ]; ?> </div>
< div class = " mainwp-child_url_label " >< ? php echo MainWPHelper :: getNiceURL ( $siteToClone [ 'url' ]); ?> </div>
</ div >
< ? php
}
?>
</ div >
</ div >
< div class = " mainwp-child_clonebutton_container " >< ? php if ( ! $error ) { ?> <a href="#" id="mainwp-child_clonebutton" class="button-primary"><?php _e('Clone Website','mainwp-child'); ?></a><?php } ?></div>
< div style = " clear:both " ></ div >
</ div >
</ div >
</ form >
< br />
< ? php
}
?>
2014-04-01 20:53:57 +02:00
< div id = " icon-options-general " class = " icon32 " >< br ></ div >< h2 >< strong >< ? php _e ( 'Option 1:' , 'mainwp-child' ); ?> </strong> <?php _e('Restore/Clone From Backup','mainwp-child'); ?></h2>
2014-03-19 23:58:52 +07:00
< br />
< ? php _e ( 'Upload backup in .zip format (Maximum filesize for your server settings: ' , 'mainwp-child' ); ?> <?php echo $uploadSize; ?>)<br/>
< i >< ? php _e ( 'If you have a FULL backup created by your Network dashboard you may restore it by uploading here.' , 'mainwp-child' ); ?> <br />
< ? php _e ( 'A database only backup will not work.' , 'mainwp-child' ); ?> </i><br /><br />
< form action = " <?php echo admin_url('options-general.php?page=MainWPClone&upload=yes'); ?> " method = " post " enctype = " multipart/form-data " >< input type = " file " name = " file " id = " file " /> < input type = " submit " name = " submit " id = " filesubmit " disabled = " disabled " value = " <?php _e('Clone/Restore Website','mainwp-child'); ?> " /></ form >
< ? php
}
2014-03-29 19:42:09 +01:00
self :: renderCloneFromServer ();
2014-03-19 23:58:52 +07:00
self :: renderJavaScript ();
}
2014-03-29 19:42:09 +01:00
2014-03-19 23:58:52 +07:00
public static function renderNormalRestore ()
{
$uploadError = false ;
$uploadFile = false ;
if ( isset ( $_REQUEST [ 'upload' ]))
{
if ( isset ( $_FILES [ 'file' ]))
{
if ( ! function_exists ( 'wp_handle_upload' )) require_once ( ABSPATH . 'wp-admin/includes/file.php' );
$uploadedfile = $_FILES [ 'file' ];
$upload_overrides = array ( 'test_form' => false );
$movefile = wp_handle_upload ( $uploadedfile , $upload_overrides );
if ( $movefile )
{
$uploadFile = str_replace ( ABSPATH , '' , $movefile [ 'file' ]);
}
else
{
$uploadError = __ ( 'File could not be uploaded.' , 'mainwp-child' );
}
}
else
{
$uploadError = __ ( 'File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.' , 'mainwp-child' );
}
}
$uploadSizeInBytes = min ( MainWPHelper :: return_bytes ( ini_get ( 'upload_max_filesize' )), MainWPHelper :: return_bytes ( ini_get ( 'post_max_size' )));
$uploadSize = MainWPHelper :: human_filesize ( $uploadSizeInBytes );
self :: renderHeader ();
2014-04-01 20:53:57 +02:00
?> <div id="icon-options-general" class="icon32"><br></div><h2><strong><?php _e('Option 1:', 'mainwp-child'); ?></strong> <?php _e('Restore','mainwp-child'); ?></h2><?php
2014-03-19 23:58:52 +07:00
2014-04-01 20:47:27 +02:00
MainWPHelper :: getWPFilesystem ();
global $wp_filesystem ;
if (( ! empty ( $wp_filesystem ) && ! $wp_filesystem -> is_writable ( WP_CONTENT_DIR )) || ( empty ( $wp_filesystem ) && ! is_writable ( WP_CONTENT_DIR )))
2014-03-19 23:58:52 +07:00
{
echo '<div class="mainwp-child_info-box-red"><strong>' . __ ( 'Your content directory is not writable. Please set 0755 permission to ' , 'mainwp-child' ) . basename ( WP_CONTENT_DIR ) . '. (' . WP_CONTENT_DIR . ')</strong></div>' ;
$error = true ;
}
?>
< div class = " mainwp-child_info-box-green " style = " display: none; " >< ? php _e ( 'Restore process completed successfully! You will now need to click ' , 'mainwp-child' ); ?> <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('here','mainwp-child'); ?></a><?php _e(' to re-login to the admin and re-save permalinks.','mainwp-child'); ?></div>
< ? php
if ( $uploadFile )
{
_e ( 'Upload successful.' , 'mainwp-child' ); ?> <a href="#" id="mainwp-child_uploadclonebutton" class="button-primary" file="<?php echo $uploadFile; ?>"><?php _e('Restore Website','mainwp-child'); ?></a><?php
}
else
{
if ( $uploadError )
{
?> <div class="mainwp-child_info-box-red"><?php echo $uploadError; ?></div><?php
}
?>
< ? php _e ( 'Upload backup in .zip format (Maximum filesize for your server settings: ' , 'mainwp-child' ); ?> <?php echo $uploadSize; ?>)<br/>
< i >< ? php _e ( 'If you have a FULL backup created by your Network dashboard you may restore it by uploading here.' , 'mainwp-child' ); ?> <br />
< ? php _e ( 'A database only backup will not work.' , 'mainwp-child' ); ?> </i><br /><br />
< form action = " <?php echo admin_url('options-general.php?page=MainWPRestore&upload=yes'); ?> " method = " post " enctype = " multipart/form-data " >< input type = " file " name = " file " id = " file " /> < input type = " submit " name = " submit " id = " filesubmit " disabled = " disabled " value = " <?php _e('Restore Website','mainwp-child'); ?> " /></ form >
< ? php
}
2014-03-29 19:42:09 +01:00
self :: renderCloneFromServer ();
2014-03-19 23:58:52 +07:00
self :: renderJavaScript ();
}
2014-03-31 21:38:19 +02:00
/*
Plugin Name : Add From Server
Version : 3.2 . 0.3
Plugin URI : http :// dd32 . id . au / wordpress - plugins / add - from - server /
Description : Plugin to allow the Media Manager to add files from the webservers filesystem . < strong > Note :</ strong > All files are copied to the uploads directory .
Author : Dion Hulse
Author URI : http :// dd32 . id . au /
*/
2014-03-29 19:42:09 +01:00
2014-03-31 21:38:19 +02:00
public static function renderCloneFromServer () {
2014-03-29 19:42:09 +01:00
2014-03-31 21:38:19 +02:00
$page = $_REQUEST [ 'page' ];
$url = admin_url ( 'options-general.php?page=' . $page . " #title_03 " );
$dirs = MainWPHelper :: getMainWPDir ( 'backup' , false );
$current_dir = $backup_dir = $dirs [ 0 ];
if ( isset ( $_REQUEST [ 'dir' ]) ) {
$current_dir = stripslashes ( urldecode ( $_REQUEST [ 'dir' ]));
$current_dir = " / " . ltrim ( $current_dir , " / " );
if ( ! is_readable ( $current_dir ) && get_option ( 'mainwp_child_clone_from_server_last_folder' ))
$current_dir = get_option ( 'mainwp_child_clone_from_server_last_folder' ) . $current_dir ;
}
if ( ! is_readable ( $current_dir ))
$current_dir = WP_CONTENT_DIR ;
$current_dir = str_replace ( '\\' , '/' , $current_dir );
if ( strlen ( $current_dir ) > 1 )
$current_dir = untrailingslashit ( $current_dir );
echo " <br /><hr /><br /> " ;
2014-04-01 20:53:57 +02:00
echo '<h2 id="title_03"><strong>' . __ ( 'Option 2:' , 'mainwp-child' ) . '</strong> ' . __ ( 'Restore/Clone From Server' , 'mainwp-child' ) . '</h2>' ;
2014-03-31 21:38:19 +02:00
echo __ ( 'If you have uploaded a FULL backup to your server (via FTP or other means) you can use this section to locate the zip file and select it. A database only backup will not work.' , 'mainwp-child' );
if ( ! is_readable ( $current_dir )) {
echo '<div class="mainwp-child_info-box-yellow"><strong>' . __ ( 'Root directory is not readable. Please contact with site administrator to correct.' , 'mainwp-child' ) . '</strong></div>' ;
return ;
}
update_option ( 'mainwp_child_clone_from_server_last_folder' , rtrim ( $current_dir , '/' ));
$parts = explode ( '/' , ltrim ( $current_dir , '/' ));
$dirparts = '' ;
for ( $i = count ( $parts ) - 1 ; $i >= 0 ; $i -- ) {
$part = $parts [ $i ];
$adir = implode ( '/' , array_slice ( $parts , 0 , $i + 1 ));
if ( strlen ( $adir ) > 1 )
$adir = ltrim ( $adir , '/' );
$durl = esc_url ( add_query_arg ( array ( 'dir' => rawurlencode ( $adir ) ), $url ));
$dirparts = '<a href="' . $durl . '">' . $part . DIRECTORY_SEPARATOR . '</a>' . $dirparts ;
}
echo '<p>' . __ ( '<strong>Current Directory:</strong> <span>' . $dirparts . '</span>' , 'mainwp' ) . '</p>' ;
$quick_dirs = array ();
$quick_dirs [] = array ( __ ( 'Site Root' , 'mainwp' ), ABSPATH );
$quick_dirs [] = array ( __ ( 'Backup' , 'mainwp' ), $backup_dir );
if (( $uploads = wp_upload_dir ()) && false === $uploads [ 'error' ])
$quick_dirs [] = array ( __ ( 'Uploads Folder' , 'mainwp' ), $uploads [ 'path' ]);
$quick_dirs [] = array ( __ ( 'Content Folder' , 'mainwp' ), WP_CONTENT_DIR );
$quick_links = array ();
foreach ( $quick_dirs as $dir ) {
list ( $text , $adir ) = $dir ;
$adir = str_replace ( '\\' , '/' , strtolower ( $adir ));
if ( strlen ( $adir ) > 1 )
$adir = ltrim ( $adir , '/' );
$durl = add_query_arg ( array ( 'dir' => rawurlencode ( $adir )), $url );
$quick_links [] = " <a href=' $durl '> $text </a> " ;
}
if ( ! empty ( $quick_links )) {
echo '<p><strong>' . __ ( 'Quick Jump:' , 'mainwp' ) . '</strong> ' . implode ( ' | ' , $quick_links ) . '</p>' ;
}
$dir_files = scandir ( $current_dir );
$directories = array ();
$files = array ();
$rejected_files = array ();
foreach (( array ) $dir_files as $file ) {
if ( in_array ( $file , array ( '.' , '..' )))
continue ;
if ( is_dir ( $current_dir . " / " . $file ) )
$directories [] = $file ;
else {
$wp_filetype = wp_check_filetype ( $file );
if ( 'zip' !== $wp_filetype [ 'ext' ])
$rejected_files [] = $file ;
else
$files [] = $file ;
}
}
sort ( $directories );
sort ( $files );
$parent = dirname ( $current_dir );
?>
< form method = " post " action = " " >
< div class = " mainwp-child_select_sites_box " id = " mainwp_child_select_files_from_server_box " >
< div class = " postbox " >
< h2 >< ? php _e ( 'Select File' , 'mainwp-child' ); ?> </h2>
< div class = " inside " >
< div id = " mainwp-child_clonesite_select_site " >
< div class = " clonesite_select_site_item " >
< div class = " mainwp-child_name_label " >
< a href = " <?php echo add_query_arg(array('dir' => rawurlencode( $parent )), $url ) ?> " title = " <?php echo esc_attr(dirname( $current_dir )) ?> " >< ? php _e ( 'Parent Folder' , 'mainwp' ) ?> </a>
</ div >
</ div >
< ? php
foreach ( ( array ) $directories as $file ) {
$filename = ltrim ( $file , '/' );
$folder_url = add_query_arg ( array ( 'dir' => rawurlencode ( $filename )), $url );
?>
< div class = " clonesite_select_site_item " >
< div class = " mainwp-child_name_label " >
< a href = " <?php echo $folder_url ?> " >< ? php echo esc_html ( rtrim ( $filename , '/' ) . DIRECTORY_SEPARATOR ); ?> </a>
</ div >
</ div >
< ? php
}
foreach ( $files as $file )
{
?>
< div class = " clonesite_select_site_item " >
< div class = " mainwp-child_name_label " >
< span >< ? php echo esc_html ( $file ) ?> </span>
</ div >
</ div >
< ? php
}
foreach ( $rejected_files as $file )
{
?>
< div class = " mainwp_rejected_files " >
< div class = " mainwp-child_name_label " >
< span >< ? php echo esc_html ( $file ) ?> </span>
</ div >
</ div >
< ? php
}
?>
</ div >
</ div >
< div class = " mainwp-child_clonebutton_container " >< a href = " # " id = " mainwp-child_clonebutton_from_server " class = " button-primary " >< ? php _e ( 'Clone/Restore Website' , 'mainwp-child' ); ?> </a></div>
< div style = " clear:both " ></ div >
</ div >
</ div >
</ form >
< input type = " hidden " id = " clonesite_from_server_current_dir " value = " <?php echo $current_dir ; ?> " />
< ? php
}
2014-03-29 19:42:09 +01:00
2014-03-19 23:58:52 +07:00
public static function renderJavaScript ()
{
$uploadSizeInBytes = min ( MainWPHelper :: return_bytes ( ini_get ( 'upload_max_filesize' )), MainWPHelper :: return_bytes ( ini_get ( 'post_max_size' )));
$uploadSize = MainWPHelper :: human_filesize ( $uploadSizeInBytes );
?>
2014-03-29 19:42:09 +01:00
< div id = " mainwp-child_clone_status " title = " Clone process " ></ div >
2014-03-19 23:58:52 +07:00
< script language = " javascript " >
jQuery ( document ) . on ( 'change' , '#file' , function ()
{
var maxSize = < ? php echo $uploadSizeInBytes ; ?> ;
var humanSize = '<?php echo $uploadSize; ?>' ;
if ( this . files [ 0 ] . size > maxSize )
{
jQuery ( '#filesubmit' ) . attr ( 'disabled' , 'disabled' );
alert ( 'The selected file is bigger than your maximum allowed filesize. (Maximum: ' + humanSize + ')' );
}
else
{
jQuery ( '#filesubmit' ) . removeAttr ( 'disabled' );
}
});
jQuery ( document ) . on ( 'click' , '#mainwp-child_displayby_sitename' , function () {
jQuery ( '#mainwp-child_displayby_url' ) . removeClass ( 'mainwp-child_action_down' );
jQuery ( this ) . addClass ( 'mainwp-child_action_down' );
jQuery ( '.mainwp-child_url_label' ) . hide ();
jQuery ( '.mainwp-child_name_label' ) . show ();
return false ;
});
jQuery ( document ) . on ( 'click' , '#mainwp-child_displayby_url' , function () {
jQuery ( '#mainwp-child_displayby_sitename' ) . removeClass ( 'mainwp-child_action_down' );
jQuery ( this ) . addClass ( 'mainwp-child_action_down' );
jQuery ( '.mainwp-child_name_label' ) . hide ();
jQuery ( '.mainwp-child_url_label' ) . show ();
return false ;
});
jQuery ( document ) . on ( 'click' , '.clonesite_select_site_item' , function () {
jQuery ( '.clonesite_select_site_item' ) . removeClass ( 'selected' );
jQuery ( this ) . addClass ( 'selected' );
});
var pollingCreation = undefined ;
var backupCreationFinished = false ;
var pollingDownloading = undefined ;
var backupDownloadFinished = false ;
handleCloneError = function ( resp )
{
updateClonePopup ( resp . error , true , 'red' );
};
updateClonePopup = function ( pText , pShowDate , pColor )
{
if ( pShowDate == undefined ) pShowDate = true ;
var theDiv = jQuery ( '#mainwp-child_clone_status' );
theDiv . append ( '<br /><span style="color: ' + pColor + ';">' + ( pShowDate ? cloneDateToHMS ( new Date ()) + ' ' : '' ) + pText + '</span>' );
theDiv . animate ({ scrollTop : theDiv . height () * 2 }, 100 );
};
cloneDateToHMS = function ( date ) {
var h = date . getHours ();
var m = date . getMinutes ();
var s = date . getSeconds ();
return '' + ( h <= 9 ? '0' + h : h ) + ':' + ( m <= 9 ? '0' + m : m ) + ':' + ( s <= 9 ? '0' + s : s );
};
var translations = [] ;
translations [ 'large_site' ] = '<?php _e(' This is a large site ( % dMB ), the clone process will more than likely fail . ', ' mainwp - child '); ?>' ;
translations [ 'continue_anyway' ] = '<?php _e(' Continue Anyway ? ', ' mainwp - child '); ?>' ;
translations [ 'creating_backup' ] = '<?php _e(' Creating backup on % s expected size : % dMB ( estimated time : % d seconds ) ', ' mainwp - child '); ?>' ;
translations [ 'backup_created' ] = '<?php _e(' Backup created on % s total size to download : % dMB ', ' mainwp - child '); ?>' ;
translations [ 'downloading_backup' ] = '<?php _e(' Downloading backup ', ' mainwp - child '); ?>' ;
translations [ 'backup_downloaded' ] = '<?php _e(' Backup downloaded ', ' mainwp - child '); ?>' ;
translations [ 'extracting_backup' ] = '<?php _e(' Extracting backup and updating your database , this might take a while . Please be patient . ', ' mainwp - child '); ?>' ;
translations [ 'clone_complete' ] = '<?php _e(' Cloning process completed successfully ! ', ' mainwp - child '); ?>' ;
cloneInitiateBackupCreation = function ( siteId , siteName , size , rand , continueAnyway )
{
if (( continueAnyway == undefined ) && ( size > 256 ))
{
updateClonePopup ( mwp_sprintf ( translations [ 'large_site' ], size ) + ' <a href="#" class="button continueCloneButton" onClick="cloneInitiateBackupCreation(' + " ' " + siteId + " ' " + ', ' + " ' " + siteName + " ' " + ', ' + size + ', ' + " ' " + rand + " ' " + ', true); return false;">' + translations [ 'continue_anyway' ] + '</a>' );
return ;
}
else
{
jQuery ( '.continueCloneButton' ) . hide ();
}
size = size / 2.4 ; //Guessing how large the zip will be
//5 mb every 10 seconds
updateClonePopup ( mwp_sprintf ( translations [ 'creating_backup' ], siteName , size . toFixed ( 2 ), ( size / 5 * 3 ) . toFixed ( 2 )));
updateClonePopup ( '<div id="mainwp-child-clone-create-progress" style="margin-top: 1em !important;"></div>' , false );
jQuery ( '#mainwp-child-clone-create-progress' ) . progressbar ({ value : 0 , max : ( size * 1024 )});
var data = {
action : 'mainwp-child_clone_backupcreate' ,
siteId : siteId ,
rand : rand
};
jQuery . post ( ajaxurl , data , function ( pSiteId , pSiteName ) { return function ( resp ) {
backupCreationFinished = true ;
clearTimeout ( pollingCreation );
var progressBar = jQuery ( '#mainwp-child-clone-create-progress' );
progressBar . progressbar ( 'value' , parseFloat ( progressBar . progressbar ( 'option' , 'max' )));
if ( resp . error )
{
handleCloneError ( resp );
return ;
}
updateClonePopup ( mwp_sprintf ( translations [ 'backup_created' ], pSiteName , ( resp . size / 1024 ) . toFixed ( 2 )));
//update view;
cloneInitiateBackupDownload ( pSiteId , resp . url , resp . size );
} }( siteId , siteName ), 'json' );
//Poll for filesize 'till it's complete
pollingCreation = setTimeout ( function () { cloneBackupCreationPolling ( siteId , rand ); }, 1000 );
};
cloneBackupCreationPolling = function ( siteId , rand )
{
if ( backupCreationFinished ) return ;
var data = {
action : 'mainwp-child_clone_backupcreatepoll' ,
siteId : siteId ,
rand : rand
};
jQuery . post ( ajaxurl , data , function ( pSiteId , pRand ) { return function ( resp ) {
if ( backupCreationFinished ) return ;
if ( resp . size )
{
var progressBar = jQuery ( '#mainwp-child-clone-create-progress' );
if ( progressBar . progressbar ( 'option' , 'value' ) < progressBar . progressbar ( 'option' , 'max' ))
{
progressBar . progressbar ( 'value' , resp . size );
}
//Also update estimated time?? ETA??
}
pollingCreation = setTimeout ( function () { cloneBackupCreationPolling ( pSiteId , pRand ); }, 1000 );
} }( siteId , rand ), 'json' );
};
cloneInitiateBackupDownload = function ( pSiteId , pUrl , pSize )
{
updateClonePopup ( translations [ 'downloading_backup' ]);
updateClonePopup ( '<div id="mainwp-child-clone-download-progress" style="margin-top: 1em !important;"></div>' , false );
jQuery ( '#mainwp-child-clone-download-progress' ) . progressbar ({ value : 0 , max : pSize });
var data = {
action : 'mainwp-child_clone_backupdownload' ,
url : pUrl
};
if ( pSiteId != undefined ) data [ 'siteId' ] = pSiteId ;
jQuery . post ( ajaxurl , data , function ( siteId ) { return function ( resp ) {
backupDownloadFinished = true ;
clearTimeout ( pollingDownloading );
var progressBar = jQuery ( '#mainwp-child-clone-download-progress' );
progressBar . progressbar ( 'value' , parseFloat ( progressBar . progressbar ( 'option' , 'max' )));
if ( resp . error )
{
handleCloneError ( resp );
return ;
}
updateClonePopup ( translations [ 'backup_downloaded' ]);
//update view
cloneInitiateExtractBackup ();
}}( pSiteId ), 'json' );
//Poll for filesize 'till it's complete
pollingDownloading = setTimeout ( function () { cloneBackupDownloadPolling ( pSiteId , pUrl ); }, 1000 );
};
cloneBackupDownloadPolling = function ( siteId , url )
{
if ( backupDownloadFinished ) return ;
var data = {
action : 'mainwp-child_clone_backupdownloadpoll' ,
siteId : siteId ,
url : url
};
jQuery . post ( ajaxurl , data , function ( pSiteId ) { return function ( resp ) {
if ( backupDownloadFinished ) return ;
if ( resp . size )
{
var progressBar = jQuery ( '#mainwp-child-clone-download-progress' );
if ( progressBar . progressbar ( 'option' , 'value' ) < progressBar . progressbar ( 'option' , 'max' ))
{
progressBar . progressbar ( 'value' , resp . size );
}
}
pollingDownloading = setTimeout ( function () { cloneBackupDownloadPolling ( pSiteId ); }, 1000 );
} }( siteId ), 'json' );
};
cloneInitiateExtractBackup = function ( file )
{
if ( file == undefined ) file = '' ;
updateClonePopup ( translations [ 'extracting_backup' ]);
//Extract & install SQL
var data = {
action : 'mainwp-child_clone_backupextract' ,
file : file
};
jQuery . ajax ({
type : " POST " ,
url : ajaxurl ,
data : data ,
success : function ( resp ) {
if ( resp . error )
{
handleCloneError ( resp );
return ;
}
updateClonePopup ( translations [ 'clone_complete' ]);
setTimeout ( function () {
jQuery ( '#mainwp-child_clone_status' ) . dialog ( 'close' );
jQuery ( '.mainwp-child_select_sites_box' ) . hide ();
jQuery ( '.mainwp-child_info-box-green' ) . show ();
jQuery ( '#mainwp-child_uploadclonebutton' ) . hide ();
jQuery ( '#mainwp-child_clonebutton' ) . hide ();
jQuery ( '.mainwp-hide-after-restore' ) . hide ();
}, 1000 );
},
dataType : 'json' });
};
jQuery ( document ) . on ( 'click' , '#mainwp-child-restore' , function () {
jQuery ( '#mainwp-child_clone_status' ) . dialog ({
resizable : false ,
height : 400 ,
width : 750 ,
modal : true ,
close : function ( event , ui ) { bulkTaskRunning = false ; jQuery ( '#mainwp-child_clone_status' ) . dialog ( 'destroy' ); }});
cloneInitiateBackupDownload ( undefined , jQuery ( this ) . attr ( 'file' ), jQuery ( this ) . attr ( 'size' ));
return false ;
});
jQuery ( document ) . on ( 'click' , '#mainwp-child_uploadclonebutton' , function ()
{
var file = jQuery ( this ) . attr ( 'file' );
jQuery ( '#mainwp-child_clone_status' ) . dialog ({
resizable : false ,
height : 400 ,
width : 750 ,
modal : true ,
close : function ( event , ui ) { bulkTaskRunning = false ; jQuery ( '#mainwp-child_clone_status' ) . dialog ( 'destroy' ); }});
cloneInitiateExtractBackup ( file );
return false ;
});
jQuery ( document ) . on ( 'click' , '#mainwp-child_clonebutton' , function () {
jQuery ( '#mainwp-child_clone_status' ) . dialog ({
resizable : false ,
height : 400 ,
width : 750 ,
modal : true ,
close : function ( event , ui ) { bulkTaskRunning = false ; jQuery ( '#mainwp-child_clone_status' ) . dialog ( 'destroy' ); }});
//Initiate backup creation on other child
var siteElement = jQuery ( '.clonesite_select_site_item.selected' );
var siteId = siteElement . attr ( 'id' );
var siteName = siteElement . find ( '.mainwp-child_name_label' ) . html ();
var siteSize = siteElement . find ( '.mainwp-child_size_label' ) . attr ( 'size' );
var siteRand = siteElement . attr ( 'rand' );
cloneInitiateBackupCreation ( siteId , siteName , siteSize , siteRand );
return false ;
});
function mwp_sprintf ()
{
if ( ! arguments || arguments . length < 1 || ! RegExp )
{
return ;
}
var str = arguments [ 0 ];
var re = / ([ ^% ] * ) % ( ' .| 0 | \x20 ) ? ( - ) ? ( \d + ) ? ( \ . \d + ) ? ( %| b | c | d | u | f | o | s | x | X )( .* ) / ;
var a = b = [], numSubstitutions = 0 , numMatches = 0 ;
while ( a = re . exec ( str ))
{
var leftpart = a [ 1 ], pPad = a [ 2 ], pJustify = a [ 3 ], pMinLength = a [ 4 ];
var pPrecision = a [ 5 ], pType = a [ 6 ], rightPart = a [ 7 ];
//alert(a + '\n' + [a[0], leftpart, pPad, pJustify, pMinLength, pPrecision);
numMatches ++ ;
if ( pType == '%' )
{
subst = '%' ;
}
else
{
numSubstitutions ++ ;
if ( numSubstitutions >= arguments . length )
{
alert ( 'Error! Not enough function arguments (' + ( arguments . length - 1 ) + ', excluding the string)\nfor the number of substitution parameters in string (' + numSubstitutions + ' so far).' );
}
var param = arguments [ numSubstitutions ];
var pad = '' ;
if ( pPad && pPad . substr ( 0 , 1 ) == " ' " ) pad = leftpart . substr ( 1 , 1 );
else if ( pPad ) pad = pPad ;
var justifyRight = true ;
if ( pJustify && pJustify === " - " ) justifyRight = false ;
var minLength = - 1 ;
if ( pMinLength ) minLength = parseInt ( pMinLength );
var precision = - 1 ;
if ( pPrecision && pType == 'f' ) precision = parseInt ( pPrecision . substring ( 1 ));
var subst = param ;
if ( pType == 'b' ) subst = parseInt ( param ) . toString ( 2 );
else if ( pType == 'c' ) subst = String . fromCharCode ( parseInt ( param ));
else if ( pType == 'd' ) subst = parseInt ( param ) ? parseInt ( param ) : 0 ;
else if ( pType == 'u' ) subst = Math . abs ( param );
else if ( pType == 'f' ) subst = ( precision > - 1 ) ? Math . round ( parseFloat ( param ) * Math . pow ( 10 , precision )) / Math . pow ( 10 , precision ) : parseFloat ( param );
else if ( pType == 'o' ) subst = parseInt ( param ) . toString ( 8 );
else if ( pType == 's' ) subst = param ;
else if ( pType == 'x' ) subst = ( '' + parseInt ( param ) . toString ( 16 )) . toLowerCase ();
else if ( pType == 'X' ) subst = ( '' + parseInt ( param ) . toString ( 16 )) . toUpperCase ();
}
str = leftpart + subst + rightPart ;
}
return str ;
}
2014-03-29 19:42:09 +01:00
jQuery ( document ) . on ( 'click' , '#mainwp-child_clonebutton_from_server' , function ()
{
var cur_dir = jQuery ( '#clonesite_from_server_current_dir' ) . val ();
var file = cur_dir + '/' + jQuery ( '.clonesite_select_site_item.selected span' ) . html ();
jQuery ( '#mainwp-child_clone_status' ) . dialog ({
resizable : false ,
height : 400 ,
width : 750 ,
modal : true ,
close : function ( event , ui ) { bulkTaskRunning = false ; jQuery ( '#mainwp-child_clone_status' ) . dialog ( 'destroy' ); }});
cloneInitiateExtractBackup ( file );
return false ;
});
2014-03-19 23:58:52 +07:00
</ script >
< ? php
self :: renderFooter ();
}
public static function renderStyle ()
{
?>
< style >
#mainwp-child_clone_status {
display : none ;
}
. mainwp - child - container {
padding - right : 10 px ;
padding - top : 20 px ;
}
. mainwp - child_info - box - yellow {
margin : 5 px 0 15 px ;
padding : . 6 em ;
background : #ffffe0;
border : 1 px solid #e6db55;
border - radius : 3 px ;
- moz - border - radius : 3 px ;
- webkit - border - radius : 3 px ;
clear : both ;
}
. mainwp - child_info - box - red {
margin : 5 px 0 15 px ;
padding : . 6 em ;
background : #ffebe8;
border : 1 px solid #c00;
border - radius : 3 px ;
- moz - border - radius : 3 px ;
- webkit - border - radius : 3 px ;
clear : both ;
}
. mainwp - child_info - box - green {
margin : 5 px 0 15 px ;
padding : . 6 em ;
background : rgba ( 127 , 177 , 0 , 0.3 );
border : 1 px solid #7fb100;
border - radius : 3 px ;
- moz - border - radius : 3 px ;
- webkit - border - radius : 3 px ;
clear : both ;
}
. mainwp - child_select_sites_box {
width : 505 px ;
}
#mainwp-child_clonesite_select_site {
max - height : 585 px ! important ;
overflow : auto ;
background : #fff ;
width : 480 px ;
border : 1 px solid #DDDDDD;
height : 300 px ;
overflow - y : scroll ;
margin - top : 10 px ;
}
. clonesite_select_site_item {
padding : 5 px ;
}
. clonesite_select_site_item . selected {
background - color : rgba ( 127 , 177 , 0 , 0.3 );
}
. clonesite_select_site_item : hover {
cursor : pointer ;
background - color : rgba ( 127 , 177 , 0 , 0.3 );
}
. mainwp - child_select_sites_box . postbox h2 {
margin - left : 10 px ;
}
. mainwp - child_action
{
text - decoration : none ;
background : none repeat scroll 0 0 #FFFFFF;
border - color : #C9CBD1 #BFC2C8 #A9ABB1;
border - style : solid ;
color : #3A3D46;
display : inline - block ;
font - size : 12 px ;
padding : 4 px 8 px ;
- webkit - box - shadow : 0 1 px 0 rgba ( 0 , 0 , 0 , 0.05 );
- moz - box - shadow : 0 1 px 0 rgba ( 0 , 0 , 0 , 0.05 );
box - shadow : 0 1 px 0 rgba ( 0 , 0 , 0 , 0.05 );
}
. mainwp - child_action . left
{
border - width : 1 px 0 1 px 1 px ;
- webkit - border - radius : 3 px 0 0 3 px ;
- moz - border - radius : 3 px 0 0 3 px ;
border - radius : 3 px 0 0 3 px ;
}
. mainwp - child_action . right
{
border - width : 1 px 1 px 1 px 1 px ;
- webkit - border - radius : 0 3 px 3 px 0 ;
- moz - border - radius : 0 3 px 3 px 0 ;
border - radius : 0 3 px 3 px 0 ;
}
. mainwp - child_action_down
{
background - image : - webkit - gradient ( linear , left top , left bottom , color - stop ( 0 % , rgba ( 220 , 221 , 225 , 1 )), color - stop ( 100 % , rgba ( 234 , 236 , 241 , 1 )));
background : - webkit - linear - gradient ( top , rgba ( 220 , 221 , 225 , 1 ) 0 % , rgba ( 234 , 236 , 241 , 1 ) 100 % );
background : - moz - linear - gradient ( top , rgba ( 220 , 221 , 225 , 1 ) 0 % , rgba ( 234 , 236 , 241 , 1 ) 100 % );
background : - o - linear - gradient ( top , rgba ( 220 , 221 , 225 , 1 ) 0 % , rgba ( 234 , 236 , 241 , 1 ) 100 % );
background : - ms - linear - gradient ( top , rgba ( 220 , 221 , 225 , 1 ) 0 % , rgba ( 234 , 236 , 241 , 1 ) 100 % );
background : linear - gradient ( top , rgba ( 220 , 221 , 225 , 1 ) 0 % , rgba ( 234 , 236 , 241 , 1 ) 100 % );
filter : progid : DXImageTransform . Microsoft . gradient ( startColorstr = '#dcdde1' , endColorstr = '#eaecf1' , GradientType = 0 );
- webkit - box - shadow : 0 1 px 0 rgba ( 255 , 255 , 255 , 0.59 ), 0 2 px 0 rgba ( 0 , 0 , 0 , 0.05 ) inset ;
- moz - box - shadow : 0 1 px 0 rgba ( 255 , 255 , 255 , 0.59 ), 0 2 px 0 rgba ( 0 , 0 , 0 , 0.05 ) inset ;
box - shadow : 0 1 px 0 rgba ( 255 , 255 , 255 , 0.59 ), 0 2 px 0 rgba ( 0 , 0 , 0 , 0.05 ) inset ;
border - color : #b1b5c7 #bec2d1 #c9ccd9;
}
. mainwp - child_displayby {
float : right ;
padding - top : 15 px ;
padding - right : 10 px ;
}
. mainwp - child_url_label {
display : none ;
}
. mainwp - child_size_label {
float : right ;
padding - right : 10 px ;
font - style : italic ;
color : #8f8f8f;
}
. mainwp - child_clonebutton_container {
float : right ;
padding - right : 10 px ;
padding - top : 5 px ;
padding - bottom : 10 px ;
}
. ui - dialog {
padding : . 5 em ;
width : 600 px ! important ;
overflow : hidden ;
- webkit - box - shadow : 0 px 0 px 15 px rgba ( 50 , 50 , 50 , 0.45 );
- moz - box - shadow : 0 px 0 px 15 px rgba ( 50 , 50 , 50 , 0.45 );
box - shadow : 0 px 0 px 15 px rgba ( 50 , 50 , 50 , 0.45 );
background : #fff !important;
}
. ui - dialog . ui - dialog - titlebar { background : none ; border : none ;}
. ui - dialog . ui - dialog - title { font - size : 20 px ; font - family : Helvetica ; text - transform : uppercase ; color : #555; }
. ui - dialog h3 { font - family : Helvetica ; text - transform : uppercase ; color : #888; border-radius: 25px; -moz-border-radius: 25px; -webkit-border-radius: 25px;}
. ui - dialog . ui - dialog - titlebar - close { background : none ; border - radius : 15 px ; - moz - border - radius : 15 px ; - webkit - border - radius : 15 px ; color : #fff;}
. ui - dialog . ui - dialog - titlebar - close : hover { background : #7fb100;}
/*
. ui - dialog . ui - progressbar { border : 5 px Solid #ddd; border-radius: 25px; -moz-border-radius: 25px; -webkit-border-radius: 25px; }
. ui - dialog . ui - progressbar - value {
background : #7fb100;
border - radius : 25 px ;
- moz - border - radius : 25 px ;
- webkit - border - radius : 25 px ;
display : inline - block ;
overflow : hidden ;
- webkit - transition : width . 4 s ease - in - out ;
- moz - transition : width . 4 s ease - in - out ;
- ms - transition : width . 4 s ease - in - out ;
- o - transition : width . 4 s ease - in - out ;
transition : width . 4 s ease - in - out ;
*/
#mainwp-child_clone_status .ui-progressbar {
border : 5 px Solid #ddd !important;
border - radius : 25 px ! important ;
- moz - border - radius : 25 px ! important ;
- webkit - border - radius : 25 px ! important ;
}
#mainwp-child_clone_status .ui-progressbar-value {
background : #7fb100 !important;
border - radius : 25 px ! important ;
- moz - border - radius : 25 px ! important ;
- webkit - border - radius : 25 px ! important ;
display : inline - block ;
overflow : hidden ;
- webkit - transition : width . 4 s ease - in - out ;
- moz - transition : width . 4 s ease - in - out ;
- ms - transition : width . 4 s ease - in - out ;
- o - transition : width . 4 s ease - in - out ;
transition : width . 4 s ease - in - out ;
}
#mainwp-child_clone_status .ui-progressbar-value:after {
content : " " ;
position : relative ;
top : 0 ;
height : 100 % ; width : 100 % ;
display : inline - block ;
- webkit - background - size : 30 px 30 px ;
- moz - background - size : 30 px 30 px ;
background - size : 30 px 30 px ;
overflow : hidden ! important ;
background - image : - webkit - gradient ( linear , left top , right bottom ,
color - stop ( . 25 , rgba ( 255 , 255 , 255 , . 15 )), color - stop ( . 25 , transparent ),
color - stop ( . 5 , transparent ), color - stop ( . 5 , rgba ( 255 , 255 , 255 , . 15 )),
color - stop ( . 75 , rgba ( 255 , 255 , 255 , . 15 )), color - stop ( . 75 , transparent ),
to ( transparent ));
background - image : - webkit - linear - gradient ( 135 deg , rgba ( 255 , 255 , 255 , . 15 ) 25 % , transparent 25 % ,
transparent 50 % , rgba ( 255 , 255 , 255 , . 15 ) 50 % , rgba ( 255 , 255 , 255 , . 15 ) 75 % ,
transparent 75 % , transparent );
background - image : - moz - linear - gradient ( 135 deg , rgba ( 255 , 255 , 255 , . 15 ) 25 % , transparent 25 % ,
transparent 50 % , rgba ( 255 , 255 , 255 , . 15 ) 50 % , rgba ( 255 , 255 , 255 , . 15 ) 75 % ,
transparent 75 % , transparent );
background - image : - ms - linear - gradient ( 135 deg , rgba ( 255 , 255 , 255 , . 15 ) 25 % , transparent 25 % ,
transparent 50 % , rgba ( 255 , 255 , 255 , . 15 ) 50 % , rgba ( 255 , 255 , 255 , . 15 ) 75 % ,
transparent 75 % , transparent );
background - image : - o - linear - gradient ( 135 deg , rgba ( 255 , 255 , 255 , . 15 ) 25 % , transparent 25 % ,
transparent 50 % , rgba ( 255 , 255 , 255 , . 15 ) 50 % , rgba ( 255 , 255 , 255 , . 15 ) 75 % ,
transparent 75 % , transparent );
background - image : linear - gradient ( 135 deg , rgba ( 255 , 255 , 255 , . 15 ) 25 % , transparent 25 % ,
transparent 50 % , rgba ( 255 , 255 , 255 , . 15 ) 50 % , rgba ( 255 , 255 , 255 , . 15 ) 75 % ,
transparent 75 % , transparent );
- webkit - animation : animate - stripes 6 s linear infinite ;
- moz - animation : animate - stripes 6 s linear infinite ;
}
@- webkit - keyframes animate - stripes {
0 % { background - position : 0 0 ;} 100 % { background - position : 100 % 0 ;}
}
@- moz - keyframes animate - stripes {
0 % { background - position : 0 0 ;} 100 % { background - position : 100 % 0 ;}
}
2014-03-29 19:42:09 +01:00
#mainwp_child_select_files_from_server_box .mainwp-child_name_label > a{
text - decoration : none ;
}
#mainwp_child_select_files_from_server_box .mainwp_rejected_files {
background - color : #FFE8EE;
padding : 5 px ;
}
2014-03-19 23:58:52 +07:00
</ style >
< ? php
}
public static function init_ajax ()
{
add_action ( 'wp_ajax_mainwp-child_clone_backupcreate' , array ( 'MainWPClone' , 'cloneBackupCreate' ));
add_action ( 'wp_ajax_mainwp-child_clone_backupcreatepoll' , array ( 'MainWPClone' , 'cloneBackupCreatePoll' ));
add_action ( 'wp_ajax_mainwp-child_clone_backupdownload' , array ( 'MainWPClone' , 'cloneBackupDownload' ));
add_action ( 'wp_ajax_mainwp-child_clone_backupdownloadpoll' , array ( 'MainWPClone' , 'cloneBackupDownloadPoll' ));
add_action ( 'wp_ajax_mainwp-child_clone_backupextract' , array ( 'MainWPClone' , 'cloneBackupExtract' ));
}
public static function cloneBackupCreate ()
{
try
{
if ( ! isset ( $_POST [ 'siteId' ])) throw new Exception ( __ ( 'No site given' , 'mainwp-child' ));
$siteId = $_POST [ 'siteId' ];
$rand = $_POST [ 'rand' ];
$sitesToClone = get_option ( 'mainwp_child_clone_sites' );
if ( ! is_array ( $sitesToClone ) || ! isset ( $sitesToClone [ $siteId ])) throw new Exception ( __ ( 'Site not found' , 'mainwp-child' ));
$siteToClone = $sitesToClone [ $siteId ];
$url = $siteToClone [ 'url' ];
$key = $siteToClone [ 'extauth' ];
MainWPHelper :: endSession ();
//Send request to the childsite!
global $wp_version ;
$result = MainWPHelper :: fetchUrl ( $url , array ( 'cloneFunc' => 'createCloneBackup' , 'key' => $key , 'file' => $rand , 'wpversion' => $wp_version ));
if ( ! $result [ 'backup' ]) throw new Exception ( __ ( 'Could not create backupfile on child' , 'mainwp-child' ));
@ session_start ();
update_option ( 'mainwp_temp_clone_plugins' , $result [ 'plugins' ]);
update_option ( 'mainwp_temp_clone_themes' , $result [ 'themes' ]);
$output = array ( 'url' => $result [ 'backup' ], 'size' => round ( $result [ 'size' ] / 1024 , 0 ));
}
catch ( Exception $e )
{
$output = array ( 'error' => $e -> getMessage ());
}
die ( json_encode ( $output ));
}
public static function cloneBackupCreatePoll ()
{
try
{
if ( ! isset ( $_POST [ 'siteId' ])) throw new Exception ( __ ( 'No site given' , 'mainwp-child' ));
$siteId = $_POST [ 'siteId' ];
$rand = $_POST [ 'rand' ];
$sitesToClone = get_option ( 'mainwp_child_clone_sites' );
if ( ! is_array ( $sitesToClone ) || ! isset ( $sitesToClone [ $siteId ])) throw new Exception ( __ ( 'Site not found' , 'mainwp-child' ));
$siteToClone = $sitesToClone [ $siteId ];
$url = $siteToClone [ 'url' ];
$key = $siteToClone [ 'extauth' ];
MainWPHelper :: endSession ();
//Send request to the childsite!
$result = MainWPHelper :: fetchUrl ( $url , array ( 'cloneFunc' => 'createCloneBackupPoll' , 'key' => $key , 'file' => $rand ));
if ( ! isset ( $result [ 'size' ])) throw new Exception ( __ ( 'Invalid response' , 'mainwp-child' ));
$output = array ( 'size' => round ( $result [ 'size' ] / 1024 , 0 ));
}
catch ( Exception $e )
{
$output = array ( 'error' => $e -> getMessage ());
}
//Return size in kb
die ( json_encode ( $output ));
}
public static function cloneBackupDownload ()
{
try
{
if ( ! isset ( $_POST [ 'url' ])) throw new Exception ( __ ( 'No download link given' , 'mainwp-child' ));
$url = $_POST [ 'url' ];
MainWPHelper :: endSession ();
//Send request to the childsite!
$filename = 'download-' . basename ( $url );
$dirs = MainWPHelper :: getMainWPDir ( 'backup' , false );
$backupdir = $dirs [ 0 ];
if ( $dh = opendir ( $backupdir ))
{
while (( $file = readdir ( $dh )) !== false )
{
if ( $file != '.' && $file != '..' && preg_match ( '/^download-(.*).zip/' , $file ))
{
@ unlink ( $backupdir . $file );
}
}
closedir ( $dh );
}
$filename = $backupdir . $filename ;
$response = wp_remote_get ( $url , array ( 'timeout' => 300000 , 'stream' => true , 'filename' => $filename ) );
if ( is_wp_error ( $response ) ) {
unlink ( $filename );
return $response ;
}
if ( 200 != wp_remote_retrieve_response_code ( $response ) ){
unlink ( $filename );
return new WP_Error ( 'http_404' , trim ( wp_remote_retrieve_response_message ( $response ) ) );
}
$output = array ( 'done' => $filename );
//Delete backup on child
try
{
if ( isset ( $_POST [ 'siteId' ]))
{
$siteId = $_POST [ 'siteId' ];
$sitesToClone = get_option ( 'mainwp_child_clone_sites' );
if ( is_array ( $sitesToClone ) && isset ( $sitesToClone [ $siteId ]))
{
$siteToClone = $sitesToClone [ $siteId ];
MainWPHelper :: fetchUrl ( $siteToClone [ 'url' ], array ( 'cloneFunc' => 'deleteCloneBackup' , 'key' => $siteToClone [ 'extauth' ], 'file' => basename ( $url )));
}
}
}
catch ( Exception $e )
{
throw $e ;
}
}
catch ( Exception $e )
{
$output = array ( 'error' => $e -> getMessage ());
}
die ( json_encode ( $output ));
}
public static function cloneBackupDownloadPoll ()
{
try
{
MainWPHelper :: endSession ();
$dirs = MainWPHelper :: getMainWPDir ( 'backup' , false );
$backupdir = $dirs [ 0 ];
$files = glob ( $backupdir . 'download-*.zip' );
if ( count ( $files ) == 0 ) throw new Exception ( __ ( 'No download file found' , 'mainwp-child' ));
$output = array ( 'size' => filesize ( $files [ 0 ]) / 1024 );
}
catch ( Exception $e )
{
$output = array ( 'error' => $e -> getMessage ());
}
//return size in kb
die ( json_encode ( $output ));
}
public static function cloneBackupExtract ()
{
try
{
MainWPHelper :: endSession ();
$file = $_POST [ 'file' ];
$testFull = false ;
if ( $file == '' )
{
$dirs = MainWPHelper :: getMainWPDir ( 'backup' , false );
$backupdir = $dirs [ 0 ];
$files = glob ( $backupdir . 'download-*.zip' );
if ( count ( $files ) == 0 ) throw new Exception ( __ ( 'No download file found' , 'mainwp-child' ));
$file = $files [ 0 ];
2014-03-29 19:42:09 +01:00
} else if ( file_exists ( $file )) {
$testFull = true ;
} else {
2014-03-19 23:58:52 +07:00
$file = ABSPATH . $file ;
if ( ! file_exists ( $file )) throw new Exception ( __ ( 'Backup file not found' , 'mainwp-child' ));
$testFull = true ;
}
//return size in kb
$cloneInstall = new MainWPCloneInstall ( $file );
//todo: RS: refactor to get those plugins after install (after .18 release)
$cloneInstall -> readConfigurationFile ();
$plugins = get_option ( 'mainwp_temp_clone_plugins' );
$themes = get_option ( 'mainwp_temp_clone_themes' );
if ( $testFull )
{
$cloneInstall -> testDownload ();
}
$cloneInstall -> removeConfigFile ();
$cloneInstall -> extractBackup ();
$pubkey = get_option ( 'mainwp_child_pubkey' );
$uniqueId = get_option ( 'mainwp_child_uniqueId' );
$server = get_option ( 'mainwp_child_server' );
$nonce = get_option ( 'mainwp_child_nonce' );
$nossl = get_option ( 'mainwp_child_nossl' );
$nossl_key = get_option ( 'mainwp_child_nossl_key' );
$sitesToClone = get_option ( 'mainwp_child_clone_sites' );
2014-03-29 19:42:09 +01:00
2014-03-19 23:58:52 +07:00
$cloneInstall -> install ();
$cloneInstall -> updateWPConfig ();
// $cloneInstall->update_option('mainwp_child_pubkey', $pubkey);
// $cloneInstall->update_option('mainwp_child_uniqueId', $uniqueId);
// $cloneInstall->update_option('mainwp_child_server', $server);
// $cloneInstall->update_option('mainwp_child_nonce', $nonce);
// $cloneInstall->update_option('mainwp_child_nossl', $nossl);
// $cloneInstall->update_option('mainwp_child_nossl_key', $nossl_key);
// $cloneInstall->update_option('mainwp_child_clone_sites', $sitesToClone);
// $cloneInstall->update_option('mainwp_child_clone_permalink', true);
update_option ( 'mainwp_child_pubkey' , $pubkey );
update_option ( 'mainwp_child_uniqueId' , $uniqueId );
update_option ( 'mainwp_child_server' , $server );
update_option ( 'mainwp_child_nonce' , $nonce );
update_option ( 'mainwp_child_nossl' , $nossl );
update_option ( 'mainwp_child_nossl_key' , $nossl_key );
update_option ( 'mainwp_child_clone_sites' , $sitesToClone );
if ( ! MainWPHelper :: startsWith ( basename ( $file ), 'download-backup-' ))
{
update_option ( 'mainwp_child_restore_permalink' , true );
}
else
{
update_option ( 'mainwp_child_clone_permalink' , true );
}
2014-03-29 19:42:09 +01:00
2014-03-19 23:58:52 +07:00
$cloneInstall -> clean ();
if ( $plugins !== false )
{
$out = array ();
if ( is_array ( $plugins ))
{
$dir = WP_CONTENT_DIR . '/plugins/' ;
$fh = @ opendir ( $dir );
while ( $entry = @ readdir ( $fh ))
{
if ( ! is_dir ( $dir . $entry )) continue ;
if (( $entry == '.' ) || ( $entry == '..' )) continue ;
if ( ! in_array ( $entry , $plugins )) MainWPHelper :: delete_dir ( $dir . $entry );
}
@ closedir ( $fh );
}
delete_option ( 'mainwp_temp_clone_plugins' );
}
if ( $themes !== false )
{
$out = array ();
if ( is_array ( $themes ))
{
$dir = WP_CONTENT_DIR . '/themes/' ;
$fh = @ opendir ( $dir );
while ( $entry = @ readdir ( $fh ))
{
if ( ! is_dir ( $dir . $entry )) continue ;
if (( $entry == '.' ) || ( $entry == '..' )) continue ;
if ( ! in_array ( $entry , $themes )) MainWPHelper :: delete_dir ( $dir . $entry );
}
@ closedir ( $fh );
}
delete_option ( 'mainwp_temp_clone_themes' );
}
$output = array ( 'result' => 'ok' );
//todo: remove old tables if other prefix?
wp_logout ();
wp_set_current_user ( 0 );
}
catch ( Exception $e )
{
$output = array ( 'error' => $e -> getMessage ());
}
//return size in kb
die ( json_encode ( $output ));
}
public static function permalinkChanged ( $action )
{
if ( $action == 'update-permalink' )
{
if ( isset ( $_POST [ 'permalink_structure' ]) || isset ( $_POST [ 'category_base' ]) || isset ( $_POST [ 'tag_base' ]))
{
delete_option ( 'mainwp_child_clone_permalink' );
delete_option ( 'mainwp_child_restore_permalink' );
}
}
}
public static function permalinkAdminNotice ()
{
if ( isset ( $_POST [ 'permalink_structure' ]) || isset ( $_POST [ 'category_base' ]) || isset ( $_POST [ 'tag_base' ])) return ;
?>
< style >
. mainwp - child_info - box - green {
margin : 5 px 0 15 px ;
padding : . 6 em ;
background : rgba ( 127 , 177 , 0 , 0.3 );
border : 1 px solid #7fb100;
border - radius : 3 px ;
margin - right : 10 px ;
- moz - border - radius : 3 px ;
- webkit - border - radius : 3 px ;
clear : both ;
}
</ style >
< div class = " mainwp-child_info-box-green " >< ? php if ( get_option ( 'mainwp_child_restore_permalink' ) == true ) { _e ( 'Restore process completed successfully! Check and re-save permalinks ' , 'mainwp-child' ); } else { _e ( 'Cloning process completed successfully! Check and re-save permalinks ' , 'mainwp-child' ); } ?> <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('here','mainwp-child'); ?></a>.</div>
< ? php
}
public static function renderRestore ()
{
if ( session_id () == '' ) @ session_start ();
$file = null ;
$size = null ;
if ( isset ( $_SESSION [ 'file' ]))
{
$file = $_SESSION [ 'file' ];
$size = $_SESSION [ 'size' ];
unset ( $_SESSION [ 'file' ]);
unset ( $_SESSION [ 'size' ]);
}
if ( $file == null )
{
die ( '<meta http-equiv="refresh" content="0;url=' . admin_url () . '">' );
}
self :: renderStyle ();
?>
< div id = " icon-options-general " class = " icon32 " >< br ></ div >< h2 >< ? php _e ( 'Restore' , 'mainwp-child' ); ?> </h2>
< div class = " mainwp-hide-after-restore " >
< br />< ? php _e ( 'Be sure to use a FULL backup created by your Network dashboard, if critical folders are excluded it may result in a not working installation.' , 'mainwp-child' ); ?>
< br />< br />< a href = " # " class = " button-primary " file = " <?php echo urldecode( $file ); ?> " size = " <?php echo ( $size / 1024); ?> " id = " mainwp-child-restore " >< ? php _e ( 'Start Restore' , 'mainwp-child' ); ?> </a> <i><?php _e('CAUTION: this will overwrite your existing site.','mainwp-child'); ?></i>
</ div >
< div class = " mainwp-child_info-box-green " style = " display: none; " >< ? php _e ( 'Restore process completed successfully! You will now need to click ' , 'mainwp-child' ); ?> <a href="<?php echo admin_url('options-permalink.php'); ?>"><?php _e('here','mainwp-child'); ?></a><?php _e(' to re-login to the admin and re-save permalinks.','mainwp-child'); ?></div>
< ? php
self :: renderJavaScript ();
?>
< script type = " text/javascript " > translations [ 'clone_complete' ] = '<?php _e(' Restore process completed successfully ! ', ' mainwp - child '); ?>' ; </ script >
< ? php
}
}