mainwp-child/class/MainWPClone.class.php

1369 lines
61 KiB
PHP
Raw Normal View History

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;
}
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
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: 10px;
padding-top: 20px;
}
.mainwp-child_info-box-yellow {
margin: 5px 0 15px;
padding: .6em;
background: #ffffe0;
border: 1px solid #e6db55;
border-radius: 3px ;
-moz-border-radius: 3px ;
-webkit-border-radius: 3px ;
clear: both ;
}
.mainwp-child_info-box-red {
margin: 5px 0 15px;
padding: .6em;
background: #ffebe8;
border: 1px solid #c00;
border-radius: 3px ;
-moz-border-radius: 3px ;
-webkit-border-radius: 3px ;
clear: both ;
}
.mainwp-child_info-box-green {
margin: 5px 0 15px;
padding: .6em;
background: rgba(127, 177, 0, 0.3);
border: 1px solid #7fb100;
border-radius: 3px ;
-moz-border-radius: 3px ;
-webkit-border-radius: 3px ;
clear: both ;
}
.mainwp-child_select_sites_box {
width: 505px;
}
#mainwp-child_clonesite_select_site {
max-height: 585px !important ;
overflow: auto;
background: #fff ;
width: 480px;
border: 1px solid #DDDDDD;
height: 300px;
overflow-y: scroll;
margin-top: 10px;
}
.clonesite_select_site_item {
padding: 5px;
}
.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: 10px;
}
.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: 12px;
padding: 4px 8px;
-webkit-box-shadow: 0 1px 0 rgba(0,0,0,0.05);
-moz-box-shadow: 0 1px 0 rgba(0,0,0,0.05);
box-shadow: 0 1px 0 rgba(0,0,0,0.05);
}
.mainwp-child_action.left
{
border-width: 1px 0 1px 1px;
-webkit-border-radius: 3px 0 0 3px;
-moz-border-radius: 3px 0 0 3px;
border-radius: 3px 0 0 3px;
}
.mainwp-child_action.right
{
border-width: 1px 1px 1px 1px;
-webkit-border-radius: 0 3px 3px 0;
-moz-border-radius: 0 3px 3px 0;
border-radius: 0 3px 3px 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 1px 0 rgba(255, 255, 255, 0.59), 0 2px 0 rgba(0, 0, 0, 0.05) inset;
-moz-box-shadow: 0 1px 0 rgba(255, 255, 255, 0.59), 0 2px 0 rgba(0, 0, 0, 0.05) inset;
box-shadow: 0 1px 0 rgba(255, 255, 255, 0.59), 0 2px 0 rgba(0, 0, 0, 0.05) inset;
border-color: #b1b5c7 #bec2d1 #c9ccd9;
}
.mainwp-child_displayby {
float: right;
padding-top: 15px;
padding-right: 10px;
}
.mainwp-child_url_label {
display: none;
}
.mainwp-child_size_label {
float: right;
padding-right: 10px;
font-style:italic;
color: #8f8f8f;
}
.mainwp-child_clonebutton_container {
float: right;
padding-right: 10px;
padding-top: 5px;
padding-bottom: 10px;
}
.ui-dialog {
padding: .5em;
width: 600px !important;
overflow: hidden;
-webkit-box-shadow: 0px 0px 15px rgba(50, 50, 50, 0.45);
-moz-box-shadow: 0px 0px 15px rgba(50, 50, 50, 0.45);
box-shadow: 0px 0px 15px 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: 20px; 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: 15px; -moz- border-radius: 15px; -webkit- border-radius: 15px; color: #fff;}
.ui-dialog .ui-dialog-titlebar-close:hover { background: #7fb100;}
/*
.ui-dialog .ui-progressbar {border:5px Solid #ddd; border-radius: 25px; -moz-border-radius: 25px; -webkit-border-radius: 25px; }
.ui-dialog .ui-progressbar-value {
background: #7fb100;
border-radius: 25px;
-moz-border-radius: 25px;
-webkit-border-radius: 25px;
display: inline-block;
overflow: hidden;
-webkit-transition: width .4s ease-in-out;
-moz-transition: width .4s ease-in-out;
-ms-transition: width .4s ease-in-out;
-o-transition: width .4s ease-in-out;
transition: width .4s ease-in-out;
*/
#mainwp-child_clone_status .ui-progressbar {
border:5px Solid #ddd !important;
border-radius: 25px !important;
-moz-border-radius: 25px !important;
-webkit-border-radius: 25px !important;
}
#mainwp-child_clone_status .ui-progressbar-value {
background: #7fb100 !important;
border-radius: 25px!important;
-moz-border-radius: 25px!important;
-webkit-border-radius: 25px!important;
display: inline-block;
overflow: hidden;
-webkit-transition: width .4s ease-in-out;
-moz-transition: width .4s ease-in-out;
-ms-transition: width .4s ease-in-out;
-o-transition: width .4s ease-in-out;
transition: width .4s 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: 30px 30px;
-moz-background-size: 30px 30px;
background-size: 30px 30px;
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(135deg, 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(135deg, 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(135deg, 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(135deg, 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(135deg, 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 6s linear infinite;
-moz-animation: animate-stripes 6s 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: 5px;
}
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: 5px 0 15px;
padding: .6em;
background: rgba(127, 177, 0, 0.3);
border: 1px solid #7fb100;
border-radius: 3px ;
margin-right: 10px;
-moz-border-radius: 3px ;
-webkit-border-radius: 3px ;
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
}
}