PluginProbe ʕ •ᴥ•ʔ
UpdraftPlus: WP Backup & Migration Plugin / 1.24.10
UpdraftPlus: WP Backup & Migration Plugin v1.24.10
1.26.4 1.26.3 1.9.19 1.9.25 1.9.26 1.9.30 1.9.31 1.9.32 1.9.4 1.9.40 1.9.41 1.9.42 1.9.43 1.9.44 1.9.45 1.9.46 1.9.5 1.9.50 1.9.51 1.9.60 1.9.62 1.9.63 1.9.64 1.11.12 1.4.8 1.11.15 1.4.9 1.11.17 1.5.16 1.11.18 1.5.20 1.11.2 1.5.21 1.11.20 1.5.22 1.11.23 1.5.5 1.11.24 1.5.6 1.11.25 1.5.7 1.11.26 1.5.8 1.11.27 1.5.9 1.11.28 1.6.1 1.11.3 1.6.17 1.11.4 1.6.2 1.11.5 1.6.46 1.11.8 1.7.0 1.11.9 1.7.1 1.12.0 1.7.18 1.12.1 1.7.20 1.12.12 1.7.3 1.12.13 1.7.34 1.12.15 1.7.35 1.12.17 1.7.39 1.12.2 1.7.40 1.12.20 1.7.41 1.12.23 1.8.1 1.12.24 1.8.11 1.12.25 1.8.12 1.12.28 1.8.13 1.12.29 1.8.2 1.12.30 1.8.5 1.12.32 1.8.8 1.12.34 1.9.0 1.12.35 1.9.13 1.12.37 1.9.15 1.12.39 1.9.17 1.12.4 1.12.40 1.12.6 1.13.1 1.13.11 1.13.12 1.13.15 1.13.16 1.13.2 1.13.3 1.13.4 1.13.5 1.13.6 1.13.7 1.13.8 1.13.9 1.14.10 1.14.11 1.14.12 1.14.13 1.14.2 1.14.3 1.14.4 1.14.5 1.14.7 1.14.9 1.15.0 1.15.2 1.15.3 1.15.5 1.15.6 1.15.7 1.16.0 1.16.10 1.16.11 1.16.12 1.16.13 1.16.14 1.16.15 1.16.16 1.16.17 1.16.20 1.16.21 1.16.22 1.16.23 1.16.24 1.16.25 1.16.26 1.16.28 1.16.29 1.16.32 1.16.34 1.16.35 1.16.36 1.16.37 1.16.4 1.16.40 1.16.41 1.16.42 1.16.43 1.16.44 1.16.45 1.16.46 1.16.47 1.16.48 1.16.49 1.16.5 1.16.50 1.16.51 1.16.53 1.16.55 1.16.56 1.16.59 1.16.6 1.16.60 1.16.61 1.16.62 1.16.63 1.16.64 1.16.65 1.16.66 1.16.67 1.16.68 1.16.69 1.16.7 1.16.8 1.16.9 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.14 1.2.15 1.2.16 1.2.17 1.2.19 1.2.2 1.2.20 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.33 1.2.35 1.2.36 1.2.38 1.2.39 1.2.4 1.2.40 1.2.41 1.2.42 1.2.43 1.2.44 1.2.45 1.2.46 1.2.5 1.2.7 1.2.8 1.2.9 1.22.1 1.22.10 1.22.11 1.22.12 1.22.14 1.22.15 1.22.16 1.22.17 1.22.18 1.22.19 1.22.20 1.22.21 1.22.22 1.22.23 1.22.24 1.22.3 1.22.4 1.22.5 1.22.6 1.22.7 1.22.8 1.22.9 1.23.1 1.23.10 1.23.11 1.23.12 1.23.13 1.23.15 1.23.16 1.23.2 1.23.3 1.23.4 1.23.5 1.23.6 1.23.7 1.23.8 1.23.9 1.24.1 1.24.10 1.24.11 1.24.12 1.24.2 trunk 1.24.3 0.7.4 1.24.4 0.7.7 1.24.5 0.8.28 1.24.6 0.8.29 1.24.7 0.8.30 1.24.8 0.8.31 1.24.9 0.8.32 1.25.1 0.8.33 1.25.2 0.8.36 1.25.3 0.8.37 1.25.5 0.8.50 1.25.6 0.8.51 1.25.7 0.9.1 1.25.8 0.9.10 1.25.9 0.9.11 1.26.1 0.9.12 1.26.2 0.9.2 1.3.10 0.9.20 1.3.12 0.9.21 1.3.14 0.9.22 1.3.15 1.0.10 1.3.17 1.0.11 1.3.18 1.0.12 1.3.19 1.0.15 1.3.2 1.0.16 1.3.20 1.0.18 1.3.22 1.0.20 1.3.23 1.0.3 1.3.24 1.0.4 1.3.25 1.0.5 1.3.3 1.0.6 1.3.4 1.0.7 1.3.6 1.0.8 1.3.7 1.0.9 1.3.8 1.1.0 1.3.9 1.1.10 1.4.0 1.1.11 1.4.10 1.1.12 1.4.11 1.1.13 1.4.12 1.1.14 1.4.13 1.1.15 1.4.14 1.1.16 1.4.15 1.1.17 1.4.2 1.1.2 1.4.27 1.1.3 1.4.28 1.1.5 1.4.29 1.1.6 1.4.30 1.1.8 1.4.4 1.1.9 1.4.48 1.10.1 1.4.5 1.10.3 1.4.6 1.11.1 1.4.7
updraftplus / includes / class-semaphore.php
updraftplus / includes Last commit date
Dropbox2 2 years ago Google 2 years ago blockui 1 year ago checkout-embed 1 year ago cloudfiles 2 years ago handlebars 2 years ago images 9 years ago jquery-ui.dialog.extended 1 year ago jquery.serializeJSON 5 years ago jstree 1 year ago labelauty 1 year ago pcloud 2 years ago tether 6 years ago tether-shepherd 7 years ago updraftclone 2 years ago S3.php 2 years ago S3compat.php 1 year ago cacert.pem 2 years ago class-backup-history.php 1 year ago class-commands.php 1 year ago class-database-utility.php 2 years ago class-filesystem-functions.php 1 year ago class-http-error-descriptions.php 2 years ago class-job-scheduler.php 3 years ago class-manipulation-functions.php 2 years ago class-partialfileservlet.php 5 years ago class-remote-send.php 2 years ago class-search-replace.php 3 years ago class-semaphore.php 3 years ago class-storage-methods-interface.php 2 years ago class-updraft-dashboard-news.php 2 years ago class-updraft-semaphore.php 4 years ago class-updraftcentral-updraftplus-commands.php 3 years ago class-updraftplus-encryption.php 2 years ago class-wpadmin-commands.php 1 year ago class-zip.php 2 years ago ftp.class.php 2 years ago get-cpanel-quota-usage.pl 12 years ago google-extensions.php 3 years ago jquery-ui.custom-v1.11.4-1-24-10.min.css 1 year ago jquery-ui.custom-v1.11.4-1-24-10.min.css.map 1 year ago jquery-ui.custom-v1.11.4.css 3 years ago jquery-ui.custom-v1.12.1-1-24-10.min.css 1 year ago jquery-ui.custom-v1.12.1-1-24-10.min.css.map 1 year ago jquery-ui.custom-v1.12.1.css 3 years ago migrator-lite.php 1 year ago updraft-admin-common-1-24-10.min.js 1 year ago updraft-admin-common.js 1 year ago updraft-restorer-skin-compatibility.php 6 years ago updraft-restorer-skin.php 3 years ago updraftcentral.php 2 years ago updraftplus-clone.php 2 years ago updraftplus-login.php 7 years ago updraftplus-notices.php 2 years ago updraftplus-tour.php 2 years ago updraftvault.php 3 years ago
class-semaphore.php
225 lines
1 <?php
2 /**
3 * Semaphore Lock Management
4 * Adapted from WP Social under the GPL - thanks to Alex King (https://github.com/crowdfavorite/wp-social)
5 */
6 class UpdraftPlus_Semaphore {
7
8 /**
9 * Initializes the semaphore object.
10 *
11 * @static
12 * @return UpdraftPlus_Semaphore
13 */
14 public static function factory() {
15 return new self;
16 }
17
18 /**
19 * Lock Broke
20 *
21 * @var boolean
22 */
23 protected $lock_broke = false;
24
25 public $lock_name = 'lock';
26
27 /**
28 * Attempts to start the lock. If the rename works, the lock is started.
29 *
30 * @return bool
31 */
32 public function lock() {
33 global $wpdb, $updraftplus;
34
35 // Attempt to set the lock
36 $affected = $wpdb->query("
37 UPDATE $wpdb->options
38 SET option_name = 'updraftplus_locked_".$this->lock_name."'
39 WHERE option_name = 'updraftplus_unlocked_".$this->lock_name."'
40 ");
41
42 if ('0' == $affected && !$this->stuck_check()) {
43 $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
44 return false;
45 }
46
47 // Check to see if all processes are complete
48 $affected = $wpdb->query("
49 UPDATE $wpdb->options
50 SET option_value = CAST(option_value AS UNSIGNED) + 1
51 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
52 AND option_value = '0'
53 ");
54 if ('1' != $affected) {
55 if (!$this->stuck_check()) {
56 $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
57 return false;
58 }
59
60 // Reset the semaphore to 1
61 $wpdb->query("
62 UPDATE $wpdb->options
63 SET option_value = '1'
64 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
65 ");
66
67 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') reset to 1');
68 }
69
70 // Set the lock time
71 $wpdb->query($wpdb->prepare("
72 UPDATE $wpdb->options
73 SET option_value = %s
74 WHERE option_name = 'updraftplus_last_lock_time_".$this->lock_name."'
75 ", current_time('mysql', 1)));
76 $updraftplus->log('Set semaphore last lock ('.$this->lock_name.') time to '.current_time('mysql', 1));
77
78 $updraftplus->log('Semaphore lock ('.$this->lock_name.') complete');
79 return true;
80 }
81
82 public static function ensure_semaphore_exists($semaphore) {
83 // Make sure the options for semaphores exist
84 global $wpdb, $updraftplus;
85 $results = $wpdb->get_results("
86 SELECT option_id
87 FROM $wpdb->options
88 WHERE option_name IN ('updraftplus_locked_$semaphore', 'updraftplus_unlocked_$semaphore', 'updraftplus_last_lock_time_$semaphore', 'updraftplus_semaphore_$semaphore')
89 ");
90
91 if (!is_array($results) || count($results) < 3) {
92
93 if (is_array($results) && count($results) > 0) {
94 $updraftplus->log("Semaphore ($semaphore, ".$wpdb->options.") in an impossible/broken state - fixing (".count($results).")");
95 } else {
96 $updraftplus->log("Semaphore ($semaphore, ".$wpdb->options.") being initialised");
97 }
98
99 $wpdb->query("
100 DELETE FROM $wpdb->options
101 WHERE option_name IN ('updraftplus_locked_$semaphore', 'updraftplus_unlocked_$semaphore', 'updraftplus_last_lock_time_$semaphore', 'updraftplus_semaphore_$semaphore')
102 ");
103
104 $wpdb->query($wpdb->prepare("
105 INSERT INTO $wpdb->options (option_name, option_value, autoload)
106 VALUES
107 ('updraftplus_unlocked_$semaphore', '1', 'no'),
108 ('updraftplus_last_lock_time_$semaphore', '%s', 'no'),
109 ('updraftplus_semaphore_$semaphore', '0', 'no')
110 ", current_time('mysql', 1)));
111 }
112 }
113
114 /**
115 * Increment the semaphore.
116 *
117 * @param array $filters
118 * @return Updraft_Semaphore
119 */
120 public function increment(array $filters = array()) {
121 global $wpdb, $updraftplus;
122
123 if (count($filters)) {
124 // Loop through all of the filters and increment the semaphore
125 foreach ($filters as $priority) {
126 for ($i = 0, $j = count($priority); $i < $j; ++$i) {
127 $this->increment();
128 }
129 }
130 } else {
131 $wpdb->query("
132 UPDATE $wpdb->options
133 SET option_value = CAST(option_value AS UNSIGNED) + 1
134 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
135 ");
136 $updraftplus->log('Incremented the semaphore ('.$this->lock_name.') by 1');
137 }
138
139 return $this;
140 }
141
142 /**
143 * Decrements the semaphore.
144 *
145 * @return void
146 */
147 public function decrement() {
148 global $wpdb, $updraftplus;
149
150 $wpdb->query("
151 UPDATE $wpdb->options
152 SET option_value = CAST(option_value AS UNSIGNED) - 1
153 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
154 AND CAST(option_value AS UNSIGNED) > 0
155 ");
156 $updraftplus->log('Decremented the semaphore ('.$this->lock_name.') by 1');
157 }
158
159 /**
160 * Unlocks the process.
161 *
162 * @return bool
163 */
164 public function unlock() {
165 global $wpdb, $updraftplus;
166
167 // Decrement for the master process.
168 $this->decrement();
169
170 $result = $wpdb->query("
171 UPDATE $wpdb->options
172 SET option_name = 'updraftplus_unlocked_".$this->lock_name."'
173 WHERE option_name = 'updraftplus_locked_".$this->lock_name."'
174 ");
175
176 if ('1' == $result) {
177 $updraftplus->log('Semaphore ('.$this->lock_name.') unlocked');
178 return true;
179 }
180
181 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') still locked ('.$result.')');
182 return false;
183 }
184
185 /**
186 * Attempts to jiggle the stuck lock loose.
187 *
188 * @return bool
189 */
190 private function stuck_check() {
191 global $wpdb, $updraftplus;
192
193 // Check to see if we already broke the lock.
194 if ($this->lock_broke) {
195 return true;
196 }
197
198 $current_time = current_time('mysql', 1);
199 $three_minutes_before = gmdate('Y-m-d H:i:s', time()-(defined('UPDRAFTPLUS_SEMAPHORE_LOCK_WAIT') ? UPDRAFTPLUS_SEMAPHORE_LOCK_WAIT : 180));
200
201 $affected = $wpdb->query($wpdb->prepare("
202 UPDATE $wpdb->options
203 SET option_value = %s
204 WHERE option_name = 'updraftplus_last_lock_time_".$this->lock_name."'
205 AND option_value <= %s
206 ", $current_time, $three_minutes_before));
207
208 if ('1' == $affected) {
209 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') was stuck, set lock time to '.$current_time);
210 $this->lock_broke = true;
211 return true;
212 }
213
214 // Check if lock is greater that 24 hours
215 $last_lock_time = strtotime(UpdraftPlus_Options::get_updraft_option('updraftplus_last_lock_time_'.$this->lock_name, $current_time));
216 $next_day = strtotime($current_time.' +1 day');
217 if ($last_lock_time > $next_day) {
218 $this->lock_broke = true;
219 return true;
220 }
221
222 return false;
223 }
224 } // End UpdraftPlus_Semaphore
225