86 lines
2.9 KiB
PHP
86 lines
2.9 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Umbrix Update Manager - Restore Version
|
|||
|
|
* Откат на предыдущую версию из бэкапа
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
header('Access-Control-Allow-Origin: *');
|
|||
|
|
header('Access-Control-Allow-Methods: POST, OPTIONS');
|
|||
|
|
header('Access-Control-Allow-Headers: Content-Type');
|
|||
|
|
header('Content-Type: application/json; charset=utf-8');
|
|||
|
|
|
|||
|
|
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') {
|
|||
|
|
http_response_code(200);
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|||
|
|
http_response_code(405);
|
|||
|
|
echo json_encode(['success' => false, 'message' => 'Method Not Allowed']);
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$input = file_get_contents('php://input');
|
|||
|
|
$data = json_decode($input, true);
|
|||
|
|
|
|||
|
|
if (!isset($data['filename'])) {
|
|||
|
|
http_response_code(400);
|
|||
|
|
echo json_encode(['success' => false, 'message' => 'Не указан файл для восстановления']);
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$filename = basename($data['filename']); // Защита от path traversal
|
|||
|
|
$backups_dir = __DIR__ . '/../';
|
|||
|
|
$backup_file = $backups_dir . $filename;
|
|||
|
|
$current_file = $backups_dir . 'latest.json';
|
|||
|
|
|
|||
|
|
// Проверяем существование файла бэкапа
|
|||
|
|
if (!file_exists($backup_file)) {
|
|||
|
|
http_response_code(404);
|
|||
|
|
echo json_encode(['success' => false, 'message' => 'Файл бэкапа не найден']);
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Проверяем, что это действительно файл бэкапа
|
|||
|
|
if (!preg_match('/^latest\.json\.backup\.\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$/', $filename)) {
|
|||
|
|
http_response_code(400);
|
|||
|
|
echo json_encode(['success' => false, 'message' => 'Неверный формат файла']);
|
|||
|
|
exit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Создаём бэкап текущей версии перед откатом
|
|||
|
|
if (file_exists($current_file)) {
|
|||
|
|
$backup_name = 'latest.json.backup.' . date('Y-m-d_H-i-s');
|
|||
|
|
copy($current_file, $backups_dir . $backup_name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Восстанавливаем версию из бэкапа
|
|||
|
|
if (copy($backup_file, $current_file)) {
|
|||
|
|
// Логируем откат
|
|||
|
|
$log_dir = $backups_dir . 'logs';
|
|||
|
|
if (!is_dir($log_dir)) {
|
|||
|
|
mkdir($log_dir, 0755, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$log_entry = sprintf(
|
|||
|
|
"[%s] RESTORE: %s -> latest.json (IP: %s)\n",
|
|||
|
|
date('Y-m-d H:i:s'),
|
|||
|
|
$filename,
|
|||
|
|
$_SERVER['REMOTE_ADDR'] ?? 'unknown'
|
|||
|
|
);
|
|||
|
|
file_put_contents($log_dir . '/restore.log', $log_entry, FILE_APPEND);
|
|||
|
|
|
|||
|
|
// Получаем данные восстановленной версии
|
|||
|
|
$restored_data = json_decode(file_get_contents($current_file), true);
|
|||
|
|
|
|||
|
|
echo json_encode([
|
|||
|
|
'success' => true,
|
|||
|
|
'message' => 'Версия успешно восстановлена',
|
|||
|
|
'version' => $restored_data['version'] ?? 'unknown',
|
|||
|
|
'build_number' => $restored_data['build_number'] ?? 0
|
|||
|
|
]);
|
|||
|
|
} else {
|
|||
|
|
http_response_code(500);
|
|||
|
|
echo json_encode(['success' => false, 'message' => 'Ошибка при восстановлении файла']);
|
|||
|
|
}
|