feat: mobile-like window size and always-visible stats
- 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
This commit is contained in:
85
update-server/admin/restore.php
Normal file
85
update-server/admin/restore.php
Normal file
@@ -0,0 +1,85 @@
|
||||
<?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' => 'Ошибка при восстановлении файла']);
|
||||
}
|
||||
Reference in New Issue
Block a user