212 lines
7.6 KiB
PHP
212 lines
7.6 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Поиск файла 391075 в S3 архиве с использованием AWS SDK
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
require_once 'crm_extensions/shared/EnvLoader.php';
|
|||
|
|
require_once 'crm_extensions/vendor/autoload.php';
|
|||
|
|
|
|||
|
|
use Aws\S3\S3Client;
|
|||
|
|
use Aws\Exception\AwsException;
|
|||
|
|
|
|||
|
|
// Загружаем переменные окружения
|
|||
|
|
EnvLoader::load();
|
|||
|
|
|
|||
|
|
// S3 настройки
|
|||
|
|
$s3Endpoint = EnvLoader::get('S3_ENDPOINT');
|
|||
|
|
$s3Bucket = EnvLoader::get('S3_BUCKET');
|
|||
|
|
$s3AccessKey = EnvLoader::get('S3_ACCESS_KEY');
|
|||
|
|
$s3SecretKey = EnvLoader::get('S3_SECRET_KEY');
|
|||
|
|
$s3Region = EnvLoader::get('S3_REGION');
|
|||
|
|
|
|||
|
|
echo "=== Поиск файла 391075 в S3 архиве (AWS SDK) ===\n\n";
|
|||
|
|
|
|||
|
|
// Создаем S3 клиент
|
|||
|
|
$s3Client = new S3Client([
|
|||
|
|
'version' => 'latest',
|
|||
|
|
'region' => $s3Region,
|
|||
|
|
'endpoint' => $s3Endpoint,
|
|||
|
|
'use_path_style_endpoint' => true,
|
|||
|
|
'credentials' => [
|
|||
|
|
'key' => $s3AccessKey,
|
|||
|
|
'secret' => $s3SecretKey,
|
|||
|
|
],
|
|||
|
|
'http' => [
|
|||
|
|
'verify' => false,
|
|||
|
|
]
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
// Данные файла из БД
|
|||
|
|
$fileName = '722fb330f1bcbfa6dc3975013fbf9b4a.docx';
|
|||
|
|
$originalPath = 'storage/2025/August/week5/';
|
|||
|
|
|
|||
|
|
echo "Ищем файл: {$fileName}\n";
|
|||
|
|
echo "Оригинальный путь: {$originalPath}\n";
|
|||
|
|
echo "S3 Bucket: {$s3Bucket}\n\n";
|
|||
|
|
|
|||
|
|
// Возможные пути в архиве
|
|||
|
|
$possiblePaths = [
|
|||
|
|
"backups/{$originalPath}{$fileName}",
|
|||
|
|
"backups/storage/2025/August/week5/{$fileName}",
|
|||
|
|
"backups/{$fileName}",
|
|||
|
|
"storage/2025/August/week5/{$fileName}",
|
|||
|
|
"{$fileName}",
|
|||
|
|
"archive/{$originalPath}{$fileName}",
|
|||
|
|
"archive/storage/2025/August/week5/{$fileName}",
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
echo "Проверяем возможные пути:\n";
|
|||
|
|
|
|||
|
|
foreach ($possiblePaths as $path) {
|
|||
|
|
echo "Проверяем: {$path}\n";
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// Проверяем существование файла
|
|||
|
|
$result = $s3Client->headObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $path
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
echo " ✅ ФАЙЛ НАЙДЕН!\n";
|
|||
|
|
echo " Размер: " . $result['ContentLength'] . " байт\n";
|
|||
|
|
echo " Тип: " . ($result['ContentType'] ?? 'unknown') . "\n\n";
|
|||
|
|
|
|||
|
|
// Скачиваем файл
|
|||
|
|
echo "Скачиваем файл...\n";
|
|||
|
|
$tempFile = '/tmp/restored_' . $fileName;
|
|||
|
|
|
|||
|
|
$s3Client->getObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $path,
|
|||
|
|
'SaveAs' => $tempFile
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
echo " ✅ Файл скачан: {$tempFile}\n";
|
|||
|
|
echo " Размер: " . filesize($tempFile) . " байт\n";
|
|||
|
|
|
|||
|
|
// Восстанавливаем в локальное хранилище
|
|||
|
|
$restorePath = "/var/www/fastuser/data/www/crm.clientright.ru/storage/2025/August/week5/";
|
|||
|
|
if (!is_dir($restorePath)) {
|
|||
|
|
mkdir($restorePath, 0755, true);
|
|||
|
|
echo " Создана папка: {$restorePath}\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$finalPath = $restorePath . $fileName;
|
|||
|
|
copy($tempFile, $finalPath);
|
|||
|
|
unlink($tempFile);
|
|||
|
|
|
|||
|
|
echo " ✅ Файл восстановлен: {$finalPath}\n";
|
|||
|
|
echo " Размер: " . filesize($finalPath) . " байт\n";
|
|||
|
|
|
|||
|
|
// Обновляем БД
|
|||
|
|
echo "\nОбновляем базу данных...\n";
|
|||
|
|
include_once 'config.inc.php';
|
|||
|
|
$mysqli = new mysqli($dbconfig['db_server'], $dbconfig['db_username'], $dbconfig['db_password'], $dbconfig['db_name']);
|
|||
|
|
|
|||
|
|
if ($mysqli->connect_error) {
|
|||
|
|
echo "❌ Ошибка подключения к БД: " . $mysqli->connect_error . "\n";
|
|||
|
|
} else {
|
|||
|
|
$stmt = $mysqli->prepare("UPDATE vtiger_attachments SET path = ? WHERE attachmentsid = 391075");
|
|||
|
|
$stmt->bind_param("s", $restorePath);
|
|||
|
|
|
|||
|
|
if ($stmt->execute()) {
|
|||
|
|
echo "✅ База данных обновлена\n";
|
|||
|
|
} else {
|
|||
|
|
echo "❌ Ошибка обновления БД: " . $stmt->error . "\n";
|
|||
|
|
}
|
|||
|
|
$stmt->close();
|
|||
|
|
$mysqli->close();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\n🎉 ФАЙЛ 391075 УСПЕШНО ВОССТАНОВЛЕН!\n";
|
|||
|
|
echo "Теперь файл доступен по ссылке: https://crm.clientright.ru/index.php?module=ModComments&action=DownloadFile&record=391074&fileid=391075\n";
|
|||
|
|
exit(0);
|
|||
|
|
|
|||
|
|
} catch (AwsException $e) {
|
|||
|
|
if ($e->getAwsErrorCode() === 'NotFound') {
|
|||
|
|
echo " ❌ Файл не найден\n";
|
|||
|
|
} else {
|
|||
|
|
echo " ❌ Ошибка AWS: " . $e->getAwsErrorCode() . " - " . $e->getMessage() . "\n";
|
|||
|
|
}
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo " ❌ Ошибка: " . $e->getMessage() . "\n";
|
|||
|
|
}
|
|||
|
|
echo "\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "❌ Файл не найден ни по одному из путей\n";
|
|||
|
|
echo "\nПопробуем поискать все файлы в папке backups...\n";
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
$result = $s3Client->listObjectsV2([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Prefix' => 'backups/',
|
|||
|
|
'MaxKeys' => 1000
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
if (isset($result['Contents'])) {
|
|||
|
|
echo "Найдено " . count($result['Contents']) . " файлов в папке backups:\n";
|
|||
|
|
|
|||
|
|
$foundFiles = [];
|
|||
|
|
foreach ($result['Contents'] as $object) {
|
|||
|
|
$key = $object['Key'];
|
|||
|
|
if (strpos($key, '722fb330f1bcbfa6dc3975013fbf9b4a') !== false) {
|
|||
|
|
$foundFiles[] = $key;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (!empty($foundFiles)) {
|
|||
|
|
echo "\n✅ НАЙДЕНЫ ФАЙЛЫ С ИМЕНЕМ 722fb330f1bcbfa6dc3975013fbf9b4a:\n";
|
|||
|
|
foreach ($foundFiles as $foundFile) {
|
|||
|
|
echo " - {$foundFile}\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Пробуем восстановить первый найденный
|
|||
|
|
$firstFile = $foundFiles[0];
|
|||
|
|
echo "\nВосстанавливаем: {$firstFile}\n";
|
|||
|
|
|
|||
|
|
$tempFile = '/tmp/restored_' . $fileName;
|
|||
|
|
$s3Client->getObject([
|
|||
|
|
'Bucket' => $s3Bucket,
|
|||
|
|
'Key' => $firstFile,
|
|||
|
|
'SaveAs' => $tempFile
|
|||
|
|
]);
|
|||
|
|
|
|||
|
|
$restorePath = "/var/www/fastuser/data/www/crm.clientright.ru/storage/2025/August/week5/";
|
|||
|
|
if (!is_dir($restorePath)) {
|
|||
|
|
mkdir($restorePath, 0755, true);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$finalPath = $restorePath . $fileName;
|
|||
|
|
copy($tempFile, $finalPath);
|
|||
|
|
unlink($tempFile);
|
|||
|
|
|
|||
|
|
echo "✅ Файл восстановлен: {$finalPath}\n";
|
|||
|
|
|
|||
|
|
// Обновляем БД
|
|||
|
|
include_once 'config.inc.php';
|
|||
|
|
$mysqli = new mysqli($dbconfig['db_server'], $dbconfig['db_username'], $dbconfig['db_password'], $dbconfig['db_name']);
|
|||
|
|
$stmt = $mysqli->prepare("UPDATE vtiger_attachments SET path = ? WHERE attachmentsid = 391075");
|
|||
|
|
$stmt->bind_param("s", $restorePath);
|
|||
|
|
$stmt->execute();
|
|||
|
|
$stmt->close();
|
|||
|
|
$mysqli->close();
|
|||
|
|
|
|||
|
|
echo "🎉 ФАЙЛ 391075 ВОССТАНОВЛЕН!\n";
|
|||
|
|
exit(0);
|
|||
|
|
} else {
|
|||
|
|
echo "❌ Файлы с именем 722fb330f1bcbfa6dc3975013fbf9b4a не найдены в архиве\n";
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
echo "❌ Папка backups пуста или недоступна\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo "❌ Ошибка поиска в архиве: " . $e->getMessage() . "\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\nПроверьте архивы вручную или обратитесь к администратору\n";
|
|||
|
|
?>
|
|||
|
|
|
|||
|
|
|