PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.7.0
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.7.0
4.12.0 4.11.2 4.11.1 4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Staging / Tasks / StagingSiteUpdate / UpdateRequirementsCheckTask.php
wp-staging / Staging / Tasks / StagingSiteUpdate Last commit date
FinishStagingSiteUpdateTask.php 7 months ago UpdateRequirementsCheckTask.php 7 months ago
UpdateRequirementsCheckTask.php
214 lines
1 <?php
2
3 namespace WPStaging\Staging\Tasks\StagingSiteUpdate;
4
5 use RuntimeException;
6 use WPStaging\Backend\Modules\SystemInfo;
7 use WPStaging\Framework\Adapter\Database;
8 use WPStaging\Framework\Adapter\Directory;
9 use WPStaging\Framework\Analytics\Actions\AnalyticsStagingUpdate;
10 use WPStaging\Framework\Filesystem\DiskWriteCheck;
11 use WPStaging\Framework\Filesystem\Filesystem;
12 use WPStaging\Framework\Queue\SeekableQueueInterface;
13 use WPStaging\Framework\Utils\Cache\Cache;
14 use WPStaging\Framework\Job\Dto\StepsDto;
15 use WPStaging\Framework\Job\Dto\TaskResponseDto;
16 use WPStaging\Framework\Job\Exception\DiskNotWritableException;
17 use WPStaging\Staging\Dto\Job\StagingSiteJobsDataDto;
18 use WPStaging\Staging\Sites;
19 use WPStaging\Staging\Tasks\StagingTask;
20 use WPStaging\Vendor\Psr\Log\LoggerInterface;
21
22 class UpdateRequirementsCheckTask extends StagingTask
23 {
24 /** @var Directory */
25 protected $directory;
26
27 /** @var Database */
28 protected $database;
29
30 /** @var Filesystem */
31 protected $filesystem;
32
33 /** @var DiskWriteCheck */
34 protected $diskWriteCheck;
35
36 /** @var AnalyticsStagingUpdate */
37 protected $analyticsStagingUpdate;
38
39 /** @var SystemInfo */
40 protected $systemInfo;
41
42 /** @var StagingSiteJobsDataDto $jobDataDto */
43 protected $jobDataDto;
44
45 /** @var Sites */
46 protected $sites;
47
48 public function __construct(
49 Directory $directory,
50 Database $database,
51 Filesystem $filesystem,
52 LoggerInterface $logger,
53 Cache $cache,
54 StepsDto $stepsDto,
55 SeekableQueueInterface $taskQueue,
56 DiskWriteCheck $diskWriteCheck,
57 AnalyticsStagingUpdate $analyticsStagingUpdate,
58 SystemInfo $systemInfo,
59 Sites $sites
60 ) {
61 parent::__construct($logger, $cache, $stepsDto, $taskQueue);
62 $this->directory = $directory;
63 $this->filesystem = $filesystem;
64 $this->diskWriteCheck = $diskWriteCheck;
65 $this->analyticsStagingUpdate = $analyticsStagingUpdate;
66 $this->systemInfo = $systemInfo;
67 $this->database = $database;
68 $this->sites = $sites;
69 }
70
71 /**
72 * @return string
73 */
74 public static function getTaskName()
75 {
76 return 'staging_site_update_requirements_check';
77 }
78
79 /**
80 * @return string
81 */
82 public static function getTaskTitle()
83 {
84 return 'Requirements Check';
85 }
86
87 /**
88 * @return TaskResponseDto
89 */
90 public function execute()
91 {
92 if (!$this->stepsDto->getTotal()) {
93 $this->stepsDto->setTotal(1);
94 }
95
96 try {
97 $this->logStartHeader();
98 $this->logger->writeLogHeader();
99 $this->logger->writeInstalledPluginsAndThemes();
100 $this->writeStagingSettingsLogs();
101 $this->cannotUpdateStagingSiteOnMultisite();
102 $this->cannotUpdateIfCantWriteToDisk();
103 $this->cannotUpdateIfStagingSiteNoExists();
104 $this->cannotUpdateIfUsingExternalDatabase();
105 $this->cannotUpdateIfStagingPrefixSameAsProductionSite();
106 } catch (RuntimeException $e) {
107 $this->analyticsStagingUpdate->enqueueFinishEvent($this->jobDataDto->getId(), $this->jobDataDto);
108 $this->logger->critical($e->getMessage());
109
110 return $this->generateResponse(false);
111 }
112
113 $this->saveStagingSite();
114 $this->logRequirementsCheckPassed();
115
116 return $this->generateResponse();
117 }
118
119 /**
120 * @return void
121 */
122 protected function logStartHeader()
123 {
124 $this->logger->info('#################### Start Staging Site Update Job ####################');
125 }
126
127 /**
128 * @return void
129 */
130 protected function logRequirementsCheckPassed()
131 {
132 $this->logger->info('Staging Site update requirements passed...');
133 }
134
135 /**
136 * @return void
137 */
138 protected function saveStagingSite()
139 {
140 $stagingSites = $this->sites->tryGettingStagingSites();
141 $stagingSites[$this->jobDataDto->getCloneId()] = $this->jobDataDto->getStagingSite()->toArray();
142 $this->sites->updateStagingSites($stagingSites);
143 }
144
145 /**
146 * @return void
147 * @throws RuntimeException
148 */
149 protected function cannotUpdateStagingSiteOnMultisite()
150 {
151 if (is_multisite()) {
152 throw new RuntimeException(__('Basic version doesn\'t support staging feature on multisite.', 'wp-staging'));
153 }
154 }
155
156 /**
157 * @return void
158 * @throws RuntimeException
159 */
160 protected function cannotUpdateIfCantWriteToDisk()
161 {
162 try {
163 $this->diskWriteCheck->testDiskIsWriteable();
164 } catch (DiskNotWritableException $e) {
165 throw new RuntimeException($e->getMessage());
166 }
167 }
168
169 /**
170 * @return void
171 * @throws RuntimeException
172 */
173 protected function cannotUpdateIfStagingSiteNoExists()
174 {
175 $stagingSitePath = $this->jobDataDto->getStagingSitePath();
176 if (!is_dir($stagingSitePath)) {
177 throw new RuntimeException(esc_html__('Cannot update staging site. Staging site directory does not exist!', 'wp-staging'));
178 }
179 }
180
181 /**
182 * @return void
183 * @throws RuntimeException
184 */
185 protected function cannotUpdateIfUsingExternalDatabase()
186 {
187 if ($this->jobDataDto->getIsExternalDatabase()) {
188 throw new RuntimeException(esc_html__('Staging site update with external database is not supported in the basic version.', 'wp-staging'));
189 }
190 }
191
192 protected function cannotUpdateIfStagingPrefixSameAsProductionSite()
193 {
194 $isSamePrefix = $this->database->getBasePrefix() === $this->jobDataDto->getDatabasePrefix();
195 if ($isSamePrefix) {
196 throw new RuntimeException(esc_html__('Staging site prefix is same as production site prefix. Use different prefix for staging site.', 'wp-staging'));
197 }
198 }
199
200 /**
201 * @return void
202 */
203 protected function writeStagingSettingsLogs()
204 {
205 $this->logger->info('Staging Settings:');
206 $this->logger->info('Staging Site Path: ' . $this->jobDataDto->getStagingSitePath());
207 $this->logger->info('Staging Site URL: ' . $this->jobDataDto->getStagingSiteUrl());
208 $this->logger->info('Database Prefix: ' . $this->jobDataDto->getDatabasePrefix());
209 $this->logger->info('Clone ID: ' . $this->jobDataDto->getCloneId());
210 $this->logger->info('Clone Name: ' . $this->jobDataDto->getName());
211 $this->logger->info('Is External Database: ' . ($this->jobDataDto->getIsExternalDatabase() ? 'Yes' : 'No'));
212 }
213 }
214