Advertisement
konyakov

Bitrix Restore script (restore.php)

Jan 12th, 2012
2,924
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 71.97 KB | None | 0 0
  1. <?php
  2. # define('VMBITRIX', 'defined');
  3. error_reporting(E_ALL & ~E_NOTICE);
  4.  
  5. if (version_compare(phpversion(),'5.0.0','<'))
  6.     die('PHP5 is required');
  7.  
  8. if (($i = ini_get('short_open_tag')) == 0 || strtolower($i) == 'off')
  9.     die('PHP parameter "short_open_tag" must be turned ON');
  10. ?><?
  11.  
  12. if(strpos($_SERVER['REQUEST_URI'], '/restore.php') !== 0 || !file_exists($_SERVER['DOCUMENT_ROOT'].'/restore.php'))
  13.     die('This script must be started from Web Server\'s DOCUMENT ROOT');
  14.  
  15. if(isset($_SERVER["BX_PERSONAL_ROOT"]) && $_SERVER["BX_PERSONAL_ROOT"] <> "")
  16.     define("BX_PERSONAL_ROOT", $_SERVER["BX_PERSONAL_ROOT"]);
  17. else
  18.     define("BX_PERSONAL_ROOT", "/bitrix");
  19.  
  20. if(!defined("START_EXEC_TIME"))
  21.     define("START_EXEC_TIME", microtime(true));
  22.  
  23. define("STEP_TIME", defined('VMBITRIX') ? 30 : 15);
  24. # define("DELAY", defined('VMBITRIX') ? 0 : 3); // reserved
  25.  
  26. if (function_exists('mb_internal_encoding'))
  27. {
  28.     switch (ini_get("mbstring.func_overload"))
  29.     {
  30.         case 0:
  31.             $bUTF_serv = false;
  32.         break;
  33.         case 2:
  34.             $bUTF_serv = mb_internal_encoding() == 'UTF-8';
  35.         break;
  36.         default:
  37.             die('PHP parameter mbstring.func_overload='.ini_get("mbstring.func_overload").'. The only supported values are 0 or 2.');
  38.         break;
  39.     }
  40.     mb_internal_encoding('ISO-8859-1');
  41. }
  42. else
  43.     $bUTF_serv = false;
  44.  
  45.  
  46. # http://bugs.php.net/bug.php?id=48886 - We have 2Gb file limit on Linux
  47.  
  48. #@set_time_limit(0);
  49. ob_start();
  50.  
  51. if (@preg_match('#ru#i',$_SERVER['HTTP_ACCEPT_LANGUAGE']))
  52.     $lang = 'ru';
  53. elseif (@preg_match('#de#i',$_SERVER['HTTP_ACCEPT_LANGUAGE']))
  54.     $lang = 'de';
  55. if ($_REQUEST['lang'])
  56.     $lang = $_REQUEST['lang'];
  57. if (!in_array($lang,array('ru','en')))
  58.     $lang = 'en';
  59. define("LANG", $lang);
  60. if (LANG=='ru' && !headers_sent())
  61.     header("Content-type:text/html; charset=windows-1251");
  62.  
  63. $dbconn = $_SERVER['DOCUMENT_ROOT']."/bitrix/php_interface/dbconn.php";
  64.  
  65. $arc_name = $_REQUEST["arc_name"];
  66. $mArr_ru =  array(
  67.             "WINDOW_TITLE" => "Восстановление архива",
  68.             "BACK" => "Назад",
  69.             "BEGIN" => "
  70.             <p>
  71.             <ul>
  72.             <li>Перейдите в административную панель своего сайта на страницу <b>Настройки &gt; Инструменты &gt; Резервное копирование</b>
  73.             <li>Создайте полную резервную копию, которая будет включать <b>публичную часть</b>, <b>ядро</b> и <b>базу данных</b>
  74.             </ul>
  75.             <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>
  76.             </p>
  77.             ",
  78.             "ARC_DOWN" => "Скачать архив с дальнего сайта",
  79.             "DB_SELECT" => "Выберите дамп БД:",
  80.             "DB_SETTINGS" => "Данные для подключения к базе данных",
  81.             "DB_DEF" => "по умолчанию для выделенного сервера или виртуальной машины",
  82.             "DB_ENV" => "восстановление в &quot;Битрикс: Веб-окружение&quot;",
  83.             "DB_OTHER" => "установить значения вручную",
  84.             "ARC_DOWN_SITE" => "адрес сайта (www.site.ru):",
  85.             "DELETE_FILES" => "Удалить архив и служебные скрипты",
  86.             "ARC_DOWN_NAME" => "имя архива (2010-09-20.12-43-39.a269376c.tar.gz):",
  87.             "OR" => "ИЛИ",
  88.             "ARC_DOWN_URL" => "прямой URL архива (http://site.ru/2010-09-20.12-43-39.a269376c.tar.gz):",
  89.             "NO_FILES" => "нет архивов",
  90.             "TITLE0" => "Шаг 1: Подготовка архива",
  91.             "TITLE1" => "Шаг 2: Распаковка архива",
  92.             "TITLE_PROCESS1" => "Шаг 2: Выполняется распаковка архива",
  93.             "TITLE_PROCESS2" => "Шаг 3: Выполняется восстановление базы данных",
  94.             "TITLE2" => "Шаг 3: Восстановление базы данных",
  95.             "SELECT_LANG" => "Выберите язык",
  96.             "ARC_SKIP" => "Архив уже распакован",
  97.             "ARC_SKIP_DESC" => "переход к восстановлению базы данных",
  98.             "ARC_NAME" => "Архив загружен в корневую папку сервера",
  99.             "ARC_DOWN_PROCESS" => "Загружается:",
  100.             "ARC_LOCAL" => "Загрузить с локального диска",
  101.             "MAX_TIME" => "Шаг выполнения (сек.)",
  102.             "ERR_NO_ARC" => "Не выбран архив для распаковки!",
  103.             "BUT_TEXT1" => "Далее",
  104.             "BUT_TEXT_BACK" => "Назад",
  105.             "DUMP_NAME" => "Файл резервной копии базы:",
  106.             "USER_NAME" => "Имя пользователя базы данных",
  107.             "USER_PASS" => "Пароль",
  108.             "BASE_NAME" => "Имя базы данных",
  109.             "BASE_HOST" => "Адрес сервера базы данных",
  110.             "BASE_RESTORE" => "Восстановить",
  111.             "ERR_NO_DUMP" => "Не выбран архив базы данных для восстановления!",
  112.             "ERR_EXTRACT" => "Ошибка",
  113.             "ERR_UPLOAD" => "Не удалось загрузить файл на сервер",
  114.             "ERR_DUMP_RESTORE" => "Ошибка восстановления базы данных",
  115.             "ERR_DB_CONNECT" => "Ошибка соединения с базой данных",
  116.             "ERR_CREATE_DB" => "Ошибка создания базы",
  117.             "FINISH" => "Операция выполнена успешно",
  118.             "FINISH_MSG" => "Операция восстановления системы завершена.",
  119.             "EXTRACT_FINISH_TITLE" => "Распаковка архива",
  120.             "EXTRACT_FINISH_MSG" => "Распаковка архива завершена.",
  121.             "BASE_CREATE_DB" => "Создать базу данных",
  122.             "EXTRACT_FINISH_DELL" => "Обязательно удалите скрипт restore.php и файл резервной копии из корневой директории сайта.",
  123.             "EXTRACT_FULL_FINISH_DELL" => "Обязательно удалите скрипт restore.php, файл резервной копии из корневой директории сайта, а также дамп базы.",
  124.             "BUT_DELL" => "Удалить",
  125.             "FINISH_ERR_DELL" => "Не удалось удалить все временные файлы! Обязательно удалите их вручную.",
  126.             "FINISH_ERR_DELL_TITLE" => "Ошибка удаления файлов!",
  127.             "NO_READ_PERMS" => "Нет прав на чтение корневой папки сайта",
  128.             "UTF8_ERROR1" => "Внимание! Сайт работал в кодировке UTF-8. Конфигурация сервера не соответствует требованиям, установите mbstring.func_overload=2 и mbstring.internal_encoding=UTF-8.",
  129.             "UTF8_ERROR2" => "Внимание! Сайт работал в однобайтовой кодировке, а конфигурация сервера рассчитана на кодировку UTF-8. Установите mbstring.func_overload=0 или mbstring.internal_encoding=ISO-8859-1.",
  130.             "DOC_ROOT_WARN" => "Внимание! В настройках сайта указан путь к корневой папке, убедитесь, что путь установлен правильно, иначе возникнут проблемы с доступом к публичной части.",
  131.             "HTACCESS_WARN" => "Внимание! Файл .htaccess из архива был сохранен в корне сайта под именем .htaccess.restore, т.к. он может содержать директивы, недопустимые на данном сервере. Пожалуйста, переименуйте его вручную через FTP.",
  132.  
  133.             "NOT_SAAS_ENV" => "Вы используете дистрибутив SaaS, он может быть развернут только на SaaS окружении",
  134.             "NOT_SAAS_DISTR" => "Вы работаете на SaaS окружении, необходимо использовать редакцию SaaS",
  135.  
  136. 'TAR_WRONG_BLOCK_SIZE' => 'Неверный размер блока: ',
  137. 'TAR_ERR_FORMAT' => 'Архив поврежден, ошибочный блок: ',
  138. 'TAR_EMPTY_FILE' => 'Пустое имя файла, ошибочный блок: ',
  139. 'TAR_ERR_CRC' => 'Ошибка контрольной суммы на файле: ',
  140. 'TAR_ERR_FOLDER_CREATE' => 'Не удалось создать папку: ',
  141. 'TAR_ERR_FILE_CREATE' => 'Не удалось создать файл: ',
  142. 'TAR_ERR_FILE_OPEN' => 'Не удалось открыть файл: ',
  143. 'TAR_ERR_FILE_SIZE' => 'Размер файла отличается: ',
  144. 'TAR_ERR_WRITE_HEADER' => 'Ошибка записи заголовка',
  145. 'TAR_PATH_TOO_LONG' => 'Слишком длинный путь: ',
  146. 'TAR_ERR_FILE_READ' => 'Ошибка чтения файла: ',
  147. 'TAR_ERR_FILE_WRITE' => 'Ошибка записи на файле: ',
  148. 'TAR_ERR_FILE_NO_ACCESS' => 'Нет доступа к файлу: ',
  149. 'TAR_NO_GZIP' => 'Не доступна функция gzopen',
  150.             );
  151.  
  152. $mArr_en = array(
  153.             "WINDOW_TITLE" => "Restoring",
  154.             "BACK" => "Back",
  155.             "BEGIN" => "
  156.             <p>
  157.             <ul>
  158.             <li>Step 1. Open Control Panel section of your old site and select <b>Settings &gt; Tools &gt; Backup</b>
  159.             <li>Create full archive which contains <b>public site files</b>, <b>kernel files</b> and <b>database dump</b>
  160.             </ul>
  161.             <b>Documentation:</b> <a href='http://www.bitrixsoft.com/support/training/course/lesson.php?COURSE_ID=12&ID=441' target='_blank'>learning course</a>
  162.             </p>
  163.             ",
  164.             "ARC_DOWN" => "Download from remote server",
  165.             "DB_SELECT" => "Select Database Dump:",
  166.             "DB_SETTINGS" => "Database settings",
  167.             "DB_DEF" => "default values for Dedicated Server or Virtual Machine",
  168.             "DB_ENV" => "restoring in Bitrix Environment",
  169.             "DB_OTHER" => "custom database settings",
  170.             "ARC_DOWN_SITE" => "Server URL (www.site.com):",
  171.             "DELETE_FILES" => "Delete archive and temporary scripts",
  172.             "ARC_DOWN_NAME" => "Archive name (2010-09-20.12-43-39.a269376c.tar.gz):",
  173.             "OR" => "OR",
  174.             "ARC_DOWN_URL" => "Archive URL (http://www.site.com/2010-09-20.12-43-39.a269376c.tar.gz):",
  175.             "NO_FILES" => "no archives found",
  176.             "TITLE0" => "Step 1: Archive Creation",
  177.             "TITLE1" => "Step 2: Archive Extracting",
  178.             "TITLE_PROCESS1" => "Step 2: Extracting an archive...",
  179.             "TITLE_PROCESS2" => "Step 3: Restoring database...",
  180.             "TITLE2" => "Step 3: Database restore",
  181.             "SELECT_LANG" => "Choose the language",
  182.             "ARC_SKIP" => "Archive is already extracted",
  183.             "ARC_SKIP_DESC" => "Starting database restore",
  184.             "ARC_NAME" => "Archive is stored in document root folder",
  185.             "ARC_DOWN_PROCESS" => "Downloading:",
  186.             "ARC_LOCAL" => "Upload from local disk",
  187.             "MAX_TIME" => "Step (sec.)",
  188.             "ERR_NO_ARC" => "Archive for extracting is not specified!",
  189.             "BUT_TEXT1" => "Continue",
  190.             "BUT_TEXT_BACK" => "Back",
  191.             "DUMP_NAME" => "Database dump file:",
  192.             "USER_NAME" => "Database User Name",
  193.             "USER_PASS" => "Password",
  194.             "BASE_NAME" => "Database Name",
  195.             "BASE_HOST" => "Database Host",
  196.             "BASE_RESTORE" => "Restore",
  197.             "ERR_NO_DUMP" => "Database dump file is not specified!",
  198.             "ERR_EXTRACT" => "Error",
  199.             "ERR_UPLOAD" => "Unable to upload file",
  200.             "ERR_DUMP_RESTORE" => "Error restoring the database:",
  201.             "ERR_DB_CONNECT" => "Error connecting the database:",
  202.             "ERR_CREATE_DB" => "Error creating the database",
  203.             "FINISH" => "Successfully completed",
  204.             "FINISH_MSG" => "Restoring of the system was completed.",
  205.             "EXTRACT_FINISH_TITLE" => "Archive extracting",
  206.             "EXTRACT_FINISH_MSG" => "Archive extracting was completed.",
  207.             "BASE_CREATE_DB" => "Create database",
  208.             "EXTRACT_FINISH_DELL" => "Warning! You should delete restore.php script and backup copy file from the root folder of your site!",
  209.             "EXTRACT_FULL_FINISH_DELL" => "Warning! You should delete restore.php script, backup copy file and database dump from the root folder of your site!",
  210.             "BUT_DELL" => "Delete",
  211.             "FINISH_ERR_DELL" => "Failed to delete temporary files! You should delete them manually",
  212.             "FINISH_ERR_DELL_TITLE" => "Error deleting the files!",
  213.             "NO_READ_PERMS" => "No permissions for reading Web Server root",
  214.             "UTF8_ERROR1" => "Warning! Your server is not configured for UTF-8 encoding. Please set mbstring.func_overload=2 and mbstring.internal_encoding=UTF-8.",
  215.             "UTF8_ERROR2" => "Warning! Your server is configured for UTF-8 encoding. Please set mbstring.func_overload=0 or mbstring.internal_encoding=ISO-8859-1.",
  216.             "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.",
  217.             "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.",
  218.  
  219. 'TAR_WRONG_BLOCK_SIZE' => 'Wrong Block size: ',
  220. 'TAR_ERR_FORMAT' => 'Archive is currupted, error block: ',
  221. 'TAR_EMPTY_FILE' => 'Empty filename, block: ',
  222. 'TAR_ERR_CRC' => 'Checksum error on file: ',
  223. 'TAR_ERR_FOLDER_CREATE' => 'Can\'t create folder: ',
  224. 'TAR_ERR_FILE_CREATE' => 'Can\'t create file: ',
  225. 'TAR_ERR_FILE_OPEN' => 'Can\'t open file: ',
  226. 'TAR_ERR_FILE_SIZE' => 'Filesize differs: ',
  227. 'TAR_ERR_WRITE_HEADER' => 'Error writing header',
  228. 'TAR_PATH_TOO_LONG' => 'Path is too long: ',
  229. 'TAR_ERR_FILE_READ' => 'Error reading file: ',
  230. 'TAR_ERR_FILE_WRITE' => 'Error adding file: ',
  231. 'TAR_ERR_FILE_NO_ACCESS' => 'No access to file: ',
  232. 'TAR_NO_GZIP' => 'PHP extension GZIP is not available',
  233.             );
  234.  
  235.     $MESS = array();
  236.     if (LANG=="ru")
  237.     {
  238.         $MESS["LOADER_SUBTITLE1"] = "Загрузка архива";
  239.         $MESS["LOADER_SUBTITLE1_ERR"] = "Ошибка загрузки";
  240.         $MESS["STATUS"] = "% выполнено...";
  241.         $MESS["LOADER_MENU_UNPACK"] = "Распаковка файла";
  242.         $MESS["LOADER_TITLE_LIST"] = "Выбор файла";
  243.         $MESS["LOADER_TITLE_LOAD"] = "Загрузка файла на сайт";
  244.         $MESS["LOADER_TITLE_UNPACK"] = "Распаковка файла";
  245.         $MESS["LOADER_TITLE_LOG"] = "Отчет по загрузке";
  246.         $MESS["LOADER_NEW_LOAD"] = "Загрузить";
  247.         $MESS["LOADER_BACK_2LIST"] = "Вернуться в список файлов";
  248.         $MESS["LOADER_LOG_ERRORS"] = "Загрузка архива не удалась";
  249.         $MESS["LOADER_NO_LOG"] = "Log-файл не найден";
  250.         $MESS["LOADER_KB"] = "кб";
  251.         $MESS["LOADER_LOAD_QUERY_SERVER"] = "Подключение к серверу...";
  252.         $MESS["LOADER_LOAD_QUERY_DISTR"] = "Запрашиваю файл #DISTR#";
  253.         $MESS["LOADER_LOAD_CONN2HOST"] = "Подключение к серверу #HOST#...";
  254.         $MESS["LOADER_LOAD_NO_CONN2HOST"] = "Не могу соединиться с #HOST#:";
  255.         $MESS["LOADER_LOAD_QUERY_FILE"] = "Запрашиваю файл...";
  256.         $MESS["LOADER_LOAD_WAIT"] = "Ожидаю ответ...";
  257.         $MESS["LOADER_LOAD_SERVER_ANSWER"] = "Ошибка загрузки. Сервер ответил: #ANS#";
  258.         $MESS["LOADER_LOAD_SERVER_ANSWER1"] = "Ошибка загрузки. У вас нет прав на доступ к этому файлу. Сервер ответил: #ANS#";
  259.         $MESS["LOADER_LOAD_NEED_RELOAD"] = "Ошибка загрузки. Докачка файла невозможна.";
  260.         $MESS["LOADER_LOAD_NO_WRITE2FILE"] = "Не могу открыть файл #FILE# на запись";
  261.         $MESS["LOADER_LOAD_LOAD_DISTR"] = "Загружаю файл #DISTR#";
  262.         $MESS["LOADER_LOAD_ERR_SIZE"] = "Ошибка размера файла";
  263.         $MESS["LOADER_LOAD_ERR_RENAME"] = "Не могу переименовать файл #FILE1# в файл #FILE2#";
  264.         $MESS["LOADER_LOAD_CANT_OPEN_WRITE"] = "Не могу открыть файл #FILE# на запись";
  265.         $MESS["LOADER_LOAD_CANT_OPEN_READ"] = "Не могу открыть файл #FILE# на чтение";
  266.         $MESS["LOADER_LOAD_LOADING"] = "Загружаю файл... дождитесь окончания загрузки...";
  267.         $MESS["LOADER_LOAD_FILE_SAVED"] = "Файл сохранен: #FILE# [#SIZE# байт]";
  268.         $MESS["LOADER_UNPACK_ACTION"] = "Распаковываю файл... дождитесь окончания распаковки...";
  269.         $MESS["LOADER_UNPACK_UNKNOWN"] = "Неизвестная ошибка. Повторите процесс еще раз или обратитесь в службу технической поддержки";
  270.         $MESS["LOADER_UNPACK_SUCCESS"] = "Файл успешно распакован";
  271.         $MESS["LOADER_UNPACK_ERRORS"] = "Файл распакован с ошибками";
  272.         $MESS["LOADER_KEY_DEMO"] = "Демонстрационная версия";
  273.         $MESS["LOADER_KEY_COMM"] = "Коммерческая версия";
  274.         $MESS["UPDATE_SUCCESS"] = "Обновлено успешно. <a href='?'>Открыть</a>.";
  275.         $MESS["LOADER_NEW_VERSION"] = "Доступна новая версия скрипта восстановления, но загрузить её не удалось";
  276.     }
  277.     else
  278.     {
  279.         $MESS["LOADER_SUBTITLE1"] = "Loading";
  280.         $MESS["LOADER_SUBTITLE1_ERR"] = "Loading Error";
  281.         $MESS["STATUS"] = "% done...";
  282.         $MESS["LOADER_MENU_LIST"] = "Select package";
  283.         $MESS["LOADER_MENU_UNPACK"] = "Unpack file";
  284.         $MESS["LOADER_TITLE_LIST"] = "Select file";
  285.         $MESS["LOADER_TITLE_LOAD"] = "Uploading file to the site";
  286.         $MESS["LOADER_TITLE_UNPACK"] = "Unpack file";
  287.         $MESS["LOADER_TITLE_LOG"] = "Upload report";
  288.         $MESS["LOADER_NEW_ED"] = "package edition";
  289.         $MESS["LOADER_NEW_AUTO"] = "automatically start unpacking after loading";
  290.         $MESS["LOADER_NEW_STEPS"] = "load gradually with interval:";
  291.         $MESS["LOADER_NEW_STEPS0"] = "unlimited";
  292.         $MESS["LOADER_NEW_LOAD"] = "Download";
  293.         $MESS["LOADER_BACK_2LIST"] = "Back to packages list";
  294.         $MESS["LOADER_LOG_ERRORS"] = "Error occured";
  295.         $MESS["LOADER_NO_LOG"] = "Log file not found";
  296.         $MESS["LOADER_KB"] = "kb";
  297.         $MESS["LOADER_LOAD_QUERY_SERVER"] = "Connecting server...";
  298.         $MESS["LOADER_LOAD_QUERY_DISTR"] = "Requesting package #DISTR#";
  299.         $MESS["LOADER_LOAD_CONN2HOST"] = "Connection to #HOST#...";
  300.         $MESS["LOADER_LOAD_NO_CONN2HOST"] = "Cannot connect to #HOST#:";
  301.         $MESS["LOADER_LOAD_QUERY_FILE"] = "Requesting file...";
  302.         $MESS["LOADER_LOAD_WAIT"] = "Waiting for response...";
  303.         $MESS["LOADER_LOAD_SERVER_ANSWER"] = "Error while downloading. Server reply was: #ANS#";
  304.         $MESS["LOADER_LOAD_SERVER_ANSWER1"] = "Error while downloading. Your can not download this package. Server reply was: #ANS#";
  305.         $MESS["LOADER_LOAD_NEED_RELOAD"] = "Error while downloading. Cannot resume download.";
  306.         $MESS["LOADER_LOAD_NO_WRITE2FILE"] = "Cannot open file #FILE# for writing";
  307.         $MESS["LOADER_LOAD_LOAD_DISTR"] = "Downloading package #DISTR#";
  308.         $MESS["LOADER_LOAD_ERR_SIZE"] = "File size error";
  309.         $MESS["LOADER_LOAD_ERR_RENAME"] = "Cannot rename file #FILE1# to #FILE2#";
  310.         $MESS["LOADER_LOAD_CANT_OPEN_WRITE"] = "Cannot open file #FILE# for writing";
  311.         $MESS["LOADER_LOAD_CANT_OPEN_READ"] = "Cannot open file #FILE# for reading";
  312.         $MESS["LOADER_LOAD_LOADING"] = "Download in progress. Please wait...";
  313.         $MESS["LOADER_LOAD_FILE_SAVED"] = "File saved: #FILE# [#SIZE# bytes]";
  314.         $MESS["LOADER_UNPACK_ACTION"] = "Unpacking the package. Please wait...";
  315.         $MESS["LOADER_UNPACK_UNKNOWN"] = "Unknown error occured. Please try again or consult the technical support service";
  316.         $MESS["LOADER_UNPACK_SUCCESS"] = "The file successfully unpacked";
  317.         $MESS["LOADER_UNPACK_ERRORS"] = "Errors occured while unpacking the file";
  318.         $MESS["LOADER_KEY_DEMO"] = "Demo version";
  319.         $MESS["LOADER_KEY_COMM"] = "Commercial version";
  320.         $MESS["UPDATE_SUCCESS"] = "Successful update. <a href='?'>Open</a>.";
  321.         $MESS["LOADER_NEW_VERSION"] = "Error occured while updating restore.php script!";
  322.     }
  323.  
  324. $strErrMsg = '';
  325. if (defined('VMBITRIX'))
  326. {
  327.     $this_script_name = basename(__FILE__);
  328.     $bx_host = 'www.1c-bitrix.ru';
  329.     $bx_url = '/download/files/scripts/'.$this_script_name;
  330.     $form = '';
  331.  
  332.     // Check for updates
  333.     $res = @fsockopen($bx_host, 80, $errno, $errstr, 3);
  334.  
  335.     if($res)
  336.     {
  337.         $strRequest = "HEAD ".$bx_url." HTTP/1.1\r\n";
  338.         $strRequest.= "Host: ".$bx_host."\r\n";
  339.         $strRequest.= "\r\n";
  340.  
  341.         fputs($res, $strRequest);
  342.  
  343.         while ($line = fgets($res, 4096))
  344.         {
  345.             if (@preg_match("/Content-Length: *([0-9]+)/i", $line, $regs))
  346.             {
  347.                 if (filesize(__FILE__) != trim($regs[1]))
  348.                 {
  349.                     $tmp_name = $this_script_name.'.tmp';
  350.                     if (LoadFile('http://'.$bx_host.$bx_url, $tmp_name, 0))
  351.                     {
  352.                         if (rename($_SERVER['DOCUMENT_ROOT'].'/'.$tmp_name,__FILE__))
  353.                         {
  354.                             bx_accelerator_reset();
  355.                             echo '<script>document.location="?lang='.LANG.'";</script>'.LoaderGetMessage('UPDATE_SUCCESS');
  356.                             die();
  357.                         }
  358.                         else
  359.                             $strErrMsg = str_replace("#FILE#", $this_script_name, LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE"));
  360.                     }
  361.                     else
  362.                         $strErrMsg = LoaderGetMessage('LOADER_NEW_VERSION');
  363.                 }
  364.                 break;
  365.             }
  366.         }
  367.         fclose($res);
  368.     }
  369. }
  370.  
  371. $bSelectDumpStep = false;
  372. if ($_REQUEST['source']=='dump')
  373.     $bSelectDumpStep = true;
  374.  
  375. $Step = IntVal($_REQUEST["Step"]);
  376.  
  377. if ($Step == 2 && !$bSelectDumpStep)
  378. {
  379.     if ($_REQUEST['source']=='download')
  380.     {
  381.         $url = $_REQUEST['arc_down_url'];
  382.         if (!$url)
  383.             $url = $_REQUEST['arc_down_site'].'/bitrix/backup/'.$_REQUEST['arc_down_name'];
  384.  
  385.         if (!preg_match('#http://#',$url))
  386.             $url = 'http://'.$url;
  387.         $arc_name = basename($url);
  388.         if (!preg_match("#\.tar(\.gz)?(.[0-9]+)?$#",$arc_name))
  389.             $arc_name = 'archive.tar.gz';
  390.         $strLog = '';
  391.         $status = '';
  392.        
  393.         if ($_REQUEST['continue'])
  394.             $res = LoadFile($url, $_SERVER['DOCUMENT_ROOT'].'/'.$arc_name);
  395.         else
  396.         {
  397.             $res = 2;
  398.             SetCurrentProgress(0);
  399.         }
  400.  
  401.         if (!$res)
  402.         {
  403.             $ar = array(
  404.                 'TITLE' => LoaderGetMessage('LOADER_SUBTITLE1_ERR'),
  405.                 'TEXT' => nl2br($strLog),
  406.                 'BOTTOM' => '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '
  407.             );
  408.             html($ar);
  409.             die();
  410.         }
  411.         elseif ($res==2) // частичная закачка
  412.         {
  413.             $text = getMsg('ARC_DOWN_PROCESS').' <b>'.htmlspecialchars($arc_name).'</b>' . $status .
  414.             '<input type=hidden name=Step value=2>'.
  415.             '<input type=hidden name=source value=download>'.
  416.             '<input type=hidden name=continue value=Y>'.
  417.             '<input type=hidden name=arc_down_url value="'.htmlspecialchars($url).'">';
  418.         }
  419.         else
  420.         {
  421.             $tar = new CTar;
  422.             $next_arc_name = $tar->getNextName($arc_name);
  423.             $next_url = str_replace($arc_name, $next_arc_name, $url);
  424.             $res = LoadFile($next_url,$next_arc_name);
  425.             if ($res != false)
  426.             {
  427.                 $text = getMsg('ARC_DOWN_PROCESS').' <b>'.htmlspecialchars($next_arc_name).'</b>' . $status .
  428.                 '<input type=hidden name=Step value=2>'.
  429.                 '<input type=hidden name=source value=download>'.
  430.                 '<input type=hidden name=continue value=Y>'.
  431.                 '<input type=hidden name=arc_down_url value="'.htmlspecialchars($next_url).'">';
  432.             }
  433.             else
  434.             {
  435.                 $text = $status .
  436.                 '<input type=hidden name=Step value=2>'.
  437.                 '<input type=hidden name=arc_name value="'.htmlspecialchars(preg_replace('#\.[0-9]+$#','',$arc_name)).'">';
  438.             }
  439.         }
  440.         $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
  441.         showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text,$bottom);
  442.         ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
  443.         die();
  444.     }
  445.     elseif($_REQUEST['source']=='upload')
  446.     {
  447.         $tmp = $_FILES['archive'];
  448.         $arc_name = $_REQUEST['arc_name'] = 'uploaded_archive.tar.gz';
  449.         if (move_uploaded_file($tmp['tmp_name'],$_SERVER['DOCUMENT_ROOT'].'/'.$arc_name))
  450.         {
  451.             $text =
  452.             '<input type=hidden name=Step value=2>'.
  453.             '<input type=hidden name=arc_name value="'.($arc_name).'">';
  454.             showMsg(LoaderGetMessage('LOADER_SUBTITLE1'),$text);
  455.             ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
  456.             die();
  457.         }
  458.         else
  459.         {
  460.             $ar = array(
  461.                 'TITLE' => getMsg('ERR_EXTRACT'),
  462.                 'TEXT' => getMsg('ERR_UPLOAD'),
  463.                 'BOTTOM' => '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '
  464.             );
  465.             html($ar);
  466.             die();
  467.         }
  468.     }
  469. }
  470. elseif($Step == 3)
  471. {
  472.     $d_pos = (double) $_REQUEST["d_pos"];
  473.     if ($d_pos < 0)
  474.         $d_pos = 0;
  475.  
  476.     if ($_REQUEST['db_settings']=='default' || $_REQUEST['db_settings'] == 'env')
  477.     {
  478.         $_REQUEST['db_host'] = 'localhost'.($_REQUEST['db_settings'] == 'env' ? ':31006' : '');
  479.         $_REQUEST['db_name'] = 'bitrix';
  480.         $_REQUEST['db_user'] = 'root';
  481.         $_REQUEST['db_pass'] = '';
  482.         $_REQUEST['create_db'] = 'Y';
  483.     }
  484.  
  485.     $oDB = new CDBRestore($_REQUEST["db_host"], $_REQUEST["db_name"], $_REQUEST["db_user"], $_REQUEST["db_pass"], $_REQUEST["dump_name"], $d_pos);
  486.  
  487.     if(!$oDB->Connect())
  488.     {
  489.         $strErrMsg = $oDB->getError();
  490.         $Step = 2;
  491.         $bSelectDumpStep = true;
  492.     }
  493. }
  494.  
  495.  
  496.  
  497.  
  498.  
  499. if(!$Step)
  500. {
  501.     $ar = array(
  502.         'TITLE' => getMsg("TITLE0", LANG),
  503.         'TEXT' =>
  504.             ($strErrMsg ? '<div style="color:red;padding:10px;border:1px solid red">'.$strErrMsg.'</div>' : '').
  505.             getMsg('BEGIN') .
  506.             '<br>' .
  507.             (file_exists($img = 'images/dump'.(LANG=='ru'?'_ru':'').'.png') ? '<img src="'.$img.'">' : ''),
  508.         'BOTTOM' =>
  509.         (defined('VMBITRIX') ? '<input type=button value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/\'"> ' : '').
  510.         '<input type="button" value="'.getMsg("BUT_TEXT1", LANG).'" onClick="reloadPage(1,\''.LANG.'\')">'
  511.     );
  512.     html($ar);
  513. }
  514. elseif($Step == 1)
  515. {
  516.     $ar = array(
  517.         'TITLE' => getMsg("TITLE1", LANG),
  518.         'TEXT' =>'
  519.                 <div class=t_div>
  520.                     <input type=radio name=source value=download id=val1 onclick="div_show(1)"><label for=val1>'.getMsg("ARC_DOWN", LANG).'</label>
  521.                     <div id=div1 class="div-tool" style="display:none" align="right">
  522.                 '.getMsg("ARC_DOWN_SITE").' <input name=arc_down_site size=20><br>
  523.                 '.getMsg("ARC_DOWN_NAME").' <input name=arc_down_name size=20><br>
  524.                                         '.getMsg("OR").'<br>
  525.                 '.getMsg("ARC_DOWN_URL").' <input name=arc_down_url size=40><br>
  526.                     </div>
  527.                 </div>
  528.                 <div class=t_div>
  529.                     <input type=radio name=source value=upload id=val2 onclick="div_show(2)"><label for=val2>'. getMsg("ARC_LOCAL", LANG).'</label>
  530.                     <div id=div2 class="div-tool" style="display:none">
  531.                         <input type=file name=archive size=40>
  532.                     </div>
  533.                 </div>
  534.                 <div class=t_div>
  535.                     <input type=radio name=source value=local id=val3 onclick="div_show(3)"><label for=val3>'.getMsg("ARC_NAME", LANG).'</label>
  536.                     <div id=div3 class="div-tool" style="display:none">'
  537.                     .(
  538.                         strlen($option = getArcList())
  539.                         ?
  540.                         '<select class="selectitem" name="arc_name">'.$option.'</select>'
  541.                         :
  542.                         '<span style="color:#999999">'.getMsg('NO_FILES', LANG).'</span>'
  543.                     ).
  544.                     '</div>'.
  545.                     ($option === false ? '<div style="color:red">'.getMsg('NO_READ_PERMS', LANG).'</div>' : '').
  546.                 '</div>'.
  547.                 '<div class=t_div>'.
  548.                     '<input type=radio name=source value=dump id=val4 onclick="div_show(4)"><label for=val4>'.getMsg("ARC_SKIP", LANG).'</label>
  549.                     <div id=div4 class="div-tool" style="display:none;color:#999999">'.getMsg('ARC_SKIP_DESC').'</div>
  550.                 </div>'
  551.                 ,
  552.         'BOTTOM' =>
  553.         '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
  554.         '<input type="button" class="selectitem" id="start_button" value="'.getMsg("BUT_TEXT1", LANG).'" onClick="reloadPage(2,\''.LANG.'\')">'
  555.     );
  556.     html($ar);
  557.     ?>
  558.     <script>
  559.         function div_show(i)
  560.         {
  561.             document.getElementById('div1').style.display='none';
  562.             document.getElementById('div2').style.display='none';
  563.             document.getElementById('div3').style.display='none';
  564.             document.getElementById('div4').style.display='none';
  565.             document.getElementById('div'+i).style.display='block';
  566.         }
  567.     </script>
  568.     <style type="text/css">
  569.         .div-tool
  570.         {
  571.             border:1px solid #CCCCCC;
  572.             padding:10px;
  573.         }
  574.         .t_div
  575.         {
  576.             padding:5px;
  577.         }
  578.     </style>
  579.     <?
  580. }
  581. elseif($Step == 2)
  582. {
  583.     if(!$bSelectDumpStep)
  584.     {
  585.         $tar = new CTarRestore;
  586.         $tar->path = $_SERVER['DOCUMENT_ROOT'];
  587.         $tar->ReadBlockCurrent = intval($_REQUEST['ReadBlockCurrent']);
  588.  
  589.         $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
  590.         if ($tar->openRead($_SERVER['DOCUMENT_ROOT'].'/'.$arc_name))
  591.         {
  592.             $DataSize = intval($_REQUEST['DataSize']);
  593.             if(!isset($_REQUEST['Block'])) // first step
  594.             {
  595.                 $DataSize = $tar->getArchiveSize();
  596.                 while(file_exists($file = $tar->getNextName($file)))
  597.                     $DataSize += $tar->getArchiveSize($file);
  598.                 SetCurrentProgress(0);
  599.                 $r = true;
  600.             }
  601.             else
  602.             {
  603.                 $Block = intval($_REQUEST['Block']);
  604.                 $tar->Skip($Block);
  605.                 while(($r = $tar->extractFile()) && haveTime());
  606.             }
  607.  
  608.  
  609.             if($r === false) // Error
  610.                 showMsg(getMsg("ERR_EXTRACT", LANG), implode('<br>',$tar->err), $bottom);
  611.             elseif ($r === 0) // Finish
  612.                 $bSelectDumpStep = true;
  613.             else
  614.             {
  615.                 SetCurrentProgress(($tar->BlockHeader + $tar->ReadBlockCurrent) * 512,$DataSize, $red=false);
  616.  
  617.                 $text = $status .
  618.                 '<input type="hidden" name="Block" value="'.$tar->BlockHeader.'">'.
  619.                 '<input type="hidden" name="ReadBlockCurrent" value="'.$tar->ReadBlockCurrent.'">'.
  620.                 '<input type="hidden" name="DataSize" value="'.$DataSize.'">'.
  621.                 '<input type="hidden" name="arc_name" value="'.$arc_name.'">';
  622.                 showMsg(getMsg('TITLE_PROCESS1'),$text,$bottom);
  623.                 ?><script>reloadPage(2, '<?= LANG?>', 1);</script><?
  624.             }
  625.             $tar->close();
  626.         }
  627.         else
  628.             showMsg(getMsg("ERR_EXTRACT", LANG), implode('<br>',$tar->err),$bottom);
  629.     }
  630.  
  631.     if ($bSelectDumpStep)
  632.     {
  633.         if(file_exists($dbconn))
  634.         {
  635.             include($dbconn);
  636.             $bUTF_conf = (defined('BX_UTF') && BX_UTF === true);
  637.  
  638.             if ($bUTF_conf && !$bUTF_serv)
  639.                 $strErrMsg = getMsg('UTF8_ERROR1').'<br><br>'.$strErrMsg;
  640.             elseif (!$bUTF_conf && $bUTF_serv)
  641.                 $strErrMsg = getMsg('UTF8_ERROR2').'<br><br>'.$strErrMsg;
  642.         }
  643.  
  644.         $arDName = getDumpList();
  645.         $strDName = '';
  646.         foreach($arDName as $db)
  647.             $strDName .= '<option value="'.htmlspecialchars($db).'">'.htmlspecialchars($db).'</option>';
  648.  
  649.         if(count($arDName))
  650.         {
  651.             $ar = array(
  652.                 'TITLE' => getMsg("TITLE2", LANG),
  653.                 'TEXT' =>
  654.                     ($strErrMsg ? '<div style="color:red">'.$strErrMsg.'</div>' : '').
  655.                     '<input type="hidden" name="arc_name" value="'.$arc_name.'">'.
  656.                     (count($arDName)>1
  657.                     ?
  658.                     getMsg("DB_SELECT").' <select class="selectitem" name="dump_name">'.$strDName.'</select>'
  659.                     :
  660.                     '<input type=hidden name=dump_name value="'.htmlspecialchars($arDName[0]).'">'
  661.                     ) .
  662.                     '<p align=center><b>'.getMsg("DB_SETTINGS", LANG).'</b></p>'.
  663.                     '<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>
  664.                     <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>
  665.                     <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>
  666.                    
  667.                     <div style="border:1px solid #aeb8d7;padding:5px;'.($_REQUEST['db_settings']=='custom'?'':'display:none').'" id=settings>
  668.                     <table width=100% cellspacing=0 cellpadding=2 border=0>
  669.                     <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>
  670.                     <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>
  671.                     <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>
  672.                     <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>
  673.                     <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>
  674.                     </table>
  675.                     </div>'
  676.                 ,
  677.                 'BOTTOM' =>
  678.                 '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
  679.                 '<input type="button" class="selectitem" id="start_button" value="'.getMsg("BASE_RESTORE", LANG).'" onClick="reloadPage(3, \''. LANG.'\')">'
  680.             );
  681.             html($ar);
  682.             ?>
  683.             <script>
  684.                 function s_display(val)
  685.                 {
  686.                     document.getElementById('settings').style.display = (val ? 'block' : 'none');
  687.                 }
  688.             </script>
  689.             <?
  690.         }
  691.         else
  692.         {
  693.             $text =
  694.             ($strErrMsg ? '<div style="color:red">'.$strErrMsg.'</div>' : '').
  695.             (file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? '<div style="color:red">'.getMsg('HTACCESS_WARN').'</div>' : '') .
  696.             getMsg("EXTRACT_FINISH_MSG", LANG) . '
  697.             <input type="hidden" name="arc_name" value="'.$arc_name.'">
  698.             <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">';
  699.             $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> '.
  700.             '<input type=button value="'.getMsg('DELETE_FILES').'" onClick="reloadPage(4)">';
  701.  
  702.             showMsg(getMsg("EXTRACT_FINISH_TITLE", LANG), $text, $bottom);
  703.         }
  704.     }
  705. }
  706. elseif($Step == 3)
  707. {
  708.     $d_pos = (double) $_REQUEST["d_pos"];
  709.     if ($d_pos < 0)
  710.         $d_pos = 0;
  711.  
  712.     if (!isset($_REQUEST['d_pos'])) // start
  713.     {
  714.         if(file_exists($dbconn))
  715.         {
  716.             include($dbconn);
  717.             $arReplace = array(
  718.                 'DBHost' => 'db_host',
  719.                 'DBLogin' => 'db_user',
  720.                 'DBPassword' => 'db_pass',
  721.                 'DBName' => 'db_name'
  722.             );
  723.  
  724.             $arFile = file($dbconn);
  725.             $bCron = false;
  726.             foreach($arFile as $line)
  727.             {
  728.                 if (preg_match("#^[ \t]*".'\$'."(DB[a-zA-Z]+)#",$line,$regs))
  729.                 {
  730.                     $key = $regs[1];
  731.                     $new_val = $_REQUEST[$arReplace[$key]];
  732.                     if (isset($new_val) && $$key != $new_val)
  733.                     {
  734.                         $strFile.='#'.$line.
  735.                         '$'.$key.' = "'.addslashes($new_val).'";'."\n\n";
  736.                     }
  737.                     else
  738.                         $strFile.=$line;
  739.                 }
  740.                 else
  741.                     $strFile.=$line;
  742.  
  743.                 if (preg_match('#BX_CRONTAB_SUPPORT#',$line)) // почта уже на кроне
  744.                     $bCron = true;
  745.             }
  746.  
  747.             if (defined('VMBITRIX') && !$bCron)
  748.                 $strFile = '<'.'?define("BX_CRONTAB_SUPPORT", true);?'.'>'.$strFile;
  749.  
  750.             $f = fopen($dbconn,"wb");
  751.             fputs($f,$strFile);
  752.             fclose($f);
  753.         }
  754.         SetCurrentProgress(0);
  755.         $r = true;
  756.     }
  757.     else
  758.         $r = $oDB->restore();
  759.  
  760.     $bottom = '<input type="button" value="'.getMsg('BUT_TEXT_BACK').'" onClick="document.location=\'/restore.php?Step=1&lang='.LANG.'\'"> ';
  761.     if($r && !$oDB->is_end())
  762.     {
  763.         $d_pos = $oDB->getPos();
  764.         $oDB->close();
  765.         $arc_name = $_REQUEST["arc_name"];
  766.         SetCurrentProgress($d_pos,filesize($_SERVER['DOCUMENT_ROOT'].'/bitrix/backup/'.$_REQUEST['dump_name']));
  767.         $text =
  768.         $status . '
  769.         <input type="hidden" name="arc_name" value="'.htmlspecialchars($arc_name).'">
  770.         <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">
  771.         <input type="hidden" name="d_pos" id="d_pos_id" value="'.$d_pos.'">
  772.         <input type="hidden" name="db_user" id="db_user_id" value="'.htmlspecialchars($_REQUEST["db_user"]).'">
  773.         <input type="hidden" name="db_pass" id="db_pass_id" value="'. (strlen($_REQUEST["db_pass"]) > 0 ? htmlspecialchars($_REQUEST["db_pass"]) : "").'">
  774.         <input type="hidden" name="db_name" id="db_name_id" value="'. htmlspecialchars($_REQUEST["db_name"]).'">
  775.         <input type="hidden" name="db_host" id="db_host_id" value="'. htmlspecialchars($_REQUEST["db_host"]).'">
  776.         ';
  777.         showMsg(getMsg('TITLE_PROCESS2'),$text,$bottom);
  778.         ?><script>reloadPage(3, '<?= LANG?>', 1);</script><?
  779.     }
  780.     else
  781.     {
  782.         if($oDB->getError() != "")
  783.             showMsg(getMsg("ERR_DUMP_RESTORE", LANG), '<div style="color:red">'.$oDB->getError().'</div>', $bottom);
  784.         else
  785.         {
  786.             $rs = $oDB->Query('SELECT DOC_ROOT FROM b_lang WHERE DOC_ROOT IS NOT NULL AND DOC_ROOT != ""');
  787.  
  788.             $text = getMsg("FINISH_MSG", LANG) .
  789.             (mysql_fetch_array($rs) ? '<div style="color:red">'.getMsg('DOC_ROOT_WARN').'</div>' : '') .
  790.             (file_exists($_SERVER['DOCUMENT_ROOT'].'/.htaccess.restore') ? '<div style="color:red">'.getMsg('HTACCESS_WARN').'</div>' : '') .
  791.             '<input type="hidden" name="arc_name" value="'.htmlspecialchars($arc_name).'">
  792.             <input type="hidden" name="dump_name" id="dump_name_id" value="'. htmlspecialchars($_REQUEST["dump_name"]).'">';
  793.             $bottom = '<input type=button value="'.getMsg('DELETE_FILES').'" onClick="reloadPage(4)">';
  794.             showMsg(getMsg("FINISH", LANG), $text, $bottom);
  795.         }
  796.     }
  797. }
  798. elseif($Step == 4)
  799. {
  800.     if ($_REQUEST['dump_name'])
  801.     {
  802.         @unlink($_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".$_REQUEST["dump_name"]);
  803.         @unlink($_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".str_replace('.sql','_after_connect.sql',$_REQUEST["dump_name"]));
  804.     }
  805.     @unlink($_SERVER['DOCUMENT_ROOT'].'/bitrix8setup.php');
  806.     $ok = unlink($_SERVER["DOCUMENT_ROOT"]."/restore.php");
  807.  
  808.     if($_REQUEST['arc_name'])
  809.     {
  810.         $ok = unlink($_SERVER["DOCUMENT_ROOT"]."/".$_REQUEST["arc_name"]) && $ok;
  811.         $i = 0;
  812.         while(file_exists($_SERVER['DOCUMENT_ROOT'].'/'.$_REQUEST['arc_name'].'.'.++$i))
  813.             $ok = unlink($_SERVER['DOCUMENT_ROOT'].'/'.$_REQUEST['arc_name'].'.'.$i) && $ok;
  814.     }
  815.  
  816.  
  817.     if (!$ok)
  818.         showMsg(getMsg("FINISH_ERR_DELL_TITLE", LANG), getMsg("FINISH_ERR_DELL", LANG));
  819.     else
  820.     {
  821.         showMsg(getMsg("FINISH", LANG), getMsg("FINISH_MSG", LANG));
  822.         ?><script>window.setTimeout(function(){document.location="/";},3000);</script><?
  823.     }
  824. }
  825.  
  826. #################### END ############
  827.  
  828.  
  829.  
  830.  
  831. class CDBRestore
  832. {
  833.     var $type = "";
  834.     var $DBHost ="";
  835.     var $DBName = "";
  836.     var $DBLogin = "";
  837.     var $DBPassword = "";
  838.     var $DBdump = "";
  839.     var $db_Conn = "";
  840.     var $db_Error = "";
  841.     var $f_end = false;
  842.     var $start;
  843.     var $d_pos;
  844.     var $_dFile;
  845.  
  846.  
  847.     function Query($sql)
  848.     {
  849.         return mysql_query($sql, $this->db_Conn);
  850.     }
  851.  
  852.     function CDBRestore($DBHost, $DBName, $DBLogin, $DBPassword, $DBdump, $d_pos)
  853.     {
  854.         $this->DBHost = $DBHost;
  855.         $this->DBLogin = $DBLogin;
  856.         $this->DBPassword = $DBPassword;
  857.         $this->DBName = $DBName;
  858.         $this->DBdump = $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup/".$DBdump;
  859.         $this->d_pos = $d_pos;
  860.     }
  861.  
  862.     //Соединяется с базой данных
  863.     function Connect()
  864.     {
  865.  
  866.         $this->type="MYSQL";
  867.         if (!defined("DBPersistent")) define("DBPersistent",false);
  868.         if (DBPersistent)
  869.         {
  870.             $this->db_Conn = @mysql_pconnect($this->DBHost, $this->DBLogin, $this->DBPassword);
  871.         }
  872.         else
  873.         {
  874.             $this->db_Conn = @mysql_connect($this->DBHost, $this->DBLogin, $this->DBPassword);
  875.         }
  876.         if(!($this->db_Conn))
  877.         {
  878.             if (DBPersistent) $s = "mysql_pconnect"; else $s = "mysql_connect";
  879.             if(($str_err = mysql_error()) != "")
  880.                 $this->db_Error .= "<br><font color=#ff0000>Error! ".$s."('-', '-', '-')</font><br>".$str_err."<br>";
  881.             return false;
  882.         }
  883.  
  884.         $after_file = str_replace('.sql','_after_connect.sql',$this->DBdump);
  885.         if (file_exists($after_file))
  886.         {
  887.             $rs = fopen($after_file,'rb');
  888.             $str = fread($rs,filesize($after_file));
  889.             fclose($rs);
  890.             $arSql = explode(';',$str);
  891.             foreach($arSql as $sql)
  892.                 mysql_query($sql, $this->db_Conn);
  893.         }
  894.  
  895.  
  896.         if (@$_REQUEST["create_db"]=="Y")
  897.         {
  898.             if(!@mysql_query("CREATE DATABASE ".@$_REQUEST["db_name"], $this->db_Conn))
  899.             {
  900.                 $this->db_Error = getMsg("ERR_CREATE_DB", LANG).': '.mysql_error();
  901.                 return false;
  902.             }
  903.         }
  904.  
  905.         if(!mysql_select_db($this->DBName, $this->db_Conn))
  906.         {
  907.             if(($str_err = mysql_error($this->db_Conn)) != "")
  908.                 $this->db_Error = "<br><font color=#ff0000>Error! mysql_select_db($this->DBName)</font><br>".$str_err."<br>";
  909.             return false;
  910.         }
  911.  
  912.         return true;
  913.     }
  914.  
  915.     function readSql()
  916.     {
  917.         $cache ="";
  918.  
  919.         while(!feof($this->_dFile) && (substr($cache, (strlen($cache)-2), 1) != ";"))
  920.             $cache .= fgets($this->_dFile);
  921.  
  922.         if(!feof($this->_dFile))
  923.             return $cache;
  924.         else
  925.         {
  926.             $this->f_end = true;
  927.             return false;
  928.         }
  929.     }
  930.  
  931.     function restore()
  932.     {
  933.         $this->_dFile = @fopen($this->DBdump, 'r');
  934.  
  935.         if($this->d_pos > 0)
  936.             @fseek($this->_dFile, $this->d_pos);
  937.  
  938.         $sql = "";
  939.  
  940.         while(($sql = $this->readSql()) && haveTime())
  941.         {
  942.             if (defined('VMBITRIX')) // избавимся от MyISAM
  943.             {
  944.                 if (preg_match('#^CREATE TABLE#i',$sql))
  945.                 {
  946.                     $sql = preg_replace('#ENGINE=MyISAM#i','',$sql);
  947.                     $sql = preg_replace('#TYPE=MyISAM#i','',$sql);
  948.                 }
  949.             }
  950.  
  951.             $result = @mysql_query($sql, $this->db_Conn);
  952.  
  953.             if(!$result)
  954.             {
  955.                 $this->db_Error .= mysql_error().'<br><br>'.htmlspecialchars($sql);
  956.                 return false;
  957.             }
  958.             $sql = "";
  959.         }
  960.  
  961.         if($sql != "")
  962.         {
  963.             $result = @mysql_query($sql, $this->db_Conn);
  964.  
  965.             if(!$result)
  966.             {
  967.                 $this->db_Error .= mysql_error().'<br><br>'.htmlspecialchars($sql);
  968.                 return false;
  969.             }
  970.             $sql = "";
  971.         }
  972.  
  973.         return true;
  974.     }
  975.  
  976.     function getError()
  977.     {
  978.         return $this->db_Error;
  979.     }
  980.  
  981.     function getPos()
  982.     {
  983.         if (is_resource($this->_dFile))
  984.         {
  985.             return @ftell($this->_dFile);
  986.         }
  987.     }
  988.  
  989.     function close()
  990.     {
  991.         unset($this->_dFile);
  992.         return true;
  993.     }
  994.  
  995.     function is_end()
  996.     {
  997.         return $this->f_end;
  998.     }
  999. }
  1000.  
  1001. function getDumpList()
  1002. {
  1003.     $arDump = array();
  1004.     if (is_dir($back_dir = $_SERVER["DOCUMENT_ROOT"]."/bitrix/backup"))
  1005.     {
  1006.         $handle = opendir($back_dir);
  1007.         while (false !== ($file = readdir($handle)))
  1008.         {
  1009.             if($file == "." || $file == "..")
  1010.                 continue;
  1011.  
  1012.             if(is_dir($back_dir.'/'.$file))
  1013.                 continue;
  1014.  
  1015.             if (strpos($file,'_after_connect.sql'))
  1016.                 continue;
  1017.  
  1018.             if(substr($file, strlen($file) - 3, 3) == "sql")
  1019.                 $arDump[] = $file;
  1020.         }
  1021.     }
  1022.  
  1023.     return $arDump;
  1024. }
  1025.  
  1026. function getMsg($str_index, $str_lang='')
  1027. {
  1028.     global $mArr_ru, $mArr_en;
  1029.     if(LANG == "ru")
  1030.         return $mArr_ru[$str_index];
  1031.     else
  1032.         return $mArr_en[$str_index];
  1033. }
  1034.  
  1035. function getArcList()
  1036. {
  1037.     $arc = "";
  1038.  
  1039.     $handle = @opendir($_SERVER["DOCUMENT_ROOT"]);
  1040.     if (!$handle)
  1041.         return false;
  1042.  
  1043.     while (false !== ($file = @readdir($handle)))
  1044.     {
  1045.         if($file == "." || $file == "..")
  1046.             continue;
  1047.  
  1048.         if(is_dir($_SERVER["DOCUMENT_ROOT"]."/".$file))
  1049.             continue;
  1050.  
  1051.         if(substr($file, strlen($file) - 6, 6) == "tar.gz" || substr($file, strlen($file) - 3, 3) == "tar")
  1052.             $arc .= "<option value=\"$file\"> ".$file;
  1053.     }
  1054.  
  1055.     return $arc;
  1056. }
  1057.  
  1058. function showMsg($title, $msg, $bottom='')
  1059. {
  1060.     $ar = array(
  1061.         'TITLE' => $title,
  1062.         'TEXT' => $msg,
  1063.         'BOTTOM' => $bottom
  1064.  
  1065.     );
  1066.     html($ar);
  1067. }
  1068.  
  1069. function html($ar)
  1070. {
  1071. ?>
  1072.     <html>
  1073.     <head>
  1074.     <title><?=$ar['TITLE']?></title>
  1075.     </head>
  1076.     <body style="background:#4A507B">
  1077.     <style>
  1078.         td {font-family:Verdana;font-size:9pt}
  1079.     </style>
  1080.     <form name="restore" id="restore" action="restore.php" enctype="multipart/form-data" method="POST">
  1081.     <input type="hidden" name="Step" id="Step_id" value="">
  1082.     <input type="hidden" name="lang" value="<?=LANG?>">
  1083.     <script language="JavaScript">
  1084.         function reloadPage(val, lang, delay)
  1085.         {
  1086.             document.getElementById('Step_id').value = val;
  1087.             document.getElementById('restore').action='restore.php?lang=<?=LANG?>';
  1088.             if (null!=delay)
  1089.                 window.setTimeout("document.getElementById('restore').submit()",1000);
  1090.             else
  1091.                 document.getElementById('restore').submit();
  1092.         }
  1093.     </script>
  1094.     <table width=100% height=100%><tr><td align=center valign=middle>
  1095.     <table align="center" cellspacing=0 cellpadding=0 border=0 style="width:601px;height:387px">
  1096.         <tr>
  1097.             <td width=11><div style="background:#FFF url(<?=img('corner_top_left.gif')?>);width:11px;height:57px"></td>
  1098.             <td height=57 bgcolor="#FFFFFF" valign="middle">
  1099.                 <table cellpadding=0 cellspacing=0 border=0 width=100%><tr>
  1100.                     <td align=left style="font-size:14pt;color:#E11537;padding-left:25px"><?=$ar['TITLE']?></td>
  1101.                     <td align=right>
  1102.                         <?
  1103.                         $arLang = array();
  1104.                         foreach(array('en') as $l)
  1105.                             $arLang[] = LANG == $l ? "<span style='color:grey'>$l</span>" : "<a href='?lang=$l' style='color:black'>$l</a>";
  1106. #                       echo implode(' | ',$arLang);
  1107.                         ?>
  1108.                     </td>
  1109.                 </tr></table>
  1110.  
  1111.             </td>
  1112.             <td width=11><div style="background:#FFF url(<?=img('corner_top_right.gif')?>);width:11px;height:57px"></td>
  1113.         </tr>
  1114.         <tr>
  1115.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1116.             <td height=1 bgcolor="#FFFFFF"><hr size="1px" color="#D6D6D6"></td>
  1117.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1118.         </tr>
  1119.         <tr>
  1120.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1121.             <td bgcolor="#FFFFFF" style="padding:10px;font-size:10pt" valign="<?=$ar['TEXT_ALIGN']?$ar['TEXT_ALIGN']:'top'?>"><?=$ar['TEXT']?></td>
  1122.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1123.         </tr>
  1124.         <tr>
  1125.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1126.             <td bgcolor="#FFFFFF" style="padding:20x;font-size:10pt" valign="middle" align="right" height="40px"><?=$ar['BOTTOM']?></td>
  1127.             <td bgcolor="#FFFFFF">&nbsp;</td>
  1128.         </tr>
  1129.         <tr>
  1130.             <td><div style="background:#FFF url(<?=img('corner_bottom_left.gif')?>);width:11;height:23"></td>
  1131.             <td height=23 bgcolor="#FFFFFF" background="<?=img('bottom_fill.gif')?>"></td>
  1132.             <td><div style="background:#FFF url(<?=img('corner_bottom_right.gif')?>);width:11;height:23"></td>
  1133.         </tr>
  1134.     </table>
  1135.     <div style="background:url(<?=img('logo_'.(LANG=='ru'?'':'en_').'installer.gif')?>); width:95; height:34">
  1136.     </td></tr></table>
  1137.     </form>
  1138. <?
  1139. }
  1140.  
  1141. function SetCurrentProgress($cur,$total=0,$red=true)
  1142. {
  1143.     global $status;
  1144.     if (!$total)
  1145.     {
  1146.         $total=100;
  1147.         $cur=0;
  1148.     }
  1149.     $val = intval($cur/$total*100);
  1150.     if ($val > 100)
  1151.         $val = 99;
  1152.  
  1153.     $status = '
  1154.     <div align=center style="padding:10px;font-size:18px">'.$val.'%</div>
  1155.     <table width=100% cellspacing=0 cellpadding=0 border=0 style="border:1px solid #D8D8D8">
  1156.     <tr>
  1157.         <td style="width:'.$val.'%;height:13px" bgcolor="'.($red?'#FF5647':'#54B4FF').'" background="'.img(($red?'red':'blue').'_progress.gif').'"></td>
  1158.         <td style="width:'.(100-$val).'%"></td>
  1159.     </tr>
  1160.     </table>';
  1161. }
  1162.  
  1163. function LoadFile($strRequestedUrl, $strFilename)
  1164. {
  1165.     global $proxyaddr, $proxyport, $strUserAgent, $strRequestedSize;
  1166.  
  1167.     $strRealUrl = $strRequestedUrl;
  1168.     $iStartSize = 0;
  1169.     $iRealSize = 0;
  1170.  
  1171.     $bCanContinueDownload = False;
  1172.  
  1173.     // ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА
  1174.     $strRealUrl_tmp = "";
  1175.     $iRealSize_tmp = 0;
  1176.     if (file_exists($strFilename.".tmp") && file_exists($strFilename.".log") && filesize($strFilename.".log")>0)
  1177.     {
  1178.         $fh = fopen($strFilename.".log", "rb");
  1179.         $file_contents_tmp = fread($fh, filesize($strFilename.".log"));
  1180.         fclose($fh);
  1181.  
  1182.         list($strRealUrl_tmp, $iRealSize_tmp) = explode("\n", $file_contents_tmp);
  1183.         $strRealUrl_tmp = Trim($strRealUrl_tmp);
  1184.         $iRealSize_tmp = doubleval(Trim($iRealSize_tmp));
  1185.     }
  1186.     if ($iRealSize_tmp<=0 || strlen($strRealUrl_tmp)<=0)
  1187.     {
  1188.         $strRealUrl_tmp = "";
  1189.         $iRealSize_tmp = 0;
  1190.  
  1191.         if (file_exists($strFilename.".tmp"))
  1192.             @unlink($strFilename.".tmp");
  1193.  
  1194.         if (file_exists($strFilename.".log"))
  1195.             @unlink($strFilename.".log");
  1196.     }
  1197.     else
  1198.     {
  1199.         $strRealUrl = $strRealUrl_tmp;
  1200.         $iRealSize = $iRealSize_tmp;
  1201.         $iStartSize = filesize($strFilename.".tmp");
  1202.     }
  1203.     // КОНЕЦ: ИНИЦИАЛИЗИРУЕМ, ЕСЛИ ДОКАЧКА
  1204.  
  1205.     //SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_SERVER"));
  1206.     SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST")));
  1207.  
  1208.     // ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО
  1209.     do
  1210.     {
  1211.         SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_QUERY_DISTR")));
  1212.  
  1213.         $lasturl = $strRealUrl;
  1214.         $redirection = "";
  1215.  
  1216.         $parsedurl = @parse_url($strRealUrl);
  1217.         $useproxy = (($proxyaddr != "") && ($proxyport != ""));
  1218.  
  1219.         if (!$useproxy)
  1220.         {
  1221.             $host = $parsedurl["host"];
  1222.             $port = $parsedurl["port"];
  1223.             $hostname = $host;
  1224.         }
  1225.         else
  1226.         {
  1227.             $host = $proxyaddr;
  1228.             $port = $proxyport;
  1229.             $hostname = $parsedurl["host"];
  1230.         }
  1231.  
  1232.         $port = $port ? $port : "80";
  1233.  
  1234.         $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10);
  1235.         if (!$sockethandle)
  1236.         {
  1237.             SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg);
  1238.             return false;
  1239.         }
  1240.         else
  1241.         {
  1242.             if (!$parsedurl["path"])
  1243.                 $parsedurl["path"] = "/";
  1244.  
  1245. //          SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE"));
  1246.             $request = "";
  1247.             if (!$useproxy)
  1248.             {
  1249.                 $request .= "HEAD ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n";
  1250.                 $request .= "Host: $hostname\r\n";
  1251.             }
  1252.             else
  1253.             {
  1254.                 $request .= "HEAD ".$strRealUrl." HTTP/1.0\r\n";
  1255.                 $request .= "Host: $hostname\r\n";
  1256.             }
  1257.  
  1258.             if ($strUserAgent != "")
  1259.                 $request .= "User-Agent: $strUserAgent\r\n";
  1260.  
  1261.             $request .= "\r\n";
  1262.  
  1263.             fwrite($sockethandle, $request);
  1264.  
  1265.             $result = "";
  1266. //          SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT"));
  1267.  
  1268.             $replyheader = "";
  1269.             while (($result = fgets($sockethandle, 4096)) && $result!="\r\n")
  1270.             {
  1271.                 $replyheader .= $result;
  1272.             }
  1273.             fclose($sockethandle);
  1274.  
  1275.             $ar_replyheader = explode("\r\n", $replyheader);
  1276.  
  1277.             $replyproto = "";
  1278.             $replyversion = "";
  1279.             $replycode = 0;
  1280.             $replymsg = "";
  1281.             if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs))
  1282.             {
  1283.                 $replyproto = $regs[1];
  1284.                 $replyversion = $regs[2];
  1285.                 $replycode = IntVal($regs[3]);
  1286.                 $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1);
  1287.             }
  1288.  
  1289.             if ($replycode!=200 && $replycode!=302)
  1290.             {
  1291.                 if ($replycode==403)
  1292.                     SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER1")));
  1293.                 else
  1294.                     SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER")));
  1295.                 return false;
  1296.             }
  1297.  
  1298.             $strLocationUrl = "";
  1299.             $iNewRealSize = 0;
  1300.             $strAcceptRanges = "";
  1301.             for ($i = 1; $i < count($ar_replyheader); $i++)
  1302.             {
  1303.                 if (strpos($ar_replyheader[$i], "Location") !== false)
  1304.                     $strLocationUrl = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
  1305.                 elseif (strpos($ar_replyheader[$i], "Content-Length") !== false)
  1306.                     $iNewRealSize = IntVal(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)));
  1307.                 elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false)
  1308.                     $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
  1309.             }
  1310.  
  1311.             if (strlen($strLocationUrl)>0)
  1312.             {
  1313.                 $redirection = $strLocationUrl;
  1314.                 $redirected = true;
  1315.                 if ((strpos($redirection, "http://")===false))
  1316.                     $strRealUrl = dirname($lasturl)."/".$redirection;
  1317.                 else
  1318.                     $strRealUrl = $redirection;
  1319.             }
  1320.  
  1321.             if (strlen($strLocationUrl)<=0)
  1322.                 break;
  1323.         }
  1324.     }
  1325.     while (true);
  1326.     // КОНЕЦ: ИЩЕМ ФАЙЛ И ЗАПРАШИВАЕМ ИНФО
  1327.  
  1328.     $bCanContinueDownload = ($strAcceptRanges == "bytes");
  1329.  
  1330.     // ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ
  1331.     if (!$bCanContinueDownload
  1332.         || ($iRealSize>0 && $iNewRealSize != $iRealSize))
  1333.     {
  1334.     //  SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD"));
  1335.     //  $iStartSize = 0;
  1336.         die(LoaderGetMessage("LOADER_LOAD_NEED_RELOAD"));
  1337.     }
  1338.     // КОНЕЦ: ЕСЛИ НЕЛЬЗЯ ДОКАЧИВАТЬ
  1339.  
  1340.     // ЕСЛИ МОЖНО ДОКАЧИВАТЬ
  1341.     if ($bCanContinueDownload)
  1342.     {
  1343.         $fh = fopen($strFilename.".log", "wb");
  1344.         if (!$fh)
  1345.         {
  1346.             SetCurrentStatus(str_replace("#FILE#", $strFilename.".log", LoaderGetMessage("LOADER_LOAD_NO_WRITE2FILE")));
  1347.             return false;
  1348.         }
  1349.         fwrite($fh, $strRealUrl."\n");
  1350.         fwrite($fh, $iNewRealSize."\n");
  1351.         fclose($fh);
  1352.     }
  1353.     // КОНЕЦ: ЕСЛИ МОЖНО ДОКАЧИВАТЬ
  1354.  
  1355.     SetCurrentStatus(str_replace("#DISTR#", $strRealUrl, LoaderGetMessage("LOADER_LOAD_LOAD_DISTR")));
  1356.     $strRequestedSize = $iNewRealSize;
  1357.  
  1358.     // КАЧАЕМ ФАЙЛ
  1359.     $parsedurl = parse_url($strRealUrl);
  1360.     $useproxy = (($proxyaddr != "") && ($proxyport != ""));
  1361.  
  1362.     if (!$useproxy)
  1363.     {
  1364.         $host = $parsedurl["host"];
  1365.         $port = $parsedurl["port"];
  1366.         $hostname = $host;
  1367.     }
  1368.     else
  1369.     {
  1370.         $host = $proxyaddr;
  1371.         $port = $proxyport;
  1372.         $hostname = $parsedurl["host"];
  1373.     }
  1374.  
  1375.     $port = $port ? $port : "80";
  1376.  
  1377.     SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_CONN2HOST")));
  1378.     $sockethandle = @fsockopen($host, $port, $error_id, $error_msg, 10);
  1379.     if (!$sockethandle)
  1380.     {
  1381.         SetCurrentStatus(str_replace("#HOST#", $host, LoaderGetMessage("LOADER_LOAD_NO_CONN2HOST"))." [".$error_id."] ".$error_msg);
  1382.         return false;
  1383.     }
  1384.     else
  1385.     {
  1386.         if (!$parsedurl["path"])
  1387.             $parsedurl["path"] = "/";
  1388.  
  1389.         SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_QUERY_FILE"));
  1390.  
  1391.         $request = "";
  1392.         if (!$useproxy)
  1393.         {
  1394.             $request .= "GET ".$parsedurl["path"].($parsedurl["query"] ? '?'.$parsedurl["query"] : '')." HTTP/1.0\r\n";
  1395.             $request .= "Host: $hostname\r\n";
  1396.         }
  1397.         else
  1398.         {
  1399.             $request .= "GET ".$strRealUrl." HTTP/1.0\r\n";
  1400.             $request .= "Host: $hostname\r\n";
  1401.         }
  1402.  
  1403.         if ($strUserAgent != "")
  1404.             $request .= "User-Agent: $strUserAgent\r\n";
  1405.  
  1406.         if ($bCanContinueDownload && $iStartSize>0)
  1407.             $request .= "Range: bytes=".$iStartSize."-\r\n";
  1408.  
  1409.         $request .= "\r\n";
  1410.  
  1411.         fwrite($sockethandle, $request);
  1412.  
  1413.         $result = "";
  1414.         SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_WAIT"));
  1415.  
  1416.         $replyheader = "";
  1417.         while (($result = fgets($sockethandle, 4096)) && $result!="\r\n")
  1418.             $replyheader .= $result;
  1419.  
  1420.         $ar_replyheader = explode("\r\n", $replyheader);
  1421.  
  1422.         $replyproto = "";
  1423.         $replyversion = "";
  1424.         $replycode = 0;
  1425.         $replymsg = "";
  1426.         if (preg_match("#([A-Z]{4})/([0-9.]{3}) ([0-9]{3})#", $ar_replyheader[0], $regs))
  1427.         {
  1428.             $replyproto = $regs[1];
  1429.             $replyversion = $regs[2];
  1430.             $replycode = IntVal($regs[3]);
  1431.             $replymsg = substr($ar_replyheader[0], strpos($ar_replyheader[0], $replycode) + strlen($replycode) + 1, strlen($ar_replyheader[0]) - strpos($ar_replyheader[0], $replycode) + 1);
  1432.         }
  1433.  
  1434.         if ($replycode!=200 && $replycode!=302 && $replycode!=206)
  1435.         {
  1436.             SetCurrentStatus(str_replace("#ANS#", $replycode." - ".$replymsg, LoaderGetMessage("LOADER_LOAD_SERVER_ANSWER")));
  1437.             return false;
  1438.         }
  1439.  
  1440.         $strContentRange = "";
  1441.         $iContentLength = 0;
  1442.         $strAcceptRanges = "";
  1443.         for ($i = 1; $i < count($ar_replyheader); $i++)
  1444.         {
  1445.             if (strpos($ar_replyheader[$i], "Content-Range") !== false)
  1446.                 $strContentRange = trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
  1447.             elseif (strpos($ar_replyheader[$i], "Content-Length") !== false)
  1448.                 $iContentLength = doubleval(Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1)));
  1449.             elseif (strpos($ar_replyheader[$i], "Accept-Ranges") !== false)
  1450.                 $strAcceptRanges = Trim(substr($ar_replyheader[$i], strpos($ar_replyheader[$i], ":") + 1, strlen($ar_replyheader[$i]) - strpos($ar_replyheader[$i], ":") + 1));
  1451.         }
  1452.  
  1453.         $bReloadFile = True;
  1454.         if (strlen($strContentRange)>0)
  1455.         {
  1456.             if (preg_match("# *bytes +([0-9]*) *- *([0-9]*) */ *([0-9]*)#i", $strContentRange, $regs))
  1457.             {
  1458.                 $iStartBytes_tmp = doubleval($regs[1]);
  1459.                 $iEndBytes_tmp = doubleval($regs[2]);
  1460.                 $iSizeBytes_tmp = doubleval($regs[3]);
  1461.  
  1462.                 if ($iStartBytes_tmp==$iStartSize
  1463.                     && $iEndBytes_tmp==($iNewRealSize-1)
  1464.                     && $iSizeBytes_tmp==$iNewRealSize)
  1465.                 {
  1466.                     $bReloadFile = False;
  1467.                 }
  1468.             }
  1469.         }
  1470.  
  1471.         if ($bReloadFile)
  1472.         {
  1473.             @unlink($strFilename.".tmp");
  1474.             $iStartSize = 0;
  1475.         }
  1476.  
  1477.         if (($iContentLength+$iStartSize)!=$iNewRealSize)
  1478.         {
  1479.             SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_ERR_SIZE"));
  1480.             return false;
  1481.         }
  1482.  
  1483.         $fh = fopen($strFilename.".tmp", "ab");
  1484.         if (!$fh)
  1485.         {
  1486.             SetCurrentStatus(str_replace("#FILE#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_CANT_OPEN_WRITE")));
  1487.             return false;
  1488.         }
  1489.  
  1490.         $bFinished = True;
  1491.         $downloadsize = (double) $iStartSize;
  1492.         SetCurrentStatus(LoaderGetMessage("LOADER_LOAD_LOADING"));
  1493.         while (!feof($sockethandle))
  1494.         {
  1495.             if (!haveTime())
  1496.             {
  1497.                 $bFinished = False;
  1498.                 break;
  1499.             }
  1500.  
  1501.             $result = fread($sockethandle, 40960);
  1502.             $downloadsize += strlen($result);
  1503.             if ($result=="")
  1504.                 break;
  1505.  
  1506.             fwrite($fh, $result);
  1507.         }
  1508.         SetCurrentProgress($downloadsize,$iNewRealSize);
  1509.  
  1510.         fclose($fh);
  1511.         fclose($sockethandle);
  1512.  
  1513.         if ($bFinished)
  1514.         {
  1515.             @unlink($strFilename);
  1516.             if (!@rename($strFilename.".tmp", $strFilename))
  1517.             {
  1518.                 SetCurrentStatus(str_replace("#FILE2#", $strFilename, str_replace("#FILE1#", $strFilename.".tmp", LoaderGetMessage("LOADER_LOAD_ERR_RENAME"))));
  1519.                 return false;
  1520.             }
  1521.         }
  1522.         else
  1523.             return 2;
  1524.  
  1525.         SetCurrentStatus(str_replace("#SIZE#", $downloadsize, str_replace("#FILE#", $strFilename, LoaderGetMessage("LOADER_LOAD_FILE_SAVED"))));
  1526.         @unlink($strFilename.".log");
  1527.         return 1;
  1528.     }
  1529.     // КОНЕЦ: КАЧАЕМ ФАЙЛ
  1530. }
  1531.  
  1532. function SetCurrentStatus($str)
  1533. {
  1534.     global $strLog;
  1535.     $strLog .= $str."\n";
  1536. }
  1537.  
  1538. function LoaderGetMessage($name)
  1539. {
  1540.     global $MESS;
  1541.     return $MESS[$name];
  1542. }
  1543.  
  1544. class CTar
  1545. {
  1546.     var $gzip;
  1547.     var $file;
  1548.     var $err = array();
  1549.     var $res;
  1550.     var $Block = 0;
  1551.     var $BlockHeader;
  1552.     var $path;
  1553.     var $FileCount = 0;
  1554.     var $DirCount = 0;
  1555.     var $ReadBlockMax = 2000;
  1556.     var $ReadBlockCurrent = 0;
  1557.     var $header = null;
  1558.     var $ArchiveSizeMax;
  1559.     var $BX_EXTRA = 'BX0000';
  1560.  
  1561.     ##############
  1562.     # READ
  1563.     # {
  1564.     function openRead($file)
  1565.     {
  1566.         if (!isset($this->gzip) && (substr($file,-3)=='.gz' || substr($file,-4)=='.tgz'))
  1567.             $this->gzip = true;
  1568.  
  1569.         return $this->open($file, 'r');
  1570.     }
  1571.  
  1572.     function readBlock()
  1573.     {
  1574.         $str = $this->gzip ? gzread($this->res,512) : fread($this->res,512);
  1575.         if (!$str && $this->openNext())
  1576.             $str = $this->gzip ? gzread($this->res,512) : fread($this->res,512);
  1577.  
  1578.         if ($str)
  1579.             $this->Block++;
  1580.  
  1581.         return $str;
  1582.     }
  1583.  
  1584.     function SkipFile()
  1585.     {
  1586.         $this->Skip(ceil($this->header['size']/512));
  1587.         $this->header = null;
  1588.     }
  1589.  
  1590.     function Skip($Block = 0)
  1591.     {
  1592.         if (!$Block)
  1593.             return false;
  1594.         $pos = $this->gzip ? gztell($this->res) : ftell($this->res);
  1595.         if (file_exists($this->getNextName()))
  1596.         {
  1597.             while(($BlockLeft = ($this->getArchiveSize($this->file) - $pos)/512) < $Block)
  1598.             {
  1599.                 if ($BlockLeft != floor($BlockLeft))
  1600.                     return false; // invalid file size
  1601.                 $this->Block += $BlockLeft;
  1602.                 $Block -= $BlockLeft;
  1603.                 if (!$this->openNext())
  1604.                     return false;
  1605.                 $pos = 0;
  1606.             }
  1607.         }
  1608.  
  1609.         $this->Block += $Block;
  1610.         return 0 === ($this->gzip ? gzseek($this->res,$pos + $Block*512) : fseek($this->res,$pos + $Block*512));
  1611.     }
  1612.  
  1613.     function readHeader($Long = false)
  1614.     {
  1615.         $str = '';
  1616.         while(trim($str) == '')
  1617.             if (!strlen($str = $this->readBlock()))
  1618.                 return 0; // finish
  1619.         if (!$Long)
  1620.             $this->BlockHeader = $this->Block - 1;
  1621.  
  1622.         if (strlen($str)!=512)
  1623.             return $this->Error('TAR_WRONG_BLOCK_SIZE',$this->Block.' ('.strlen($str).')');
  1624.  
  1625.  
  1626.         $data = unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1type/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $str);
  1627.         $chk = $data['devmajor'].$data['devminor'];
  1628.  
  1629.         if (!is_numeric(trim($data['checksum'])) || $chk!='' && $chk!=0)
  1630.             return $this->Error('TAR_ERR_FORMAT',($this->Block-1).'<hr>Header: <br>'.htmlspecialchars($str)); // быстрая проверка
  1631.  
  1632.         $header['filename'] = trim($data['prefix'].'/'.$data['filename'],'/');
  1633.         $header['mode'] = OctDec($data['mode']);
  1634.         $header['uid'] = OctDec($data['uid']);
  1635.         $header['gid'] = OctDec($data['gid']);
  1636.         $header['size'] = OctDec($data['size']);
  1637.         $header['mtime'] = OctDec($data['mtime']);
  1638.         $header['type'] = $data['type'];
  1639. //      $header['link'] = $data['link'];
  1640.  
  1641.         if (strpos($header['filename'],'./')===0)
  1642.             $header['filename'] = substr($header['filename'],2);
  1643.  
  1644.         if ($header['type']=='L') // Long header
  1645.         {
  1646.             $n = ceil($header['size']/512);
  1647.             for ($i = 0; $i < $n; $i++)
  1648.                 $filename .= $this->readBlock();
  1649.  
  1650.             $header = $this->readHeader($Long = true);
  1651.             $header['filename'] = substr($filename,0,strpos($filename,chr(0)));
  1652.         }
  1653.        
  1654.         if (substr($header['filename'],-1)=='/') // trailing slash
  1655.             $header['type'] = 5; // Directory
  1656.  
  1657.         if ($header['type']=='5')
  1658.             $header['size'] = '';
  1659.  
  1660.         if ($header['filename']=='')
  1661.             return $this->Error('TAR_EMPTY_FILE',($this->Block-1));
  1662.  
  1663.         if (!$this->checkCRC($str, $data))
  1664.             return $this->Error('TAR_ERR_CRC',htmlspecialchars($header['filename']));
  1665.  
  1666.         $this->header = $header;
  1667.  
  1668.         return $header;
  1669.     }
  1670.  
  1671.     function checkCRC($str, $data)
  1672.     {
  1673.         $checksum = $this->checksum($str);
  1674.         $res = octdec($data['checksum']) == $checksum || $data['checksum']===0 && $checksum==256;
  1675. #       if (!$res)
  1676. #           var_dump(octdec($data['checksum']) .'=='. $checksum);
  1677.         return $res;
  1678.     }
  1679.  
  1680.     function extractFile()
  1681.     {
  1682.         if ($this->header === null)
  1683.         {
  1684.             if(($header = $this->readHeader()) === false || $header === 0 || $header === true)
  1685.             {
  1686.                 if ($header === true)
  1687.                     $this->SkipFile();
  1688.                 return $header;
  1689.             }
  1690.  
  1691.             $this->lastPath = $f = $this->path.'/'.$header['filename'];
  1692.        
  1693.             if ($this->ReadBlockCurrent == 0)
  1694.             {
  1695.                 if ($header['type']==5) // dir
  1696.                 {
  1697.                     if(!file_exists($f) && !self::xmkdir($f))
  1698.                         return $this->Error('TAR_ERR_FOLDER_CREATE',htmlspecialchars($f));
  1699.                     //chmod($f, $header['mode']);
  1700.                 }
  1701.                 else // file
  1702.                 {
  1703.                     if (!self::xmkdir($dirname = dirname($f)))
  1704.                         return $this->Error('TAR_ERR_FOLDER_CREATE'.htmlspecialchars($dirname));
  1705.                     elseif (($rs = fopen($f, 'wb'))===false)
  1706.                         return $this->Error('TAR_ERR_FILE_CREATE',htmlspecialchars($f));
  1707.                 }
  1708.             }
  1709.             else
  1710.                 $this->Skip($this->ReadBlockCurrent);
  1711.         }
  1712.         else // файл уже частично распакован, продолжаем на том же хите
  1713.         {
  1714.             $header = $this->header;
  1715.             $this->lastPath = $f = $this->path.'/'.$header['filename'];
  1716.         }
  1717.  
  1718.         if ($header['type'] != 5) // пишем контент в файл
  1719.         {
  1720.             if (!$rs)
  1721.             {
  1722.                 if (($rs = fopen($f, 'ab'))===false)
  1723.                     return $this->Error('TAR_ERR_FILE_OPEN',htmlspecialchars($f));
  1724.             }
  1725.  
  1726.             $i = 0;
  1727.             $FileBlockCount = ceil($header['size'] / 512);
  1728.             while(++$this->ReadBlockCurrent <= $FileBlockCount && ($contents = $this->readBlock()))
  1729.             {
  1730.                 if ($this->ReadBlockCurrent == $FileBlockCount && ($chunk = $header['size'] % 512))
  1731.                     $contents = substr($contents, 0, $chunk);
  1732.  
  1733.                 fwrite($rs,$contents);
  1734.  
  1735.                 if ($this->ReadBlockMax && ++$i >= $this->ReadBlockMax)
  1736.                 {
  1737.                     fclose($rs);
  1738.                     return true; // Break
  1739.                 }
  1740.             }
  1741.             fclose($rs);
  1742.  
  1743.             //chmod($f, $header['mode']);
  1744.             if (($s=filesize($f)) != $header['size'])
  1745.                 return $this->Error('TAR_ERR_FILE_SIZE',htmlspecialchars($header['filename']).' (real: '.$s.',  expected: '.$header['size'].')');
  1746.         }
  1747.  
  1748.         if ($this->header['type']==5)
  1749.             $this->DirCount++;
  1750.         else
  1751.             $this->FileCount++;
  1752.  
  1753.         $this->debug_header = $this->header;
  1754.         $this->BlockHeader = $this->Block;
  1755.         $this->ReadBlockCurrent = 0;
  1756.         $this->header = null;
  1757.  
  1758.         return true;
  1759.     }
  1760.  
  1761.     function extract()
  1762.     {
  1763.         while ($r = $this->extractFile());
  1764.         return $r === 0;
  1765.     }
  1766.  
  1767.     function openNext()
  1768.     {
  1769.         if (file_exists($file = $this->getNextName()))
  1770.         {
  1771.             $this->close();
  1772.             return $this->open($file,$this->mode);
  1773.         }
  1774.         else
  1775.             return false;
  1776.     }
  1777.  
  1778.     # }
  1779.     ##############
  1780.  
  1781.     ##############
  1782.     # WRITE
  1783.     # {
  1784.     function openWrite($file)
  1785.     {
  1786.         if (!isset($this->gzip) && (substr($file,-3)=='.gz' || substr($file,-4)=='.tgz'))
  1787.             $this->gzip = true;
  1788.  
  1789.         if ($this->ArchiveSizeMax > 0)
  1790.         {
  1791.             while(file_exists($file1 = $this->getNextName($file)))
  1792.                 $file = $file1;
  1793.  
  1794.             $size = 0;
  1795.             if (($size = $this->getArchiveSize($file)) >= $this->ArchiveSizeMax)
  1796.             {
  1797.                 $file = $file1;
  1798.                 $size = 0;
  1799.             }
  1800.             $this->ArchiveSizeCurrent = $size;
  1801.         }
  1802.         return $this->open($file, 'a');
  1803.     }
  1804.  
  1805.     // создадим пустой gzip с экстра полем
  1806.     function createEmptyGzipExtra($file)
  1807.     {
  1808.         if (file_exists($file))
  1809.             return false;
  1810.  
  1811.         if (!($f = gzopen($file,'wb')))
  1812.             return false;
  1813.         gzwrite($f,'');
  1814.         gzclose($f);
  1815.  
  1816.         $data = file_get_contents($file);
  1817.  
  1818.         if (!($f = fopen($file, 'w')))
  1819.             return false;
  1820.  
  1821.         $ar = unpack('A3bin0/A1FLG/A6bin1',substr($data,0,10));
  1822.         if ($ar['FLG'] != 0)
  1823.             return $this->Error('Error writing extra field: already exists');
  1824.  
  1825.         $EXTRA = chr(0).chr(0).chr(strlen($this->BX_EXTRA)).chr(0).$this->BX_EXTRA;
  1826.         fwrite($f,$ar['bin0'].chr(4).$ar['bin1'].chr(strlen($EXTRA)).chr(0).$EXTRA.substr($data,10));
  1827.         fclose($f);
  1828.         return true;
  1829.     }
  1830.  
  1831.     function writeBlock($str)
  1832.     {
  1833.         $l = strlen($str);
  1834.         if ($l!=512)
  1835.             return $this->Error('TAR_WRONG_BLOCK_SIZE'.$l);
  1836.  
  1837.         if ($this->ArchiveSizeMax && $this->ArchiveSizeCurrent >= $this->ArchiveSizeMax)
  1838.         {
  1839.             $file = $this->getNextName();
  1840.             $this->close();
  1841.  
  1842.             if (!$this->open($file,$this->mode))
  1843.                 return false;
  1844.  
  1845.             $this->ArchiveSizeCurrent = 0;
  1846.         }
  1847.  
  1848.         if ($res = $this->gzip ? gzwrite($this->res, $str) : fwrite($this->res,$str))
  1849.         {
  1850.             $this->Block++;
  1851.             $this->ArchiveSizeCurrent+=512;
  1852.         }
  1853.  
  1854.         return $res;
  1855.     }
  1856.  
  1857.     function writeHeader($ar)
  1858.     {
  1859.         $header0 = pack("a100a8a8a8a12a12", $ar['filename'], decoct($ar['mode']), decoct($ar['uid']), decoct($ar['gid']), decoct($ar['size']), decoct($ar['mtime']));
  1860.         $header1 = pack("a1a100a6a2a32a32a8a8a155", $ar['type'],'','','','','','', '', $ar['prefix']);
  1861.  
  1862.         $checksum = pack("a8",decoct($this->checksum($header0.'        '.$header1)));
  1863.         $header = pack("a512", $header0.$checksum.$header1);
  1864.         return $this->writeBlock($header) || $this->Error('TAR_ERR_WRITE_HEADER');
  1865.     }
  1866.  
  1867.     function addFile($f)
  1868.     {
  1869.         $f = str_replace('\\', '/', $f);
  1870.         $path = substr($f,strlen($this->path) + 1);
  1871.         if ($path == '')
  1872.             return true;
  1873.         if (strlen($path)>512)
  1874.             return $this->Error('TAR_PATH_TOO_LONG',htmlspecialchars($path));
  1875.  
  1876.         $ar = array();
  1877.  
  1878.         if (is_dir($f))
  1879.         {
  1880.             $ar['type'] = 5;
  1881.             $path .= '/';
  1882.         }
  1883.         else
  1884.             $ar['type'] = 0;
  1885.  
  1886.         $info = stat($f);
  1887.         if ($info)
  1888.         {
  1889.             if ($this->ReadBlockCurrent == 0) // read from start
  1890.             {
  1891.                 $ar['mode'] = 0777 & $info['mode'];
  1892.                 $ar['uid'] = $info['uid'];
  1893.                 $ar['gid'] = $info['gid'];
  1894.                 $ar['size'] = $ar['type']==5 ? 0 : $info['size'];
  1895.                 $ar['mtime'] = $info['mtime'];
  1896.  
  1897.  
  1898.                 if (strlen($path)>100) // Long header
  1899.                 {
  1900.                     $ar0 = $ar;
  1901.                     $ar0['type'] = 'L';
  1902.                     $ar0['filename'] = '././@LongLink';
  1903.                     $ar0['size'] = strlen($path);
  1904.                     if (!$this->writeHeader($ar0))
  1905.                         return false;
  1906.                     $path .= str_repeat(chr(0),512 - strlen($path));
  1907.  
  1908.                     if (!$this->writeBlock($path))
  1909.                         return false;
  1910.                     $ar['filename'] = substr($path,0,100);
  1911.                 }
  1912.                 else
  1913.                     $ar['filename'] = $path;
  1914.  
  1915.                 if (!$this->writeHeader($ar))
  1916.                     return false;
  1917.             }
  1918.  
  1919.             if ($ar['type']==0 && $info['size']>0) // File
  1920.             {
  1921.                 if (!($rs = fopen($f, 'rb')))
  1922.                     return $this->Error('TAR_ERR_FILE_READ',htmlspecialchars($f));
  1923.  
  1924.                 if ($this->ReadBlockCurrent)
  1925.                     fseek($rs, $this->ReadBlockCurrent * 512);
  1926.  
  1927.                 $i = 0;
  1928.                 while(!feof($rs) && $str = fread($rs,512))
  1929.                 {
  1930.                     $this->ReadBlockCurrent++;
  1931.                     if (feof($rs) && ($l = strlen($str)) && $l < 512)
  1932.                         $str .= str_repeat(chr(0),512 - $l);
  1933.  
  1934.                     if (!$this->writeBlock($str))
  1935.                     {
  1936.                         fclose($rs);
  1937.                         return $this->Error('TAR_ERR_FILE_WRITE',htmlspecialchars($f));
  1938.                     }
  1939.  
  1940.                     if ($this->ReadBlockMax && ++$i >= $this->ReadBlockMax)
  1941.                     {
  1942.                         fclose($rs);
  1943.                         return true;
  1944.                     }
  1945.                 }
  1946.                 fclose($rs);
  1947.                 $this->ReadBlockCurrent = 0;
  1948.             }
  1949.             return true;
  1950.         }
  1951.         else
  1952.             return $this->Error('TAR_ERR_FILE_NO_ACCESS',htmlspecialchars($f));
  1953.     }
  1954.  
  1955.     # }
  1956.     ##############
  1957.  
  1958.     ##############
  1959.     # BASE
  1960.     # {
  1961.     function open($file, $mode='r')
  1962.     {
  1963.         $this->file = $file;
  1964.         $this->mode = $mode;
  1965.  
  1966.         if ($this->gzip)
  1967.         {
  1968.             if(!function_exists('gzopen'))
  1969.                 return $this->Error('TAR_NO_GZIP');
  1970.             else
  1971.             {
  1972.                 if ($mode == 'a' && !file_exists($file) && !$this->createEmptyGzipExtra($file))
  1973.                     return false;
  1974.                 $this->res = gzopen($file,$mode."b");
  1975.             }
  1976.         }
  1977.         else
  1978.             $this->res = fopen($file,$mode."b");
  1979.  
  1980.         return $this->res;
  1981.     }
  1982.  
  1983.     function close()
  1984.     {
  1985.         if ($this->gzip)
  1986.         {
  1987.             gzclose($this->res);
  1988.  
  1989.             // добавим фактический размер всех несжатых данных в extra поле
  1990.             if ($this->mode == 'a')
  1991.             {
  1992.                 $f = fopen($this->file, 'rb+');
  1993. #               fseek($f, -4, SEEK_END);
  1994.                 fseek($f, 18);
  1995.                 fwrite($f, pack("V", $this->ArchiveSizeCurrent));
  1996.                 fclose($f);
  1997.             }
  1998.         }
  1999.         else
  2000.             fclose($this->res);
  2001.     }
  2002.  
  2003.     function getNextName($file = '')
  2004.     {
  2005.         if (!$file)
  2006.             $file = $this->file;
  2007.         static $CACHE;
  2008.         $c = &$CACHE[$file];
  2009.  
  2010.         if (!$c)
  2011.         {
  2012.             $l = strrpos($file, '.');
  2013.             $num = substr($file,$l+1);
  2014.             if (is_numeric($num))
  2015.                 $file = substr($file,0,$l+1).++$num;
  2016.             else
  2017.                 $file .= '.1';
  2018.             $c = $file;
  2019.         }
  2020.         return $c;
  2021.     }
  2022.  
  2023.     function checksum($str)
  2024.     {
  2025.         static $CACHE;
  2026.         $checksum = &$CACHE[md5($str)];
  2027.         if (!$checksum)
  2028.         {
  2029. //          $str = pack("a512",$str);
  2030.             for ($i = 0; $i < 512; $i++)
  2031.                 if ($i>=148 && $i<156)
  2032.                     $checksum += 32; // ord(' ')
  2033.                 else
  2034.                     $checksum += ord($str[$i]);
  2035.         }
  2036.         return $checksum;
  2037.     }
  2038.  
  2039.     function getArchiveSize($file = '')
  2040.     {
  2041.         if (!$file)
  2042.             $file = $this->file;
  2043.         static $CACHE;
  2044.         $size = &$CACHE[$file];
  2045.  
  2046.         if (!$size)
  2047.         {
  2048.             if (!file_exists($file))
  2049.                 $size = 0;
  2050.             else
  2051.             {
  2052.                 if ($this->gzip)
  2053.                 {
  2054.                     $f = fopen($file, "rb");
  2055.         #           fseek($f, -4, SEEK_END);
  2056.                     fseek($f, 16);
  2057.                     if (fread($f, 2) == 'BX')
  2058.                     {
  2059.                         $size = end(unpack("V", fread($f, 4)));
  2060.                         fclose($f);
  2061.                     }
  2062.                     else
  2063.                     {
  2064.                         fclose($f);
  2065.                         $size = filesize($file) * 3; // fake
  2066.                     }
  2067.                 }
  2068.                 else
  2069.                     $size = filesize($file);
  2070.             }
  2071.         }
  2072.         return $size;
  2073.     }
  2074.  
  2075.     function Error($err_code, $str = '')
  2076.     {
  2077. //      echo '<pre>';debug_print_backtrace();echo '</pre>';
  2078. //      echo '<pre>';print_r($this);echo '</pre>';
  2079.  
  2080.         if (is_array($this->debug_header))
  2081.             $str .= '<hr>Последний успешный файл: <br><pre>'.(htmlspecialchars(print_r($this->debug_header,1))).'</pre>';
  2082.         $this->err[] = self::getMsg($err_code).' '.$str;
  2083.         return false;
  2084.     }
  2085.  
  2086.     function xmkdir($dir)
  2087.     {
  2088.         if (!file_exists($dir))
  2089.         {
  2090.             $upper_dir = dirname($dir);
  2091.             if (!file_exists($upper_dir) && !self::xmkdir($upper_dir))
  2092.                 return false;
  2093.  
  2094.             return mkdir($dir);
  2095.         }
  2096.  
  2097.         return is_dir($dir);
  2098.     }
  2099.  
  2100.     function getMsg($code)
  2101.     {
  2102.         if (function_exists('getMsg'))
  2103.             return getMsg($code);
  2104.         else
  2105.             return $code;
  2106.     }
  2107.  
  2108.     function __construct()
  2109.     {
  2110. //      $this->ArchiveSizeMax = 2000 * 1024 * 1024;
  2111.         $this->ArchiveSizeMax = 20 * 1024 * 1024;
  2112.     }
  2113.  
  2114.     # }
  2115.     ##############
  2116. }
  2117.  
  2118. class CTarRestore extends CTar
  2119. {
  2120.     function readHeader($Long = false)
  2121.     {
  2122.         $header = parent::readHeader($Long);
  2123.         if (is_array($header))
  2124.         {
  2125.             $dr = str_replace(array('/','\\'),'',$_SERVER['DOCUMENT_ROOT']);
  2126.             $f = str_replace(array('/','\\'),'',$this->path.'/'.$header['filename']);
  2127.  
  2128.             if ($f == $dr.'restore.php')
  2129.                 return true;
  2130.             elseif ($f == $dr.'.htaccess')
  2131.                 $header['filename'] .= '.restore';
  2132.             elseif ($f == $dr.'bitrix.config.php')
  2133.                 return file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/.config.php') ? true : $this->Error('NOT_SAAS_ENV');
  2134.             elseif ($this->Block == 1 && file_exists($_SERVER['DOCUMENT_ROOT'].'/bitrix/.config.php'))
  2135.                 return $this->Error('NOT_SAAS_DISTR');
  2136.         }
  2137.         return $header;
  2138.     }
  2139. }
  2140.  
  2141. function haveTime()
  2142. {
  2143.     return microtime(true) - START_EXEC_TIME < STEP_TIME;
  2144. }
  2145.  
  2146. function img($name)
  2147. {
  2148.     if (file_exists($_SERVER['DOCUMENT_ROOT'].'/images/'.$name))
  2149.         return '/images/'.$name;
  2150.     return 'http://www.1c-bitrix.ru/images/bitrix_setup/'.$name;
  2151. }
  2152.  
  2153. function bx_accelerator_reset()
  2154. {
  2155.         if(function_exists("accelerator_reset"))
  2156.                 accelerator_reset();
  2157.         elseif(function_exists("wincache_refresh_if_changed"))
  2158.                 wincache_refresh_if_changed();
  2159. }
  2160. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement