PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.0
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.0
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 1 day ago UpdateRequirementsCheckTask.php 1 day ago
UpdateRequirementsCheckTask.php
245 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\Service\StagingEngine;
19 use WPStaging\Staging\Sites;
20 use WPStaging\Staging\Tasks\StagingTask;
21 use WPStaging\Staging\Traits\WithStagingEnginePreference;
22 use WPStaging\Staging\Traits\WithStagingRequirementLogs;
23 use WPStaging\Vendor\Psr\Log\LoggerInterface;
24
25
26
27
28 class UpdateRequirementsCheckTask extends StagingTask
29 {
30 use WithStagingEnginePreference;
31 use WithStagingRequirementLogs;
32
33
34 protected $directory;
35
36
37 protected $database;
38
39
40 protected $filesystem;
41
42
43 protected $diskWriteCheck;
44
45
46 protected $analyticsStagingUpdate;
47
48
49 protected $systemInfo;
50
51
52 protected $jobDataDto;
53
54
55 protected $sites;
56
57 public function __construct(
58 Directory $directory,
59 Database $database,
60 Filesystem $filesystem,
61 LoggerInterface $logger,
62 Cache $cache,
63 StepsDto $stepsDto,
64 SeekableQueueInterface $taskQueue,
65 DiskWriteCheck $diskWriteCheck,
66 AnalyticsStagingUpdate $analyticsStagingUpdate,
67 StagingEngine $stagingEngine,
68 SystemInfo $systemInfo,
69 Sites $sites
70 ) {
71 parent::__construct($logger, $cache, $stepsDto, $taskQueue);
72 $this->directory = $directory;
73 $this->filesystem = $filesystem;
74 $this->diskWriteCheck = $diskWriteCheck;
75 $this->analyticsStagingUpdate = $analyticsStagingUpdate;
76 $this->stagingEngine = $stagingEngine;
77 $this->systemInfo = $systemInfo;
78 $this->database = $database;
79 $this->sites = $sites;
80 }
81
82
83
84
85 public static function getTaskName()
86 {
87 return 'staging_site_update_requirements_check';
88 }
89
90
91
92
93 public static function getTaskTitle()
94 {
95 return 'Requirements Check';
96 }
97
98
99
100
101 public function execute()
102 {
103 if (!$this->stepsDto->getTotal()) {
104 $this->stepsDto->setTotal(1);
105 }
106
107 $this->persistStagingEnginePreference();
108 $this->enqueueStartEvent();
109
110 try {
111 $this->logStartHeader();
112 $this->logger->writeLogHeader();
113 $this->logger->writeInstalledPluginsAndThemes();
114 $this->writeStagingSettingsLogs();
115 $this->writeAdvancedSettingsToLogs();
116 $this->cannotUpdateStagingSiteOnMultisite();
117 $this->cannotUpdateIfCantWriteToDisk();
118 $this->cannotUpdateIfStagingSiteNoExists();
119 $this->cannotUpdateIfUsingExternalDatabase();
120 $this->cannotUpdateIfStagingPrefixSameAsProductionSite();
121 } catch (RuntimeException $e) {
122 $this->enqueueRequirementFailEvent();
123 $this->logger->critical($e->getMessage());
124
125 return $this->generateResponse(false);
126 }
127
128 $this->saveStagingSite();
129 $this->logRequirementsCheckPassed();
130
131 return $this->generateResponse();
132 }
133
134
135
136
137 protected function logStartHeader()
138 {
139 $this->logger->info('#################### Start Staging Site Update Job ####################');
140 }
141
142
143
144
145 protected function logRequirementsCheckPassed()
146 {
147 $this->logger->info('Staging Site update requirements passed...');
148 }
149
150
151
152
153 protected function enqueueStartEvent()
154 {
155 $this->analyticsStagingUpdate->enqueueStartEvent($this->jobDataDto->getId(), $this->jobDataDto);
156 }
157
158
159
160
161 protected function enqueueRequirementFailEvent()
162 {
163 $this->analyticsStagingUpdate->enqueueFinishEvent($this->jobDataDto->getId(), $this->jobDataDto);
164 }
165
166
167
168
169 protected function saveStagingSite()
170 {
171 $stagingSites = $this->sites->tryGettingStagingSites();
172 $stagingSites[$this->jobDataDto->getCloneId()] = $this->jobDataDto->getStagingSite()->toArray();
173 $this->sites->updateStagingSites($stagingSites);
174 }
175
176
177
178
179
180 protected function cannotUpdateStagingSiteOnMultisite()
181 {
182 if (is_multisite()) {
183 throw new RuntimeException(__('Basic version doesn\'t support staging feature on multisite.', 'wp-staging'));
184 }
185 }
186
187
188
189
190
191 protected function cannotUpdateIfCantWriteToDisk()
192 {
193 try {
194 $this->diskWriteCheck->testDiskIsWriteable();
195 } catch (DiskNotWritableException $e) {
196 throw new RuntimeException($e->getMessage());
197 }
198 }
199
200
201
202
203
204 protected function cannotUpdateIfStagingSiteNoExists()
205 {
206 $stagingSitePath = $this->jobDataDto->getStagingSitePath();
207 if (!is_dir($stagingSitePath)) {
208 throw new RuntimeException(esc_html__('Cannot update staging site. Staging site directory does not exist!', 'wp-staging'));
209 }
210 }
211
212
213
214
215
216 protected function cannotUpdateIfUsingExternalDatabase()
217 {
218 if ($this->jobDataDto->getIsExternalDatabase()) {
219 throw new RuntimeException(esc_html__('Staging site update with external database is not supported in the basic version.', 'wp-staging'));
220 }
221 }
222
223 protected function cannotUpdateIfStagingPrefixSameAsProductionSite()
224 {
225 $isSamePrefix = $this->database->getBasePrefix() === $this->jobDataDto->getDatabasePrefix();
226 if ($isSamePrefix) {
227 throw new RuntimeException(esc_html__('Staging site prefix is same as production site prefix. Use different prefix for staging site.', 'wp-staging'));
228 }
229 }
230
231
232
233
234 protected function writeStagingSettingsLogs()
235 {
236 $this->logger->info('Staging Settings:');
237 $this->logger->info('Staging Site Path: ' . $this->jobDataDto->getStagingSitePath());
238 $this->logger->info('Staging Site URL: ' . $this->jobDataDto->getStagingSiteUrl());
239 $this->logger->info('Database Prefix: ' . $this->jobDataDto->getDatabasePrefix());
240 $this->logger->info('Clone ID: ' . $this->jobDataDto->getCloneId());
241 $this->logger->info('Clone Name: ' . $this->jobDataDto->getName());
242 $this->logger->info('Is External Database: ' . ($this->jobDataDto->getIsExternalDatabase() ? 'Yes' : 'No'));
243 }
244 }
245