PluginProbe
Manage – Centralized site maintenance and monitoring / trunk
Manage – Centralized site maintenance and monitoring vtrunk
1.0.9 1.0.8 1.0.7 1.0.6 1.0.5 trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4
manage / modules / api / components / core.php

core.php in Manage – Centralized site maintenance and monitoring trunk, at modules/api/components/core.php

256 lines 6.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace Manage\Modules\Api\Components;
3
4 use Manage\Modules\Api\Classes\Route;
5 use Manage\Modules\Api\Classes\Translation_Updater;
6
7 if ( ! defined( 'ABSPATH' ) ) {
8 exit; // Exit if accessed directly.
9 }
10
11 class Core extends Route {
12
13 public function register_routes() {
14 register_rest_route( static::NAMESPACE, '/core/update', [
15 'methods' => 'POST',
16 'permission_callback' => [ $this, 'token_authentication' ],
17 'callback' => [ $this, 'update_core' ],
18 ] );
19
20 register_rest_route( static::NAMESPACE, '/core/rollback', [
21 'methods' => 'GET',
22 'permission_callback' => [ $this, 'token_authentication' ],
23 'callback' => [ $this, 'get_rollback_versions' ],
24 ] );
25
26 register_rest_route( static::NAMESPACE, '/core/rollback', [
27 'methods' => 'POST',
28 'permission_callback' => [ $this, 'token_authentication' ],
29 'callback' => [ $this, 'rollback_core' ],
30 'args' => [
31 'version' => [
32 'required' => true,
33 'type' => 'string',
34 'sanitize_callback' => 'sanitize_text_field',
35 ],
36 ],
37 ] );
38
39 register_rest_route( static::NAMESPACE, '/core/update-translations', [
40 'methods' => 'POST',
41 'permission_callback' => [ $this, 'token_authentication' ],
42 'callback' => [ $this, 'update_all_translations' ],
43 'args' => [],
44 ] );
45
46 register_rest_route( static::NAMESPACE, '/core/update-db', [
47 'methods' => 'POST',
48 'permission_callback' => [ $this, 'token_authentication' ],
49 'callback' => [ $this, 'update_db' ],
50 ] );
51 }
52
53 public function update_core( $request ) {
54 require_once ABSPATH . 'wp-admin/includes/file.php';
55 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
56 require_once ABSPATH . 'wp-admin/includes/update.php';
57
58 wp_version_check();
59 $current = get_site_transient( 'update_core' );
60
61 if ( ! $current || ! isset( $current->updates[0] ) || 'upgrade' !== $current->updates[0]->response ) {
62 return new \WP_Error(
63 'no_update_available',
64 'No WordPress core update available.',
65 [ 'status' => \WP_Http::BAD_REQUEST ]
66 );
67 }
68
69 $update = $current->updates[0];
70
71 // Perform the core update
72 $skin = new \WP_Ajax_Upgrader_Skin();
73 $upgrader = new \Core_Upgrader( $skin );
74 $result = $upgrader->upgrade( $update );
75
76 if ( is_wp_error( $result ) ) {
77 return new \WP_Error(
78 'update_failed',
79 'Failed to update WordPress core: ' . $result->get_error_message(),
80 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
81 );
82 }
83
84 if ( is_wp_error( $skin->result ) ) {
85 return new \WP_Error(
86 'update_failed',
87 'Failed to update WordPress core: ' . $skin->result->get_error_message(),
88 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
89 );
90 }
91
92 if ( $skin->get_errors()->has_errors() ) {
93 return new \WP_Error(
94 'update_failed',
95 'Failed to update WordPress core: ' . $skin->get_error_messages(),
96 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
97 );
98 }
99
100 if ( ! $result ) {
101 return new \WP_Error(
102 'update_failed',
103 'Failed to update WordPress core for an unknown reason.',
104 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
105 );
106 }
107
108 return rest_ensure_response( [
109 'status' => 'success',
110 'message' => 'WordPress core updated successfully.',
111 ] );
112 }
113
114 public function get_rollback_versions( $request ) {
115 require_once ABSPATH . 'wp-admin/includes/update.php';
116
117 $response = wp_remote_get( 'https://api.wordpress.org/core/version-check/1.7/' );
118
119 if ( is_wp_error( $response ) ) {
120 return new \WP_Error(
121 'api_request_failed',
122 'Failed to fetch WordPress versions: ' . $response->get_error_message(),
123 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
124 );
125 }
126
127 $body = wp_remote_retrieve_body( $response );
128 $data = json_decode( $body, true );
129
130 if ( ! $data || ! isset( $data['offers'] ) ) {
131 return new \WP_Error(
132 'invalid_api_response',
133 'Invalid response from WordPress version API.',
134 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
135 );
136 }
137
138 $versions = [];
139
140 foreach ( $data['offers'] as $offer ) {
141 if ( isset( $offer['version'] ) ) {
142 $versions[] = $offer['version'];
143 }
144 }
145
146 $versions = array_unique( $versions );
147
148 usort( $versions, 'version_compare' );
149 $versions = array_reverse( $versions );
150
151 $maximum_versions = 30;
152 $versions = array_slice( $versions, 0, $maximum_versions );
153
154 return rest_ensure_response( [
155 'status' => 'success',
156 'data' => [
157 'versions' => $versions,
158 ],
159 ] );
160 }
161
162 public function rollback_core( $request ) {
163 $version = $request->get_param( 'version' );
164
165 if ( empty( $version ) ) {
166 return new \WP_Error( 'missing_version', 'Version is required.', [ 'status' => \WP_Http::BAD_REQUEST ] );
167 }
168
169 require_once ABSPATH . 'wp-admin/includes/file.php';
170 require_once ABSPATH . 'wp-admin/includes/update.php';
171 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
172
173 $current_version = get_bloginfo( 'version' );
174
175 if ( version_compare( $current_version, $version, '=' ) ) {
176 return new \WP_Error(
177 'same_version',
178 'WordPress is already at version ' . $version,
179 [ 'status' => \WP_Http::BAD_REQUEST ]
180 );
181 }
182
183 // Construct download URL for the specific WordPress version
184 $download_url = sprintf( 'https://wordpress.org/wordpress-%s.zip', $version );
185
186 // Perform the core rollback
187 $skin = new \WP_Ajax_Upgrader_Skin();
188 $upgrader = new \Core_Upgrader( $skin );
189
190 // Create proper package structure for Core_Upgrader
191 $rollback_package = (object) [
192 'response' => 'upgrade',
193 'version' => $version,
194 'current' => $current_version,
195 'packages' => (object) [
196 'rollback' => $download_url,
197 'full' => $download_url,
198 ],
199 ];
200
201 $result = $upgrader->upgrade( $rollback_package, [ 'do_rollback' => true ] );
202
203 if ( is_wp_error( $result ) ) {
204 return new \WP_Error(
205 'rollback_failed',
206 'Failed to rollback WordPress core: ' . $result->get_error_message(),
207 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
208 );
209 }
210
211 if ( is_wp_error( $skin->result ) ) {
212 return new \WP_Error(
213 'rollback_failed',
214 'Failed to rollback WordPress core: ' . $skin->result->get_error_message(),
215 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
216 );
217 }
218
219 if ( $skin->get_errors()->has_errors() ) {
220 return new \WP_Error(
221 'rollback_failed',
222 'Failed to rollback WordPress core: ' . $skin->get_error_messages(),
223 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
224 );
225 }
226
227 if ( ! $result ) {
228 return new \WP_Error(
229 'rollback_failed',
230 'Failed to rollback WordPress core for an unknown reason.',
231 [ 'status' => \WP_Http::INTERNAL_SERVER_ERROR ]
232 );
233 }
234
235 return rest_ensure_response( [
236 'status' => 'success',
237 'message' => 'WordPress core rolled back successfully.',
238 ] );
239 }
240
241 public function update_all_translations( $request ) {
242 return Translation_Updater::update_translations( 'core' );
243 }
244
245 public function update_db() {
246 require_once ABSPATH . 'wp-admin/includes/upgrade.php';
247
248 wp_upgrade();
249
250 return rest_ensure_response( [
251 'status' => 'success',
252 'message' => 'Database updated successfully.',
253 ] );
254 }
255 }
256