Current File : /home/tdmfgi5/www/old/XCloner.php |
<?php
/*
* XCloner.php
*
* Copyright 2011 Ovidiu Liuta <info@thinkovi.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*/
if(@is_file("../cloner.config.php")){
echo "<h3>Access denied, if you are trying to restore a backup, please move the restore script in another directory!</h3>";
exit;
}
@set_time_limit(3600);
@ini_set("error_reporting", E_ALL^E_NOTICE);
###################### Do not edit Below #############################
$g_pcltar_lib_dir = "./";
require "TAR.php";
$_CONFIG['my_version'] = "3.0.1";
$_CONFIG['script_name'] = "XCloner.php";
$_CONFIG['sql_usefile'] = "";
$_CONFIG['filesLimit'] = 100;
$_CONFIG['seek'] = 0;
if(isset($_REQUEST['sql_setfile']))
$_CONFIG['sql_usefile'] = $_REQUEST['sql_setfile'];
if(trim($_CONFIG['sql_usefile']) == "")
$_CONFIG['sql_usefile'] = "database-sql.sql";
if(isset($_REQUEST['strrep'])){
setcookie ("strrep_c", "", time() - 3600);
setcookie("strrep_c", str_replace("\r\n","*-*",stripslashes($_REQUEST['strrep'])), time()+3600); /* expire in 1 hour */
}else{
$_REQUEST['strrep'] = str_replace("*-*", "\r\n", $_COOKIE['strrep_c']);
}
if ($handle = opendir('./')) {
/* This is the correct way to loop over the directory. */
while (false !== ($file = readdir($handle))){
$ext = substr($file,strlen($file)-4,strlen($file));
if(($file!='XCloner.php')&&($file!='..')&&($file!='.')&&(($ext=='.tgz')||($ext=='.tar'))){
$_CONFIG[versions][] = $file;
}
}
closedir($handle);
}else{
echo "Unable to open my directory for reading and listing!";exit;
}
######################################################################
$_CONFIG['output_path'] = $_REQUEST['output_path'];
$_CONFIG['output_url'] = $_REQUEST['output_url_pref']."://".$_REQUEST['output_url'];
$_REQUEST['output_url'] = str_replace("/###","",$_REQUEST['output_url']."###");
$_REQUEST['output_url'] = str_replace("###","",$_REQUEST['output_url']);
if(function_exists('filter_var')){
$_CONFIG['output_url'] = filter_var($_CONFIG['output_url'], FILTER_SANITIZE_URL);
}
$_CONFIG['tmp'] = $_REQUEST['output_path'];
if($_REQUEST['files_skip'] == 1)
$_REQUEST['do_database'] = 1;
if($_REQUEST['fpos'])
$_CONFIG['seek'] = $_REQUEST['fpos'];
$filepath =$_SERVER["SCRIPT_FILENAME"];
$pathinfo = pathinfo($filepath);
$startscript = $pathinfo['dirname'];
$_CONFIG[group] = $groupinfo[name];
$_CONFIG[owner] =$ownerinfo[name];
###################### FRONT AREA ###################################
//setCache();
?>
<!DOCTYPE html>
<html>
<head>
<title>XCloner Restore - <?php echo $_SERVER['HTTP_HOST']?> - Backup and Restore Made Easy</title>
<META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW">
<link REL="SHORTCUT ICON" HREF="http://www.xcloner.com/images/favicon.ico">
<style type="text/css" media="screen">
@import url( http://www.xcloner.com/downloads/style.css );
@import url( http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/themes/start/jquery-ui.css );
.error {
color: red;
font-size: 15px;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js" type="text/javascript"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js" type="text/javascript"></script>
</head>
<body>
<script>
$(function() {
$( "#tabs-main" ).tabs();
});
</script>
<!-- section 1-->
<table align='center' width='700' bgcolor='#eeeeee' style='padding: 0 5px 0 5px;'>
<tr><td align='center'><h2><font color=red>XCloner</font> Automatic Restore! - <?php echo $_SERVER['HTTP_HOST']?></h2></td></tr>
<tr><td align='left'>
<form action='' method='GET' name='form'>
<?php
switch ($_REQUEST[task]) {
case 'step2':
step2();
break;
case 'step1':
step1();
break;
case 'getinfo':
getPHPINFO();
break;
case 'info':
echo phpinfo();
break;
default :
start();
break;
}
?>
</form>
</td></tr>
<tr><td>
<hr />
<small>XCloner Automatic Restore(<b><?php echo $_CONFIG['my_version']?></b>) - <a href='http://www.xcloner.com' title='XCloner.com - Website Backup Application'>Website Backup and Restore</a>
</small>
</td></tr>
</table>
</body>
</html>
<?php
#####################################################################
##################### FUNCTIONS #####################################
function step2($file=""){
global $_CONFIG,$filepath ;
$DBcreated = $_REQUEST[DBcreated];
if ($DBcreated=='on'){
$DBhostname = $_REQUEST['mysql_server'];
$DBuserName = $_REQUEST['mysql_username'];
$DBpassword = $_REQUEST['mysql_pass'];
$DBname = $_REQUEST['mysql_db'];
$db = @mysql_connect($DBhostname, $DBuserName, $DBpassword) or die("<br />The database details provided are incorrect and/or empty. Unable to connect to mysql server");
@mysql_query("CREATE database $DBname;");
if (!@mysql_select_db($DBname)) {
die("<br /><span class='error'>Could not connect to $DBname database! Please make sure the database exists and that you assigned the mysql user to it...</span>");
}
mysql_query("SET sql_mode='';");
if($_REQUEST['charset_of_file']!="")
mysql_query("SET NAMES ".$_REQUEST['charset_of_file']."");
else
mysql_query("SET NAMES utf8;");
}
if($_REQUEST['do_database'] != 1){
############ DATABASE ONLY RESTRICTION##################################################
########################### START FTP MODE #################################
if($_REQUEST[transfer_mode]==2){
$_CONFIG[output_path] = $_CONFIG[output_path]."/archive_tmp/";
@mkdir($_CONFIG[output_path]);
// set up basic connection
$conn_id = @ftp_connect($_REQUEST[ftp_server], $_REQUEST[ftp_port]) or die("<span class='error'>Could not connect to $_REQUEST[ftp_server] on port $_REQUEST[ftp_port]! Ftp connection has failed!</span>");
// login with username and password
$login_result = @ftp_login($conn_id, $_REQUEST[ftp_user], $_REQUEST[ftp_pass]) or die("<span class='error'>Could not login to ftp server for user $_REQUEST[ftp_user] and provided pass! Ftp connection has failed!</span>");
// check connection
if ((!$conn_id) || (!$login_result)) {
echo "<b style='color:red'>FTP connection has failed!</b>";
echo "<b style='color:red'>Attempted to connect to ".$_REQUEST[ftp_server].":".$_REQUEST[ftp_port]." for user ".$_REQUEST[ftp_user]."</b>";
return;
} else {
echo "<br />Connected to $_REQUEST[ftp_server], for user $_REQUEST[ftp_user], starting transfer...<br />";
}
$ftp_dir_original = ftp_pwd($conn_id);
@ftp_mkdir($conn_id,$_REQUEST[ftp_path]);
// try to change the directory to somedir
if (@ftp_chdir($conn_id, $_REQUEST[ftp_path])) {
echo "Current directory is now: <b>" . ftp_pwd($conn_id) . "</b>\n";
} else {
echo "<b style='color:red'>Couldn't change directory to <b>$_REQUEST[ftp_path]</b>, please verify that the ftp location exists or use the \"Install files directly\" option!</b><br />\n";
return;
}
@ftp_chdir($conn_id, $ftp_dir_original);
}
########################## END FTP MODE ######################################
##### START extract ######
if($_REQUEST['refresh'] < 1){
$ext = substr($file, strlen($file)-4, strlen($file));
if($_REQUEST['file_utilities'] != '1'){
$tar_object = new Archive_Tar($file);
if($_REQUEST['manual_ftp']){
$tar_object->_openRead();
fseek($tar_object->_file, $_CONFIG['seek']);
$seek = $tar_object->_extractList($_CONFIG['output_path'], $return, "partial", "", "", $_CONFIG['filesLimit']);
$seek = $seek - 512;//reverse 512 bytes
if($seek > 0){
$backupSize = filesize($file);
$rurl = rurl($seek, $backupSize);
$percent = sprintf("%.2f",($seek*100)/$backupSize);
echo "<h3>Processing files - ".$percent."%</h3>";
echo "<script> document.location='".$rurl."'</script>";
return;
}
$_REQUEST['fpos'] = 0;
$_REQUEST['chunk'] = 0;
}
else{
$tar_object->extract($_CONFIG['output_path']);
#$tar_object->extractList("backups/perm.txt", $_CONFIG['output_path']);
}
}else{
if($ext == '.tgz') $compress = 'z';
else $compress = '';
shell_exec("tar -x".$compress."pf $file -C $_CONFIG[output_path]");
}
}
##### END extract ######
$new_arr = array();
#@chmod($_CONFIG[output_path], 0777);
$tran_file = $_CONFIG[output_path]."/transfer.txt";
if($_REQUEST[transfer_mode]==2){
# initialise list arrays, directories and files separately and array counters for them
$excludedFolders = array();
$d_arr = array(); $d = 0;
$ds_arr = array();
$f_arr = array(); $f = 0;
$s_arr = array(); $s = 0;
$d_arr[$d] = $_CONFIG[output_path];
if($_REQUEST['refresh'] < 1){
# obtain the list of files by recursing the mambo file store
recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $excludedFolders , '', $_CONFIG[output_path]);
recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $d_arr , '', $_CONFIG[output_path]);
sort($d_arr);
sort($f_arr);
$new_arr = array_merge($d_arr, $f_arr);
if($_REQUEST[transfer_mode]==2)
if($fp = fopen($tran_file, "w")){
foreach($new_arr as $file){
fwrite($fp, $file."\n");
}
fclose($fp);
}else{
echo "Unable to write to directory ".$_CONFIG[output_path]."! Please check that this directory is writeable!"; return;
}
else{};
}else{
$content = "";
$new_arr = file($tran_file);
}
if(sizeof($new_arr) != 0 )
$percn = sprintf("%.2f",($_REQUEST[next] * 100)/sizeof($new_arr));
if($percn > sizeof($new_arr))
$percn = sizeof($new_arr);
}
if($_REQUEST['refresh'] == 1){
echo "<h3>Transfering $percn% of ".sizeof($new_arr)." files through ftp</h3>";
echo "<textarea cols=70 rows=30 name='ftp_list'></textarea>";
}
elseif($_REQUEST['refresh'] == 2)
echo "Files transfer finished!";
$i = (int)$_REQUEST[next];
$j = 0;
### MOVING THE FILES THROUGH FTP
#foreach($new_arr as $key=>$file)
for($key=$i;$key<=sizeof($new_arr);$key++){
$file = str_replace(array("\r","\n"), array("",""), $new_arr[$key]);
if($_REQUEST['manual_ftp'] == 1)
if($j == 100){
#echo "Transfering files from line: ". (int)$_REQUEST[next];
$qstr = explode("&refresh=1&next=",$_SERVER['QUERY_STRING']);
$rurl = "XCloner.php?".$qstr[0]."&refresh=1&next=".($_REQUEST[next]+100);
ftp_close($conn_id);
echo "<script> document.location='".$rurl."'</script>";
exit;
}
$j++;
$sfile = str_replace($_CONFIG[output_path],"",$file);
$fsource = $_CONFIG[output_path]."/".$sfile;
if(($sfile != "")&&($sfile!="/"))
if($_REQUEST[transfer_mode]==2){
$upload = 1;
$ftarget = $_REQUEST[ftp_path]."/".$sfile;
if(is_dir($fsource)){
$upload1 = @ftp_mkdir($conn_id,$ftarget);
}else{
$upload = ftp_put($conn_id, $ftarget, $fsource, FTP_BINARY);
}
#echo "$i <br >";
if(!$upload){
echo "<br /><font color=red>Transfer fail for $fsource to $ftarget</font> <br />File already exists and/or doesn't have writing permissions!<br/>";
}else{
if($_REQUEST['manual_ftp'] == 1){
$ftarget .= '\n';
echo "<script>document.form.ftp_list.value = document.form.ftp_list.value + '".$ftarget."'; </script>";
#echo "$ftarget <br />\n";
}
}
}
}
if($_REQUEST['refresh'] == 1){
$qstr = explode("&refresh=1&next=",$_SERVER['QUERY_STRING']);
$rurl = "XCloner.php?".$qstr[0]."&refresh=2&next=".($_REQUEST[next]+102);
echo "<script> document.location='".$rurl."'</script>";
exit;
}
############### RESTORING HTACCESS AND CONFIGURATION PERM#####################################
if($_REQUEST[transfer_mode]==2){
$cmd = "CHMOD 0777 ".$_REQUEST[ftp_path]."/"."wp-config.php";
@ftp_site($conn_id, $cmd);
}else{
@chmod($_REQUEST[output_path]."/"."wp-config.php", 0777);
}
#### CUSTOM PERMISSIONS #####
if($_REQUEST['preserve_perm']){
$perm_data = "";
$perm_file = $_CONFIG[output_path]."/administrator/backups/perm.txt";
$per = 1;
@chmod($perm_file,0777);
$fp = @fopen($perm_file,'r');
if($fp){
while(!feof($fp))
$perm_data .= fread($fp, 1024);
fclose($fp);
}else{
echo "Could not set permissions! Permissions file $perm_file not found!<br />";
$per = 0;
}
$data = explode("\n",$perm_data);
foreach($data as $value){
$dir = explode("|", $value);
if($dir[1]=="")
$dir[1] = '0755';
if(strstr($dir[0],"wp-config.php"))
$dir[1] = '0777';
if($_REQUEST[transfer_mode]==2){
$cmd = "CHMOD ".$dir[1]." ".$_REQUEST[ftp_path]."/".$dir[0];
@ftp_site($conn_id, $cmd);
}else{
@chmod($_CONFIG[output_path]."/".$dir[0], octdec($dir[1]));
}
}
if($per){
echo "<h2>Permissions restored to their initial value...</h2>";
}
}
#### END CUSTOM PERMISSIONS #####
$_CONFIG[output_path] = str_replace("/archive_tmp/","",$_CONFIG[output_path]);
if($_REQUEST[transfer_mode]==2){
// close the FTP stream
@ftp_close($conn_id);
recursive_remove_directory($_CONFIG[output_path]."/archive_tmp/");
@unlink($_CONFIG[output_path]."/archive_tmp/");
echo "<h2>Files succesfully copied to ".$_REQUEST[ftp_path]." on $_REQUEST[ftp_server] using FTP</h2>";
}else{
echo "<h2>Files succesfully copied to ".$_CONFIG[output_path]."</h2>";
}
######### END DATABASE ONLY RESTRICT #########################################
}
##### RESTORE CONFIGURATION #####
$update_config = 1;
if(($_REQUEST['files_skip']) and (isset($_REQUEST['fpos']))){
$update_config = 0;
}
if(($_REQUEST['do_database'] != 1) || ($_REQUEST['files_skip'] == 1)){
$config_file = $_CONFIG[output_path]."/wp-config.php";
@chmod($config_file,0777);
@unlink($_CONFIG[output_path]."/administrator/backups/perm.txt");
if(($_CONFIG['sql_usefile'] == "database-sql.sql") and ($update_config))
if(write_config($config_file)){
echo "<H2>Configuration updated!</H2>";
}else{
echo "<span class='error'>Unable to write to configuration file $config_file... Aborting...</span>";return;
}
}
############ ATTEMPT DATABASE INSERT #####################################
if($DBcreated!='on'){
echo "<h2>Database import skipped!</h2>";
echo "<a href='".$_CONFIG[output_url]."'><b>All should be done! Click here to continue...</b></a><br />";
return ;
}
if (($DBcreated=='on')&&($_REQUEST['do_database'] == 1)){
$sqlfile = $_CONFIG[output_path]."/administrator/backups/".$_CONFIG['sql_usefile'];
if(!file_exists($sqlfile)){
echo "<span class='error'>Unable to read the database backup file $sqlfile , database was not imported!</span>";
}else{
if($_REQUEST['manual_sql'])
$errors = populate_db_manual( $db, $sqlfile);
else
$errors = populate_db( $db, $sqlfile);
if(sizeof($errors)>0){
echo "There were some errors while importing the database:<br />";
echo "<textarea cols=60 rows=30>".implode("\n",$errors)."</textarea>";
exit;
}else{
@unlink($_CONFIG[output_path]."/administrator/backups/".$_CONFIG['sql_usefile']);
}
echo "<h2>Database populated...</h2>";
}
}
###################################################################################
if($_REQUEST['do_database'] != 1) {
$vars = "";
foreach($_REQUEST as $key=>$value)
$vars .= $key.'='.@urlencode($value).'&';
#$href = "XCloner.php?".$vars."do_database=1";
$href = rurl()."&do_database=1";
echo "<br /><a href='$href'>Please click here to continue with database import...</a>";
return;
}else{
echo "<br /><a href='".$_CONFIG[output_url]."'><b>All should be done! Click here to continue...<br /></a><br />";
return ;
}
}
function write_config($file){
global $_CONFIG;
if(@$fp = fopen($file, "r")){
$config_data = "";
while(!feof($fp))
$config_data .= fread($fp, 1024);
fclose($fp);
}
if ($_REQUEST[DBcreated] == 'on'){
$config_data = str_replace("define('DB_HOST', '", "define('DB_HOST', '".$_REQUEST[mysql_server]."');#", $config_data);
$config_data = str_replace("define('DB_USER', '", "define('DB_USER', '".$_REQUEST[mysql_username]."');#", $config_data);
$config_data = str_replace("define('DB_PASSWORD', '", "define('DB_PASSWORD', '".$_REQUEST[mysql_pass]."');#", $config_data);
$config_data = str_replace("define('DB_NAME', '", "define('DB_NAME', '".$_REQUEST[mysql_db]."');#", $config_data);
$liveurl = $_CONFIG['output_url'];
$config_data = str_replace("define('DB_HOST", "define('WP_SITEURL','".$liveurl."');\ndefine('WP_HOME','".$liveurl."');\ndefine('RELOCATE',true);\ndefine('DB_HOST", $config_data);
$config_data = str_replace("define('WP_SITEURL', '", "define('WP_SITEURL', '".$liveurl."');#", $config_data);
$config_data = str_replace("define('WP_HOME', '", "define('WP_HOME', '".$liveurl."');#", $config_data);
}
if($_REQUEST['transfer_mode'] == 2){
$config_data = str_replace('$'.'ftp_host =',"$"."ftp_host ='".$_REQUEST[ftp_server]."';#", $config_data);
$config_data = str_replace('$'.'ftp_port =',"$"."ftp_port ='".$_REQUEST[ftp_port]."';#", $config_data);
$config_data = str_replace('$'.'ftp_user =',"$"."ftp_user ='".$_REQUEST[ftp_user]."';#", $config_data);
$config_data = str_replace('$'.'ftp_pass =',"$"."ftp_pass ='".$_REQUEST[ftp_pass]."';#", $config_data);
$config_data = str_replace('$'.'ftp_root =',"$"."ftp_root ='".$_REQUEST[ftp_path]."';#", $config_data);
}else{
$config_data = str_replace('$'.'ftp_enable =',"$"."ftp_enable ='0';#", $config_data);
}
$config_data = str_replace('$'.'live_site =',"$"."live_site ='".$_CONFIG['output_url']."';#", $config_data);
$config_data = str_replace('$'.'absolute_path =',"$"."absolute_path ='".$_CONFIG['output_path']."';#", $config_data);
if ($fp = fopen($file, "w")) {
fwrite( $fp, $config_data);
fclose( $fp );
} else {
return false;
} // if
return true;
}
function step1(){
global $_CONFIG;
$ftarget = $_CONFIG[output_path]."/".$_REQUEST[ver];
if($_REQUEST['refresh'] < 1)
if(!is_writable($_CONFIG[output_path])){
echo "<span class='error'>Directory ".$_CONFIG[output_path]." is not writeable or does not exists! Could not continue...</span>";
return ;
}
$ftarget = $_REQUEST[ver];
if((!file_exists($ftarget)) and (!$_REQUEST['files_skip'])){
echo "<span class='error'>Could not continue, unable to read the clone backup file! Please make sure you copied the backup in the same directory as XCloner.php </span>";
return;
}
step2($ftarget);
return;
}
function start() {
global $_CONFIG,$pathinfo;
$pdir = str_replace($_CONFIG['script_name'], "", $_SERVER["SCRIPT_FILENAME"]);
$purl = $_SERVER['HTTP_HOST'].str_replace("/".$_CONFIG['script_name'],"", $_SERVER['SCRIPT_NAME']);
?>
<script>
$(function() {
$( "#DBcreated" ).button();
$( "#phpinfo").button();
$( "#manual_sql" ).button();
$( "#transfer_mode-ftp" ).button();
$( "#transfer_mode-direct" ).button();
$( "input:submit", ".form" ).button();
});
$(function() {
$( "#tabs" ).tabs();
$( "#tabs2" ).tabs();
});
</script>
<!-- section 1-->
<div id="tabs2">
<ul>
<li><a href="#tabs2-1">New Path & Url Configuration</a></li>
</ul>
<div id="tabs2-1">
<table class="adminForm">
<tr><td nowrap>
1. Install directory: (server path where you want to restore your backup)<br />
<input type=text size=80 name='output_path' value='<?php echo str_replace("\\", "/", $pdir);?>'><br >
</td></tr>
<tr><td>
<br />2.Install Url: (the url correspondent of your Install directory:)<br />
<div style="display:inline">
<div style="float:left">
<select name='output_url_pref'>
<option selected value='http'>http://</option>
<option value='https'>https://</option>
</select>
</div>
<div style="float:left">
<input type=text size=65 name='output_url' value='<?php echo $purl?>'>
</div>
</div>
</td></tr>
<tr><td>
<br />3. Choose backup archive to restore:
<?php echo version_list('ver');?>
</td></tr>
</table>
</div>
</div>
<!-- end section 1-->
<div id="tabs">
<ul>
<li><a href="#tabs-1">New Mysql Configuration</a></li>
<li><a href="#tabs-2">File Restore Options</a></li>
</ul>
<div id="tabs-1">
<!--start tabs 1 -->
<table width="100%">
<tr><td>
<!--<h3><a href="#">Mysql configuration: </a></h3>-->
<input type=checkbox checked name='DBcreated' id="DBcreated"> <label for="DBcreated">Import mysql database</label>
<input type='checkbox' value='1' name='manual_sql' checked id="manual_sql"> <label for="manual_sql">Incremental sql import</label>
</td></tr>
<tr><td>
<!-- mysql details -->
<table width='100%'>
<tr>
<td nowrap>Mysql server:</td>
<td><input type=text size=40 name='mysql_server' value='localhost'></td>
<tr>
<td>Mysql username:</td>
<td><input type=text size=40 name='mysql_username' value=''></td>
</tr>
<tr>
<td>Mysql password:</td>
<td><input type=text size=40 name='mysql_pass' value=''></td>
</tr>
<tr>
<td>Mysql database:</td>
<td><input type=text size=40 name='mysql_db' value=''></td>
</tr>
<tr>
<td>Data encoding:</td>
<td>
<select name="charset_of_file">
<option value="" selected="selected">Default</option>
<option value="big5" title="Big5 Traditional Chinese">big5</option>
<option value="binary" title="Binary pseudo charset">binary</option>
<option value="cp1250" title="Windows Central European">cp1250</option>
<option value="cp932" title="SJIS for Windows Japanese">cp932</option>
<option value="euckr" title="EUC-KR Korean">euckr</option>
<option value="gb2312" title="GB2312 Simplified Chinese">gb2312</option>
<option value="gbk" title="GBK Simplified Chinese">gbk</option>
<option value="latin1" title="cp1252 West European">latin1</option>
<option value="latin2" title="ISO 8859-2 Central European">latin2</option>
<option value="sjis" title="Shift-JIS Japanese">sjis</option>
<option value="tis620" title="TIS620 Thai">tis620</option>
<option value="ucs2" title="UCS-2 Unicode">ucs2</option>
<option value="ujis" title="EUC-JP Japanese">ujis</option>
<option value="utf8" title="UTF-8 Unicode" >utf8</option>
</select>
</td>
</tr>
<?php
$dir = "administrator/backups/";
$sql_files =array();
if(@is_dir($dir)){
if ($handle = @opendir($dir)) {
/* This is the correct way to loop over the directory. */
while (false !== ($file = @readdir($handle))) {
if(strstr($file, ".sql"))
$sql_files[] = $file;
}
@closedir($handle);
}
if(sizeof($sql_files) > 0) {
$list = "";
for($i=0;$i<sizeof($sql_files);$i++){
$list .= "<option value='$sql_files[$i]'>$sql_files[$i]</option>";
}
echo "<tr><td>Import Mysql file:</td>
<td><select name='sql_setfile'><option value='database-sql.sql'>Default</option>$list</select></td> </tr>";
}
}
?>
</table>
</tr></td>
<!-- end mysql details -->
</table>
<!--end tabs 1 -->
</div>
<div id="tabs-2">
<!-- start tabs 2 -->
<table width="100%">
<tr bgcolor='#dddddd'><td>
<!--<h3><a href="#">Files transfer and configuration:</a></h3>-->
<input type=checkbox name='files_skip' value='1' > <font color='red'>Skip files restore</font><br />
<input type=checkbox name='preserve_perm' value='1'> Restore files permissions<br />
<input type=checkbox name='file_utilities' value='1' > Restore by using the server utilities(tar) <br />
<input type='checkbox' value='1' name='manual_ftp' checked> Incremental transfer
</td></tr>
<tr><td colspan=2>
<table width='100%'>
<tr><td colspan='2'>
<label for="transfer_mode-ftp">Install files throught ftp:</label>
<input type=radio name=transfer_mode value=2 id="transfer_mode-ftp">
<!--<small>this will attempt to transfer all files through ftp, so the owner keep it's permissions, can be used to send files to other hosts also, <font color=red>*recommended</font></small>-->
<label for="transfer_mode-direct">Install files directly</label>
<input type=radio name=transfer_mode value=1 checked id="transfer_mode-direct"><br />
<!--<small>transfering the files directly will cause some permissions problems in some cases, but it's faster than the other option </small>-->
</td></tr>
<tr>
<td valign="top" nowrap>Ftp server:</td>
<td><input type=text size=30 name='ftp_server' value='localhost'> : <input type=text size=3 name='ftp_port' value='21'></td>
</tr>
<tr>
<td valign="top">Ftp username:</td>
<td><input type=text size=30 name='ftp_user'></td>
</tr>
<tr>
<td valign="top">Ftp password:</td>
<td><input type=text size=30 name='ftp_pass'></td>
</tr>
<tr>
<td valign="top">Ftp upload path:</td>
<td><input type=text size=30 name='ftp_path'>
<br><small>ftp root path of where the backup will be restored</small>
</td>
</tr>
</table>
</td></tr>
</table>
<!--end tabs 2-->
</div>
</div>
<br />
<div class="form">
<input type=hidden name='task' value='step1'>
<input type=submit name=submit value='Start install' >
<button onclick="window.open('XCloner.php?task=getinfo', 'getInfo', 'toolbar,width=750,height=400'); return false;" id="phpinfo">phpinfo()</button>
</div>
<small>*after hitting submit please wait for the package to get unarchived and transfered through ftp if it is the case!</small>
<br />
<span class="ui-state-highlight">
<span style='color:red'>Security Note:</span> After restore <b>delete the XCloner.php</b> script from your server</span>
</span>
<?php
}
function getPHPINFO(){
?>
<table width='100%'>
<tr bgcolor='#dddddd'><td>
<b>PHP Configuration: <a target='_blank' href='XCloner.php?task=info'> phpinfo()</a></b>
</td></tr>
<tr><td>
<table bgcolor='#dddddd' width='65%' style='text-align:center;' border='1'>
<tr>
<td><b style='color:red'>PHP Setting</b></td>
<td><b style='color:orange'>Current Value</b></td>
<td><b style='color:green'>Recomemnded</b></td>
</tr>
<tr>
<td><b>Open_Basedir:</b> </td>
<td>
<?php echo (@ini_get('open_basedir') ? @ini_get('open_basedir') : 'No value')?>
</td>
<td><b>No Value</b></td>
</tr>
<tr>
<td><b>Max Execution Time:</b> </td>
<td>
<?php echo (@ini_get('max_execution_time') ? @ini_get('max_execution_time') : 'No value')?>
</td>
<td><b>>30</b></td>
</tr>
<tr>
<td><b>Safe mode:</b> </td>
<td>
<?php echo (@ini_get('safe_mode') ? @ini_get('safe_mode') : 'Off')?>
</td>
<td><b>Off</b></td>
</tr>
</table>
</td></tr>
</table>
<?php
}
###END
###Starting the manual sql backup
function populate_db_manual( $db, $sqlfile='administrator/backups/database-sql.sql'){
global $qstr;
$extra_que = $qstr[0];
$file = $sqlfile;
define ('DATA_CHUNK_LENGTH',16384); // How many chars are read per time
define ('MAX_QUERY_LINES',300); // How many lines may be considered to be one query (except text lines)
$lines = "";
$error = "";
$error_status = 0;
if((isset($_REQUEST['chunk']))&&((int)$_REQUEST['chunk'] != 0))
$chunk = $_REQUEST['chunk'];
else
$chunk = DATA_CHUNK_LENGTH;
if($_REQUEST['correct_query'] != 1){
$start_pos = (int)$_REQUEST['fpos'];
$fpos = read_file($file, MAX_QUERY_LINES, $start_pos, $chunk, $lines);
}else{
$lines[0] = stripslashes($_REQUEST['error_msg']);
$fpos = $_REQUEST['start_posf'] ;
}
foreach($lines as $line)
if(trim($line) != ''){
$query = $line;
$line = $line .";\n";
#$tmp = explode("DEFAULT CHARSET",$line);
$line_tmp = $line;
$start_pos = $start_pos + strlen($line);
if(isset($_REQUEST['strrep']))
{
$strrep = explode("\r\n", stripslashes($_REQUEST['strrep']));
foreach($strrep as $value)
if(trim($value)!= ""){
$tmp = explode("|", $value);
$line_tmp = str_replace(trim($tmp[0]),trim($tmp[1]),$line_tmp);
$query = str_replace(trim($tmp[0]),trim($tmp[1]),$query);
}
}
if(!mysql_query($line_tmp)){
if($_REQUEST['correct_query'] != 1)
$fpos = $start_pos ;
$form_url = rurl($fpos, $chunk);
echo "</form><form name='' action='".$form_url."' method='POST'>
<input type='hidden' name='correct_query' value = '1'>
<input type='hidden' name='start_pos' value='".$start_pos."'>
<input type='hidden' name='start_posf' value='".$fpos."'>
<input type='hidden' name='glen' value='".$qlen."'>
<center>";
echo sprintf("<b>###MYSQL error</b>\n<br /><font color='red'>".mysql_error()."</font><br />\n<b>###On Query:</b><br />\n<br /><textarea cols=70 rows=15 name='error_msg'>%s</textarea><br />", $query);
echo "<b>Search and replace in query:</b><br /><textarea cols=70 rows=5 name='strrep'>".stripslashes($_REQUEST[strrep])."</textarea><br />
<small>
enter a string, one per line, which you would like to replace in the query above, example <i>string_to_search|text_to_replace_with</i>
</small>";
echo "<br /> <input type=submit name=submit value='Correct Query >>'>";
echo "</center></form>";
$error_status = 1;
break;
}
}
$percent = sprintf("%.2f", (100*$fpos)/ filesize($file));
if($fpos!='-1'){
echo "<h3>Processed $percent% from sql backup!</h3>";
$red_url = rurl($fpos, $chunk);
if($error_status == 1 ){
echo "<h3><a href='".$red_url."'>To skip this query, click here to Continue</a></h3>";
exit;
}else{
echo "<h3><a href='".$red_url."'>Continue here</a></h3>";
echo "<script>window.location='".$red_url."'</script>";
exit;
}
} else {
echo "<h3>The sql import is finished!</h3>";
}
return;
}
########END
### STARTING THE AUTOMATIC BACKUP
function populate_db( $db, $sqlfile='administrator/backups/database-sql.sql') {
global $errors, $_CONFIG;
if($_REQUEST['use_mysqldump'] == 1){
echo shell_exec($_REQUEST['mysqldump_path']." -u ".$_REQUEST[mysql_username]." -p".$_REQUEST[mysql_pass]." -h ".$_REQUEST[mysql_server]." ".$_REQUEST[mysql_db]." < ".$sqlfile);
return;
}
$mqr = @get_magic_quotes_runtime();
@set_magic_quotes_runtime(0);
@chmod($sqlfile,0777);
$query = fread( fopen( $sqlfile, 'r' ), filesize( $sqlfile ) );
@set_magic_quotes_runtime($mqr);
$pieces = split_sql($query);
for ($i=0; $i<count($pieces); $i++) {
$pieces[$i] = trim($pieces[$i]);
$tmp = explode("DEFAULT CHARSET",$pieces[$i]);
$pieces[$i] = $tmp[0].";";
if(!empty($pieces[$i]) && $pieces[$i] != "#") {
if (!mysql_query($pieces[$i], $db)) {
$errors[] = "\n\n##Mysql Query: \n########\n".
$pieces[$i].
"\n########\n##Error message: ".
mysql_error();
}
}
}
return $errors;
}
function rurl($fpos = 0, $chunk = 0){
$get_query = "&";
foreach($_REQUEST as $key=>$value){
if(($key != 'fpos')&&($key != 'chunk')&&($key != 'strrep_c')&&($key != 'strrep'))
$get_query .= $key."=".$value."&";
}
$url = $_SERVER['PHP_SELF']."?fpos=".$fpos."&chunk=".$chunk.$get_query;
return $url;
}
function read_file($file, $lines, $start_pos, &$chunk, &$text){
$cline = 0;
$fp = fopen($file, "r");
fseek($fp, $start_pos);
while((!feof($fp)) &&($cline <= $lines)){
$btemp = fgets($fp, $chunk);
$buffer .= $btemp;
if(strstr($btemp, ";\n"))
$cline++;
$fpos = ftell($fp);
}
$buffer = str_replace(";\r", ";\n", $buffer);
$text = explode(";\n", $buffer);
$fpos = $fpos - strlen($text[sizeof($text)-1]);
if(sizeof($text) == 1)
$chunk = DATA_CHUNK_LENGTH+$chunk;
else
$chunk = DATA_CHUNK_LENGTH;
if(feof($fp))
$fpos = '-1';
fclose ($fp);
return $fpos; // array_reverse is optional: you can also just return the $text array which consists of the file's lines.
}
/**
* @param string
*/
function split_sql($sql) {
$ret = array();
$sql = str_replace("\n) ", "\n) ;\n#\n#", $sql);
$sql = str_replace("\n--\n","\n#\n",$sql);
$sql = str_replace("\n-- ","\n# ",$sql);
$sql = str_replace("\n/*","\n#/*",$sql);
$sql = str_replace("#\n", "#;\n", $sql);
// Processing the SQL file content
$file_content = explode("\n",$sql);
$query = "";
// Parsing the SQL file content
foreach($file_content as $key=>$sql_line) {
if(substr($sql_line, 0, 2) == "--")
$sql_line = "#".substr($sql_line, 2, strlen($sql_line));
if(trim($sql_line) != "" ){
$query .= $sql_line;
// Checking whether the line is a valid statement
if(preg_match("/(.*);/", $sql_line)){
$query = substr($query, 0, strlen($query)-1);
//Executing the parsed string, returns the error code in failure
$ret[] = $query;
$query = "";
}
}
} //End of foreach
return($ret);
}
function recurseFiles(&$d_arr, &$ds_arr, &$f_arr, &$s_arr, &$d, &$f, &$s, &$includedFolders, $path, $mosConfig_absolute_path) {
$currentfullpath = $mosConfig_absolute_path.$path;
# Open possibly available directory
if( is_dir( $currentfullpath ) ) {
if( $handle = opendir( $currentfullpath ) ) {
while( false !== ( $file = readdir( $handle ) ) ) {
# Make sure we don't push parental directories or dotfiles (unix) into the arrays
if( $file != "." && $file != ".." ) {
if( is_dir( $currentfullpath . "/" . $file ) ) {
# Create array for directories
$d_arr[++$d] = $currentfullpath . "/" . $file;
recurseFiles($d_arr, $ds_arr, $f_arr, $s_arr, $d, $f, $s, $includedFolders, $path . "/" . $file, $mosConfig_absolute_path);
} else {
if ( in_array($currentfullpath, $includedFolders) ) {
# Create array for files
$s_arr[$f] = filesize($currentfullpath.'/'.$file);
$f_arr[$f++] = str_replace($mosConfig_absolute_path.'/', '', $currentfullpath.'/').$file;
$s += filesize($currentfullpath.'/'.$file);
}
}
}
}
}
# Wrap things up if we're in a directory
if( is_dir( $handle ) )
closedir( $handle );
}
}
function version_list($fname) {
global $_CONFIG;
$return = "<select name='$fname'><option value=''>Choose local clone archive</option>";
if(is_array($_CONFIG[versions])){
foreach($_CONFIG[versions] as $key=>$value){
$size = sprintf("%.2fM", filesize($value)/(1024*1024));
$return .= "<option selected value='$value'>$value($size)</option>";
}
}
$return .= "</select>";
return $return;
}
function recursive_remove_directory($directory, $empty=FALSE){
// if the path has a slash at the end we remove it here
if(substr($directory,-1) == '/'){
$directory = substr($directory,0,-1);
}
// if the path is not valid or is not a directory ...
if(!file_exists($directory) || !is_dir($directory)){
// ... we return false and exit the function
return FALSE;
// ... if the path is not readable
}elseif(!is_readable($directory)){
// ... we return false and exit the function
return FALSE;
// ... else if the path is readable
}else{
// we open the directory
$handle = opendir($directory);
// and scan through the items inside
while (FALSE !== ($item = readdir($handle))){
// if the filepointer is not the current directory
// or the parent directory
if($item != '.' && $item != '..'){
// we build the new path to delete
$path = $directory.'/'.$item;
// if the new path is a directory
if(is_dir($path)){
// we call this function with the new path
recursive_remove_directory($path);
// if the new path is a file
}else{
// we remove the file
unlink($path);
}
}
}
// close the directory
closedir($handle);
// if the option to empty is not set to true
if($empty == FALSE){
// try to delete the now empty directory
if(!@rmdir($directory)){
// return false if not possible
return FALSE;
}
}
// return success
return TRUE;
}
}
function setCache($time = 3600){
$seconds_to_cache = $time;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
@header("Expires: $ts");
@header("Pragma: cache");
@header("Cache-Control: maxage=$seconds_to_cache");
}
?>