Current Path : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/modules/main/admin/ |
Current File : /var/www/www-root/data/www.catalog.monolith-realty.ru/bitrix/modules/main/admin/dump.php |
<?php /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2013 Bitrix */ /** * Bitrix vars * @global CUser $USER * @global CMain $APPLICATION * @global CDatabase $DB */ use Bitrix\Main\Security\Random; define('NO_AGENT_CHECK', true); define("STATISTIC_SKIP_ACTIVITY_CHECK", true); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); define("HELP_FILE", "utilities/dump.php"); if(!$USER->CanDoOperation('edit_php')) $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); if(!defined("START_EXEC_TIME")) define("START_EXEC_TIME", microtime(true)); IncludeModuleLangFile(__FILE__); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/classes/general/backup.php"); $strBXError = ''; $bGzip = function_exists('gzcompress'); $encrypt = function_exists('openssl_encrypt'); $bHash = function_exists('hash'); $bBitrixCloud = $encrypt && $bHash; if (!CModule::IncludeModule('bitrixcloud')) { $bBitrixCloud = false; $strBXError = GetMessage('ERR_NO_BX_CLOUD'); } elseif (!CModule::IncludeModule('clouds')) { $bBitrixCloud = false; $strBXError = GetMessage('ERR_NO_CLOUDS'); } if($bBitrixCloud) { $backup = CBitrixCloudBackup::getInstance(); $arFiles = $backup->listFiles(); $backup->saveToOptions(); } define('DOCUMENT_ROOT', rtrim(str_replace('\\','/',$_SERVER['DOCUMENT_ROOT']),'/')); // define('DUMP_DEBUG_MODE', true); // xdebug_start_trace(); $arAllBucket = CBackup::GetBucketList(); $status_title = ""; if (isset($_REQUEST['ajax_mode']) && $_REQUEST['ajax_mode'] == 'Y') { if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'get_table_size') { ?> <script> BX('db_size').innerHTML = "(<?=CFile::FormatSize(getTableSize(""))?>)"; BX('db_stat_size').innerHTML = "(<?=CFile::FormatSize(getTableSize("^b_stat"))?>)"; BX('db_search_size').innerHTML = "(<?=CFile::FormatSize(getTableSize("^b_search"))?>)"; BX('db_event_size').innerHTML = "(<?=CFile::FormatSize(getTableSize("^b_event_log$"))?>)"; </script> <? die(); } } elseif(isset($_REQUEST['process']) && $_REQUEST['process'] == "Y") { if (!check_bitrix_sessid()) RaiseErrorAndDie(GetMessage("DUMP_MAIN_SESISON_ERROR")); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_js.php"); $NS =& \Bitrix\Main\Application::getInstance()->getSession()['BX_DUMP_STATE']; if(isset($_REQUEST['action']) && $_REQUEST['action'] == 'start') { define('NO_TIME', true); $bFull = isset($_REQUEST['dump_all']) && $_REQUEST['dump_all'] == 'Y'; if(!file_exists(DOCUMENT_ROOT.BX_ROOT."/backup")) mkdir(DOCUMENT_ROOT.BX_ROOT."/backup", BX_DIR_PERMISSIONS); if(!file_exists(DOCUMENT_ROOT.BX_ROOT."/backup/index.php")) { $f = fopen(DOCUMENT_ROOT.BX_ROOT."/backup/index.php","w"); fwrite($f,"<head><meta http-equiv=\"REFRESH\" content=\"0;URL=/bitrix/admin/index.php\"></head>"); fclose($f); } if(!is_dir(DOCUMENT_ROOT.BX_ROOT."/backup") || !is_writable(DOCUMENT_ROOT.BX_ROOT."/backup")) RaiseErrorAndDie(GetMessage("MAIN_DUMP_FOLDER_ERR",array('#FOLDER#' => DOCUMENT_ROOT.BX_ROOT.'/backup'))); DeleteDirFilesEx(BX_ROOT.'/backup/clouds'); $NS = Array(); $NS['finished_steps'] = 0; $NS['dump_state'] = ''; $NS['BUCKET_ID'] = intval($_REQUEST['dump_bucket_id'] ?? 0); COption::SetOptionInt("main", "dump_bucket_id", $NS['BUCKET_ID']); if ($encrypt && !empty($_REQUEST['dump_encrypt_key'])) { $NS['dump_encrypt_key'] = $_REQUEST['dump_encrypt_key']; // if (!defined('BX_UTF') || !BX_UTF) // $NS['dump_encrypt_key'] = $APPLICATION->ConvertCharset('windows-1251','utf-8',$NS['dump_encrypt_key']); COption::SetOptionInt("main", "dump_encrypt", 1); } else COption::SetOptionInt("main", "dump_encrypt", 0); if ($NS['BUCKET_ID'] == -1 && !$NS['dump_encrypt_key']) RaiseErrorAndDie(GetMessage('MAIN_DUMP_BXCLOUD_ENC')); $bUseCompression = $bGzip && (!isset($_REQUEST['dump_disable_gzip']) || $_REQUEST['dump_disable_gzip'] != 'Y' || $bFull); COption::SetOptionInt("main", "dump_use_compression", $bUseCompression); if ($bFull) { $NS['total_steps'] = 4; // dump, tar dump, tar files, integrity COption::SetOptionInt("main", "dump_max_exec_time", 20); COption::SetOptionInt("main", "dump_max_exec_time_sleep", 1); COption::SetOptionInt("main", "dump_archive_size_limit", 100 * 1024 * 1024); COption::SetOptionInt("main", "dump_integrity_check", 1); COption::SetOptionInt("main", "dump_max_file_size", 0); COption::SetOptionInt("main", "dump_file_public", 1); COption::SetOptionInt("main", "dump_file_kernel", 1); COption::SetOptionInt("main", "dump_base", $DB->type == 'MYSQL' ? 1 : 0); COption::SetOptionInt("main", "dump_base_skip_stat", 0); COption::SetOptionInt("main", "dump_base_skip_search", 0); COption::SetOptionInt("main", "dump_base_skip_log", 0); if ($arAllBucket) { $bDumpCloud = 1; $NS['total_steps']++; COption::SetOptionInt("main", "dump_do_clouds", 1); foreach($arAllBucket as $arBucket) COption::SetOptionInt('main', 'dump_cloud_'.$arBucket['ID'], 1); } COption::SetOptionInt("main", "skip_mask", 0); } else { COption::SetOptionInt("main", "dump_max_exec_time", max(intval($_REQUEST['dump_max_exec_time'] ?? 0), 5)); COption::SetOptionInt("main", "dump_max_exec_time_sleep", $_REQUEST['dump_max_exec_time_sleep'] ?? 0); $dump_archive_size_limit = intval($_REQUEST['dump_archive_size_limit'] ?? 0); if ($dump_archive_size_limit > 2047 || $dump_archive_size_limit <= 10) $dump_archive_size_limit = 100; COption::SetOptionInt("main", "dump_archive_size_limit", $dump_archive_size_limit * 1024 * 1024); COption::SetOptionInt("main", "dump_max_file_size", $_REQUEST['max_file_size'] ?? 0); $NS['total_steps'] = 0; if ($r = (isset($_REQUEST['dump_file_public']) && $_REQUEST['dump_file_public'] == 'Y')) $NS['total_steps'] = 1; COption::SetOptionInt("main", "dump_file_public", $r); if ($r = (isset($_REQUEST['dump_file_kernel']) && $_REQUEST['dump_file_kernel'] == 'Y')) $NS['total_steps'] = 1; COption::SetOptionInt("main", "dump_file_kernel", $r); if ($r = $DB->type == 'MYSQL' ? (isset($_REQUEST['dump_base']) && $_REQUEST['dump_base'] == 'Y') : 0) $NS['total_steps'] += 2; COption::SetOptionInt("main", "dump_base", $r); COption::SetOptionInt("main", "dump_base_skip_stat", isset($_REQUEST['dump_base_skip_stat']) && $_REQUEST['dump_base_skip_stat'] == 'Y'); COption::SetOptionInt("main", "dump_base_skip_search", isset($_REQUEST['dump_base_skip_search']) && $_REQUEST['dump_base_skip_search'] == 'Y'); COption::SetOptionInt("main", "dump_base_skip_log", isset($_REQUEST['dump_base_skip_log']) && $_REQUEST['dump_base_skip_log'] == 'Y'); if ($r = (isset($_REQUEST['dump_integrity_check']) && $_REQUEST['dump_integrity_check'] == 'Y')) $NS['total_steps']++; COption::SetOptionInt("main", "dump_integrity_check", $r); $bDumpCloud = false; if ($arAllBucket) { foreach($arAllBucket as $arBucket) { if ($res = (isset($_REQUEST['dump_cloud'][$arBucket['ID']]) && $_REQUEST['dump_cloud'][$arBucket['ID']] == 'Y')) $bDumpCloud = true; COption::SetOptionInt('main', 'dump_cloud_'.$arBucket['ID'], $res); } if ($bDumpCloud) $NS['total_steps']++; } COption::SetOptionInt("main", "dump_do_clouds", $bDumpCloud); $skip_mask = isset($_REQUEST['skip_mask']) && $_REQUEST['skip_mask'] == 'Y'; COption::SetOptionInt("main", "skip_mask", $skip_mask); $skip_mask_array = array(); if ($skip_mask && isset($_REQUEST['arMask']) && is_array($_REQUEST['arMask'])) { $arMask = array_unique($_REQUEST['arMask']); foreach($arMask as $mask) if (trim($mask)) { $mask = rtrim(str_replace('\\','/',trim($mask)),'/'); $skip_mask_array[] = $mask; } COption::SetOptionString("main", "skip_mask_array", serialize($skip_mask_array)); } } $NS["step"] = 1; if ($NS['BUCKET_ID']) // send to the [bitrix]cloud $NS['total_steps']++; $NS['dump_site_id'] = $_REQUEST['dump_site_id'] ?? ''; if (!is_array($NS['dump_site_id'])) $NS['dump_site_id'] = array(); COption::SetOptionString("main", "dump_site_id", serialize($NS['dump_site_id'])); if ($NS['BUCKET_ID'] == -1) // Bitrixcloud { $name = DOCUMENT_ROOT . BX_ROOT . "/backup/" . date('Ymd_His_') . Random::getStringByAlphabet(16, Random::ALPHABET_NUM); $NS['arc_name'] = $name.'.enc'.($bUseCompression ? ".gz" : ''); $NS['dump_name'] = $name.'.sql'; } else { $prefix = ''; if (count($NS['dump_site_id']) == 1) { $rs = CSite::GetList('sort', 'asc', array('ID' => $NS['dump_site_id'][0], 'ACTIVE' => 'Y')); if ($f = $rs->Fetch()) $prefix = str_replace('/', '', $f['SERVER_NAME']); } else $prefix = str_replace('/', '', COption::GetOptionString("main", "server_name", "")); $arc_name = CBackup::GetArcName(preg_match('#^[a-z0-9\.\-]+$#i', $prefix) ? substr($prefix, 0, 20).'_' : ''); $NS['dump_name'] = $arc_name.".sql"; $NS['arc_name'] = $arc_name.(!empty($NS['dump_encrypt_key']) ? ".enc" : ".tar").($bUseCompression ? ".gz" : ''); } } elseif(isset($_REQUEST['action']) && $_REQUEST['action'] == 'cloud_send') { define('NO_TIME', true); $NS = Array(); $NS['finished_steps'] = 0; $NS['total_steps'] = 1; $NS['cloud_send'] = 1; $NS['dump_encrypt_key'] = $_REQUEST['dump_encrypt_key'] ?? ''; $NS['arc_name'] = $name = DOCUMENT_ROOT.BX_ROOT.'/backup/'.str_replace(array('..','/','\\'),'',$_REQUEST['f_id'] ?? ''); $NS['arc_size'] = filesize($NS['arc_name']); $NS['BUCKET_ID'] = intval($_REQUEST['dump_bucket_id'] ?? 0); $tar = new CTar; while(file_exists($name = $tar->getNextName($name))) $NS['arc_size'] += filesize($name); $NS['step'] = 6; } elseif(isset($_REQUEST['action']) && $_REQUEST['action'] == 'check_archive') { define('NO_TIME', true); $NS = Array(); $NS['finished_steps'] = 0; $NS['total_steps'] = 1; $NS['arc_name'] = $name = DOCUMENT_ROOT.BX_ROOT.'/backup/'.str_replace(array('..','/','\\'),'',$_REQUEST['f_id'] ?? ''); $NS['step'] = 5; $NS['dump_encrypt_key'] = $_REQUEST['dump_encrypt_key'] ?? ''; $NS['check_archive'] = true; $tar = new CTar; $NS['data_size'] = $tar->getDataSize($name); } else { $ar = unserialize(COption::GetOptionString("main","skip_mask_array"), ['allowed_classes' => false]); $skip_mask_array = is_array($ar) ? $ar : array(); } $after_file = str_replace('.sql','_after_connect.sql',preg_replace('#\.[0-9]+$#', '', $NS['dump_name'])); $FinishedTables = 0; // Step 1: Dump if($NS["step"] == 1) { $step_done = 0; if (IntOption('dump_base')) { if (!CBackup::MakeDump($NS['dump_name'], $NS['dump_state'])) { RaiseErrorAndDie(GetMessage('DUMP_NO_PERMS')); } $TotalTables = $NS['dump_state']['TableCount']; $FinishedTables = $TotalTables - count($NS['dump_state']['TABLES']); $status_title = GetMessage('DUMP_DB_CREATE'); $status_details = GetMessage("MAIN_DUMP_TABLE_FINISH")." <b>".(intval($FinishedTables))."</b> ".GetMessage('MAIN_DUMP_FROM').' <b>'.$TotalTables.'</b>'; $step_done = $FinishedTables / $TotalTables; if (!empty($NS['dump_state']['end'])) { $rs = $DB->Query('SHOW VARIABLES LIKE "character_set_results"'); if (($f = $rs->Fetch()) && array_key_exists ('Value', $f)) file_put_contents($after_file, "SET NAMES '".$f['Value']."';\n"); $rs = $DB->Query('SHOW VARIABLES LIKE "collation_database"'); if (($f = $rs->Fetch()) && array_key_exists ('Value', $f)) file_put_contents($after_file, "ALTER DATABASE `<DATABASE>` COLLATE ".$f['Value'].";\n",8); clearstatcache(); $NS["step"]++; $NS['finished_steps']++; } } else $NS["step"]++; } // Step 2: pack dump if($NS["step"] == 2) { $step_done = 0; if (IntOption('dump_base')) { if (haveTime()) { $tar = new CTar; $tar->EncryptKey = $NS['dump_encrypt_key'] ?? ''; $tar->ArchiveSizeLimit = IntOption('dump_archive_size_limit'); $tar->gzip = IntOption('dump_use_compression'); $tar->path = DOCUMENT_ROOT; $tar->ReadBlockCurrent = intval($NS['ReadBlockCurrent'] ?? 0); if (!$tar->openWrite($NS["arc_name"])) { RaiseErrorAndDie(GetMessage('DUMP_NO_PERMS')); } if (!$tar->ReadBlockCurrent && file_exists($f = DOCUMENT_ROOT.BX_ROOT.'/.config.php')) $tar->addFile($f); $Block = $tar->Block; $r = null; while(haveTime() && ($r = $tar->addFile($NS['dump_name'])) && $tar->ReadBlockCurrent > 0); if (!isset($NS["data_size"])) { $NS["data_size"] = 0; } $NS["data_size"] += 512 * ($tar->Block - $Block); if ($r === false) RaiseErrorAndDie(implode('<br>',$tar->err)); $NS["ReadBlockCurrent"] = $tar->ReadBlockCurrent; if (empty($NS['dump_size'])) { $next_part = $NS['dump_name']; $NS['dump_size'] = filesize($next_part); while(file_exists($next_part = CBackup::getNextName($next_part))) $NS['dump_size'] += filesize($next_part); } $status_title = GetMessage("MAIN_DUMP_DB_PROC"); $status_details = GetMessage('CURRENT_POS').' <b>'.round(100 * $NS['data_size'] / $NS['dump_size']).'%</b>'; $step_done = $NS['data_size'] / $NS['dump_size']; if($tar->ReadBlockCurrent == 0) { unlink($NS["dump_name"]); if (file_exists($next_part = CBackup::getNextName($NS['dump_name']))) { $NS['dump_name'] = $next_part; } else { if (file_exists($after_file)) { $tar->addFile($after_file); unlink($after_file); } $NS['arc_size'] = 0; $name = $NS["arc_name"]; while(file_exists($name)) { $size = filesize($name); $NS['arc_size'] += $size; if (IntOption("disk_space") > 0) CDiskQuota::updateDiskQuota("file", $size, "add"); $name = $tar->getNextName($name); } $NS["step"]++; $NS['finished_steps']++; } } $tar->close(); } } else $NS["step"]++; } // Step 3: Download Cloud Files $arDumpClouds = false; if($NS["step"] == 3) { $step_done = 0; if ($arDumpClouds = CBackup::CheckDumpClouds()) { if (haveTime()) { $res = null; foreach($arDumpClouds as $id) { if (!empty($NS['bucket_finished_'.$id])) continue; $obCloud = new CloudDownload($id); $obCloud->last_bucket_path = $NS['last_bucket_path'] ?? ''; if ($res = $obCloud->Scan('')) { $NS['bucket_finished_'.$id] = true; } else // partial { $NS['last_bucket_path'] = $obCloud->path; $NS['download_cnt'] += $obCloud->download_cnt; $NS['download_size'] += $obCloud->download_size; if ($c = count($obCloud->arSkipped)) $NS['download_skipped'] += $c; break; } } $status_title = GetMessage("MAIN_DUMP_CLOUDS_DOWNLOAD"); $status_details = GetMessage("MAIN_DUMP_FILES_DOWNLOADED").': <b>'.intval($NS["download_cnt"] ?? 0).'</b>'; // if ($NS['download_skipped']) // $status_title .= GetMessage("MAIN_DUMP_DOWN_ERR_CNT").': <b>'.$NS['download_skipped'].'</b><br>'; if ($res) // finish { $NS['step']++; $NS['finished_steps']++; } } } else $NS["step"]++; } // Step 4: Tar Files if($NS["step"] == 4) { $step_done = 0; if (CBackup::CheckDumpFiles() || CBackup::CheckDumpClouds()) { if (haveTime()) { $tar = new CTar; $DirScan = new CDirRealScan; $DOCUMENT_ROOT_SITE = DOCUMENT_ROOT; if (is_array($NS['dump_site_id'])) { $SITE_ID = reset($NS['dump_site_id']); $rs = CSite::GetList('sort', 'asc', array('ID' => $SITE_ID, 'ACTIVE' => 'Y')); if ($f = $rs->Fetch()) { $DOCUMENT_ROOT_SITE = rtrim(str_replace('\\','/',$f['ABS_DOC_ROOT']),'/'); if (!empty($NS['multisite'])) { $tar->prefix = 'bitrix/backup/sites/'.$f['LID'].'/'; $DirScan->arSkip[$DOCUMENT_ROOT_SITE.'/bitrix'] = true; $DirScan->arSkip[$DOCUMENT_ROOT_SITE.'/upload'] = true; } } } CBackup::$DOCUMENT_ROOT_SITE = $DOCUMENT_ROOT_SITE; CBackup::$REAL_DOCUMENT_ROOT_SITE = realpath($DOCUMENT_ROOT_SITE); $tar->EncryptKey = $NS['dump_encrypt_key'] ?? ''; $tar->ArchiveSizeLimit = IntOption('dump_archive_size_limit'); $tar->gzip = IntOption('dump_use_compression'); $tar->path = $DOCUMENT_ROOT_SITE; $tar->ReadBlockCurrent = intval($NS['ReadBlockCurrent'] ?? 0); $tar->ReadFileSize = intval($NS['ReadFileSize'] ?? 0); if (!$tar->openWrite($NS["arc_name"] ?? '')) { RaiseErrorAndDie(GetMessage('DUMP_NO_PERMS')); } $Block = $tar->Block; if (empty($NS['startPath'])) { if (!IntOption('dump_base') && file_exists($f = DOCUMENT_ROOT.BX_ROOT.'/.config.php')) $tar->addFile($f); } else $DirScan->startPath = $NS['startPath']; $r = $DirScan->Scan($DOCUMENT_ROOT_SITE); if (!isset($NS["data_size"])) { $NS["data_size"] = 0; } $NS["data_size"] += 512 * ($tar->Block - $Block); $tar->close(); if ($r === false) RaiseErrorAndDie(implode('<br>',array_merge($tar->err,$DirScan->err))); $NS["ReadBlockCurrent"] = $tar->ReadBlockCurrent; $NS["ReadFileSize"] = $tar->ReadFileSize; $NS["startPath"] = $DirScan->nextPath; if (!isset($NS["cnt"])) { $NS["cnt"] = 0; } $NS["cnt"] += $DirScan->FileCount; $status_title = GetMessage("MAIN_DUMP_SITE_PROC"); $status_details = GetMessage("MAIN_DUMP_FILE_CNT")." <b>".intval($NS["cnt"])."</b>"; $last_files_count = IntOption('last_files_count'); if (!$last_files_count) $last_files_count = 200000; $step_done = $NS['cnt'] / $last_files_count; if ($step_done > 1) $step_done = 1; if ($r !== 'BREAK') { if (count($NS['dump_site_id']) > 1) { array_shift($NS['dump_site_id']); $NS['multisite'] = true; unset($NS['startPath']); } else // finish { $NS['arc_size'] = 0; $name = $NS["arc_name"]; while(file_exists($name)) { $size = filesize($name); $NS['arc_size'] += $size; if (IntOption("disk_space") > 0) CDiskQuota::updateDiskQuota("file", $size, "add"); $name = $tar->getNextName($name); } DeleteDirFilesEx(BX_ROOT.'/backup/clouds'); $NS["step"]++; $NS['finished_steps']++; } } } } else $NS["step"]++; } // Step 5: Integrity check if($NS["step"] == 5) { $step_done = 0; if (IntOption('dump_integrity_check') || $NS['check_archive']) { if (haveTime()) { $tar = new CTarCheck; $tar->EncryptKey = $NS['dump_encrypt_key'] ?? ''; if (!$tar->openRead($NS["arc_name"] ?? '')) RaiseErrorAndDie(GetMessage('DUMP_NO_PERMS_READ').'<br>'.implode('<br>',$tar->err)); else { if(($Block = intval($NS['Block'] ?? 0)) && !$tar->SkipTo($Block)) RaiseErrorAndDie(implode('<br>',$tar->err)); while(($r = $tar->extractFile()) && haveTime()); $NS["Block"] = $tar->Block; $status_title = GetMessage('INTEGRITY_CHECK'); $status_details = GetMessage('CURRENT_POS').' <b>'.CFile::FormatSize($NS['Block'] * 512).'</b> '.GetMessage('MAIN_DUMP_FROM').' <b>'.CFile::FormatSize($NS['data_size']).'</b>'; $step_done = $NS['Block'] * 512 / $NS['data_size']; if ($r === false) RaiseErrorAndDie(implode('<br>',$tar->err)); if ($r === 0) { $NS["step"]++; $NS['finished_steps']++; } } $tar->close(); } } else $NS["step"]++; } // Step 6: Send to the cloud if($NS["step"] == 6) { $step_done = 0; if ($NS['BUCKET_ID']) { if (haveTime()) { if (!CModule::IncludeModule('clouds')) RaiseErrorAndDie(GetMessage("MAIN_DUMP_NO_CLOUDS_MODULE")); $file_size = filesize($NS["arc_name"]); $file_name = $NS['BUCKET_ID'] == -1? basename($NS['arc_name']) : substr($NS['arc_name'], strlen(DOCUMENT_ROOT)); $obUpload = new CCloudStorageUpload($file_name); if (!$NS['upload_start_time']) $NS['upload_start_time'] = START_EXEC_TIME; if ($NS['BUCKET_ID'] == -1) { if (!$bBitrixCloud) RaiseErrorAndDie(getMessage('DUMP_BXCLOUD_NA')); $obBucket = null; if (!$NS['obBucket']) { $backup = CBitrixCloudBackup::getInstance(); $q = $backup->getQuota(); if ($e = $APPLICATION->GetException()) { unset($NS['obBucket']); RaiseErrorAndDie($e->GetString(),true); } else { if ($NS['arc_size'] > $q) RaiseErrorAndDie(GetMessage('DUMP_ERR_BIG_BACKUP', array('#ARC_SIZE#' => $NS['arc_size'], '#QUOTA#' => $q)), true); try { $obBucket = $backup->getBucketToWriteFile(CTar::getCheckword($NS['dump_encrypt_key']), basename($NS['arc_name'])); $NS['obBucket'] = serialize($obBucket); } catch (CBitrixCloudException $e) { RaiseErrorAndDie($e->GetMessage(),true); } } } else { $obBucket = unserialize( $NS['obBucket'], ['allowed_classes' => ['CBitrixCloudBackupBucket']] ); } $obBucket->Init(); $obBucket->GetService()->setPublic(false); $bucket_id = $obBucket; } else { $obBucket = null; $bucket_id = $NS['BUCKET_ID']; } if (!$obUpload->isStarted()) { if (is_object($obBucket)) $obBucket->setCheckWordHeader(); if (!$obUpload->Start($bucket_id, $file_size)) { if ($e = $APPLICATION->GetException()) $strError = $e->GetString(); else $strError = GetMessage('MAIN_DUMP_INT_CLOUD_ERR'); unset($NS['obBucket']); RaiseErrorAndDie($strError,true); } if (is_object($obBucket)) $obBucket->unsetCheckWordHeader(); } if ($fp = fopen($NS['arc_name'],'rb')) { fseek($fp, $obUpload->getPos()); $part = fread($fp, $obUpload->getPartSize()); fclose($fp); $fails = 0; $res = null; while($obUpload->hasRetries()) { if($res = $obUpload->Next($part, $obBucket)) break; elseif (++$fails >= 10) { $e = $APPLICATION->GetException(); $strError = $e ? '. ' . $e->GetString() : ''; RaiseErrorAndDie('Internal Error: could not init upload for ' . $fails . ' times' . $strError); } } if ($res) { $pos = $obUpload->getPos(); if ($pos >= $file_size) // file ended { if($obUpload->Finish($obBucket)) { $NS['pos'] += $file_size; $pos = 0; if ($NS['BUCKET_ID'] != -1) { $oBucket = new CCloudStorageBucket($NS['BUCKET_ID']); $oBucket->IncFileCounter($file_size); } $tar = new CTar; if (file_exists($arc_name = $tar->getNextName($NS['arc_name']))) { unset($NS['obBucket']); $NS['arc_name'] = $arc_name; } else { $ob = new CBitrixCloudBackup; $ob->clearOptions(); $name = CTar::getFirstName($NS['arc_name']); while(file_exists($name)) { $size = filesize($name); if (unlink($name) && IntOption("disk_space") > 0) CDiskQuota::updateDiskQuota("file",$size , "del"); $name = $tar->getNextName($name); } $NS["step"]++; $NS['finished_steps']++; } } else { $obUpload->Delete(); unset($NS['obBucket']); $e = $APPLICATION->GetException(); $strError = $e ? '. ' . $e->GetString() : ''; RaiseErrorAndDie(GetMessage('MAIN_DUMP_ERR_FILE_SEND') . basename($NS['arc_name']) . $strError,true); } } $pos += $NS['pos']; $status_title = GetMessage("MAIN_DUMP_FILE_SENDING"); $status_details = GetMessage('CURRENT_POS').' <b>'.CFile::FormatSize($pos).'</b> '.GetMessage('MAIN_DUMP_FROM').' <b>'.CFile::FormatSize($NS["arc_size"])."</b>". GetMessage('TIME_LEFT', array('#TIME#' => HumanTime(($NS['arc_size'] - $pos) / $pos * (microtime(true) - $NS['upload_start_time'])))); $step_done = $pos / $NS['arc_size']; } else { $obUpload->Delete(); unset($NS['obBucket']); $e = $APPLICATION->GetException(); $strError = $e ? '. ' . $e->GetString() : ''; RaiseErrorAndDie(GetMessage('MAIN_DUMP_ERR_FILE_SEND') . basename($NS['arc_name']) . $strError, true); } } else { unset($NS['obBucket']); RaiseErrorAndDie(GetMessage("MAIN_DUMP_ERR_OPEN_FILE").$NS['arc_name'],true); } } } else $NS["step"]++; } if (!isset($NS["time"])) { $NS["time"] = 0; } $NS["time"] += workTime(); if ($NS["step"] <= 6) // partial { CAdminMessage::ShowMessage(array( "TYPE" => "PROGRESS", "MESSAGE" => $status_title, "DETAILS" => $status_details.'#PROGRESS_BAR#'. // GetMessage('TIME_SPENT').' '.HumanTime($NS["time"]), GetMessage('TIME_SPENT').' <span id="counter_field">'.sprintf('%02d',floor($NS["time"]/60)).':'.sprintf('%02d', $NS['time']%60).'</span><!--'.intval($NS['time']).'-->', "HTML" => true, "PROGRESS_TOTAL" => 100, "PROGRESS_VALUE" => ($NS['finished_steps'] + $step_done) * 100 / $NS['total_steps'], )); ?> <script> window.setTimeout("if(!stop)AjaxSend('?process=Y&<?=bitrix_sessid_get()?>')",<?=1000 * IntOption("dump_max_exec_time_sleep")?>); </script> <? } else // Finish { $title = (!empty($NS['cloud_send']) ? GetMessage("MAIN_DUMP_SUCCESS_SENT") : GetMessage("MAIN_DUMP_FILE_FINISH")).'<br><br>'; $status_msg = ''; if (!empty($NS["arc_size"])) { $status_msg .= GetMessage("MAIN_DUMP_ARC_NAME").": <b>".basename(CTar::getFirstName($NS["arc_name"]))."</b><br>"; $status_msg .= GetMessage("MAIN_DUMP_ARC_SIZE")." <b>".CFile::FormatSize($NS["arc_size"])."</b><br>"; if ($NS['BUCKET_ID'] > 0) $l = ''; //htmlspecialcharsbx($arBucket['BUCKET'].' ('.$arBucket['SERVICE_ID'].')'); elseif ($NS['BUCKET_ID'] == -1) $l = GetMessage('DUMP_MAIN_BITRIX_CLOUD'); else $l = GetMessage("MAIN_DUMP_LOCAL"); if ($l) $status_msg .= GetMessage("MAIN_DUMP_LOCATION").": <b>".$l."</b><br>"; } if ($FinishedTables) $status_msg .= GetMessage("MAIN_DUMP_TABLE_FINISH")." <b>".$FinishedTables."</b><br>"; if (!empty($NS["cnt"])) { $status_msg .= GetMessage("MAIN_DUMP_FILE_CNT")." <b>".$NS["cnt"]."</b><br>"; if (IntOption("dump_file_public") && IntOption("dump_file_kernel")) COption::SetOptionInt("main", "last_files_count", $NS['cnt']); } if (!empty($NS["data_size"])) $status_msg .= GetMessage("MAIN_DUMP_FILE_SIZE")." <b>".CFile::FormatSize($NS["data_size"])."</b><br>"; $status_msg .= GetMessage('TIME_SPENT').' <b>'.HumanTime($NS["time"]).'</b>'; CAdminMessage::ShowMessage(array( "MESSAGE" => $title, "DETAILS" => $status_msg, "TYPE" => "OK", "HTML" => true)); ?> <?echo bitrix_sessid_post()?> <script> EndDump(); </script> <? } require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin_js.php"); die(); } // in case of error $DB->Query("UNLOCK TABLES",true); $APPLICATION->SetTitle(GetMessage("MAIN_DUMP_PAGE_TITLE")); require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/prolog_admin_after.php"); $aTabs = array(); $aTabs[] = array("DIV"=>"std", "TAB"=>GetMessage("DUMP_MAIN_MAKE_ARC"), "ICON"=>"main_user_edit", "TITLE"=>GetMessage("MAKE_DUMP_FULL")); $aTabs[] = array("DIV"=>"expert", "TAB"=>GetMessage("DUMP_MAIN_PARAMETERS"), "ICON"=>"main_user_edit", "TITLE"=>GetMessage("DUMP_MAIN_EXPERT_SETTINGS")); $editTab = new CAdminTabControl("editTab", $aTabs, true, true); if ($DB->type != 'MYSQL') echo BeginNote().GetMessage('MAIN_DUMP_MYSQL_ONLY').EndNote(); if (!$encrypt || !$bHash) { CAdminMessage::ShowMessage(array( "MESSAGE" => ($encrypt ? '' : GetMessage("MAIN_DUMP_NOT_INSTALLED1")).($bHash ? '' : ' '.GetMessage('MAIN_DUMP_NOT_INSTALLED_HASH')), "DETAILS" => GetMessage("MAIN_DUMP_NO_ENC_FUNCTIONS"), "TYPE" => "ERROR", "HTML" => true)); } if (defined('DUMP_DEBUG_MODE')) echo '<div style="color:red">DEBUG MODE</div><input type=button value=Next onclick="AjaxSend(\'?process=Y&'.bitrix_sessid_get().'\')">'; ?><div id="dump_result_div"></div><? $aMenu = array( array( "TEXT" => GetMessage("MAIN_DUMP_LIST_PAGE_TITLE"), "LINK" => "/bitrix/admin/dump_list.php?lang=".LANGUAGE_ID, "TITLE" => GetMessage("MAIN_DUMP_LIST_PAGE_TITLE"), "ICON" => "btn_list" ) ); $context = new CAdminContextMenu($aMenu); $context->Show(); CAdminFileDialog::ShowScript( Array ( "event" => "__bx_select_dir", "arResultDest" => Array("FUNCTION_NAME" => "mnu_SelectValue"), "arPath" => Array('PATH'=>"/"), "select" => 'D', "operation" => 'O', "showUploadTab" => false, "showAddToMenuTab" => false, "allowAllFiles" => true, "SaveConfig" => true ) ); ?> <script language="JavaScript"> var counter_started = false; var counter_sec = 0; function StartCounter() { counter_started = true; } function StopCounter(result) { counter_started = false; if (result) { var regs; if (regs = /<!--([0-9]+)-->/.exec(result)) counter_sec = regs[1]; } } function IncCounter() { window.setTimeout(IncCounter, 1000); if (!counter_started) return; counter_sec ++; var ob; if (ob = BX('counter_field')) { var min = Math.floor(counter_sec / 60); var sec = counter_sec % 60; if (min < 10) min = '0' + min; if (sec < 10) sec = '0' + sec; ob.innerHTML = min + ':' + sec; } } window.setTimeout(IncCounter, 1000); function GetLicenseInfo() { CHttpRequest.Action = function(result) { BX('license_info').innerHTML = result; }; CHttpRequest.Send('?action=key_info&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>'); } var numRows=0; function AddTableRow() { var oTable = BX('skip_mask_table'); numRows = oTable.rows.length; var oRow = oTable.insertRow(-1); var oCell = oRow.insertCell(0); oCell.innerHTML = '<input type="text" name="arMask[]" id="mnu_FILES_' + numRows +'" size=30><input type="button" id="mnu_FILES_btn_' + numRows + '" value="..." onclick="showMenu(this, '+ numRows +')">'; } var currentID; function showMenu(div, id) { currentID = id; __bx_select_dir(); } function mnu_SelectValue(filename, path, site, title, menu) { BX('mnu_FILES_' + currentID).value = path + (path == '/' ? '' : '/') + filename; } function CheckExpert() { var ob = document.fd1.dump_expert; var table = BX('tr_dump_expert').parentNode.parentNode; var found = false; for(var i=0;i<table.rows.length;i++) { if (found) table.rows[i].style.display = ob.checked ? '' : 'none'; if (table.rows[i].id == 'tr_dump_expert') found = true; } CheckActiveStart(); } function CheckActiveStart() { if (counter_started) return; var start = true; if (document.fd1.dump_expert.checked) { start = document.fd1.dump_file_public.checked || document.fd1.dump_file_kernel.checked; document.fd1.max_file_size.disabled = !start; document.fd1.skip_mask.disabled = !start; var mask = start && document.fd1.skip_mask.checked; BX('more_button').disabled = !mask; var oTable = BX('skip_mask_table'); numRows = oTable.rows.length; for(var i=0;i<numRows;i++) { BX('mnu_FILES_'+i).disabled = !mask; BX('mnu_FILES_btn_'+i).disabled = !mask; } <? if ($arAllBucket) { foreach($arAllBucket as $arBucket) echo 'start = start || BX("dump_cloud_'.$arBucket['ID'].'").checked;'."\n"; } ?> var ob; if (ob = document.fd1.dump_base) { document.fd1.dump_base_skip_stat.disabled = !ob.checked; document.fd1.dump_base_skip_search.disabled = !ob.checked; document.fd1.dump_base_skip_log.disabled = !ob.checked; start = start || ob.checked; } } BX('start_button').disabled = !start; } function CheckEncrypt(ob) { var enc; if(enc = document.fd1.dump_encrypt) { enc.disabled = (ob.value == -1); } } BX.ready( function() { CheckExpert(); <? if (isset($_REQUEST['from']) && $_REQUEST['from'] == 'bitrixcloud') echo 'StartDump();'; elseif (isset($_REQUEST['action']) && $_REQUEST['action'] == 'cloud_send' && check_bitrix_sessid()) echo "AjaxSend('?process=Y&action=cloud_send&f_id=".CUtil::JSEscape($_REQUEST['f_id'] ?? '')."&dump_encrypt_key=".CUtil::JSEscape($_REQUEST['dump_encrypt_key'] ?? '')."&dump_bucket_id=".CUtil::JSEscape($_REQUEST['dump_bucket_id'] ?? '')."&".bitrix_sessid_get()."');"; elseif (isset($_REQUEST['action']) && $_REQUEST['action'] == 'check_archive' && check_bitrix_sessid()) echo "AjaxSend('?process=Y&action=check_archive&f_id=".CUtil::JSEscape($_REQUEST['f_id'] ?? '')."&dump_encrypt_key=".CUtil::JSEscape($_REQUEST['dump_encrypt_key'] ?? '')."&".bitrix_sessid_get()."');"; ?> } ); var stop; var dump_encrypt_key; var PasswordDialog; function SavePassword() { var key = BX('dump_encrypt_key').value; var l = key.length; var strError = ''; if (!l) strError = '<?=GetMessageJS("MAIN_DUMP_EMPTY_PASS")?>'; else if (!/^[\040-\176]*$/.test(key)) strError = '<?=GetMessageJS('DUMP_ERR_NON_ASCII')?>'; else if (l < 6) strError = '<?=GetMessageJS("MAIN_DUMP_ENC_PASS_DESC")?>'; else if (key != BX('dump_encrypt_key_confirm').value) strError = '<?=GetMessageJS("DUMP_MAIN_ERR_PASS_CONFIRM")?>'; if (strError) { BX('password_error').innerHTML = strError; BX('dump_encrypt_key').focus(); } else { BX('password_error').innerHTML = ''; dump_encrypt_key = key; BX.WindowManager.Get().Close(); DoDump(); } } function StartDump() { var ob; if (BX('bitrixcloud').checked || (document.fd1.dump_expert.checked && (ob = document.fd1.dump_encrypt) && ob.checked)) { if (!PasswordDialog) { PasswordDialog = new BX.CDialog({ title: '<?=GetMessage("DUMP_MAIN_ENC_ARC")?>', content: '<? echo '<div style="color:red" id=password_error></div>'; echo CUtil::JSEscape(BeginNote().GetMessage('MAIN_DUMP_SAVE_PASS').EndNote()); echo '<table>'; echo '<tr><td>'.GetMessage('MAIN_DUMP_ENC_PASS').'</td><td><input type="password" value="" id="dump_encrypt_key" onkeyup="if(event.keyCode==13) {BX("dump_encrypt_key_confirm").focus()}"/></td></tr>'; echo '<tr><td>'.GetMessage('DUMP_MAIN_PASSWORD_CONFIRM').'</td><td><input type="password" value="" id="dump_encrypt_key_confirm" onkeyup="if(event.keyCode==13) {SavePassword()}"/></td></tr>'; echo '</table>'; ?>', height: 300, width: 600, resizable: false, buttons: [ { title: '<?=GetMessage("MAIN_DUMP_FILE_DUMP_BUTTON")?>', // id: 'my_save', // name: 'my_save', className: 'adm-btn-save', action: SavePassword }, BX.CAdminDialog.btnCancel ] }) } PasswordDialog.Show(); BX('dump_encrypt_key').focus(); } else { dump_encrypt_key = ''; DoDump(); } } function DoDump() { counter_sec = 0; var queryString = 'lang=<?echo htmlspecialcharsbx(LANGUAGE_ID)?>&process=Y&action=start'; var ob = document.fd1.dump_bucket_id; for (var i = 0; i<ob.length; i++) if (ob[i].checked) queryString += '&dump_bucket_id=' + ob[i].value; i = 0; while (ob = document.fd1['dump_site_id' + i]) { if (ob.checked) queryString += '&dump_site_id[]=' + ob.value; i++; } if (dump_encrypt_key) queryString += '&dump_encrypt_key=' + encodeURIComponent(dump_encrypt_key); if (document.fd1.dump_expert.checked) { queryString+='&dump_max_exec_time=' + encodeURIComponent(document.fd1.dump_max_exec_time.value); queryString+='&dump_max_exec_time_sleep=' + encodeURIComponent(document.fd1.dump_max_exec_time_sleep.value); queryString+='&dump_archive_size_limit=' + encodeURIComponent(document.fd1.dump_archive_size_limit.value); if (document.fd1.dump_disable_gzip.checked) queryString += '&dump_disable_gzip=Y'; if (document.fd1.dump_integrity_check.checked) queryString += '&dump_integrity_check=Y'; if(document.fd1.dump_file_public.checked) queryString +='&dump_file_public=Y'; if(document.fd1.dump_file_kernel.checked) queryString+='&dump_file_kernel=Y'; if(document.fd1.skip_mask.checked) { queryString+='&skip_mask=Y'; var oTable = BX('skip_mask_table'); numRows = oTable.rows.length; for(i=0;i<numRows;i++) queryString+='&arMask[]=' + encodeURIComponent(BX('mnu_FILES_'+i).value); } if(document.fd1.dump_file_public.checked || document.fd1.dump_file_kernel.checked) queryString+='&max_file_size=' + document.fd1.max_file_size.value; if((ob = document.fd1.dump_base) && ob.checked) { queryString +='&dump_base=Y'; if(document.fd1.dump_base_skip_stat.checked) queryString +='&dump_base_skip_stat=Y'; if(document.fd1.dump_base_skip_search.checked) queryString +='&dump_base_skip_search=Y'; if(document.fd1.dump_base_skip_log.checked) queryString +='&dump_base_skip_log=Y'; } <? if ($arAllBucket) { foreach($arAllBucket as $arBucket) { ?> if (BX('dump_cloud_<?=$arBucket['ID']?>').checked) queryString += '&dump_cloud[<?=$arBucket['ID']?>]=Y'; <? } } ?> } else queryString += '&dump_all=Y'; queryString += '&<?=bitrix_sessid_get()?>'; BX('dump_result_div').innerHTML=''; AjaxSend('dump.php', queryString); window.scrollTo(0, 0); } function EndDump(conditional) { BX('stop_button').disabled = stop = true; if (!conditional || !counter_started) BX('start_button').disabled = false; } function AjaxSend(url, data) { stop = false; BX('stop_button').disabled=false; BX('start_button').disabled=true; StartCounter(); CHttpRequest.Action = function(result) { StopCounter(result); if (stop) { EndDump(); BX('dump_result_div').innerHTML = ''; } else BX('dump_result_div').innerHTML = result; }; if (data) CHttpRequest.Post(url, data); else CHttpRequest.Send(url); } function RetryRequest() { if (ob = BX('retry_button')) ob.disabled=true; AjaxSend('?process=Y&<?=bitrix_sessid_get()?>'); } function getTableSize() { AjaxSend('?ajax_mode=Y&action=get_table_size'); } </script> <form name="fd1" action="<?echo $APPLICATION->GetCurPage()?>?lang=<?=LANGUAGE_ID?>" method="GET"> <? $editTab->Begin(); $editTab->BeginNextTab(); if (!COption::GetOptionInt("main", 'dump_auto_enable_auto', 0)) { ?> <tr> <td colspan=2><? echo BeginNote(); echo GetMessage('MAIN_DUMP_AUTO_WARN', array('#LINK#' => '/bitrix/admin/dump_auto.php?lang='.LANGUAGE_ID)); echo EndNote(); ?></td> </tr> <? } if ($bBitrixCloud) { ?> <tr> <td class="adm-detail-valign-top" width="40%"><?=GetMessage('DUMP_MAIN_BITRIX_CLOUD_DESC')?><span class="required"><sup>1</sup></span>:</td> <td width="60%"> <? if(is_object($backup)) { CAdminMessage::ShowMessage(array( "TYPE" => "PROGRESS", "DETAILS" => GetMessage("BCL_BACKUP_USAGE", array( "#QUOTA#" => CFile::FormatSize($quota = $backup->getQuota()), "#USAGE#" => CFile::FormatSize($usage = $backup->getUsage()), )).'#PROGRESS_BAR#', "HTML" => false, "PROGRESS_TOTAL" => $quota, "PROGRESS_VALUE" => $usage, )); } ?> </td> </tr> <? } ?> <tr> <td class="adm-detail-valign-top" width=40%><?=GetMessage('MAIN_DUMP_ARC_LOCATION')?></td> <td> <div><input type=radio name=dump_bucket_id value="-1" <?=$bBitrixCloud ? "checked" : ""?> id="bitrixcloud" <?=$bBitrixCloud ? '' : 'disabled'?> onclick="CheckEncrypt(this)"> <label for="bitrixcloud"><?=GetMessage('DUMP_MAIN_IN_THE_BXCLOUD')?></label><?=$strBXError ? ' <span style="color:red">('.$strBXError.')</span>' : ''?></div> <div><input type=radio name=dump_bucket_id value="0" <?=!$bBitrixCloud ? "checked" : ""?> id="dump_bucket_id_0" onclick="CheckEncrypt(this)"> <label for="dump_bucket_id_0"><?=GetMessage('MAIN_DUMP_LOCAL_DISK')?></label></div> <? $arWriteBucket = CBackup::GetBucketList($arFilter = array('READ_ONLY' => 'N')); if ($arWriteBucket) { foreach($arWriteBucket as $f) echo '<div><input type=radio name=dump_bucket_id value="'.$f['ID'].'" id="dump_bucket_id_'.$f['ID'].'" onclick="CheckEncrypt(this)"> <label for="dump_bucket_id_'.$f['ID'].'">'.GetMessage('DUMP_MAIN_IN_THE_CLOUD').' '.htmlspecialcharsbx($f['BUCKET'].' ('.$f['SERVICE_ID'].')').'</label></div>'; } ?> </td> </tr> <? $arSitePath = array(); $res = CSite::GetList('sort', 'asc', array('ACTIVE'=>'Y')); while($f = $res->Fetch()) { $root = rtrim($f['ABS_DOC_ROOT'],'/'); if (is_dir($root)) $arSitePath[$root] = array($f['ID'] => '['.$f['ID'].'] '.$f['NAME']); } if (count($arSitePath) > 1) { ?> <tr> <td class="adm-detail-valign-top"><?=GetMessage("DUMP_MAIN_SITE")?><span class="required"><sup>2</sup></span></td> <td> <? if ($s = COption::GetOptionString("main", "dump_site_id", $NS['dump_site_id'])) $dump_site_id = unserialize($s, ['allowed_classes' => false]); else $dump_site_id = array(); $i = 0; foreach($arSitePath as $path => $val) { $path = rtrim(str_replace('\\','/',$path),'/'); $k = key($val); $v = current($val); echo '<div><input type=checkbox id="dump_site_id'.$i.'" value="'.htmlspecialcharsbx($k).'" '.(in_array($k, $dump_site_id) ? ' checked' : '').'> <label for="dump_site_id'.$i.'">'.htmlspecialcharsbx($v).'</label></div>'; $i++; } ?> </td> </tr> <? } ?> <? $editTab->BeginNextTab(); ?> <tr> <td colspan=2 align=center><input type="checkbox" name="dump_expert" onclick="CheckExpert()" id="dump_expert"> <label for="dump_expert"><?=GetMessage("DUMP_MAIN_ENABLE_EXPERT")?></label></td> </tr> <tr id="tr_dump_expert"> <td colspan=2><? echo BeginNote(); echo GetMessage("DUMP_MAIN_CHANGE_SETTINGS"); echo EndNote(); ?></td> </tr> <tr class="heading"> <td colspan="2"><?=GetMessage("DUMP_MAIN_ARC_CONTENTS")?></td> </tr> <? if ($arAllBucket) { ?> <tr> <td class="adm-detail-valign-top"><?=GetMessage("DUMP_MAIN_DOWNLOAD_CLOUDS")?></td> <td> <? foreach($arAllBucket as $arBucket) echo '<div><input type="checkbox" id="dump_cloud_'.$arBucket['ID'].'" OnClick="CheckActiveStart()" '.(IntOption("dump_cloud_".$arBucket['ID'], 1) ? "checked" : "").'> <label for="dump_cloud_'.$arBucket['ID'].'">'.htmlspecialcharsbx($arBucket['BUCKET'].' ('.$arBucket['SERVICE_ID'].')').'</label></div>'; ?> </td> </tr> <? } ?> <? if ($DB->type == 'MYSQL') { ?> <tr> <td><?=GetMessage("DUMP_MAIN_ARC_DATABASE")?> <span id="db_size">(<a href="javascript:getTableSize()">?</a> <?=GetMessage("MAIN_DUMP_BASE_SIZE")?>)</span>:</td> <td><input type="checkbox" name="dump_base" OnClick="CheckActiveStart()" <?=IntOption("dump_base", 1) ? "checked" : "" ?>></td> </tr> <tr> <td class="adm-detail-valign-top"><?=GetMessage("DUMP_MAIN_DB_EXCLUDE")?></td> <td> <div><input type="checkbox" name="dump_base_skip_stat" <?=IntOption("dump_base_skip_stat", 0) ? "checked" : "" ?> id="dump_base_skip_stat"> <label for="dump_base_skip_stat"><?=GetMessage("MAIN_DUMP_BASE_STAT")?></label> <span id=db_stat_size></span></div> <div><input type="checkbox" name="dump_base_skip_search" value="Y" <?=IntOption("dump_base_skip_search", 0) ? "checked" : "" ?> id="dump_base_skip_search"> <label for="dump_base_skip_search"><?=GetMessage("MAIN_DUMP_BASE_SINDEX")?></label> <span id=db_search_size></span></div> <div><input type="checkbox" name="dump_base_skip_log" value="Y"<?=IntOption("dump_base_skip_log", 0) ? "checked" : "" ?> id="dump_base_skip_log"> <label for="dump_base_skip_log"><?=GetMessage("MAIN_DUMP_EVENT_LOG")?></label> <span id=db_event_size></span></div> </td> </tr> <? } ?> <tr> <td><?echo GetMessage("MAIN_DUMP_FILE_KERNEL")?></td> <td><input type="checkbox" name="dump_file_kernel" value="Y" OnClick="CheckActiveStart()" <?=IntOption("dump_file_kernel", 1) ? "checked" : ''?>></td> </tr> <tr> <td><?echo GetMessage("MAIN_DUMP_FILE_PUBLIC")?></td> <td><input type="checkbox" name="dump_file_public" value="Y" OnClick="CheckActiveStart()" <?=IntOption("dump_file_public", 1) ? "checked" : ''?>></td> </tr> <tr> <td class="adm-detail-valign-top"><?echo GetMessage("MAIN_DUMP_MASK")?><span class="required"><sup>3</sup></span></td> <td> <input type="checkbox" name="skip_mask" value="Y" <?=IntOption('skip_mask', 0)?" checked":'';?> onclick="CheckActiveStart()"> <table id="skip_mask_table" cellspacing=0 cellpadding=0> <? $i=-1; $res = unserialize(COption::GetOptionString("main","skip_mask_array"), ['allowed_classes' => false]); $skip_mask_array = is_array($res)?$res:array(); foreach($skip_mask_array as $mask) { $i++; echo '<tr><td> <input type="text" name="arMask[]" id="mnu_FILES_'.$i.'" value="'.htmlspecialcharsbx($mask).'" size=30>'. '<input type="button" id="mnu_FILES_btn_'.$i.'" value="..." onclick="showMenu(this, \''.$i.'\')">'. '</tr>'; } $i++; ?> <tr><td><input type="text" name="arMask[]" id="mnu_FILES_<?=$i?>" size=30><input type="button" id="mnu_FILES_btn_<?=$i?>" value="..." onclick="showMenu(this, '<?=$i?>')"></tr> </table> <input type=button id="more_button" value="<?=GetMessage('MAIN_DUMP_MORE')?>" onclick="AddTableRow()"> </td> </tr> <tr> <td><?echo GetMessage("MAIN_DUMP_FILE_MAX_SIZE")?></td> <td><input type="text" name="max_file_size" size="10" value="<?=IntOption("dump_max_file_size", 0)?>" <?=CBackup::CheckDumpFiles() ? '' : "disabled"?>> <?echo GetMessage("MAIN_DUMP_FILE_MAX_SIZE_kb")?></td> </tr> <tr class="heading"> <td colspan="2"><?=GetMessage("DUMP_MAIN_ARC_MODE")?></td> </tr> <tr> <td><?=GetMessage("MAIN_DUMP_ENABLE_ENC")?><span class="required"><sup>4</sup></td> <td><input type="checkbox" name="dump_encrypt" value="Y" <?=(IntOption("dump_encrypt", 0) ? "checked" : "")?> <?=$encrypt && !$bBitrixCloud ? '' : 'disabled'?>></td> </tr> <tr> <td width=40%><?=GetMessage('INTEGRITY_CHECK_OPTION')?></td> <td><input type="checkbox" name="dump_integrity_check" <?=IntOption('dump_integrity_check', 1) ? 'checked' : '' ?>> </tr> <tr> <td><?=GetMessage('DISABLE_GZIP')?></td> <td><input type="checkbox" name="dump_disable_gzip" <?=IntOption('dump_use_compression', 1) && $bGzip ? '' : 'checked' ?> <?=$bGzip ? '' : 'disabled'?>> </tr> <tr> <td width=40%><?=GetMessage('STEP_LIMIT')?></td> <td> <input type="text" name="dump_max_exec_time" value="<?=IntOption("dump_max_exec_time", 20)?>" size=2> <?echo GetMessage("MAIN_DUMP_FILE_STEP_sec");?>, <?echo GetMessage("MAIN_DUMP_FILE_STEP_SLEEP")?> <input type="text" name="dump_max_exec_time_sleep" value="<?=IntOption("dump_max_exec_time_sleep", 3)?>" size=2> <?echo GetMessage("MAIN_DUMP_FILE_STEP_sec");?> </td> </tr> <tr> <td><?=GetMessage("MAIN_DUMP_MAX_ARCHIVE_SIZE")?></td> <td><input type="text" name="dump_archive_size_limit" value="<?=intval(COption::GetOptionString('main', 'dump_archive_size_limit', 100 * 1024 * 1024)) / 1024 / 1024?>" size=4> <?=GetMessage("MAIN_DUMP_MAX_ARCHIVE_SIZE_VALUES")?><span class="required"><sup>5</sup></span></td> </tr> <? $editTab->Buttons(); ?> <input type="button" id="start_button" class="adm-btn-save" value="<?=GetMessage("MAIN_DUMP_FILE_DUMP_BUTTON")?>" OnClick="StartDump();"> <input type="button" id="stop_button" value="<?=GetMessage("MAIN_DUMP_FILE_STOP_BUTTON")?>" OnClick="EndDump(true)" disabled> <? $editTab->End(); ?> </form> <br> <? echo BeginNote(); echo '<div><span class=required><sup>1</sup></span> '.GetMessage("DUMP_MAIN_BXCLOUD_INFO").'</div>'; echo '<div><span class=required><sup>2</sup></span> '.GetMessage("DUMP_MAIN_MULTISITE_INFO").'</div>'; echo '<div><span class=required><sup>3</sup></span> '.GetMessage("MAIN_DUMP_FOOTER_MASK").'</div>'; echo '<div><span class=required><sup>4</sup></span> '.GetMessage("MAIN_DUMP_BXCLOUD_ENC").'</div>'; echo '<div><span class=required><sup>5</sup></span> '.GetMessage("MAIN_DUMP_MAX_ARCHIVE_SIZE_INFO").'</div>'; echo EndNote(); require($_SERVER["DOCUMENT_ROOT"].BX_ROOT."/modules/main/include/epilog_admin.php"); ################################################# ################## FUNCTIONS function IntOption($name, $def = 0) { static $CACHE; if (!isset($CACHE[$name])) $CACHE[$name] = COption::GetOptionInt("main", $name, $def); return $CACHE[$name]; } function getTableSize($reg) { global $DB; if ($DB->type != 'MYSQL') return 0; static $CACHE; if (!$CACHE) { $CACHE = array(); $sql = "SHOW TABLE STATUS"; $res = $DB->Query($sql); while($row = $res->Fetch()) $CACHE[$row['Name']] = $row['Data_length']; } $size = 0; foreach($CACHE as $table => $s) if (!$reg || preg_match('#'.$reg.'#i', $table)) $size += $s; return $size; } function haveTime() { if(defined('NO_TIME')) return microtime(true) - START_EXEC_TIME < 1; return microtime(true) - START_EXEC_TIME < IntOption("dump_max_exec_time"); } function workTime() { return microtime(true) - START_EXEC_TIME; } function RaiseErrorAndDie($strError, $bRepeat = false) { if ($bRepeat) { $strError .= '<br><input type=button value="'.GetMessage('DUMP_RETRY').'" onclick="RetryRequest()" id="retry_button"> <script>window.setTimeout(RetryRequest, 60000);</script>'; } CAdminMessage::ShowMessage(array( "MESSAGE" => GetMessage("MAIN_DUMP_ERROR"), "DETAILS" => $strError, "TYPE" => "ERROR", "HTML" => true)); echo '<script>EndDump();</script>'; die(); } ?>