- Changed window size to mobile phone format (400x800) - Removed width condition for ActiveProxyFooter - now always visible - Added run-umbrix.sh launch script with icon copying - Stats cards now display on all screen sizes
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' => 'Ошибка при восстановлении файла']);
|
||
}
|