- Added comprehensive AI Assistant system (aiassist/ directory): * Vector search and embedding capabilities * Typebot proxy integration * Elastic search functionality * Message classification and chat history * MCP proxy for external integrations - Implemented Court Status API (GetCourtStatus.php): * Real-time court document status checking * Integration with external court systems * Comprehensive error handling and logging - Enhanced S3 integration: * Improved file backup system with metadata * Batch processing capabilities * Enhanced error logging and recovery * Copy operations with URL fixing - Added Telegram contact creation API - Improved error logging across all modules - Enhanced callback system for AI responses - Extensive backup file storage with timestamps - Updated documentation and README files - File storage improvements: * Thousands of backup files with proper metadata * Fix operations for broken file references * Project-specific backup and recovery systems * Comprehensive file integrity checking Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
156 lines
5.9 KiB
PHP
156 lines
5.9 KiB
PHP
<?php
|
|
/**
|
|
* Поиск файла 391075 в S3 архиве
|
|
*/
|
|
|
|
require_once 'crm_extensions/shared/EnvLoader.php';
|
|
|
|
// Загружаем переменные окружения
|
|
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');
|
|
|
|
echo "=== Поиск файла 391075 в S3 архиве ===\n\n";
|
|
|
|
// Данные файла из БД
|
|
$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) {
|
|
$s3Url = "{$s3Endpoint}/{$s3Bucket}/{$path}";
|
|
echo "Проверяем: {$path}\n";
|
|
|
|
// Создаем подписанный URL (простой подход)
|
|
$timestamp = time();
|
|
$expires = $timestamp + 3600; // 1 час
|
|
|
|
// Простая проверка существования через HEAD запрос
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $s3Url,
|
|
CURLOPT_CUSTOMREQUEST => 'HEAD',
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_NOBODY => true,
|
|
CURLOPT_SSL_VERIFYPEER => false,
|
|
CURLOPT_TIMEOUT => 10,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: AWS ' . $s3AccessKey . ':' . $s3SecretKey,
|
|
'Date: ' . gmdate('D, d M Y H:i:s T', $timestamp),
|
|
]
|
|
]);
|
|
|
|
$response = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$error = curl_error($ch);
|
|
curl_close($ch);
|
|
|
|
if ($error) {
|
|
echo " ❌ cURL error: {$error}\n";
|
|
} else {
|
|
echo " HTTP Code: {$httpCode}\n";
|
|
if ($httpCode == 200) {
|
|
echo " ✅ ФАЙЛ НАЙДЕН!\n";
|
|
echo " URL: {$s3Url}\n\n";
|
|
|
|
// Пробуем скачать файл
|
|
echo "Скачиваем файл...\n";
|
|
$downloadUrl = $s3Url;
|
|
$tempFile = '/tmp/restored_' . $fileName;
|
|
|
|
$ch = curl_init();
|
|
curl_setopt_array($ch, [
|
|
CURLOPT_URL => $downloadUrl,
|
|
CURLOPT_RETURNTRANSFER => true,
|
|
CURLOPT_SSL_VERIFYPEER => false,
|
|
CURLOPT_TIMEOUT => 30,
|
|
CURLOPT_HTTPHEADER => [
|
|
'Authorization: AWS ' . $s3AccessKey . ':' . $s3SecretKey,
|
|
'Date: ' . gmdate('D, d M Y H:i:s T', $timestamp),
|
|
]
|
|
]);
|
|
|
|
$fileContent = curl_exec($ch);
|
|
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
|
$error = curl_error($ch);
|
|
curl_close($ch);
|
|
|
|
if ($error) {
|
|
echo " ❌ Ошибка скачивания: {$error}\n";
|
|
} elseif ($httpCode == 200 && !empty($fileContent)) {
|
|
file_put_contents($tempFile, $fileContent);
|
|
echo " ✅ Файл скачан: {$tempFile}\n";
|
|
echo " Размер: " . strlen($fileContent) . " байт\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";
|
|
exit(0);
|
|
} else {
|
|
echo " ❌ Ошибка скачивания, HTTP: {$httpCode}\n";
|
|
}
|
|
} else {
|
|
echo " ❌ Файл не найден\n";
|
|
}
|
|
}
|
|
echo "\n";
|
|
}
|
|
|
|
echo "❌ Файл не найден ни по одному из путей\n";
|
|
echo "Проверьте архивы вручную или обратитесь к администратору\n";
|
|
?>
|
|
|
|
|