Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- # define('VMBITRIX', 'defined');
- error_reporting(E_ALL & ~E_NOTICE);
- if (version_compare(phpversion(),'5.0.0','<'))
- die('PHP5 is required');
- if (($i = ini_get('short_open_tag')) == 0 || strtolower($i) == 'off')
- die('PHP parameter "short_open_tag" must be turned ON');
- ?><?
- 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" => "
- <p>
- <ul>
- <li>Перейдите в административную панель своего сайта на страницу <b>Настройки > Инструменты > Резервное копирование</b>
- <li>Создайте полную резервную копию, которая будет включать <b>публичную часть</b>, <b>ядро</b> и <b>базу данных</b>
- </ul>
- <b>Документация:</b> <a href='http://dev.1c-bitrix.ru/api_help/main/going_remote.php' target='_blank'>http://dev.1c-bitrix.ru/api_help/main/going_remote.php</a>
- </p>
- ",
- "ARC_DOWN" => "Скачать архив с дальнего сайта",
- "DB_SELECT" => "Выберите дамп БД:",
- "DB_SETTINGS" => "Данные для подключения к базе данных",
- "DB_DEF" => "по умолчанию для выделенного сервера или виртуальной машины",
- "DB_ENV" => "восстановление в "Битрикс: Веб-окружение"",
- "DB_OTHER" => "установить значения вручную",
- "ARC_DOWN_SITE" => "адрес сайта (www.site.ru):",
- "DELETE_FILES" => "Удалить архив и служебные скрипты",
- "ARC_DOWN_NAME" => "имя архива (2010-09-20.12-43-39.a269376c.tar.gz):",
- "OR" => "ИЛИ",
- "ARC_DOWN_URL" => "прямой URL архива (http://site.ru/2010-09-20.12-43-39.a269376c.tar.gz):",
- "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" => "Ошибка создания базы",
- "FINISH" => "Операция выполнена успешно",
- "FINISH_MSG" => "Операция восстановления системы завершена.",
- "EXTRACT_FINISH_TITLE" => "Распаковка архива",
- "EXTRACT_FINISH_MSG" => "Распаковка архива завершена.",
- "BASE_CREATE_DB" => "Создать базу данных",
- "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" => "
- <p>
- <ul>
- <li>Step 1. Open Control Panel section of your old site and select <b>Settings > Tools > Backup</b>
- <li>Create full archive which contains <b>public site files</b>, <b>kernel files</b> and <b>database dump</b>
- </ul>
- <b>Documentation:</b> <a href='http://www.bitrixsoft.com/support/training/course/lesson.php?COURSE_ID=12&ID=441' target='_blank'>learning course</a>
- </p>
- ",
- "ARC_DOWN" => "Download from remote server",
- "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",
- "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 (http://www.site.com/2010-09-20.12-43-39.a269376c.tar.gz):",
- "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",
- "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",
- "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"] = "Обновлено успешно. <a href='?'>Открыть</a>.";
- $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. <a href='?'>Open</a>.";
- $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, 0))
- {
- if (rename($_SERVER['DOCUMENT_ROOT'].'/'.$tmp_name,__FILE__))
- {
- bx_accelerator_reset();
- echo '<script>document.location="?lang='.LANG.'";</script>'.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 = 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);
- else
- {
- $res = 2;
- SetCurrentProgress(0);
- }
- if (!$res)
- {
- $ar = array(
- 'TITLE' => LoaderGetMessage('LOADER_SUBTITLE1_ERR'),
- 'TEXT' => nl2br($strLog),
- 'BOTTOM' => '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '
- );
- html($ar);
- die();
- }
- elseif ($res==2) // частичная закачка
- {
- $text = getMsg('ARC_DOWN_PROCESS').' <b>'.htmlspecialchars($arc_name).'</b>' . $status .
- '<input type=hidden name=Step value=2>'.
- '<input type=hidden name=source value=download>'.
- '<input type=hidden name=continue value=Y>'.
- '<input type=hidden name=arc_down_url value="'.htmlspecialchars($url).'">';
- }
- else
- {
- $tar = new CTar;
- $next_arc_name = $tar->getNextName($arc_name);
- $next_url = str_replace($arc_name, $next_arc_name, $url);
- $res = LoadFile($next_url,$next_arc_name);
- if ($res != false)
- {
- $text = getMsg('ARC_DOWN_PROCESS').' <b>'.htmlspecialchars($next_arc_name).'</b>' . $status .
- '<input type=hidden name=Step value=2>'.
- '<input type=hidden name=source value=download>'.
- '<input type=hidden name=continue value=Y>'.
- '<input type=hidden name=arc_down_url value="'.htmlspecialchars($next_url).'">';
- }
- else
- {
- $text = $status .
- '<input type=hidden name=Step value=2>'.
- '<input type=hidden name=arc_name value="'.htmlspecialchars(preg_replace('#\.[0-9]+$#','',$arc_name)).'">';
- }
- }
- $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
- showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text,$bottom);
- ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
- 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 =
- '<input type=hidden name=Step value=2>'.
- '<input type=hidden name=arc_name value="'.($arc_name).'">';
- showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text);
- ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
- die();
- }
- else
- {
- $ar = array(
- 'TITLE' => getMsg('ERR_EXTRACT'),
- 'TEXT' => getMsg('ERR_UPLOAD'),
- 'BOTTOM' => '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '
- );
- html($ar);
- die();
- }
- }
- }
- elseif($Step == 3)
- {
- $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);
- if(!$oDB->Connect())
- {
- $strErrMsg = $oDB->getError();
- $Step = 2;
- $bSelectDumpStep = true;
- }
- }
- if(!$Step)
- {
- $ar = array(
- 'TITLE' => getMsg("TITLE0", LANG),
- 'TEXT' =>
- ($strErrMsg ? '<div style="color:red;padding:10px;border:1px solid red">'.$strErrMsg.'</div>' : '').
- getMsg('BEGIN') .
- '<br>' .
- (file_exists($img = 'images/dump'.(LANG=='ru'?'_ru':'').'.png') ? '<img src="'.$img.'">' : ''),
- 'BOTTOM' =>
- (defined('VMBITRIX') ? '<input type=button value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/\'"> ' : '').
- '<input type="button" value="'.getMsg("BUT_TEXT1", LANG).'" onClick="reloadPage(1,\''.LANG.'\')">'
- );
- html($ar);
- }
- elseif($Step == 1)
- {
- $ar = array(
- 'TITLE' => getMsg("TITLE1", LANG),
- 'TEXT' =>'
- <div class=t_div>
- <input type=radio name=source value=download id=val1 onclick="div_show(1)"><label for=val1>'.getMsg("ARC_DOWN", LANG).'</label>
- <div id=div1 class="div-tool" style="display:none" align="right">
- '.getMsg("ARC_DOWN_SITE").' <input name=arc_down_site size=20><br>
- '.getMsg("ARC_DOWN_NAME").' <input name=arc_down_name size=20><br>
- '.getMsg("OR").'<br>
- '.getMsg("ARC_DOWN_URL").' <input name=arc_down_url size=40><br>
- </div>
- </div>
- <div class=t_div>
- <input type=radio name=source value=upload id=val2 onclick="div_show(2)"><label for=val2>'. getMsg("ARC_LOCAL", LANG).'</label>
- <div id=div2 class="div-tool" style="display:none">
- <input type=file name=archive size=40>
- </div>
- </div>
- <div class=t_div>
- <input type=radio name=source value=local id=val3 onclick="div_show(3)"><label for=val3>'.getMsg("ARC_NAME", LANG).'</label>
- <div id=div3 class="div-tool" style="display:none">'
- .(
- strlen($option = getArcList())
- ?
- '<select class="selectitem" name="arc_name">'.$option.'</select>'
- :
- '<span style="color:#999999">'.getMsg('NO_FILES', LANG).'</span>'
- ).
- '</div>'.
- ($option === false ? '<div style="color:red">'.getMsg('NO_READ_PERMS', LANG).'</div>' : '').
- '</div>'.
- '<div class=t_div>'.
- '<input type=radio name=source value=dump id=val4 onclick="div_show(4)"><label for=val4>'.getMsg("ARC_SKIP", LANG).'</label>
- <div id=div4 class="div-tool" style="display:none;color:#999999">'.getMsg('ARC_SKIP_DESC').'</div>
- </div>'
- ,
- 'BOTTOM' =>
- '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
- '<input type="button" class="selectitem" id="start_button" value="'.getMsg("BUT_TEXT1", LANG).'" onClick="reloadPage(2,\''.LANG.'\')">'
- );
- html($ar);
- ?>
- <script>
- function div_show(i)
- {
- document.getElementById('div1').style.display='none';
- document.getElementById('div2').style.display='none';
- document.getElementById('div3').style.display='none';
- document.getElementById('div4').style.display='none';
- document.getElementById('div'+i).style.display='block';
- }
- </script>
- <style type="text/css">
- .div-tool
- {
- border:1px solid #CCCCCC;
- padding:10px;
- }
- .t_div
- {
- padding:5px;
- }
- </style>
- <?
- }
- elseif($Step == 2)
- {
- if(!$bSelectDumpStep)
- {
- $tar = new CTarRestore;
- $tar->path = $_SERVER['DOCUMENT_ROOT'];
- $tar->ReadBlockCurrent = intval($_REQUEST['ReadBlockCurrent']);
- $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
- if ($tar->openRead($_SERVER['DOCUMENT_ROOT'].'/'.$arc_name))
- {
- $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('<br>',$tar->err), $bottom);
- elseif ($r === 0) // Finish
- $bSelectDumpStep = true;
- else
- {
- SetCurrentProgress(($tar->BlockHeader + $tar->ReadBlockCurrent) * 512,$DataSize, $red=false);
- $text = $status .
- '<input type="hidden" name="Block" value="'.$tar->BlockHeader.'">'.
- '<input type="hidden" name="ReadBlockCurrent" value="'.$tar->ReadBlockCurrent.'">'.
- '<input type="hidden" name="DataSize" value="'.$DataSize.'">'.
- '<input type="hidden" name="arc_name" value="'.$arc_name.'">';
- showMsg(getMsg('TITLE_PROCESS1'),$text,$bottom);
- ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
- }
- $tar->close();
- }
- else
- showMsg(getMsg("ERR_EXTRACT", LANG), implode('<br>',$tar->err),$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').'<br><br>'.$strErrMsg;
- elseif (!$bUTF_conf && $bUTF_serv)
- $strErrMsg = getMsg('UTF8_ERROR2').'<br><br>'.$strErrMsg;
- }
- $arDName = getDumpList();
- $strDName = '';
- foreach($arDName as $db)
- $strDName .= '<option value="'.htmlspecialchars($db).'">'.htmlspecialchars($db).'</option>';
- if(count($arDName))
- {
- $ar = array(
- 'TITLE' => getMsg("TITLE2", LANG),
- 'TEXT' =>
- ($strErrMsg ? '<div style="color:red">'.$strErrMsg.'</div>' : '').
- '<input type="hidden" name="arc_name" value="'.$arc_name.'">'.
- (count($arDName)>1
- ?
- getMsg("DB_SELECT").' <select class="selectitem" name="dump_name">'.$strDName.'</select>'
- :
- '<input type=hidden name=dump_name value="'.htmlspecialchars($arDName[0]).'">'
- ) .
- '<p align=center><b>'.getMsg("DB_SETTINGS", LANG).'</b></p>'.
- '<p><input type=radio name=db_settings value=default id=default onClick="s_display(0)" '.((!$_REQUEST['db_settings'] && defined('VMBITRIX') || $_REQUEST['db_settings']=='default')?'checked':'').'><label for=default>'.getMsg("DB_DEF").'</label></p>
- <p><input type=radio name=db_settings value=env id=env onClick="s_display(0)" '.($_REQUEST['db_settings']=='env'?'checked':'').'><label for=env>'.getMsg("DB_ENV").'</label></p>
- <p><input type=radio name=db_settings value=custom id=custom onClick="s_display(1)" '.($_REQUEST['db_settings']=='custom'?'checked':'').'><label for=custom>'.getMsg("DB_OTHER").'</label></p>
- <div style="border:1px solid #aeb8d7;padding:5px;'.($_REQUEST['db_settings']=='custom'?'':'display:none').'" id=settings>
- <table width=100% cellspacing=0 cellpadding=2 border=0>
- <tr><td class="tablebody1" align=right>'. getMsg("BASE_HOST", LANG).'</td><td><input type="text" class="selectitem" name="db_host" id="db_host_id" value="'.(strlen($_REQUEST["db_host"])>0 ? htmlspecialchars($_REQUEST['db_host']) : "localhost").'"></td></tr>
- <tr><td class="tablebody1" align=right>'. getMsg("USER_NAME", LANG).'</td><td><input type="text" class="selectitem" name="db_user" id="db_user_id" value="'.(strlen($_REQUEST["db_user"])>0 ? htmlspecialchars($_REQUEST["db_user"]) : "").'"></td></tr>
- <tr><td class="tablebody1" align=right>'. getMsg("USER_PASS", LANG).'</td><td><input type="password" class="selectitem" name="db_pass" id="db_pass_id" value="'.(strlen($_REQUEST["db_pass"])>0 ? htmlspecialchars($_REQUEST["db_pass"]) : "").'"></td></tr>
- <tr><td class="tablebody1" align=right>'. getMsg("BASE_NAME", LANG).'</td><td><input type="text" class="selectitem" name="db_name" id="db_name_id" value="'.(strlen($_REQUEST["db_name"])>0 ? htmlspecialchars($_REQUEST["db_name"]) : "").'"></td></tr>
- <tr><td class="tablebody1" align=right>'. getMsg("BASE_CREATE_DB", LANG).'</td><td><input type="checkbox" name="create_db" id="create_db_id" value="Y" '.($_REQUEST["create_db"]=="Y" ? "checked" : "").'></td></tr>
- </table>
- </div>'
- ,
- 'BOTTOM' =>
- '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
- '<input type="button" class="selectitem" id="start_button" value="'.getMsg("BASE_RESTORE", LANG).'" onClick="reloadPage(3, \''. LANG.'\')">'
- );
- html($ar);
- ?>
- <script>
- function s_display(val)
- {
- document.getElementById('settings').style.display = (val ? 'block' : 'none');
- }
- </script>
- <?
- }
- else
- {
- $text =
- ($strErrMsg ? '<div style="color:red">'.$strErrMsg.'</div>' : '').
- (file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? '<div style="color:red">'.getMsg('HTACCESS_WARN').'</div>' : '') .
- getMsg("EXTRACT_FINISH_MSG", LANG) . '
- <input type="hidden" name="arc_name" value="'.$arc_name.'">
- <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">';
- $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
- '<input type=button value="'.getMsg('DELETE_FILES').'" onClick="reloadPage(4)">';
- 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($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 = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
- 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 . '
- <input type="hidden" name="arc_name" value="'.htmlspecialchars($arc_name).'">
- <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">
- <input type="hidden" name="d_pos" id="d_pos_id" value="'.$d_pos.'">
- <input type="hidden" name="db_user" id="db_user_id" value="'.htmlspecialchars($_REQUEST["db_user"]).'">
- <input type="hidden" name="db_pass" id="db_pass_id" value="'. (strlen($_REQUEST["db_pass"]) > 0 ? htmlspecialchars($_REQUEST["db_pass"]) : "").'">
- <input type="hidden" name="db_name" id="db_name_id" value="'. htmlspecialchars($_REQUEST["db_name"]).'">
- <input type="hidden" name="db_host" id="db_host_id" value="'. htmlspecialchars($_REQUEST["db_host"]).'">
- ';
- showMsg(getMsg('TITLE_PROCESS2'),$text,$bottom);
- ?><script>reloadPage(3, '<?= LANG?>', 1);</script><?
- }
- else
- {
- if($oDB->getError() != "")
- showMsg(getMsg("ERR_DUMP_RESTORE", LANG), '<div style="color:red">'.$oDB->getError().'</div>', $bottom);
- else
- {
- $rs = $oDB->Query('SELECT DOC_ROOT FROM b_lang WHERE DOC_ROOT IS NOT NULL AND DOC_ROOT != ""');
- $text = getMsg("FINISH_MSG", LANG) .
- (mysql_fetch_array($rs) ? '<div style="color:red">'.getMsg('DOC_ROOT_WARN').'</div>' : '') .
- (file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? '<div style="color:red">'.getMsg('HTACCESS_WARN').'</div>' : '') .
- '<input type="hidden" name="arc_name" value="'.htmlspecialchars($arc_name).'">
- <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">';
- $bottom = '<input type=button value="'.getMsg('DELETE_FILES').'" onClick="reloadPage(4)">';
- 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));
- ?><script>window.setTimeout(function(){document.location="/";},3000);</script><?
- }
- }
- #################### 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 .= "<br><font color=#ff0000>Error! ".$s."('-', '-', '-')</font><br>".$str_err."<br>";
- return false;
- }
- $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 (@$_REQUEST["create_db"]=="Y")
- {
- if(!@mysql_query("CREATE DATABASE ".@$_REQUEST["db_name"], $this->db_Conn))
- {
- $this->db_Error = getMsg("ERR_CREATE_DB", LANG).': '.mysql_error();
- return false;
- }
- }
- if(!mysql_select_db($this->DBName, $this->db_Conn))
- {
- if(($str_err = mysql_error($this->db_Conn)) != "")
- $this->db_Error = "<br><font color=#ff0000>Error! mysql_select_db($this->DBName)</font><br>".$str_err."<br>";
- 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().'<br><br>'.htmlspecialchars($sql);
- return false;
- }
- $sql = "";
- }
- if($sql != "")
- {
- $result = @mysql_query($sql, $this->db_Conn);
- if(!$result)
- {
- $this->db_Error .= mysql_error().'<br><br>'.htmlspecialchars($sql);
- return false;
- }
- $sql = "";
- }
- 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 = "";
- $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 .= "<option value=\"$file\"> ".$file;
- }
- return $arc;
- }
- function showMsg($title, $msg, $bottom='')
- {
- $ar = array(
- 'TITLE' => $title,
- 'TEXT' => $msg,
- 'BOTTOM' => $bottom
- );
- html($ar);
- }
- function html($ar)
- {
- ?>
- <html>
- <head>
- <title><?=$ar['TITLE']?></title>
- </head>
- <body style="background:#4A507B">
- <style>
- td {font-family:Verdana;font-size:9pt}
- </style>
- <form name="restore" id="restore" action="restore.php" enctype="multipart/form-data" method="POST">
- <input type="hidden" name="Step" id="Step_id" value="">
- <input type="hidden" name="lang" value="<?=LANG?>">
- <script language="JavaScript">
- function reloadPage(val, lang, delay)
- {
- document.getElementById('Step_id').value = val;
- document.getElementById('restore').action='restore.php?lang=<?=LANG?>';
- if (null!=delay)
- window.setTimeout("document.getElementById('restore').submit()",1000);
- else
- document.getElementById('restore').submit();
- }
- </script>
- <table width=100% height=100%><tr><td align=center valign=middle>
- <table align="center" cellspacing=0 cellpadding=0 border=0 style="width:601px;height:387px">
- <tr>
- <td width=11><div style="background:#FFF url(<?=img('corner_top_left.gif')?>);width:11px;height:57px"></td>
- <td height=57 bgcolor="#FFFFFF" valign="middle">
- <table cellpadding=0 cellspacing=0 border=0 width=100%><tr>
- <td align=left style="font-size:14pt;color:#E11537;padding-left:25px"><?=$ar['TITLE']?></td>
- <td align=right>
- <?
- $arLang = array();
- foreach(array('en') as $l)
- $arLang[] = LANG == $l ? "<span style='color:grey'>$l</span>" : "<a href='?lang=$l' style='color:black'>$l</a>";
- # echo implode(' | ',$arLang);
- ?>
- </td>
- </tr></table>
- </td>
- <td width=11><div style="background:#FFF url(<?=img('corner_top_right.gif')?>);width:11px;height:57px"></td>
- </tr>
- <tr>
- <td bgcolor="#FFFFFF"> </td>
- <td height=1 bgcolor="#FFFFFF"><hr size="1px" color="#D6D6D6"></td>
- <td bgcolor="#FFFFFF"> </td>
- </tr>
- <tr>
- <td bgcolor="#FFFFFF"> </td>
- <td bgcolor="#FFFFFF" style="padding:10px;font-size:10pt" valign="<?=$ar['TEXT_ALIGN']?$ar['TEXT_ALIGN']:'top'?>"><?=$ar['TEXT']?></td>
- <td bgcolor="#FFFFFF"> </td>
- </tr>
- <tr>
- <td bgcolor="#FFFFFF"> </td>
- <td bgcolor="#FFFFFF" style="padding:20x;font-size:10pt" valign="middle" align="right" height="40px"><?=$ar['BOTTOM']?></td>
- <td bgcolor="#FFFFFF"> </td>
- </tr>
- <tr>
- <td><div style="background:#FFF url(<?=img('corner_bottom_left.gif')?>);width:11;height:23"></td>
- <td height=23 bgcolor="#FFFFFF" background="<?=img('bottom_fill.gif')?>"></td>
- <td><div style="background:#FFF url(<?=img('corner_bottom_right.gif')?>);width:11;height:23"></td>
- </tr>
- </table>
- <div style="background:url(<?=img('logo_'.(LANG=='ru'?'':'en_').'installer.gif')?>); width:95; height:34">
- </td></tr></table>
- </form>
- <?
- }
- function SetCurrentProgress($cur,$total=0,$red=true)
- {
- global $status;
- if (!$total)
- {
- $total=100;
- $cur=0;
- }
- $val = intval($cur/$total*100);
- if ($val > 100)
- $val = 99;
- $status = '
- <div align=center style="padding:10px;font-size:18px">'.$val.'%</div>
- <table width=100% cellspacing=0 cellpadding=0 border=0 style="border:1px solid #D8D8D8">
- <tr>
- <td style="width:'.$val.'%;height:13px" bgcolor="'.($red?'#FF5647':'#54B4FF').'" background="'.img(($red?'red':'blue').'_progress.gif').'"></td>
- <td style="width:'.(100-$val).'%"></td>
- </tr>
- </table>';
- }
- function LoadFile($strRequestedUrl, $strFilename)
- {
- global $proxyaddr, $proxyport, $strUserAgent, $strRequestedSize;
- $strRealUrl = $strRequestedUrl;
- $iStartSize = 0;
- $iRealSize = 0;
- $bCanContinueDownload = False;
- // ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА
- $strRealUrl_tmp = "";
- $iRealSize_tmp = 0;
- if (file_exists($strFilename.".tmp") && file_exists($strFilename.".log") && filesize($strFilename.".log")>0)
- {
- $fh = fopen($strFilename.".log", "rb");
- $file_contents_tmp = fread($fh, filesize($strFilename.".log"));
- fclose($fh);
- list($strRealUrl_tmp, $iRealSize_tmp) = explode("\n", $file_contents_tmp);
- $strRealUrl_tmp = Trim($strRealUrl_tmp);
- $iRealSize_tmp = doubleval(Trim($iRealSize_tmp));
- }
- if ($iRealSize_tmp<=0 || strlen($strRealUrl_tmp)<=0)
- {
- $strRealUrl_tmp = "";
- $iRealSize_tmp = 0;
- if (file_exists($strFilename.".tmp"))
- @unlink($strFilename.".tmp");
- if (file_exists($strFilename.".log"))
- @unlink($strFilename.".log");
- }
- else
- {
- $strRealUrl = $strRealUrl_tmp;
- $iRealSize = $iRealSize_tmp;
- $iStartSize = filesize($strFilename.".tmp");
- }
- // КОНЕЦ: ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА
- //SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_SERVER"));
- SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST")));
- // ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО
- do
- {
- SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_QUERY_DISTR")));
- $lasturl = $strRealUrl;
- $redirection = "";
- $parsedurl = @parse_url($strRealUrl);
- $useproxy = (($proxyaddr != "") && ($proxyport != ""));
- if (!$useproxy)
- {
- $host = $parsedurl["host"];
- $port = $parsedurl["port"];
- $hostname = $host;
- }
- else
- {
- $host = $proxyaddr;
- $port = $proxyport;
- $hostname = $parsedurl["host"];
- }
- $port = $port ? $port : "80";
- $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10);
- if (!$sockethandle)
- {
- SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg);
- return false;
- }
- else
- {
- if (!$parsedurl["path"])
- $parsedurl["path"] = "/";
- // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE"));
- $request = "";
- if (!$useproxy)
- {
- $request .= "HEAD ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n";
- $request .= "Host: $hostname\r\n";
- }
- else
- {
- $request .= "HEAD ".$strRealUrl." HTTP/1.0\r\n";
- $request .= "Host: $hostname\r\n";
- }
- if ($strUserAgent != "")
- $request .= "User-Agent: $strUserAgent\r\n";
- $request .= "\r\n";
- fwrite($sockethandle, $request);
- $result = "";
- // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT"));
- $replyheader = "";
- while (($result = fgets($sockethandle, 4096)) && $result!="\r\n")
- {
- $replyheader .= $result;
- }
- fclose($sockethandle);
- $ar_replyheader = explode("\r\n", $replyheader);
- $replyproto = "";
- $replyversion = "";
- $replycode = 0;
- $replymsg = "";
- if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs))
- {
- $replyproto = $regs[1];
- $replyversion = $regs[2];
- $replycode = IntVal($regs[3]);
- $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1);
- }
- if ($replycode!=200 && $replycode!=302)
- {
- if ($replycode==403)
- SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER1")));
- else
- SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER")));
- return false;
- }
- $strLocationUrl = "";
- $iNewRealSize = 0;
- $strAcceptRanges = "";
- for ($i = 1; $i < count($ar_replyheader); $i++)
- {
- if (strpos($ar_replyheader[$i], "Location") !== false)
- $strLocationUrl = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
- elseif (strpos($ar_replyheader[$i], "Content-Length") !== false)
- $iNewRealSize = IntVal(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)));
- elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false)
- $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
- }
- if (strlen($strLocationUrl)>0)
- {
- $redirection = $strLocationUrl;
- $redirected = true;
- if ((strpos($redirection, "http://")===false))
- $strRealUrl = dirname($lasturl)."/".$redirection;
- else
- $strRealUrl = $redirection;
- }
- if (strlen($strLocationUrl)<=0)
- break;
- }
- }
- while (true);
- // КОНЕЦ: ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО
- $bCanContinueDownload = ($strAcceptRanges == "bytes");
- // ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ
- if (!$bCanContinueDownload
- || ($iRealSize>0 && $iNewRealSize != $iRealSize))
- {
- // SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD"));
- // $iStartSize = 0;
- die(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD"));
- }
- // КОНЕЦ: ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ
- // ЕСЛИ МОЖНО ДОКАЧИВАТЬ
- if ($bCanContinueDownload)
- {
- $fh = fopen($strFilename.".log", "wb");
- if (!$fh)
- {
- SetCurrentStatus(str_replace("#FILE#", $strFilename.".log", LoaderGetMessage("LOADER_LOAD_NO_WRITE2FILE")));
- return false;
- }
- fwrite($fh, $strRealUrl."\n");
- fwrite($fh, $iNewRealSize."\n");
- fclose($fh);
- }
- // КОНЕЦ: ЕСЛИ МОЖНО ДОКАЧИВАТЬ
- SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_LOAD_DISTR")));
- $strRequestedSize = $iNewRealSize;
- // КАЧАЕМ ФАЙЛ
- $parsedurl = parse_url($strRealUrl);
- $useproxy = (($proxyaddr != "") && ($proxyport != ""));
- if (!$useproxy)
- {
- $host = $parsedurl["host"];
- $port = $parsedurl["port"];
- $hostname = $host;
- }
- else
- {
- $host = $proxyaddr;
- $port = $proxyport;
- $hostname = $parsedurl["host"];
- }
- $port = $port ? $port : "80";
- SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST")));
- $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10);
- if (!$sockethandle)
- {
- SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg);
- return false;
- }
- else
- {
- if (!$parsedurl["path"])
- $parsedurl["path"] = "/";
- SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE"));
- $request = "";
- if (!$useproxy)
- {
- $request .= "GET ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n";
- $request .= "Host: $hostname\r\n";
- }
- else
- {
- $request .= "GET ".$strRealUrl." HTTP/1.0\r\n";
- $request .= "Host: $hostname\r\n";
- }
- if ($strUserAgent != "")
- $request .= "User-Agent: $strUserAgent\r\n";
- if ($bCanContinueDownload && $iStartSize>0)
- $request .= "Range: bytes=".$iStartSize."-\r\n";
- $request .= "\r\n";
- fwrite($sockethandle, $request);
- $result = "";
- SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT"));
- $replyheader = "";
- while (($result = fgets($sockethandle, 4096)) && $result!="\r\n")
- $replyheader .= $result;
- $ar_replyheader = explode("\r\n", $replyheader);
- $replyproto = "";
- $replyversion = "";
- $replycode = 0;
- $replymsg = "";
- if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs))
- {
- $replyproto = $regs[1];
- $replyversion = $regs[2];
- $replycode = IntVal($regs[3]);
- $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1);
- }
- if ($replycode!=200 && $replycode!=302 && $replycode!=206)
- {
- SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER")));
- return false;
- }
- $strContentRange = "";
- $iContentLength = 0;
- $strAcceptRanges = "";
- for ($i = 1; $i < count($ar_replyheader); $i++)
- {
- if (strpos($ar_replyheader[$i], "Content-Range") !== false)
- $strContentRange = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
- elseif (strpos($ar_replyheader[$i], "Content-Length") !== false)
- $iContentLength = doubleval(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)));
- elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false)
- $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
- }
- $bReloadFile = True;
- if (strlen($strContentRange)>0)
- {
- if (preg_match("# *bytes +([0-9]*) *- *([0-9]*) */ *([0-9]*)#i", $strContentRange, $regs))
- {
- $iStartBytes_tmp = doubleval($regs[1]);
- $iEndBytes_tmp = doubleval($regs[2]);
- $iSizeBytes_tmp = doubleval($regs[3]);
- if ($iStartBytes_tmp==$iStartSize
- && $iEndBytes_tmp==($iNewRealSize-1)
- && $iSizeBytes_tmp==$iNewRealSize)
- {
- $bReloadFile = False;
- }
- }
- }
- if ($bReloadFile)
- {
- @unlink($strFilename.".tmp");
- $iStartSize = 0;
- }
- if (($iContentLength+$iStartSize)!=$iNewRealSize)
- {
- SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_ERR_SIZE"));
- return false;
- }
- $fh = fopen($strFilename.".tmp", "ab");
- if (!$fh)
- {
- SetCurrentStatus(str_replace("#FILE#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE")));
- return false;
- }
- $bFinished = True;
- $downloadsize = (double) $iStartSize;
- SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_LOADING"));
- while (!feof($sockethandle))
- {
- if (!haveTime())
- {
- $bFinished = False;
- break;
- }
- $result = fread($sockethandle, 40960);
- $downloadsize += strlen($result);
- if ($result=="")
- break;
- fwrite($fh, $result);
- }
- SetCurrentProgress($downloadsize,$iNewRealSize);
- fclose($fh);
- fclose($sockethandle);
- if ($bFinished)
- {
- @unlink($strFilename);
- if (!@rename($strFilename.".tmp", $strFilename))
- {
- SetCurrentStatus(str_replace("#FILE2#", $strFilename, str_replace("#FILE1#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_ERR_RENAME"))));
- return false;
- }
- }
- else
- return 2;
- SetCurrentStatus(str_replace("#SIZE#", $downloadsize, str_replace("#FILE#", $strFilename, LoaderGetMessage("LOADER_LOAD_FILE_SAVED"))));
- @unlink($strFilename.".log");
- return 1;
- }
- // КОНЕЦ: КАЧАЕМ ФАЙЛ
- }
- function SetCurrentStatus($str)
- {
- global $strLog;
- $strLog .= $str."\n";
- }
- function LoaderGetMessage($name)
- {
- global $MESS;
- return $MESS[$name];
- }
- class CTar
- {
- var $gzip;
- var $file;
- var $err = array();
- var $res;
- var $Block = 0;
- var $BlockHeader;
- var $path;
- var $FileCount = 0;
- var $DirCount = 0;
- var $ReadBlockMax = 2000;
- var $ReadBlockCurrent = 0;
- var $header = null;
- var $ArchiveSizeMax;
- var $BX_EXTRA = 'BX0000';
- ##############
- # READ
- # {
- function openRead($file)
- {
- if (!isset($this->gzip) && (substr($file,-3)=='.gz' || substr($file,-4)=='.tgz'))
- $this->gzip = true;
- return $this->open($file, 'r');
- }
- function readBlock()
- {
- $str = $this->gzip ? gzread($this->res,512) : fread($this->res,512);
- if (!$str && $this->openNext())
- $str = $this->gzip ? gzread($this->res,512) : fread($this->res,512);
- if ($str)
- $this->Block++;
- return $str;
- }
- function SkipFile()
- {
- $this->Skip(ceil($this->header['size']/512));
- $this->header = null;
- }
- function Skip($Block = 0)
- {
- if (!$Block)
- return false;
- $pos = $this->gzip ? gztell($this->res) : ftell($this->res);
- if (file_exists($this->getNextName()))
- {
- while(($BlockLeft = ($this->getArchiveSize($this->file) - $pos)/512) < $Block)
- {
- if ($BlockLeft != floor($BlockLeft))
- return false; // invalid file size
- $this->Block += $BlockLeft;
- $Block -= $BlockLeft;
- if (!$this->openNext())
- return false;
- $pos = 0;
- }
- }
- $this->Block += $Block;
- return 0 === ($this->gzip ? gzseek($this->res,$pos + $Block*512) : fseek($this->res,$pos + $Block*512));
- }
- function readHeader($Long = false)
- {
- $str = '';
- while(trim($str) == '')
- if (!strlen($str = $this->readBlock()))
- return 0; // finish
- if (!$Long)
- $this->BlockHeader = $this->Block - 1;
- if (strlen($str)!=512)
- return $this->Error('TAR_WRONG_BLOCK_SIZE',$this->Block.' ('.strlen($str).')');
- $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1type/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $str);
- $chk = $data['devmajor'].$data['devminor'];
- if (!is_numeric(trim($data['checksum'])) || $chk!='' && $chk!=0)
- return $this->Error('TAR_ERR_FORMAT',($this->Block-1).'<hr>Header: <br>'.htmlspecialchars($str)); // быстрая проверка
- $header['filename'] = trim($data['prefix'].'/'.$data['filename'],'/');
- $header['mode'] = OctDec($data['mode']);
- $header['uid'] = OctDec($data['uid']);
- $header['gid'] = OctDec($data['gid']);
- $header['size'] = OctDec($data['size']);
- $header['mtime'] = OctDec($data['mtime']);
- $header['type'] = $data['type'];
- // $header['link'] = $data['link'];
- if (strpos($header['filename'],'./')===0)
- $header['filename'] = substr($header['filename'],2);
- if ($header['type']=='L') // Long header
- {
- $n = ceil($header['size']/512);
- for ($i = 0; $i < $n; $i++)
- $filename .= $this->readBlock();
- $header = $this->readHeader($Long = true);
- $header['filename'] = substr($filename,0,strpos($filename,chr(0)));
- }
- if (substr($header['filename'],-1)=='/') // trailing slash
- $header['type'] = 5; // Directory
- if ($header['type']=='5')
- $header['size'] = '';
- if ($header['filename']=='')
- return $this->Error('TAR_EMPTY_FILE',($this->Block-1));
- if (!$this->checkCRC($str, $data))
- return $this->Error('TAR_ERR_CRC',htmlspecialchars($header['filename']));
- $this->header = $header;
- return $header;
- }
- function checkCRC($str, $data)
- {
- $checksum = $this->checksum($str);
- $res = octdec($data['checksum']) == $checksum || $data['checksum']===0 && $checksum==256;
- # if (!$res)
- # var_dump(octdec($data['checksum']) .'=='. $checksum);
- return $res;
- }
- function extractFile()
- {
- if ($this->header === null)
- {
- if(($header = $this->readHeader()) === false || $header === 0 || $header === true)
- {
- if ($header === true)
- $this->SkipFile();
- return $header;
- }
- $this->lastPath = $f = $this->path.'/'.$header['filename'];
- if ($this->ReadBlockCurrent == 0)
- {
- if ($header['type']==5) // dir
- {
- if(!file_exists($f) && !self::xmkdir($f))
- return $this->Error('TAR_ERR_FOLDER_CREATE',htmlspecialchars($f));
- //chmod($f, $header['mode']);
- }
- else // file
- {
- if (!self::xmkdir($dirname = dirname($f)))
- return $this->Error('TAR_ERR_FOLDER_CREATE'.htmlspecialchars($dirname));
- elseif (($rs = fopen($f, 'wb'))===false)
- return $this->Error('TAR_ERR_FILE_CREATE',htmlspecialchars($f));
- }
- }
- else
- $this->Skip($this->ReadBlockCurrent);
- }
- else // файл уже частично распакован, продолжаем на том же хите
- {
- $header = $this->header;
- $this->lastPath = $f = $this->path.'/'.$header['filename'];
- }
- if ($header['type'] != 5) // пишем контент в файл
- {
- if (!$rs)
- {
- if (($rs = fopen($f, 'ab'))===false)
- return $this->Error('TAR_ERR_FILE_OPEN',htmlspecialchars($f));
- }
- $i = 0;
- $FileBlockCount = ceil($header['size'] / 512);
- while(++$this->ReadBlockCurrent <= $FileBlockCount && ($contents = $this->readBlock()))
- {
- if ($this->ReadBlockCurrent == $FileBlockCount && ($chunk = $header['size'] % 512))
- $contents = substr($contents, 0, $chunk);
- fwrite($rs,$contents);
- if ($this->ReadBlockMax && ++$i >= $this->ReadBlockMax)
- {
- fclose($rs);
- return true; // Break
- }
- }
- fclose($rs);
- //chmod($f, $header['mode']);
- if (($s=filesize($f)) != $header['size'])
- return $this->Error('TAR_ERR_FILE_SIZE',htmlspecialchars($header['filename']).' (real: '.$s.', expected: '.$header['size'].')');
- }
- if ($this->header['type']==5)
- $this->DirCount++;
- else
- $this->FileCount++;
- $this->debug_header = $this->header;
- $this->BlockHeader = $this->Block;
- $this->ReadBlockCurrent = 0;
- $this->header = null;
- return true;
- }
- function extract()
- {
- while ($r = $this->extractFile());
- return $r === 0;
- }
- function openNext()
- {
- if (file_exists($file = $this->getNextName()))
- {
- $this->close();
- return $this->open($file,$this->mode);
- }
- else
- return false;
- }
- # }
- ##############
- ##############
- # WRITE
- # {
- function openWrite($file)
- {
- if (!isset($this->gzip) && (substr($file,-3)=='.gz' || substr($file,-4)=='.tgz'))
- $this->gzip = true;
- if ($this->ArchiveSizeMax > 0)
- {
- while(file_exists($file1 = $this->getNextName($file)))
- $file = $file1;
- $size = 0;
- if (($size = $this->getArchiveSize($file)) >= $this->ArchiveSizeMax)
- {
- $file = $file1;
- $size = 0;
- }
- $this->ArchiveSizeCurrent = $size;
- }
- return $this->open($file, 'a');
- }
- // создадим пустой gzip с экстра полем
- function createEmptyGzipExtra($file)
- {
- if (file_exists($file))
- return false;
- if (!($f = gzopen($file,'wb')))
- return false;
- gzwrite($f,'');
- gzclose($f);
- $data = file_get_contents($file);
- if (!($f = fopen($file, 'w')))
- return false;
- $ar = unpack('A3bin0/A1FLG/A6bin1',substr($data,0,10));
- if ($ar['FLG'] != 0)
- return $this->Error('Error writing extra field: already exists');
- $EXTRA = chr(0).chr(0).chr(strlen($this->BX_EXTRA)).chr(0).$this->BX_EXTRA;
- fwrite($f,$ar['bin0'].chr(4).$ar['bin1'].chr(strlen($EXTRA)).chr(0).$EXTRA.substr($data,10));
- fclose($f);
- return true;
- }
- function writeBlock($str)
- {
- $l = strlen($str);
- if ($l!=512)
- return $this->Error('TAR_WRONG_BLOCK_SIZE'.$l);
- if ($this->ArchiveSizeMax && $this->ArchiveSizeCurrent >= $this->ArchiveSizeMax)
- {
- $file = $this->getNextName();
- $this->close();
- if (!$this->open($file,$this->mode))
- return false;
- $this->ArchiveSizeCurrent = 0;
- }
- if ($res = $this->gzip ? gzwrite($this->res, $str) : fwrite($this->res,$str))
- {
- $this->Block++;
- $this->ArchiveSizeCurrent+=512;
- }
- return $res;
- }
- function writeHeader($ar)
- {
- $header0 = pack("a100a8a8a8a12a12", $ar['filename'], decoct($ar['mode']), decoct($ar['uid']), decoct($ar['gid']), decoct($ar['size']), decoct($ar['mtime']));
- $header1 = pack("a1a100a6a2a32a32a8a8a155", $ar['type'],'','','','','','', '', $ar['prefix']);
- $checksum = pack("a8",decoct($this->checksum($header0.' '.$header1)));
- $header = pack("a512", $header0.$checksum.$header1);
- return $this->writeBlock($header) || $this->Error('TAR_ERR_WRITE_HEADER');
- }
- function addFile($f)
- {
- $f = str_replace('\\', '/', $f);
- $path = substr($f,strlen($this->path) + 1);
- if ($path == '')
- return true;
- if (strlen($path)>512)
- return $this->Error('TAR_PATH_TOO_LONG',htmlspecialchars($path));
- $ar = array();
- if (is_dir($f))
- {
- $ar['type'] = 5;
- $path .= '/';
- }
- else
- $ar['type'] = 0;
- $info = stat($f);
- if ($info)
- {
- if ($this->ReadBlockCurrent == 0) // read from start
- {
- $ar['mode'] = 0777 & $info['mode'];
- $ar['uid'] = $info['uid'];
- $ar['gid'] = $info['gid'];
- $ar['size'] = $ar['type']==5 ? 0 : $info['size'];
- $ar['mtime'] = $info['mtime'];
- if (strlen($path)>100) // Long header
- {
- $ar0 = $ar;
- $ar0['type'] = 'L';
- $ar0['filename'] = '././@LongLink';
- $ar0['size'] = strlen($path);
- if (!$this->writeHeader($ar0))
- return false;
- $path .= str_repeat(chr(0),512 - strlen($path));
- if (!$this->writeBlock($path))
- return false;
- $ar['filename'] = substr($path,0,100);
- }
- else
- $ar['filename'] = $path;
- if (!$this->writeHeader($ar))
- return false;
- }
- if ($ar['type']==0 && $info['size']>0) // File
- {
- if (!($rs = fopen($f, 'rb')))
- return $this->Error('TAR_ERR_FILE_READ',htmlspecialchars($f));
- if ($this->ReadBlockCurrent)
- fseek($rs, $this->ReadBlockCurrent * 512);
- $i = 0;
- while(!feof($rs) && $str = fread($rs,512))
- {
- $this->ReadBlockCurrent++;
- if (feof($rs) && ($l = strlen($str)) && $l < 512)
- $str .= str_repeat(chr(0),512 - $l);
- if (!$this->writeBlock($str))
- {
- fclose($rs);
- return $this->Error('TAR_ERR_FILE_WRITE',htmlspecialchars($f));
- }
- if ($this->ReadBlockMax && ++$i >= $this->ReadBlockMax)
- {
- fclose($rs);
- return true;
- }
- }
- fclose($rs);
- $this->ReadBlockCurrent = 0;
- }
- return true;
- }
- else
- return $this->Error('TAR_ERR_FILE_NO_ACCESS',htmlspecialchars($f));
- }
- # }
- ##############
- ##############
- # BASE
- # {
- function open($file, $mode='r')
- {
- $this->file = $file;
- $this->mode = $mode;
- if ($this->gzip)
- {
- if(!function_exists('gzopen'))
- return $this->Error('TAR_NO_GZIP');
- else
- {
- if ($mode == 'a' && !file_exists($file) && !$this->createEmptyGzipExtra($file))
- return false;
- $this->res = gzopen($file,$mode."b");
- }
- }
- else
- $this->res = fopen($file,$mode."b");
- return $this->res;
- }
- function close()
- {
- if ($this->gzip)
- {
- gzclose($this->res);
- // добавим фактический размер всех несжатых данных в extra поле
- if ($this->mode == 'a')
- {
- $f = fopen($this->file, 'rb+');
- # fseek($f, -4, SEEK_END);
- fseek($f, 18);
- fwrite($f, pack("V", $this->ArchiveSizeCurrent));
- fclose($f);
- }
- }
- else
- fclose($this->res);
- }
- function getNextName($file = '')
- {
- if (!$file)
- $file = $this->file;
- static $CACHE;
- $c = &$CACHE[$file];
- if (!$c)
- {
- $l = strrpos($file, '.');
- $num = substr($file,$l+1);
- if (is_numeric($num))
- $file = substr($file,0,$l+1).++$num;
- else
- $file .= '.1';
- $c = $file;
- }
- return $c;
- }
- function checksum($str)
- {
- static $CACHE;
- $checksum = &$CACHE[md5($str)];
- if (!$checksum)
- {
- // $str = pack("a512",$str);
- for ($i = 0; $i < 512; $i++)
- if ($i>=148 && $i<156)
- $checksum += 32; // ord(' ')
- else
- $checksum += ord($str[$i]);
- }
- return $checksum;
- }
- function getArchiveSize($file = '')
- {
- if (!$file)
- $file = $this->file;
- static $CACHE;
- $size = &$CACHE[$file];
- if (!$size)
- {
- if (!file_exists($file))
- $size = 0;
- else
- {
- if ($this->gzip)
- {
- $f = fopen($file, "rb");
- # fseek($f, -4, SEEK_END);
- fseek($f, 16);
- if (fread($f, 2) == 'BX')
- {
- $size = end(unpack("V", fread($f, 4)));
- fclose($f);
- }
- else
- {
- fclose($f);
- $size = filesize($file) * 3; // fake
- }
- }
- else
- $size = filesize($file);
- }
- }
- return $size;
- }
- function Error($err_code, $str = '')
- {
- // echo '<pre>';debug_print_backtrace();echo '</pre>';
- // echo '<pre>';print_r($this);echo '</pre>';
- if (is_array($this->debug_header))
- $str .= '<hr>Последний успешный файл: <br><pre>'.(htmlspecialchars(print_r($this->debug_header,1))).'</pre>';
- $this->err[] = self::getMsg($err_code).' '.$str;
- return false;
- }
- function xmkdir($dir)
- {
- if (!file_exists($dir))
- {
- $upper_dir = dirname($dir);
- if (!file_exists($upper_dir) && !self::xmkdir($upper_dir))
- return false;
- return mkdir($dir);
- }
- return is_dir($dir);
- }
- function getMsg($code)
- {
- if (function_exists('getMsg'))
- return getMsg($code);
- else
- return $code;
- }
- function __construct()
- {
- // $this->ArchiveSizeMax = 2000 * 1024 * 1024;
- $this->ArchiveSizeMax = 20 * 1024 * 1024;
- }
- # }
- ##############
- }
- class CTarRestore extends CTar
- {
- function readHeader($Long = false)
- {
- $header = parent::readHeader($Long);
- if (is_array($header))
- {
- $dr = str_replace(array('/','\\'),'',$_SERVER['DOCUMENT_ROOT']);
- $f = str_replace(array('/','\\'),'',$this->path.'/'.$header['filename']);
- if ($f == $dr.'restore.php')
- return true;
- elseif ($f == $dr.'.htaccess')
- $header['filename'] .= '.restore';
- elseif ($f == $dr.'bitrix.config.php')
- return file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/.config.php') ? true : $this->Error('NOT_SAAS_ENV');
- elseif ($this->Block == 1 && file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/.config.php'))
- return $this->Error('NOT_SAAS_DISTR');
- }
- return $header;
- }
- }
- function haveTime()
- {
- return microtime(true) - START_EXEC_TIME < STEP_TIME;
- }
- function img($name)
- {
- if (file_exists($_SERVER['DOCUMENT_ROOT'].'/images/'.$name))
- return '/images/'.$name;
- return 'http://www.1c-bitrix.ru/images/bitrix_setup/'.$name;
- }
- function bx_accelerator_reset()
- {
- if(function_exists("accelerator_reset"))
- accelerator_reset();
- elseif(function_exists("wincache_refresh_if_changed"))
- wincache_refresh_if_changed();
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement