Current Path : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/bitrixcloud/classes/general/ |
Current File : /var/www/www-root/data/www/monolith-realty.ru/bitrix/modules/bitrixcloud/classes/general/backup.php |
<?php IncludeModuleLangFile(__FILE__); class CBitrixCloudBackup { private static $instance = /*.(CBitrixCloudBackup).*/ null; private $init = false; private $infoXML = /*.(CDataXML).*/ null; private $quota = 0.0; private $files = /*.(array[int][string]string).*/ []; private $total_size = 0.0; private $last_backup_time = 0; /** * Returns proxy class instance (singleton pattern) * * @return CBitrixCloudBackup * */ public static function getInstance() { if (!isset(self::$instance)) { self::$instance = new CBitrixCloudBackup; } return self::$instance; } /** * Loads and parses xml * * @param bool $force * @return bool * */ private function _getInformation($force = false) { if ($this->init && !$force) { return true; } $this->init = true; try { $web_service = new CBitrixCloudBackupWebService(); $web_service->setTimeout(10); $this->infoXML = $web_service->actionGetInformation(); } catch (CBitrixCloudException $_) { return false; } /* @var CDataXMLNode $node */ $node = $this->infoXML->SelectNodes('/control/quota/allow'); if (is_object($node)) { $this->quota = \Bitrix\Main\Config\Ini::unformatInt($node->textContent()); } $node = $this->infoXML->SelectNodes('/control/files'); if (is_object($node)) { $this->last_backup_time = 0; $this->total_size = 0.0; $this->files = /*.(array[int][string]string).*/ []; $nodeFiles = $node->elementsByName('file'); foreach ($nodeFiles as $nodeFile) { /* @var CDataXMLNode $nodeFile */ $size = \Bitrix\Main\Config\Ini::unformatInt($nodeFile->getAttribute('size')); $name = $nodeFile->getAttribute('name'); $this->total_size += $size; $this->files[] = [ 'FILE_NAME' => $name, 'FILE_SIZE' => (string)$size, ]; $time = strtotime(preg_replace('/^(\\d{4})(\\d\\d)(\\d\\d)_(\\d\\d)(\\d\\d)(\\d\\d)(.*)$/', '\\1-\\2-\\3 \\4:\\5:\\6', $name)); if ($time > $this->last_backup_time) { $this->last_backup_time = $time; } } } return true; } /** * Returns list of backup files * * @return array[int][string]string * */ public function listFiles() /*. throws CBitrixCloudException .*/ { $this->_getInformation(); return $this->files; } /** * Returns amount of space available for backup * * @return float * */ public function getQuota() /*. throws CBitrixCloudException .*/ { $this->_getInformation(); return $this->quota; } /** * Returns amount of space used by backup files * * @return float * */ public function getUsage() /*. throws CBitrixCloudException .*/ { $this->_getInformation(); return $this->total_size; } /** * Returns timestamp of the last saved backup * * @return int * */ public function getLastTimeBackup() /*. throws CBitrixCloudException .*/ { $this->_getInformation(); return $this->last_backup_time; } /** * Returns bucket object for backup operation. * * @param string $operation * @param string $check_word * @param string $file_name * @return CBitrixCloudBackupBucket * @throws CBitrixCloudException */ private function _getBucket($operation, $check_word, $file_name) { if (!CModule::IncludeModule('clouds')) { throw new CBitrixCloudException('Module clouds not installed.'); } $web_service = new CBitrixCloudBackupWebService(); if ($operation === 'write') { $obXML = $web_service->actionWriteFile($check_word, $file_name); } else { $obXML = $web_service->actionReadFile($check_word, $file_name); } /* @var CDataXMLNode $node */ $bucket_name = (is_object($node = $obXML->SelectNodes('/control/bucket/bucket_name'))) ? $node->textContent() : ''; $bucket_location = (is_object($node = $obXML->SelectNodes('/control/bucket/bucket_location'))) ? $node->textContent() : ''; $prefix = (is_object($node = $obXML->SelectNodes('/control/bucket/prefix'))) ? $node->textContent() : ''; $access_key = (is_object($node = $obXML->SelectNodes('/control/bucket/access_key'))) ? $node->textContent() : ''; $secret_key = (is_object($node = $obXML->SelectNodes('/control/bucket/secret_key'))) ? $node->textContent() : ''; $session_token = (is_object($node = $obXML->SelectNodes('/control/bucket/session_token'))) ? $node->textContent() : ''; $file_name = (is_object($node = $obXML->SelectNodes('/control/bucket/file_name'))) ? $node->textContent() : ''; return new CBitrixCloudBackupBucket( $bucket_name, $prefix, $access_key, $secret_key, $session_token, $check_word, $file_name, $bucket_location ); } /** * Returns bucket object for downloading backup file. * * @param string $check_word * @param string $file_name * @return CBitrixCloudBackupBucket * @throws CBitrixCloudException */ public function getBucketToReadFile($check_word, $file_name) { return $this->_getBucket('read', $check_word, $file_name); } /** * Returns bucket object for uploading backup file. * * @param string $check_word * @param string $file_name * @return CBitrixCloudBackupBucket * @throws CBitrixCloudException */ public function getBucketToWriteFile($check_word, $file_name) { return $this->_getBucket('write', $check_word, $file_name); } /** * Deletes state stored in the database. * * @return CBitrixCloudBackup */ public function clearOptions() { CBitrixCloudOption::getOption('backup_files')->delete(); CBitrixCloudOption::getOption('backup_quota')->delete(); CBitrixCloudOption::getOption('backup_total_size')->delete(); CBitrixCloudOption::getOption('backup_last_backup_time')->delete(); return $this; } /** * Saves state into the database. * * @return CBitrixCloudBackup */ public function saveToOptions() { $this->_getInformation(); $arFiles = []; foreach ($this->files as $arFile) { $arFiles[$arFile['FILE_NAME']] = $arFile['FILE_SIZE']; } ksort($arFiles); CBitrixCloudOption::getOption('backup_files')->setArrayValue($arFiles); CBitrixCloudOption::getOption('backup_quota')->setStringValue((string)$this->quota); CBitrixCloudOption::getOption('backup_total_size')->setStringValue((string)$this->total_size); CBitrixCloudOption::getOption('backup_last_backup_time')->setStringValue((string)$this->last_backup_time); return $this; } /** * Restores state from the database. * * @return CBitrixCloudBackup */ public function loadFromOptions() { $this->files = /*.(array[int][string]string).*/ []; foreach (CBitrixCloudOption::getOption('backup_files')->getArrayValue() as $FILE_NAME => $FILE_SIZE) { $this->files[] = [ 'FILE_NAME' => $FILE_NAME, 'FILE_SIZE' => $FILE_SIZE, ]; } $this->quota = doubleval(CBitrixCloudOption::getOption('backup_quota')->getStringValue()); $this->total_size = doubleval(CBitrixCloudOption::getOption('backup_total_size')->getStringValue()); $this->last_backup_time = intval(CBitrixCloudOption::getOption('backup_last_backup_time')->getStringValue()); $this->init = true; return $this; } /** * Shows information about backup free space in Admin's informer popup * * @return void */ public static function OnAdminInformerInsertItems() { global $USER; $informerParams = [ 'TITLE' => GetMessage('BCL_BACKUP_AI_TITLE'), 'COLOR' => 'peach', ]; $backup = self::getInstance(); $backup->loadFromOptions(); $last_request_time_option = CBitrixCloudOption::getOption('backup_last_backup_time'); try { if ( $backup->getQuota() <= 0 && $last_request_time_option->getIntegerValue() <= 0 ) { $backup->_getInformation(true); $backup->saveToOptions(); $last_request_time_option->setStringValue((string)time()); } } catch (CBitrixCloudException $_) { return; } if ( $backup->getQuota() <= 0 ) { return; } $arFiles = $backup->listFiles(); if (empty($arFiles)) { $PROGRESS_FREE = 100; $AVAIL = $backup->getQuota(); $ALLOWED = CFile::FormatSize($backup->getQuota(), 0); $informerParams['ALERT'] = true; $MESS = '<span class="adm-informer-strong-text">' . GetMessage('BCL_BACKUP_AI_NO_FILES') . '</span>'; if ($USER->CanDoOperation('bitrixcloud_backup') && $USER->CanDoOperation('edit_php')) { $informerParams['FOOTER'] = '<a href="/bitrix/admin/dump.php?lang=' . LANGUAGE_ID . '">' . GetMessage('BCL_BACKUP_AI_DO_BACKUP_STRONGLY') . '</a>'; } } elseif ($backup->getLastTimeBackup() < (time() - 7 * 24 * 3600)) { $AVAIL = $backup->getQuota() - $backup->getUsage(); if ($AVAIL < 0.0) { $AVAIL = 0.0; } $PROGRESS_FREE = round($AVAIL / $backup->getQuota() * 100); $ALLOWED = CFile::FormatSize($backup->getQuota(), 0); $informerParams['ALERT'] = true; $MESS = '<span class="adm-informer-strong-text">' . GetMessage('BCL_BACKUP_AI_LAST_TIME') . ': ' . FormatDate([ 'today' => 'today', 'yesterday' => 'yesterday', '' => 'dago', ], $backup->getLastTimeBackup()) . '.</span>'; if ($USER->CanDoOperation('bitrixcloud_backup') && $USER->CanDoOperation('edit_php')) { $informerParams['FOOTER'] = '<a href="/bitrix/admin/dump.php?lang=' . LANGUAGE_ID . '">' . GetMessage('BCL_BACKUP_AI_DO_BACKUP_STRONGLY') . '</a>'; } } else { $AVAIL = $backup->getQuota() - $backup->getUsage(); if ($AVAIL < 0.0) { $AVAIL = 0.0; } $PROGRESS_FREE = round($AVAIL / $backup->getQuota() * 100); $ALLOWED = CFile::FormatSize($backup->getQuota(), 0); $informerParams['ALERT'] = false; $MESS = GetMessage('BCL_BACKUP_AI_LAST_TIME') . ': ' . FormatDate([ 'today' => 'today', 'yesterday' => 'yesterday', '' => 'dago', ], $backup->getLastTimeBackup()); if ($USER->CanDoOperation('bitrixcloud_backup') && $USER->CanDoOperation('edit_php')) { $informerParams['FOOTER'] = '<a href="/bitrix/admin/dump.php?lang=' . LANGUAGE_ID . '">' . GetMessage('BCL_BACKUP_AI_DO_BACKUP') . '</a>'; } } if (isset($informerParams['ALERT'])) { $PROGRESS_FREE_BAR = $PROGRESS_FREE < 0 ? 0 : $PROGRESS_FREE; $informerParams['HTML'] = ' <div class="adm-informer-item-section"> <span class="adm-informer-item-l"> <span class="adm-informer-strong-text">' . GetMessage('BCL_BACKUP_AI_USAGE_TOTAL') . '</span> ' . $ALLOWED . ' </span> <span class="adm-informer-item-r"> <span class="adm-informer-strong-text">' . GetMessage('BCL_BACKUP_AI_USAGE_AVAIL') . '</span> ' . CFile::FormatSize($AVAIL, 0) . ' </span> </div> <div class="adm-informer-status-bar-block" > <div class="adm-informer-status-bar-indicator" style="width:' . (100 - $PROGRESS_FREE_BAR) . '%; "></div> <div class="adm-informer-status-bar-text">' . (100 - $PROGRESS_FREE) . '%</div> </div> ' . $MESS; CAdminInformer::AddItem($informerParams); } } /** * Registers new backup job with the remote service. * Returns empty string on success. * * @param string $secret_key * @param string $url * @param int $time * @param array $weekdays * @return string * */ public function addBackupJob($secret_key, $url, $time = 0, $weekdays = []) { try { $web_service = new CBitrixCloudBackupWebService(); $web_service->actionAddBackupJob($secret_key, $url, $time, $weekdays); return ''; } catch (CBitrixCloudException $e) { return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]"; } } /** * Cancels backup job with the remote service. * Returns empty string on success. * * @return string * */ public function deleteBackupJob() { try { $web_service = new CBitrixCloudBackupWebService(); $web_service->actionDeleteBackupJob(); return ''; } catch (CBitrixCloudException $e) { return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]"; } } public function getBackupJob() { try { $web_service = new CBitrixCloudBackupWebService(); $infoXML = $web_service->actionGetBackupJob(); } catch (CBitrixCloudException $e) { return $e->getMessage();//."[".htmlspecialcharsEx($e->getErrorCode())."]"; } $result = []; $jobList = $infoXML->SelectNodes('/control/JobList'); if (is_object($jobList)) { $jobEntries = $jobList->elementsByName('JobEntry'); foreach ($jobEntries as $jobEntry) { $info = []; foreach ($jobEntry->children() as $field) { $name = $field->name(); $value = $field->textContent(); $info[$name] = $value; } $result[] = [ 'URL' => $info['Url'], 'TIME' => $info['Time'], 'WEEK_DAYS' => explode(',', $info['WeekDays']), 'STATUS' => $info['Status'], 'FINISH_TIME' => $info['FinishTime'], ]; } } return $result; } }