Rollback.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Backup\Controller\Adminhtml\Index;
  8. use Magento\Framework\App\Filesystem\DirectoryList;
  9. use Magento\Framework\Filesystem;
  10. /**
  11. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  12. */
  13. class Rollback extends \Magento\Backup\Controller\Adminhtml\Index
  14. {
  15. /**
  16. * Rollback Action
  17. *
  18. * @return void|\Magento\Backend\App\Action
  19. * @SuppressWarnings(PHPMD.CyclomaticComplexity)
  20. * @SuppressWarnings(PHPMD.NPathComplexity)
  21. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  22. */
  23. public function execute()
  24. {
  25. if (!$this->_objectManager->get(\Magento\Backup\Helper\Data::class)->isRollbackAllowed()) {
  26. $this->_forward('denied');
  27. }
  28. if (!$this->getRequest()->isAjax()) {
  29. return $this->_redirect('*/*/index');
  30. }
  31. $helper = $this->_objectManager->get(\Magento\Backup\Helper\Data::class);
  32. $response = new \Magento\Framework\DataObject();
  33. try {
  34. /* @var $backup \Magento\Backup\Model\Backup */
  35. $backup = $this->_backupModelFactory->create(
  36. $this->getRequest()->getParam('time'),
  37. $this->getRequest()->getParam('type')
  38. );
  39. if (!$backup->getTime() || !$backup->exists()) {
  40. return $this->_redirect('backup/*');
  41. }
  42. if (!$backup->getTime()) {
  43. throw new \Magento\Framework\Backup\Exception\CantLoadSnapshot(__('Can\'t load snapshot archive'));
  44. }
  45. $type = $backup->getType();
  46. $backupManager = $this->_backupFactory->create(
  47. $type
  48. )->setBackupExtension(
  49. $helper->getExtensionByType($type)
  50. )->setTime(
  51. $backup->getTime()
  52. )->setBackupsDir(
  53. $helper->getBackupsDir()
  54. )->setName(
  55. $backup->getName(),
  56. false
  57. )->setResourceModel(
  58. $this->_objectManager->create(\Magento\Backup\Model\ResourceModel\Db::class)
  59. );
  60. $this->_coreRegistry->register('backup_manager', $backupManager);
  61. $passwordValid = $this->_objectManager->create(
  62. \Magento\Backup\Model\Backup::class
  63. )->validateUserPassword(
  64. $this->getRequest()->getParam('password')
  65. );
  66. if (!$passwordValid) {
  67. $response->setError(__('Please correct the password.'));
  68. $backupManager->setErrorMessage(__('Please correct the password.'));
  69. return $this->getResponse()->representJson($response->toJson());
  70. }
  71. if ($this->getRequest()->getParam('maintenance_mode')) {
  72. if (!$this->maintenanceMode->set(true)) {
  73. $response->setError(
  74. __(
  75. 'You need more permissions to activate maintenance mode right now.'
  76. ) . ' ' . __(
  77. 'To complete the rollback, please deselect '
  78. . '"Put store into maintenance mode" or update your permissions.'
  79. )
  80. );
  81. $backupManager->setErrorMessage(
  82. __('Something went wrong while putting your store into maintenance mode.')
  83. );
  84. return $this->getResponse()->representJson($response->toJson());
  85. }
  86. }
  87. if ($type != \Magento\Framework\Backup\Factory::TYPE_DB) {
  88. /** @var Filesystem $filesystem */
  89. $filesystem = $this->_objectManager->get(\Magento\Framework\Filesystem::class);
  90. $backupManager->setRootDir($filesystem->getDirectoryRead(DirectoryList::ROOT)->getAbsolutePath())
  91. ->addIgnorePaths($helper->getRollbackIgnorePaths());
  92. if ($this->getRequest()->getParam('use_ftp', false)) {
  93. $backupManager->setUseFtp(
  94. $this->getRequest()->getParam('ftp_host', ''),
  95. $this->getRequest()->getParam('ftp_user', ''),
  96. $this->getRequest()->getParam('ftp_pass', ''),
  97. $this->getRequest()->getParam('ftp_path', '')
  98. );
  99. }
  100. }
  101. $backupManager->rollback();
  102. $helper->invalidateCache();
  103. $adminSession = $this->_getSession();
  104. $adminSession->destroy();
  105. $response->setRedirectUrl($this->getUrl('*'));
  106. } catch (\Magento\Framework\Backup\Exception\CantLoadSnapshot $e) {
  107. $errorMsg = __('We can\'t find the backup file.');
  108. } catch (\Magento\Framework\Backup\Exception\FtpConnectionFailed $e) {
  109. $errorMsg = __('We can\'t connect to the FTP right now.');
  110. } catch (\Magento\Framework\Backup\Exception\FtpValidationFailed $e) {
  111. $errorMsg = __('Failed to validate FTP.');
  112. } catch (\Magento\Framework\Backup\Exception\NotEnoughPermissions $e) {
  113. $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->info($e->getMessage());
  114. $errorMsg = __('You need more permissions to perform a rollback.');
  115. } catch (\Exception $e) {
  116. $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->info($e->getMessage());
  117. $errorMsg = __('Failed to rollback.');
  118. }
  119. if (!empty($errorMsg)) {
  120. $response->setError($errorMsg);
  121. $backupManager->setErrorMessage($errorMsg);
  122. }
  123. if ($this->getRequest()->getParam('maintenance_mode')) {
  124. $this->maintenanceMode->set(false);
  125. }
  126. $this->getResponse()->representJson($response->toJson());
  127. }
  128. }