* @copyright Since 2007 PrestaShop SA and Contributors * @license https://opensource.org/licenses/AFL-3.0 Academic Free License 3.0 (AFL-3.0) */ namespace PrestaShop\Module\AutoUpgrade\Task\Rollback; use Exception; use PrestaShop\Module\AutoUpgrade\Analytics; use PrestaShop\Module\AutoUpgrade\Parameters\UpgradeFileNames; use PrestaShop\Module\AutoUpgrade\Task\AbstractTask; use PrestaShop\Module\AutoUpgrade\Task\ExitCode; use PrestaShop\Module\AutoUpgrade\UpgradeContainer; /** * First step executed during a rollback. */ class Rollback extends AbstractTask { const TASK_TYPE = 'rollback'; /** * @throws Exception */ public function run(): int { $this->container->getState()->setProgressPercentage( $this->container->getCompletionCalculator()->getBasePercentageOfTask(self::class) ); // 1st, need to analyse what was wrong. $restoreName = $this->container->getState()->getRestoreName(); $this->container->getState()->setRestoreFilesFilename($restoreName); $restoreDbFilenames = $this->container->getState()->getRestoreDbFilenames(); if (empty($restoreName)) { $this->next = 'noRollbackFound'; return ExitCode::SUCCESS; } $files = scandir($this->container->getProperty(UpgradeContainer::BACKUP_PATH)); // find backup filenames, and be sure they exists foreach ($files as $file) { if (preg_match('#' . preg_quote('auto-backupfiles_' . $restoreName) . '#', $file)) { $this->container->getState()->setRestoreFilesFilename($file); break; } } if (!is_file($this->container->getProperty(UpgradeContainer::BACKUP_PATH) . DIRECTORY_SEPARATOR . $this->container->getState()->getRestoreFilesFilename())) { $this->next = 'error'; $this->setErrorFlag(); $this->logger->error($this->translator->trans('[ERROR] File %s is missing: unable to restore files. Operation aborted.', [$this->container->getState()->getRestoreFilesFilename()])); return ExitCode::FAIL; } $files = scandir($this->container->getProperty(UpgradeContainer::BACKUP_PATH) . DIRECTORY_SEPARATOR . $restoreName); foreach ($files as $file) { if (preg_match('#auto-backupdb_[0-9]{6}_' . preg_quote($restoreName) . '#', $file)) { $restoreDbFilenames[] = $file; } } // order files is important ! sort($restoreDbFilenames); $this->container->getState()->setRestoreDbFilenames($restoreDbFilenames); if (count($restoreDbFilenames) == 0) { $this->next = 'error'; $this->setErrorFlag(); $this->logger->error($this->translator->trans('[ERROR] No backup database files found: it would be impossible to restore the database. Operation aborted.')); return ExitCode::FAIL; } $this->next = 'restoreFiles'; $this->logger->info($this->translator->trans('Restoring files ...')); // remove tmp files related to restoreFiles if (file_exists($this->container->getProperty(UpgradeContainer::WORKSPACE_PATH) . DIRECTORY_SEPARATOR . UpgradeFileNames::FILES_FROM_ARCHIVE_LIST)) { unlink($this->container->getProperty(UpgradeContainer::WORKSPACE_PATH) . DIRECTORY_SEPARATOR . UpgradeFileNames::FILES_FROM_ARCHIVE_LIST); } if (file_exists($this->container->getProperty(UpgradeContainer::WORKSPACE_PATH) . DIRECTORY_SEPARATOR . UpgradeFileNames::FILES_TO_REMOVE_LIST)) { unlink($this->container->getProperty(UpgradeContainer::WORKSPACE_PATH) . DIRECTORY_SEPARATOR . UpgradeFileNames::FILES_TO_REMOVE_LIST); } $this->container->getAnalytics()->track('Rollback Launched', Analytics::WITH_ROLLBACK_PROPERTIES); return ExitCode::SUCCESS; } public function init(): void { // Do nothing } }