# define('VMBITRIX', 'defined');
error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT);
if (version_compare(phpversion(),'5.0.0','<'))
die('PHP5 is required');
if(strpos($_SERVER['REQUEST_URI'], '/restore.php') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'].'/restore.php'))
die('This script must be started from Web Server\'s DOCUMENT ROOT');
if(isset($_SERVER["BX_PERSONAL_ROOT"]) && $_SERVER["BX_PERSONAL_ROOT"] <> "")
define("BX_PERSONAL_ROOT", $_SERVER["BX_PERSONAL_ROOT"]);
else
define("BX_PERSONAL_ROOT", "/bitrix");
if(!defined("START_EXEC_TIME"))
define("START_EXEC_TIME", microtime(true));
define("STEP_TIME", defined('VMBITRIX') ? 30 : 15);
# define("DELAY", defined('VMBITRIX') ? 0 : 3); // reserved
if (function_exists('mb_internal_encoding'))
{
switch (ini_get("mbstring.func_overload"))
{
case 0:
$bUTF_serv = false;
break;
case 2:
$bUTF_serv = mb_internal_encoding() == 'UTF-8';
break;
default:
die('PHP parameter mbstring.func_overload='.ini_get("mbstring.func_overload").'. The only supported values are 0 or 2.');
break;
}
mb_internal_encoding('ISO-8859-1');
}
else
$bUTF_serv = false;
# http://bugs.php.net/bug.php?id=48886 - We have 2Gb file limit on Linux
#@set_time_limit(0);
ob_start();
if (@preg_match('#ru#i',$_SERVER['HTTP_ACCEPT_LANGUAGE']))
$lang = 'ru';
elseif (@preg_match('#de#i',$_SERVER['HTTP_ACCEPT_LANGUAGE']))
$lang = 'de';
if ($_REQUEST['lang'])
$lang = $_REQUEST['lang'];
if (!in_array($lang,array('ru','en')))
$lang = 'en';
define("LANG", $lang);
if (LANG=='ru' && !headers_sent())
header("Content-type:text/html; charset=windows-1251");
$dbconn = $_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/dbconn.php";
$arc_name = $_REQUEST["arc_name"];
$mArr_ru = array(
"WINDOW_TITLE" => "Восстановление архива",
"BACK" => "Назад",
"BEGIN" => "
- Перейдите в административную панель своего сайта на страницу Настройки > Инструменты > Резервное копирование
- Создайте полную резервную копию, которая будет включать публичную часть, ядро и базу данных
Документация: http://dev.1c-bitrix.ru/api_help/main/going_remote.php
",
"ARC_DOWN" => "Скачать архив с дальнего сайта",
"ARC_LOCAL_NAME" => "Имя архива:",
"DB_SELECT" => "Выберите дамп БД:",
"DB_SETTINGS" => "Данные для подключения к базе данных",
"DB_DEF" => "по умолчанию для выделенного сервера или виртуальной машины",
"DB_ENV" => "восстановление в "Битрикс: Веб-окружение"",
"DB_OTHER" => "установить значения вручную",
"DB_SKIP" => "пропустить восстановление базы данных",
"ARC_DOWN_SITE" => "адрес сайта (www.site.ru):",
"DELETE_FILES" => "Удалить архив и служебные скрипты",
"ARC_DOWN_NAME" => "имя архива (2010-09-20.12-43-39.a269376c.tar.gz):",
"OR" => "ИЛИ",
"ARC_DOWN_URL" => "Ссылка на архив:",
"NO_FILES" => "нет архивов",
"TITLE0" => "Шаг 1: Подготовка архива",
"TITLE1" => "Шаг 2: Распаковка архива",
"TITLE_PROCESS1" => "Шаг 2: Выполняется распаковка архива",
"TITLE_PROCESS2" => "Шаг 3: Выполняется восстановление базы данных",
"TITLE2" => "Шаг 3: Восстановление базы данных",
"SELECT_LANG" => "Выберите язык",
"ARC_SKIP" => "Архив уже распакован",
"ARC_SKIP_DESC" => "переход к восстановлению базы данных",
"ARC_NAME" => "Архив загружен в корневую папку сервера",
"ARC_DOWN_PROCESS" => "Загружается:",
"ARC_LOCAL" => "Загрузить с локального диска",
"MAX_TIME" => "Шаг выполнения (сек.)",
"ERR_NO_ARC" => "Не выбран архив для распаковки!",
"BUT_TEXT1" => "Далее",
"BUT_TEXT_BACK" => "Назад",
"DUMP_NAME" => "Файл резервной копии базы:",
"USER_NAME" => "Имя пользователя базы данных",
"USER_PASS" => "Пароль",
"BASE_NAME" => "Имя базы данных",
"BASE_HOST" => "Адрес сервера базы данных",
"BASE_RESTORE" => "Восстановить",
"ERR_NO_DUMP" => "Не выбран архив базы данных для восстановления!",
"ERR_EXTRACT" => "Ошибка",
"ERR_UPLOAD" => "Не удалось загрузить файл на сервер",
"ERR_DUMP_RESTORE" => "Ошибка восстановления базы данных",
"ERR_DB_CONNECT" => "Ошибка соединения с базой данных",
"ERR_CREATE_DB" => "Ошибка создания базы",
"ERR_TAR_TAR" => "Присутствуют файлы с расширением tar.tar. Вместо них должны быть архивы с номерами: tar.1, tar.2 и т.д.",
"FINISH" => "Операция выполнена успешно",
"FINISH_MSG" => "Операция восстановления системы завершена.",
"EXTRACT_FINISH_TITLE" => "Распаковка архива",
"EXTRACT_FINISH_MSG" => "Распаковка архива завершена.",
"BASE_CREATE_DB" => "Создать базу данных",
"BASE_CLOUDS" => "Файлы из облачных хранилищ:",
"BASE_CLOUDS_Y" => "сохранить локально",
"BASE_CLOUDS_N" => "оставить в облаке",
"EXTRACT_FINISH_DELL" => "Обязательно удалите скрипт restore.php и файл резервной копии из корневой директории сайта.",
"EXTRACT_FULL_FINISH_DELL" => "Обязательно удалите скрипт restore.php, файл резервной копии из корневой директории сайта, а также дамп базы.",
"BUT_DELL" => "Удалить",
"FINISH_ERR_DELL" => "Не удалось удалить все временные файлы! Обязательно удалите их вручную.",
"FINISH_ERR_DELL_TITLE" => "Ошибка удаления файлов!",
"NO_READ_PERMS" => "Нет прав на чтение корневой папки сайта",
"UTF8_ERROR1" => "Внимание! Сайт работал в кодировке UTF-8. Конфигурация сервера не соответствует требованиям, установите mbstring.func_overload=2 и mbstring.internal_encoding=UTF-8.",
"UTF8_ERROR2" => "Внимание! Сайт работал в однобайтовой кодировке, а конфигурация сервера рассчитана на кодировку UTF-8. Установите mbstring.func_overload=0 или mbstring.internal_encoding=ISO-8859-1.",
"DOC_ROOT_WARN" => "Внимание! В настройках сайта указан путь к корневой папке, убедитесь, что путь установлен правильно, иначе возникнут проблемы с доступом к публичной части.",
"HTACCESS_WARN" => "Внимание! Файл .htaccess из архива был сохранен в корне сайта под именем .htaccess.restore, т.к. он может содержать директивы, недопустимые на данном сервере. Пожалуйста, переименуйте его вручную через FTP.",
"NOT_SAAS_ENV" => "Вы используете дистрибутив SaaS, он может быть развернут только на SaaS окружении",
"NOT_SAAS_DISTR" => "Вы работаете на SaaS окружении, необходимо использовать редакцию SaaS",
'TAR_WRONG_BLOCK_SIZE' => 'Неверный размер блока: ',
'TAR_ERR_FORMAT' => 'Архив поврежден, ошибочный блок: ',
'TAR_EMPTY_FILE' => 'Пустое имя файла, ошибочный блок: ',
'TAR_ERR_CRC' => 'Ошибка контрольной суммы на файле: ',
'TAR_ERR_FOLDER_CREATE' => 'Не удалось создать папку: ',
'TAR_ERR_FILE_CREATE' => 'Не удалось создать файл: ',
'TAR_ERR_FILE_OPEN' => 'Не удалось открыть файл: ',
'TAR_ERR_FILE_SIZE' => 'Размер файла отличается: ',
'TAR_ERR_WRITE_HEADER' => 'Ошибка записи заголовка',
'TAR_PATH_TOO_LONG' => 'Слишком длинный путь: ',
'TAR_ERR_FILE_READ' => 'Ошибка чтения файла: ',
'TAR_ERR_FILE_WRITE' => 'Ошибка записи на файле: ',
'TAR_ERR_FILE_NO_ACCESS' => 'Нет доступа к файлу: ',
'TAR_NO_GZIP' => 'Не доступна функция gzopen',
);
$mArr_en = array(
"WINDOW_TITLE" => "Restoring",
"BACK" => "Back",
"BEGIN" => "
- Step 1. Open Control Panel section of your old site and select Settings > Tools > Backup
- Create full archive which contains public site files, kernel files and database dump
Documentation: learning course
",
"ARC_DOWN" => "Download from remote server",
"ARC_LOCAL_NAME" => "Archive name:",
"DB_SELECT" => "Select Database Dump:",
"DB_SETTINGS" => "Database settings",
"DB_DEF" => "default values for Dedicated Server or Virtual Machine",
"DB_ENV" => "restoring in Bitrix Environment",
"DB_OTHER" => "custom database settings",
"DB_SKIP" => "skip database restore",
"ARC_DOWN_SITE" => "Server URL (www.site.com):",
"DELETE_FILES" => "Delete archive and temporary scripts",
"ARC_DOWN_NAME" => "Archive name (2010-09-20.12-43-39.a269376c.tar.gz):",
"OR" => "OR",
"ARC_DOWN_URL" => "Archive URL:",
"NO_FILES" => "no archives found",
"TITLE0" => "Step 1: Archive Creation",
"TITLE1" => "Step 2: Archive Extracting",
"TITLE_PROCESS1" => "Step 2: Extracting an archive...",
"TITLE_PROCESS2" => "Step 3: Restoring database...",
"TITLE2" => "Step 3: Database restore",
"SELECT_LANG" => "Choose the language",
"ARC_SKIP" => "Archive is already extracted",
"ARC_SKIP_DESC" => "Starting database restore",
"ARC_NAME" => "Archive is stored in document root folder",
"ARC_DOWN_PROCESS" => "Downloading:",
"ARC_LOCAL" => "Upload from local disk",
"MAX_TIME" => "Step (sec.)",
"ERR_NO_ARC" => "Archive for extracting is not specified!",
"BUT_TEXT1" => "Continue",
"BUT_TEXT_BACK" => "Back",
"DUMP_NAME" => "Database dump file:",
"USER_NAME" => "Database User Name",
"USER_PASS" => "Password",
"BASE_NAME" => "Database Name",
"BASE_HOST" => "Database Host",
"BASE_RESTORE" => "Restore",
"ERR_NO_DUMP" => "Database dump file is not specified!",
"ERR_EXTRACT" => "Error",
"ERR_UPLOAD" => "Unable to upload file",
"ERR_DUMP_RESTORE" => "Error restoring the database:",
"ERR_DB_CONNECT" => "Error connecting the database:",
"ERR_CREATE_DB" => "Error creating the database",
"ERR_TAR_TAR" => "There are files with tar.tar extension presents. Should be tar.1, tar.2 and so on",
"FINISH" => "Successfully completed",
"FINISH_MSG" => "Restoring of the system was completed.",
"EXTRACT_FINISH_TITLE" => "Archive extracting",
"EXTRACT_FINISH_MSG" => "Archive extracting was completed.",
"BASE_CREATE_DB" => "Create database",
"BASE_CLOUDS" => "Cloud files:",
"BASE_CLOUDS_Y" => "store locally",
"BASE_CLOUDS_N" => "leave in the cloud",
"EXTRACT_FINISH_DELL" => "Warning! You should delete restore.php script and backup copy file from the root folder of your site!",
"EXTRACT_FULL_FINISH_DELL" => "Warning! You should delete restore.php script, backup copy file and database dump from the root folder of your site!",
"BUT_DELL" => "Delete",
"FINISH_ERR_DELL" => "Failed to delete temporary files! You should delete them manually",
"FINISH_ERR_DELL_TITLE" => "Error deleting the files!",
"NO_READ_PERMS" => "No permissions for reading Web Server root",
"UTF8_ERROR1" => "Warning! Your server is not configured for UTF-8 encoding. Please set mbstring.func_overload=2 and mbstring.internal_encoding=UTF-8.",
"UTF8_ERROR2" => "Warning! Your server is configured for UTF-8 encoding. Please set mbstring.func_overload=0 or mbstring.internal_encoding=ISO-8859-1.",
"DOC_ROOT_WARN" => "Warning: In the site settings, make sure that the path to the root folder is correct, otherwise access to the public part will be promblematic or impossible.",
"HTACCESS_WARN" => "Warning! The file .htaccess was saved as .htaccess.restore, because it may contain directives which are not permitted on this server. Please rename it manually using FTP.",
'TAR_WRONG_BLOCK_SIZE' => 'Wrong Block size: ',
'TAR_ERR_FORMAT' => 'Archive is currupted, error block: ',
'TAR_EMPTY_FILE' => 'Empty filename, block: ',
'TAR_ERR_CRC' => 'Checksum error on file: ',
'TAR_ERR_FOLDER_CREATE' => 'Can\'t create folder: ',
'TAR_ERR_FILE_CREATE' => 'Can\'t create file: ',
'TAR_ERR_FILE_OPEN' => 'Can\'t open file: ',
'TAR_ERR_FILE_SIZE' => 'Filesize differs: ',
'TAR_ERR_WRITE_HEADER' => 'Error writing header',
'TAR_PATH_TOO_LONG' => 'Path is too long: ',
'TAR_ERR_FILE_READ' => 'Error reading file: ',
'TAR_ERR_FILE_WRITE' => 'Error adding file: ',
'TAR_ERR_FILE_NO_ACCESS' => 'No access to file: ',
'TAR_NO_GZIP' => 'PHP extension GZIP is not available',
);
$MESS = array();
if (LANG=="ru")
{
$MESS["LOADER_SUBTITLE1"] = "Загрузка архива";
$MESS["LOADER_SUBTITLE1_ERR"] = "Ошибка загрузки";
$MESS["STATUS"] = "% выполнено...";
$MESS["LOADER_MENU_UNPACK"] = "Распаковка файла";
$MESS["LOADER_TITLE_LIST"] = "Выбор файла";
$MESS["LOADER_TITLE_LOAD"] = "Загрузка файла на сайт";
$MESS["LOADER_TITLE_UNPACK"] = "Распаковка файла";
$MESS["LOADER_TITLE_LOG"] = "Отчет по загрузке";
$MESS["LOADER_NEW_LOAD"] = "Загрузить";
$MESS["LOADER_BACK_2LIST"] = "Вернуться в список файлов";
$MESS["LOADER_LOG_ERRORS"] = "Загрузка архива не удалась";
$MESS["LOADER_NO_LOG"] = "Log-файл не найден";
$MESS["LOADER_KB"] = "кб";
$MESS["LOADER_LOAD_QUERY_SERVER"] = "Подключение к серверу...";
$MESS["LOADER_LOAD_QUERY_DISTR"] = "Запрашиваю файл #DISTR#";
$MESS["LOADER_LOAD_CONN2HOST"] = "Подключение к серверу #HOST#...";
$MESS["LOADER_LOAD_NO_CONN2HOST"] = "Не могу соединиться с #HOST#:";
$MESS["LOADER_LOAD_QUERY_FILE"] = "Запрашиваю файл...";
$MESS["LOADER_LOAD_WAIT"] = "Ожидаю ответ...";
$MESS["LOADER_LOAD_SERVER_ANSWER"] = "Ошибка загрузки. Сервер ответил: #ANS#";
$MESS["LOADER_LOAD_SERVER_ANSWER1"] = "Ошибка загрузки. У вас нет прав на доступ к этому файлу. Сервер ответил: #ANS#";
$MESS["LOADER_LOAD_NEED_RELOAD"] = "Ошибка загрузки. Докачка файла невозможна.";
$MESS["LOADER_LOAD_NO_WRITE2FILE"] = "Не могу открыть файл #FILE# на запись";
$MESS["LOADER_LOAD_LOAD_DISTR"] = "Загружаю файл #DISTR#";
$MESS["LOADER_LOAD_ERR_SIZE"] = "Ошибка размера файла";
$MESS["LOADER_LOAD_ERR_RENAME"] = "Не могу переименовать файл #FILE1# в файл #FILE2#";
$MESS["LOADER_LOAD_CANT_OPEN_WRITE"] = "Не могу открыть файл #FILE# на запись";
$MESS["LOADER_LOAD_CANT_OPEN_READ"] = "Не могу открыть файл #FILE# на чтение";
$MESS["LOADER_LOAD_LOADING"] = "Загружаю файл... дождитесь окончания загрузки...";
$MESS["LOADER_LOAD_FILE_SAVED"] = "Файл сохранен: #FILE# [#SIZE# байт]";
$MESS["LOADER_UNPACK_ACTION"] = "Распаковываю файл... дождитесь окончания распаковки...";
$MESS["LOADER_UNPACK_UNKNOWN"] = "Неизвестная ошибка. Повторите процесс еще раз или обратитесь в службу технической поддержки";
$MESS["LOADER_UNPACK_SUCCESS"] = "Файл успешно распакован";
$MESS["LOADER_UNPACK_ERRORS"] = "Файл распакован с ошибками";
$MESS["LOADER_KEY_DEMO"] = "Демонстрационная версия";
$MESS["LOADER_KEY_COMM"] = "Коммерческая версия";
$MESS["UPDATE_SUCCESS"] = "Обновлено успешно. Открыть.";
$MESS["LOADER_NEW_VERSION"] = "Доступна новая версия скрипта восстановления, но загрузить её не удалось";
}
else
{
$MESS["LOADER_SUBTITLE1"] = "Loading";
$MESS["LOADER_SUBTITLE1_ERR"] = "Loading Error";
$MESS["STATUS"] = "% done...";
$MESS["LOADER_MENU_LIST"] = "Select package";
$MESS["LOADER_MENU_UNPACK"] = "Unpack file";
$MESS["LOADER_TITLE_LIST"] = "Select file";
$MESS["LOADER_TITLE_LOAD"] = "Uploading file to the site";
$MESS["LOADER_TITLE_UNPACK"] = "Unpack file";
$MESS["LOADER_TITLE_LOG"] = "Upload report";
$MESS["LOADER_NEW_ED"] = "package edition";
$MESS["LOADER_NEW_AUTO"] = "automatically start unpacking after loading";
$MESS["LOADER_NEW_STEPS"] = "load gradually with interval:";
$MESS["LOADER_NEW_STEPS0"] = "unlimited";
$MESS["LOADER_NEW_LOAD"] = "Download";
$MESS["LOADER_BACK_2LIST"] = "Back to packages list";
$MESS["LOADER_LOG_ERRORS"] = "Error occured";
$MESS["LOADER_NO_LOG"] = "Log file not found";
$MESS["LOADER_KB"] = "kb";
$MESS["LOADER_LOAD_QUERY_SERVER"] = "Connecting server...";
$MESS["LOADER_LOAD_QUERY_DISTR"] = "Requesting package #DISTR#";
$MESS["LOADER_LOAD_CONN2HOST"] = "Connection to #HOST#...";
$MESS["LOADER_LOAD_NO_CONN2HOST"] = "Cannot connect to #HOST#:";
$MESS["LOADER_LOAD_QUERY_FILE"] = "Requesting file...";
$MESS["LOADER_LOAD_WAIT"] = "Waiting for response...";
$MESS["LOADER_LOAD_SERVER_ANSWER"] = "Error while downloading. Server reply was: #ANS#";
$MESS["LOADER_LOAD_SERVER_ANSWER1"] = "Error while downloading. Your can not download this package. Server reply was: #ANS#";
$MESS["LOADER_LOAD_NEED_RELOAD"] = "Error while downloading. Cannot resume download.";
$MESS["LOADER_LOAD_NO_WRITE2FILE"] = "Cannot open file #FILE# for writing";
$MESS["LOADER_LOAD_LOAD_DISTR"] = "Downloading package #DISTR#";
$MESS["LOADER_LOAD_ERR_SIZE"] = "File size error";
$MESS["LOADER_LOAD_ERR_RENAME"] = "Cannot rename file #FILE1# to #FILE2#";
$MESS["LOADER_LOAD_CANT_OPEN_WRITE"] = "Cannot open file #FILE# for writing";
$MESS["LOADER_LOAD_CANT_OPEN_READ"] = "Cannot open file #FILE# for reading";
$MESS["LOADER_LOAD_LOADING"] = "Download in progress. Please wait...";
$MESS["LOADER_LOAD_FILE_SAVED"] = "File saved: #FILE# [#SIZE# bytes]";
$MESS["LOADER_UNPACK_ACTION"] = "Unpacking the package. Please wait...";
$MESS["LOADER_UNPACK_UNKNOWN"] = "Unknown error occured. Please try again or consult the technical support service";
$MESS["LOADER_UNPACK_SUCCESS"] = "The file successfully unpacked";
$MESS["LOADER_UNPACK_ERRORS"] = "Errors occured while unpacking the file";
$MESS["LOADER_KEY_DEMO"] = "Demo version";
$MESS["LOADER_KEY_COMM"] = "Commercial version";
$MESS["UPDATE_SUCCESS"] = "Successful update. Open.";
$MESS["LOADER_NEW_VERSION"] = "Error occured while updating restore.php script!";
}
$strErrMsg = '';
if (defined('VMBITRIX'))
{
$this_script_name = basename(__FILE__);
$bx_host = 'www.1c-bitrix.ru';
$bx_url = '/download/files/scripts/'.$this_script_name;
$form = '';
// Check for updates
$res = @fsockopen($bx_host, 80, $errno, $errstr, 3);
if($res)
{
$strRequest = "HEAD ".$bx_url." HTTP/1.1\r\n";
$strRequest.= "Host: ".$bx_host."\r\n";
$strRequest.= "\r\n";
fputs($res, $strRequest);
while ($line = fgets($res, 4096))
{
if (@preg_match("/Content-Length: *([0-9]+)/i", $line, $regs))
{
if (filesize(__FILE__) != trim($regs[1]))
{
$tmp_name = $this_script_name.'.tmp';
if (LoadFile('http://'.$bx_host.$bx_url, $tmp_name))
{
if (rename($_SERVER['DOCUMENT_ROOT'].'/'.$tmp_name,__FILE__))
{
bx_accelerator_reset();
echo ''.LoaderGetMessage('UPDATE_SUCCESS');
die();
}
else
$strErrMsg = str_replace("#FILE#", $this_script_name, LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE"));
}
else
$strErrMsg = LoaderGetMessage('LOADER_NEW_VERSION');
}
break;
}
}
fclose($res);
}
}
$bSelectDumpStep = false;
if ($_REQUEST['source']=='dump')
$bSelectDumpStep = true;
$Step = IntVal($_REQUEST["Step"]);
if ($Step == 2 && !$bSelectDumpStep)
{
if ($_REQUEST['source']=='download')
{
$url = $_REQUEST['arc_down_url'];
if (!$url)
$url = $_REQUEST['arc_down_site'].'/bitrix/backup/'.$_REQUEST['arc_down_name'];
if (!preg_match('#http://#',$url))
$url = 'http://'.$url;
$arc_name = trim(basename($url));
if (!preg_match("#\.tar(\.gz)?(.[0-9]+)?$#",$arc_name))
$arc_name = 'archive.tar.gz';
$strLog = '';
$status = '';
if ($_REQUEST['continue'])
$res = LoadFile($url, $_SERVER['DOCUMENT_ROOT'].'/'.$arc_name, $strRealUrl);
else
{
$res = 2;
SetCurrentProgress(0);
}
if (!$res)
{
$ar = array(
'TITLE' => LoaderGetMessage('LOADER_SUBTITLE1_ERR'),
'TEXT' => nl2br($strLog),
'BOTTOM' => ' '
);
html($ar);
die();
}
elseif ($res==2) // частичная закачка
{
$text = getMsg('ARC_DOWN_PROCESS').' '.htmlspecialchars($arc_name).'' . $status .
''.
''.
''.
'';
}
else
{
$next_arc_name = CTar::getNextName($arc_name);
$next_url = str_replace($arc_name, $next_arc_name, $url);
$res = LoadFile($next_url, $next_arc_name, $strNextRealUrl);
if ($res != false && $strRealUrl != $strNextRealUrl)
{
$text = getMsg('ARC_DOWN_PROCESS').' '.htmlspecialchars($next_arc_name).'' . $status .
''.
''.
''.
'';
}
else
{
$text = $status .
''.
'';
}
}
$bottom = ' ';
showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text,$bottom);
?>
die();
}
elseif($_REQUEST['source']=='upload')
{
$tmp = $_FILES['archive'];
$arc_name = $_REQUEST['arc_name'] = 'uploaded_archive.tar.gz';
if (@move_uploaded_file($tmp['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/'.$arc_name))
{
$text =
''.
'';
showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text);
?>
die();
}
else
{
$ar = array(
'TITLE' => getMsg('ERR_EXTRACT'),
'TEXT' => getMsg('ERR_UPLOAD'),
'BOTTOM' => ' '
);
html($ar);
die();
}
}
}
elseif($Step == 3)
{
if ($_REQUEST['db_settings'] == 'skip')
$Step++;
else
{
$d_pos = (double) $_REQUEST["d_pos"];
if ($d_pos < 0)
$d_pos = 0;
if ($_REQUEST['db_settings']=='default' || $_REQUEST['db_settings'] == 'env')
{
$_REQUEST['db_host'] = 'localhost'.($_REQUEST['db_settings'] == 'env' ? ':31006' : '');
$_REQUEST['db_name'] = 'bitrix';
$_REQUEST['db_user'] = 'root';
$_REQUEST['db_pass'] = '';
$_REQUEST['create_db'] = 'Y';
}
$oDB = new CDBRestore($_REQUEST["db_host"], $_REQUEST["db_name"], $_REQUEST["db_user"], $_REQUEST["db_pass"], $_REQUEST["dump_name"], $d_pos);
$oDB->LocalCloud = $_REQUEST['LocalCloud'];
if(!$oDB->Connect())
{
$strErrMsg = $oDB->getError();
$Step = 2;
$bSelectDumpStep = true;
}
}
}
if(!$Step)
{
$ar = array(
'TITLE' => getMsg("TITLE0", LANG),
'TEXT' =>
($strErrMsg ? ''.$strErrMsg.'
' : '').
getMsg('BEGIN') .
'
' .
(file_exists($img = 'images/dump'.(LANG=='ru'?'_ru':'').'.png') ? '' : ''),
'BOTTOM' =>
(defined('VMBITRIX') ? ' ' : '').
''
);
html($ar);
}
elseif($Step == 1)
{
$arc_down_url = $_REQUEST['arc_down_url'] ? $_REQUEST['arc_down_url'] : 'http://example.com/bitrix/backup/2012-05-02.18-27-04.s1.368e07e6.tar.gz';
$local_arc_name = htmlspecialchars(ltrim($_REQUEST['local_arc_name'],'/'));
$option = getArcList();
$ar = array(
'TITLE' => getMsg("TITLE1", LANG),
'TEXT' =>
$local_arc_name
?
' '.getMsg("ARC_LOCAL_NAME", LANG).' '.$local_arc_name.'
'
:
($strErrMsg ? ''.$strErrMsg.'
' : '').
'
'
.(
strlen($option)
?
''
:
''.getMsg('NO_FILES', LANG).''
).
'
'.
($option === false ? '
'.getMsg('NO_READ_PERMS', LANG).'
' : '').
'
'.
''
,
'BOTTOM' =>
' '.
''
);
html($ar);
?>
}
elseif($Step == 2)
{
if(!$bSelectDumpStep)
{
$tar = new CTarRestore;
$tar->path = $_SERVER['DOCUMENT_ROOT'];
$tar->ReadBlockCurrent = intval($_REQUEST['ReadBlockCurrent']);
$bottom = ' ';
if ((file_exists($f = $_SERVER['DOCUMENT_ROOT'].'/'.$arc_name)) && $tar->openRead($f))
{
$DataSize = intval($_REQUEST['DataSize']);
if(!isset($_REQUEST['Block'])) // first step
{
$DataSize = $tar->getArchiveSize();
while(file_exists($file = $tar->getNextName($file)))
$DataSize += $tar->getArchiveSize($file);
SetCurrentProgress(0);
$r = true;
}
else
{
$Block = intval($_REQUEST['Block']);
$tar->Skip($Block);
while(($r = $tar->extractFile()) && haveTime());
}
if($r === false) // Error
showMsg(getMsg("ERR_EXTRACT", LANG), implode('
',$tar->err), $bottom);
elseif ($r === 0) // Finish
$bSelectDumpStep = true;
else
{
SetCurrentProgress(($tar->BlockHeader + $tar->ReadBlockCurrent) * 512,$DataSize, $red=false);
$text = $status .
''.
''.
''.
'';
showMsg(getMsg('TITLE_PROCESS1'),$text,$bottom);
?>
}
$tar->close();
}
else
showMsg(getMsg("ERR_EXTRACT", LANG), getMsg('TAR_ERR_FILE_OPEN', LANG).htmlspecialchars($f),$bottom);
}
if ($bSelectDumpStep)
{
if(file_exists($dbconn))
{
include($dbconn);
$bUTF_conf = (defined('BX_UTF') && BX_UTF === true);
if ($bUTF_conf && !$bUTF_serv)
$strErrMsg = getMsg('UTF8_ERROR1').'
'.$strErrMsg;
elseif (!$bUTF_conf && $bUTF_serv)
$strErrMsg = getMsg('UTF8_ERROR2').'
'.$strErrMsg;
}
$arDName = getDumpList();
$strDName = '';
foreach($arDName as $db)
$strDName .= '';
if(count($arDName))
{
$ar = array(
'TITLE' => getMsg("TITLE2", LANG),
'TEXT' =>
($strErrMsg ? ''.$strErrMsg.'
' : '').
''.
(count($arDName)>1
?
getMsg("DB_SELECT").' '
:
''
) .
''.getMsg("DB_SETTINGS", LANG).'
'.
'
'.
(
file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/backup/clouds') ?
''.getMsg("BASE_CLOUDS", LANG).'
'
:
''
)
,
'BOTTOM' =>
' '.
''
);
html($ar);
?>
}
else
{
$text =
($strErrMsg ? ''.$strErrMsg.'
' : '').
(file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? ''.getMsg('HTACCESS_WARN').'
' : '') .
getMsg("EXTRACT_FINISH_MSG", LANG) . '
';
$bottom = ' '.
'';
showMsg(getMsg("EXTRACT_FINISH_TITLE", LANG), $text, $bottom);
}
}
}
elseif($Step == 3)
{
$d_pos = (double) $_REQUEST["d_pos"];
if ($d_pos < 0)
$d_pos = 0;
if (!isset($_REQUEST['d_pos'])) // start
{
if(file_exists($dbconn))
{
include($dbconn);
$arReplace = array(
'DBHost' => 'db_host',
'DBLogin' => 'db_user',
'DBPassword' => 'db_pass',
'DBName' => 'db_name'
);
$arFile = file($dbconn);
$bCron = false;
foreach($arFile as $line)
{
if (preg_match("#^[ \t]*".'\$'."(DB[a-zA-Z]+)#",$line,$regs))
{
$key = $regs[1];
$new_val = $_REQUEST[$arReplace[$key]];
if (isset($new_val) && $$key != $new_val)
{
$strFile.='#'.$line.
'$'.$key.' = "'.addslashes(str_replace('$','\$',$new_val)).'";'."\n\n";
}
else
$strFile.=$line;
}
else
$strFile.=$line;
if (preg_match('#BX_CRONTAB_SUPPORT#',$line)) // почта уже на кроне
$bCron = true;
}
if (defined('VMBITRIX') && !$bCron)
$strFile = '<'.'?define("BX_CRONTAB_SUPPORT", true);?'.'>'.$strFile;
$f = fopen($dbconn,"wb");
fputs($f,$strFile);
fclose($f);
}
SetCurrentProgress(0);
$r = true;
}
else
$r = $oDB->restore();
$bottom = ' ';
if($r && !$oDB->is_end())
{
$d_pos = $oDB->getPos();
$oDB->close();
$arc_name = $_REQUEST["arc_name"];
SetCurrentProgress($d_pos,filesize($_SERVER['DOCUMENT_ROOT'].'/bitrix/backup/'.$_REQUEST['dump_name']));
$text =
$status . '
0 ? htmlspecialchars($_REQUEST["db_pass"]) : "").'">
';
showMsg(getMsg('TITLE_PROCESS2'),$text,$bottom);
?>
}
else
{
if($oDB->getError() != "")
showMsg(getMsg("ERR_DUMP_RESTORE", LANG), ''.$oDB->getError().'
', $bottom);
else
{
$rs = $oDB->Query('SELECT DOC_ROOT FROM b_lang WHERE DOC_ROOT IS NOT NULL');
$text = getMsg("FINISH_MSG", LANG) .
(($rs && mysql_fetch_array($rs)) ? ''.getMsg('DOC_ROOT_WARN').'
' : '') .
(file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? ''.getMsg('HTACCESS_WARN').'
' : '') .
'
';
$bottom = '';
showMsg(getMsg("FINISH", LANG), $text, $bottom);
}
}
}
elseif($Step == 4)
{
if ($_REQUEST['dump_name'])
{
@unlink($_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".$_REQUEST["dump_name"]);
@unlink($_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".str_replace('.sql','_after_connect.sql',$_REQUEST["dump_name"]));
}
@unlink($_SERVER['DOCUMENT_ROOT'].'/bitrix8setup.php');
$ok = unlink($_SERVER["DOCUMENT_ROOT"]."/restore.php");
if($_REQUEST['arc_name'])
{
$ok = unlink($_SERVER["DOCUMENT_ROOT"]."/".$_REQUEST["arc_name"]) && $ok;
$i = 0;
while(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$_REQUEST['arc_name'].'.'.++$i))
$ok = unlink($_SERVER['DOCUMENT_ROOT'].'/'.$_REQUEST['arc_name'].'.'.$i) && $ok;
}
if (!$ok)
showMsg(getMsg("FINISH_ERR_DELL_TITLE", LANG), getMsg("FINISH_ERR_DELL", LANG));
else
{
showMsg(getMsg("FINISH", LANG), getMsg("FINISH_MSG", LANG));
?>
}
}
#################### END ############
class CDBRestore
{
var $type = "";
var $DBHost ="";
var $DBName = "";
var $DBLogin = "";
var $DBPassword = "";
var $DBdump = "";
var $db_Conn = "";
var $db_Error = "";
var $f_end = false;
var $start;
var $d_pos;
var $_dFile;
function Query($sql)
{
return mysql_query($sql, $this->db_Conn);
}
function CDBRestore($DBHost, $DBName, $DBLogin, $DBPassword, $DBdump, $d_pos)
{
$this->DBHost = $DBHost;
$this->DBLogin = $DBLogin;
$this->DBPassword = $DBPassword;
$this->DBName = $DBName;
$this->DBdump = $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".$DBdump;
$this->d_pos = $d_pos;
}
//Соединяется с базой данных
function Connect()
{
$this->type="MYSQL";
if (!defined("DBPersistent")) define("DBPersistent",false);
if (DBPersistent)
{
$this->db_Conn = @mysql_pconnect($this->DBHost, $this->DBLogin, $this->DBPassword);
}
else
{
$this->db_Conn = @mysql_connect($this->DBHost, $this->DBLogin, $this->DBPassword);
}
if(!($this->db_Conn))
{
if (DBPersistent) $s = "mysql_pconnect"; else $s = "mysql_connect";
if(($str_err = mysql_error()) != "")
$this->db_Error .= "
Error! ".$s."('-', '-', '-')
".$str_err."
";
return false;
}
mysql_query('SET FOREIGN_KEY_CHECKS = 0', $this->db_Conn);
$after_file = str_replace('.sql','_after_connect.sql',$this->DBdump);
if (file_exists($after_file))
{
$rs = fopen($after_file,'rb');
$str = fread($rs,filesize($after_file));
fclose($rs);
$arSql = explode(';',$str);
foreach($arSql as $sql)
mysql_query($sql, $this->db_Conn);
}
if(!@mysql_select_db($this->DBName, $this->db_Conn))
{
if (@$_REQUEST["create_db"]=="Y")
{
if(!@mysql_query("CREATE DATABASE `".mysql_escape_string($this->DBName)."`", $this->db_Conn))
{
$this->db_Error = getMsg("ERR_CREATE_DB", LANG).': '.mysql_error();
return false;
}
@mysql_select_db($this->DBName, $this->db_Conn);
}
if(($str_err = mysql_error($this->db_Conn)) != "")
$this->db_Error = "
Error! mysql_select_db($this->DBName)
".$str_err."
";
return false;
}
return true;
}
function readSql()
{
$cache ="";
while(!feof($this->_dFile) && (substr($cache, (strlen($cache)-2), 1) != ";"))
$cache .= fgets($this->_dFile);
if(!feof($this->_dFile))
return $cache;
else
{
$this->f_end = true;
return false;
}
}
function restore()
{
$this->_dFile = @fopen($this->DBdump, 'r');
if($this->d_pos > 0)
@fseek($this->_dFile, $this->d_pos);
$sql = "";
while(($sql = $this->readSql()) && haveTime())
{
if (defined('VMBITRIX')) // избавимся от MyISAM
{
if (preg_match('#^CREATE TABLE#i',$sql))
{
$sql = preg_replace('#ENGINE=MyISAM#i','',$sql);
$sql = preg_replace('#TYPE=MyISAM#i','',$sql);
}
}
$result = @mysql_query($sql, $this->db_Conn);
if(!$result)
{
$this->db_Error .= mysql_error().'
'.htmlspecialchars($sql);
return false;
}
$sql = "";
}
mysql_query('SET FOREIGN_KEY_CHECKS = 1', $this->db_Conn);
if($sql != "")
{
$result = @mysql_query($sql, $this->db_Conn);
if(!$result)
{
$this->db_Error .= mysql_error().'
'.htmlspecialchars($sql);
return false;
}
$sql = "";
}
if ($this->LocalCloud && $this->f_end)
{
$i = '';
while(file_exists($_SERVER['DOCUMENT_ROOT'].'/upload/'.($name = 'clouds'.$i)))
$i++;
if (!file_exists($f = $_SERVER['DOCUMENT_ROOT'].'/upload'))
mkdir($f);
if (rename($_SERVER['DOCUMENT_ROOT'].'/bitrix/backup/clouds', $_SERVER['DOCUMENT_ROOT'].'/upload/'.$name))
{
$arFiles = scandir($_SERVER['DOCUMENT_ROOT'].'/upload/'.$name);
foreach($arFiles as $file)
{
if ($id = intval($file))
mysql_query('UPDATE b_file SET SUBDIR = CONCAT("'.$name.'/'.$id.'/", SUBDIR), HANDLER_ID=NULL WHERE HANDLER_ID ='.$id);
}
}
}
return true;
}
function getError()
{
return $this->db_Error;
}
function getPos()
{
if (is_resource($this->_dFile))
{
return @ftell($this->_dFile);
}
}
function close()
{
unset($this->_dFile);
return true;
}
function is_end()
{
return $this->f_end;
}
}
function getDumpList()
{
$arDump = array();
if (is_dir($back_dir = $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup"))
{
$handle = opendir($back_dir);
while (false !== ($file = readdir($handle)))
{
if($file == "." || $file == "..")
continue;
if(is_dir($back_dir.'/'.$file))
continue;
if (strpos($file,'_after_connect.sql'))
continue;
if(substr($file, strlen($file) - 3, 3) == "sql")
$arDump[] = $file;
}
}
return $arDump;
}
function getMsg($str_index, $str_lang='')
{
global $mArr_ru, $mArr_en;
if(LANG == "ru")
return $mArr_ru[$str_index];
else
return $mArr_en[$str_index];
}
function getArcList()
{
$arc = "";
global $strErrMsg;
$handle = @opendir($_SERVER["DOCUMENT_ROOT"]);
if (!$handle)
return false;
while (false !== ($file = @readdir($handle)))
{
if($file == "." || $file == "..")
continue;
if(is_dir($_SERVER["DOCUMENT_ROOT"]."/".$file))
continue;
if(substr($file, strlen($file) - 6, 6) == "tar.gz" || substr($file, strlen($file) - 3, 3) == "tar")
$arc .= "