1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-08-10 22:41:43 +02:00

FTP: Скачивание файлов

This commit is contained in:
Anton Titovets
2025-08-05 21:25:59 +03:00
parent ea00b90e07
commit 81806d6ebf
12 changed files with 660 additions and 54 deletions

View File

@@ -1,9 +1,9 @@
"MAIN ---"
linux-vdso.so.1 (0x00007ffd29595000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007a33b2c00000)
libc.so.6 => /lib64/libc.so.6 (0x00007a33b2800000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007a33b2400000)
/lib64/ld-linux-x86-64.so.2 (0x00007a33b3200000)
linux-vdso.so.1 (0x00007fffdd9a1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ce163200000)
libc.so.6 => /lib64/libc.so.6 (0x00007ce162e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007ce162a00000)
/lib64/ld-linux-x86-64.so.2 (0x00007ce163800000)
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.3.4

View File

@@ -1,7 +1,7 @@
use std::io::{copy, BufReader, Cursor, ErrorKind, Write};
use std::io::{copy, BufReader, Cursor, ErrorKind, Read, Write};
use std::net::{SocketAddr, TcpStream};
use serde_json::json;
use suppaftp::{FtpResult, FtpStream, Mode, RustlsConnector, RustlsFtpStream};
use suppaftp::{FtpError, FtpResult, FtpStream, Mode, RustlsConnector, RustlsFtpStream};
use suppaftp::list::File;
use std::str::FromStr;
use chrono::{DateTime, Utc};
@@ -159,10 +159,7 @@ impl FtpClient {
pub fn upload_data(&mut self, path: &str, data: &[u8]) -> String {
let mut cursor = Cursor::new(data);
match self.upload_from_reader(path, &mut cursor) {
Ok(bytes) => json!({"result": true, "bytes": bytes}).to_string(),
Err(e) => format_json_error(e)
}
self.upload_from_reader(path, &mut cursor)
}
pub fn upload_file(&mut self, path: &str, filepath: &str) -> String {
@@ -172,12 +169,29 @@ impl FtpClient {
};
let mut buf_reader = BufReader::new(file);
match self.upload_from_reader(path, &mut buf_reader) {
Ok(bytes) => json!({"result": true, "bytes": bytes}).to_string(),
Err(e) => format_json_error(e)
self.upload_from_reader(path, &mut buf_reader)
}
pub fn download_to_file(&mut self, path: &str, file_path: &str) -> String {
let mut file = match std::fs::File::create(file_path){
Ok(f) => f,
Err(e) => return format_json_error(format!("File error: {}", e))
};
match self.download_to_writer(path, &mut file){
Ok(b) => json!({"result": true, "bytes": b, "filepath": file_path}).to_string(),
Err(e) => e
}
}
pub fn download_to_vec(&mut self, path: &str) -> Result<Vec<u8>, String> {
let mut buffer = Vec::new();
self.download_to_writer(path, &mut buffer)?;
Ok(buffer)
}
pub fn remove_file(&mut self, path: &str) -> String {
let result = match self {
@@ -200,26 +214,42 @@ impl FtpClient {
}
fn upload_from_reader<R: std::io::Read>(
pub fn rename_object(&mut self, path: &str, new_path: &str) -> String {
let result = match self {
FtpClient::Secure(stream) => stream.rename(path, new_path),
FtpClient::Insecure(stream) => stream.rename(path, new_path),
};
match result {
Ok(_) => json!({"result": true}).to_string(),
Err(e) => format_json_error(&e.to_string())
}
}
fn upload_from_reader<R: Read>(
&mut self,
path: &str,
reader: &mut R
) -> Result<u64, String> {
match self {
) -> String {
let result = match self {
FtpClient::Secure(stream) => {
let mut data_stream = stream.put_with_stream(path)
.map_err(|e| format!("Data stream error: {}", e))?;
let mut data_stream = match stream.put_with_stream(path)
.map_err(|e| format!("Data stream error: {}", e)){
Ok(stream) => stream,
Err(e) => return format_json_error(&e.to_string())
};
let bytes = match copy(reader, &mut data_stream) {
Ok(b) => {
match wait_for_writable(&mut data_stream, Duration::from_secs(5)){
Ok(_) => {},
Err(e) => return Err(e)
Err(e) => return format_json_error(e)
};
b
},
Err(e) => return Err(format!("Upload error: {}", &e.to_string()))
Err(e) => return format_json_error(format!("Upload error: {}", &e.to_string()))
};
stream.finalize_put_stream(data_stream)
@@ -230,16 +260,46 @@ impl FtpClient {
stream.put_file(path, reader)
.map_err(|e| format!("File error: {}", e))
}
};
match result {
Ok(b) => json!({"result": true, "bytes": b}).to_string(),
Err(e) => format_json_error(&e.to_string())
}
}
fn download_to_writer<W: Write>(
&mut self,
path: &str,
writer: &mut W,
) -> Result<u64, String> {
let result = match self {
FtpClient::Secure(stream) => {
stream.retr(path, |stream| {
copy(stream, writer).map_err(|e| FtpError::ConnectionError(e))
})
},
FtpClient::Insecure(stream) => {
stream.retr(path, |stream| {
copy(stream, writer).map_err(|e| FtpError::ConnectionError(e))
})
},
};
match result {
Ok(b) => Ok(b),
Err(e) => Err(format_json_error(e))
}
}
fn get_size(&mut self, path: &str) -> FtpResult<usize> {
match self {
FtpClient::Secure(stream) => stream.size(path),
FtpClient::Insecure(stream) => stream.size(path),
}
}
}
pub fn configure_ftp_client(

View File

@@ -33,7 +33,10 @@ pub const METHODS: &[&[u16]] = &[
name!("RemoveFile"),
name!("GetConfiguration"),
name!("IsTls"),
name!("GetObjectSize")
name!("GetObjectSize"),
name!("RenameObject"),
name!("DownloadToFile"),
name!("DownloadToBuffer"),
];
// Число параметров функций компоненты
@@ -54,6 +57,9 @@ pub fn get_params_amount(num: usize) -> usize {
12 => 0,
13 => 0,
14 => 1,
15 => 2,
16 => 2,
17 => 1,
_ => 0,
}
}
@@ -163,6 +169,41 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
Err(e) => e.to_string()
})
},
15 => {
let path = params[0].get_string().unwrap_or("".to_string());
let new_path = params[1].get_string().unwrap_or("".to_string());
Box::new(match &mut obj.get_client(){
Ok(c) => c.rename_object(&path, &new_path),
Err(e) => e.to_string()
})
},
16 => {
let path = params[0].get_string().unwrap_or("".to_string());
let filepath = params[1].get_string().unwrap_or("".to_string());
Box::new(match &mut obj.get_client(){
Ok(c) => c.download_to_file(&path, &filepath),
Err(e) => e.to_string()
})
},
17 => {
let path = params[0].get_string().unwrap_or("".to_string());
match &mut obj.get_client(){
Ok(c) => {
match c.download_to_vec(&path){
Ok(v) => Box::new(v),
Err(e) => Box::new(e)
}
},
Err(e) => Box::new(e.to_string())
}
},
_ => Box::new(false), // Неверный номер команды
};

View File

@@ -6,26 +6,28 @@ use base64::{Engine as _, engine::general_purpose};
use suppaftp::FtpError;
use crate::component::configuration::{FtpProxySettings, FtpSettings};
use std::fmt::Write as FmtWrite;
use std::vec::IntoIter;
pub fn make_passive_proxy_stream(
ftp_settings: &FtpSettings,
proxy_settings: &Option<FtpProxySettings>,
addr: SocketAddr) -> Result<TcpStream, FtpError> {
let redirect = match ftp_settings.advanced_resolve{
let redirect = match ftp_settings.advanced_resolve {
true => {
if proxy_settings.is_some() || addr.ip().is_loopback() {
if proxy_settings.is_some() || addr.ip().is_loopback() {
Some(&ftp_settings.domain)
}else { None }
},
false => None
} else {
None
}
}
false => None,
};
let corrected_addr = if redirect.is_some() {
match redirect.unwrap().parse::<std::net::IpAddr>() {
Ok(ftp_ip) => {
SocketAddr::new(ftp_ip, addr.port())
},
let corrected_addr = if let Some(domain) = redirect {
match get_socket_addr(domain, addr.port()) {
Ok(mut addrs) => addrs.next().unwrap_or(addr),
Err(_) => addr,
}
} else {
@@ -189,6 +191,11 @@ pub fn connect_via_http_proxy(proxy_settings: &FtpProxySettings, target_addr: (&
}
fn get_socket_addr(host: &str, port: u16) -> Result<IntoIter<SocketAddr>, String> {
let host_and_port = format!("{}:{}", host, port);
host_and_port.to_socket_addrs().map_err(|e| e.to_string())
}
fn connect_direct(addr: (&str, u16)) -> Result<TcpStream, String> {
let target_addr = format!("{}:{}", addr.0, addr.1);
TcpStream::connect(&target_addr).map_err(|e| format!("Direct connection error: {}", e))

Binary file not shown.

Binary file not shown.

View File

@@ -194,6 +194,43 @@
КонецФункции
// Переименовать объект
// Изменяет путь объекта на указанный
//
// Примечание:
// Возможность перемещения объекта из одного каталога в другой при помощи переименования зависит от настроек сервера
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
// Путь - Строка - Текущий путь к объекту - old
// НовыйПуть - Строка - Новый путь к объекту - new
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПереименоватьОбъект(Знач Соединение, Знач Путь, Знач НовыйПуть) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(НовыйПуть);
Результат = Соединение.RenameObject(Путь, НовыйПуть);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Это коннектор !NOCLI
// Проверяет, что значение является объектом внешней компоненты для работы с FTP
//
@@ -544,6 +581,40 @@
КонецФункции
// Сохранить файл
// Сохраняет файл с сервера по указанному пути
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
// Путь - Строка - Путь файла на сервере - path
// ИмяФайла - Строка - Путь для сохранения файла на диске - file
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция СохранитьФайл(Знач Соединение, Знач Путь, Знач ИмяФайла) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
OPI_ПреобразованиеТипов.ПолучитьСтроку(ИмяФайла);
Результат = Соединение.DownloadToFile(Путь, ИмяФайла);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@@ -327,9 +327,9 @@
НовыйТест(ТаблицаТестов, "OAI_РаботаСФайлами" , "Работа с файлами" , OpenAI);
НовыйТест(ТаблицаТестов, "OAI_РаботаСАудио" , "Работа с аудио" , OpenAI);
НовыйТест(ТаблицаТестов, "OAI_РаботаСМоделями" , "Работа с моделями" , OpenAI);
НовыйТест(ТаблицаТестов, "FT_ОсновныеМетоды" , "Основные методы" , FTP);
НовыйТест(ТаблицаТестов, "FT_РаботаСДиректориями" , "Работа с директориями" , FTP);
НовыйТест(ТаблицаТестов, "FT_РаботаСФайлами" , "Работа с файлами" , FTP);
НовыйТест(ТаблицаТестов, "FT_ОсновныеМетоды" , "Основные методы" , FTP);
Возврат ТаблицаТестов;

View File

@@ -2866,26 +2866,6 @@
#Область FTP
Процедура FT_ОсновныеМетоды() Экспорт
МассивВариантов = OPI_ПолучениеДанныхТестов.ПолучитьВариантыПараметровFTP();
Для Каждого ПараметрыТеста Из МассивВариантов Цикл
FTP_ОткрытьСоединение(ПараметрыТеста);
FTP_ПолучитьПриветственноеСообщение(ПараметрыТеста);
FTP_ПолучитьКонфигурациюСоединения(ПараметрыТеста);
FTP_ЗакрытьСоединение(ПараметрыТеста);
FTP_ЭтоКоннектор(ПараметрыТеста);
FTP_ПолучитьНастройкиСоединения(ПараметрыТеста);
FTP_ПолучитьНастройкиПрокси(ПараметрыТеста);
FTP_ПолучитьНастройкиTls(ПараметрыТеста);
FTP_ПолучитьРазмерОбъекта(ПараметрыТеста);
КонецЦикла;
КонецПроцедуры
Процедура FT_РаботаСДиректориями() Экспорт
МассивВариантов = OPI_ПолучениеДанныхТестов.ПолучитьВариантыПараметровFTP();
@@ -2908,12 +2888,34 @@
Для Каждого ПараметрыТеста Из МассивВариантов Цикл
FTP_ЗагрузитьФайл(ПараметрыТеста);
FTP_СохранитьФайл(ПараметрыТеста);
FTP_УдалитьФайл(ПараметрыТеста);
КонецЦикла
КонецПроцедуры
Процедура FT_ОсновныеМетоды() Экспорт
МассивВариантов = OPI_ПолучениеДанныхТестов.ПолучитьВариантыПараметровFTP();
Для Каждого ПараметрыТеста Из МассивВариантов Цикл
FTP_ОткрытьСоединение(ПараметрыТеста);
FTP_ПолучитьПриветственноеСообщение(ПараметрыТеста);
FTP_ПолучитьКонфигурациюСоединения(ПараметрыТеста);
FTP_ЗакрытьСоединение(ПараметрыТеста);
FTP_ЭтоКоннектор(ПараметрыТеста);
FTP_ПолучитьНастройкиСоединения(ПараметрыТеста);
FTP_ПолучитьНастройкиПрокси(ПараметрыТеста);
FTP_ПолучитьНастройкиTls(ПараметрыТеста);
FTP_ПолучитьРазмерОбъекта(ПараметрыТеста);
FTP_ПереименоватьОбъект(ПараметрыТеста);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#КонецОбласти
@@ -25593,6 +25595,179 @@
КонецПроцедуры
Процедура FTP_ПереименоватьОбъект(ПараметрыФункции)
Хост = ПараметрыФункции["FTP_IP"];
Порт = ПараметрыФункции["FTP_Port"];
Логин = ПараметрыФункции["FTP_User"];
Пароль = ПараметрыФункции["FTP_Password"];
ИспользоватьПрокси = Истина;
FTPS = Истина;
НастройкиПрокси = Неопределено;
НастройкиTls = Неопределено; // FTPS
ИспользоватьПрокси = ПараметрыФункции["Proxy"]; // SKIP
FTPS = ПараметрыФункции["TLS"]; // SKIP
НастройкиFTP = OPI_FTP.ПолучитьНастройкиСоединения(Хост, Порт, Логин, Пароль);
Если ИспользоватьПрокси Тогда
ТипПрокси = ПараметрыФункции["Proxy_Type"]; // http, socks5, socks4
АдресПрокси = ПараметрыФункции["Proxy_IP"];
ПортПрокси = ПараметрыФункции["Proxy_Port"];
ЛогинПрокси = ПараметрыФункции["Proxy_User"];
ПарольПрокси = ПараметрыФункции["Proxy_Password"];
НастройкиПрокси = OPI_FTP.ПолучитьНастройкиПрокси(АдресПрокси, ПортПрокси, ТипПрокси, ЛогинПрокси, ПарольПрокси);
КонецЕсли;
Если FTPS Тогда
НастройкиTls = OPI_FTP.ПолучитьНастройкиTls(Истина);
КонецЕсли;
Соединение = OPI_FTP.ОткрытьСоединение(НастройкиFTP, НастройкиПрокси, НастройкиTls);
Если OPI_FTP.ЭтоКоннектор(Соединение) Тогда
Результат = OPI_FTP.ПереименоватьОбъект(Соединение, "new_dir/big.bin", "new_dir/giant.bin");
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Постфикс = ПараметрыФункции["Postfix"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_FTP.ПолучитьРазмерОбъекта(Соединение, "new_dir/giant.bin");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (проверка, новый)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_FTP.ПолучитьРазмерОбъекта(Соединение, "new_dir/big.bin");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (проверка, старый)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
Результат = OPI_FTP.ПереименоватьОбъект(Соединение, "new_dir", "brand_new_dir");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (каталог)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_FTP.ПолучитьСписокОбъектов(Соединение, ".", Истина);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (список)", "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["path"], "brand_new_dir");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["objects"][0]["path"], "brand_new_dir/giant.bin");
Результат = OPI_FTP.ПереименоватьОбъект(Соединение, "brand_new_dir", "new_dir");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (каталог, обратно)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_FTP.ПереименоватьОбъект(Соединение, "new_dir/giant.bin", "new_dir/big.bin");
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (обратно)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Результат = OPI_FTP.ПолучитьСписокОбъектов(Соединение, ".", Истина);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ПереименоватьОбъект (список, обратно)", "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["path"], "new_dir");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["objects"][0]["path"], "new_dir/big.bin");
КонецПроцедуры
Процедура FTP_СохранитьФайл(ПараметрыФункции)
Хост = ПараметрыФункции["FTP_IP"];
Порт = ПараметрыФункции["FTP_Port"];
Логин = ПараметрыФункции["FTP_User"];
Пароль = ПараметрыФункции["FTP_Password"];
ИспользоватьПрокси = Истина;
FTPS = Истина;
НастройкиПрокси = Неопределено;
НастройкиTls = Неопределено; // FTPS
ИспользоватьПрокси = ПараметрыФункции["Proxy"]; // SKIP
FTPS = ПараметрыФункции["TLS"]; // SKIP
НастройкиFTP = OPI_FTP.ПолучитьНастройкиСоединения(Хост, Порт, Логин, Пароль);
Если ИспользоватьПрокси Тогда
ТипПрокси = ПараметрыФункции["Proxy_Type"]; // http, socks5, socks4
АдресПрокси = ПараметрыФункции["Proxy_IP"];
ПортПрокси = ПараметрыФункции["Proxy_Port"];
ЛогинПрокси = ПараметрыФункции["Proxy_User"];
ПарольПрокси = ПараметрыФункции["Proxy_Password"];
НастройкиПрокси = OPI_FTP.ПолучитьНастройкиПрокси(АдресПрокси, ПортПрокси, ТипПрокси, ЛогинПрокси, ПарольПрокси);
КонецЕсли;
Если FTPS Тогда
НастройкиTls = OPI_FTP.ПолучитьНастройкиTls(Истина);
КонецЕсли;
Соединение = OPI_FTP.ОткрытьСоединение(НастройкиFTP, НастройкиПрокси, НастройкиTls);
Если OPI_FTP.ЭтоКоннектор(Соединение) Тогда
Путь = "new_dir/big.bin";
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
Результат = OPI_FTP.СохранитьФайл(Соединение, Путь, ИмяФайла);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Постфикс = ПараметрыФункции["Postfix"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СохранитьФайл" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Размер = OPI_FTP.ПолучитьРазмерОбъекта(Соединение, Путь);
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Размер, "СохранитьФайл (размер)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Размер);
ФайлОбъект = Новый Файл(ИмяФайла);
РазмерФайла = ФайлОбъект.Размер();
РазмерРезультата = Результат["bytes"];
РазмерПроверки = Размер["bytes"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(РазмерФайла, "СохранитьФайл (размер файла)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(РазмерФайла, РазмерРезультата);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(РазмерФайла, РазмерПроверки);
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла картинки", "FTP");
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@@ -2778,6 +2778,8 @@
CLI_FTP_ПолучитьНастройкиПрокси(ПараметрыТеста);
CLI_FTP_ПолучитьНастройкиTls(ПараметрыТеста);
CLI_FTP_ПолучитьРазмерОбъекта(ПараметрыТеста);
CLI_FTP_ПереименоватьОбъект(ПараметрыТеста);
OPI_Инструменты.Пауза(5);
КонецЦикла;
@@ -2794,6 +2796,7 @@
CLI_FTP_СоздатьДиректорию(ПараметрыТеста);
CLI_FTP_ПолучитьСписокОбъектов(ПараметрыТеста);
CLI_FTP_УдалитьДиректорию(ПараметрыТеста);
OPI_Инструменты.Пауза(5);
КонецЦикла;
@@ -2807,7 +2810,9 @@
Для Каждого ПараметрыТеста Из МассивВариантов Цикл
CLI_FTP_ЗагрузитьФайл(ПараметрыТеста);
CLI_FTP_СохранитьФайл(ПараметрыТеста);
CLI_FTP_УдалитьФайл(ПараметрыТеста);
OPI_Инструменты.Пауза(5);
КонецЦикла
@@ -27256,6 +27261,253 @@
КонецПроцедуры
Процедура CLI_FTP_ПереименоватьОбъект(ПараметрыФункции)
Домен = ПараметрыФункции["FTP_IP"];
Порт = ПараметрыФункции["FTP_Port"];
Логин = ПараметрыФункции["FTP_User"];
Пароль = ПараметрыФункции["FTP_Password"];
ИспользоватьПрокси = Истина;
FTPS = Истина;
НастройкиПрокси = Неопределено;
НастройкиTls = Неопределено; // FTPS
ИспользоватьПрокси = ПараметрыФункции["Proxy"]; // SKIP
FTPS = ПараметрыФункции["TLS"]; // SKIP
Опции = Новый Структура;
Опции.Вставить("host" , Домен);
Опции.Вставить("port" , Порт);
Опции.Вставить("login", Логин);
Опции.Вставить("pass" , Пароль);
НастройкиFTP = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиСоединения", Опции);
Если ИспользоватьПрокси Тогда
ТипПрокси = ПараметрыФункции["Proxy_Type"]; // http, socks5, socks4
АдресПрокси = ПараметрыФункции["Proxy_IP"];
ПортПрокси = ПараметрыФункции["Proxy_Port"];
ЛогинПрокси = ПараметрыФункции["Proxy_User"];
ПарольПрокси = ПараметрыФункции["Proxy_Password"];
Опции = Новый Структура;
Опции.Вставить("addr" , АдресПрокси);
Опции.Вставить("port" , ПортПрокси);
Опции.Вставить("type" , ТипПрокси);
Опции.Вставить("login", ЛогинПрокси);
Опции.Вставить("pass" , ПарольПрокси);
НастройкиПрокси = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиПрокси", Опции);
КонецЕсли;
Если FTPS Тогда
Опции = Новый Структура;
Опции.Вставить("trust", Истина);
НастройкиTLS = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиTls", Опции);
КонецЕсли;
Опции = Новый Структура;
Опции.Вставить("set", НастройкиFTP);
Опции = Новый Структура;
Опции.Вставить("set" , НастройкиFTP);
Опции.Вставить("proxy", НастройкиПрокси);
Опции.Вставить("tls" , НастройкиTLS);
Соединение = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьКонфигурациюСоединения", Опции);
Опции.Вставить("conn", Соединение);
Опции.Вставить("old", "new_dir/big.bin");
Опции.Вставить("new", "new_dir/giant.bin");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПереименоватьОбъект", Опции);
Постфикс = ПараметрыФункции["Postfix"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", "new_dir/giant.bin");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьРазмерОбъекта", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (проверка, новый)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", "new_dir/big.bin");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьРазмерОбъекта", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (проверка, старый)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатЛожь(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("old", "new_dir");
Опции.Вставить("new", "brand_new_dir");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПереименоватьОбъект", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (каталог)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", ".");
Опции.Вставить("rcv" , Истина);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьСписокОбъектов", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (список)", "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["path"], "brand_new_dir");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["objects"][0]["path"], "brand_new_dir/giant.bin");
Опции.Вставить("conn", Соединение);
Опции.Вставить("new", "new_dir");
Опции.Вставить("old", "brand_new_dir");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПереименоватьОбъект", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (каталог, обратно)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("new", "new_dir/big.bin");
Опции.Вставить("old", "new_dir/giant.bin");
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПереименоватьОбъект", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (обратно)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", ".");
Опции.Вставить("rcv" , Истина);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьСписокОбъектов", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "ПереименоватьОбъект (список, обратно)", "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
OPI_ПолучениеДанныхТестов.Проверка_Массив(Результат["data"], 1);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["path"], "new_dir");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(Результат["data"][0]["objects"][0]["path"], "new_dir/big.bin");
КонецПроцедуры
Процедура CLI_FTP_СохранитьФайл(ПараметрыФункции)
Домен = ПараметрыФункции["FTP_IP"];
Порт = ПараметрыФункции["FTP_Port"];
Логин = ПараметрыФункции["FTP_User"];
Пароль = ПараметрыФункции["FTP_Password"];
ИспользоватьПрокси = Истина;
FTPS = Истина;
НастройкиПрокси = Неопределено;
НастройкиTls = Неопределено; // FTPS
ИспользоватьПрокси = ПараметрыФункции["Proxy"]; // SKIP
FTPS = ПараметрыФункции["TLS"]; // SKIP
Опции = Новый Структура;
Опции.Вставить("host" , Домен);
Опции.Вставить("port" , Порт);
Опции.Вставить("login", Логин);
Опции.Вставить("pass" , Пароль);
НастройкиFTP = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиСоединения", Опции);
Если ИспользоватьПрокси Тогда
ТипПрокси = ПараметрыФункции["Proxy_Type"]; // http, socks5, socks4
АдресПрокси = ПараметрыФункции["Proxy_IP"];
ПортПрокси = ПараметрыФункции["Proxy_Port"];
ЛогинПрокси = ПараметрыФункции["Proxy_User"];
ПарольПрокси = ПараметрыФункции["Proxy_Password"];
Опции = Новый Структура;
Опции.Вставить("addr" , АдресПрокси);
Опции.Вставить("port" , ПортПрокси);
Опции.Вставить("type" , ТипПрокси);
Опции.Вставить("login", ЛогинПрокси);
Опции.Вставить("pass" , ПарольПрокси);
НастройкиПрокси = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиПрокси", Опции);
КонецЕсли;
Если FTPS Тогда
Опции = Новый Структура;
Опции.Вставить("trust", Истина);
НастройкиTLS = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьНастройкиTls", Опции);
КонецЕсли;
Опции = Новый Структура;
Опции.Вставить("set", НастройкиFTP);
Опции = Новый Структура;
Опции.Вставить("set" , НастройкиFTP);
Опции.Вставить("proxy", НастройкиПрокси);
Опции.Вставить("tls" , НастройкиTLS);
Соединение = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьКонфигурациюСоединения", Опции);
Путь = "new_dir/big.bin";
ИмяФайла = ПолучитьИмяВременногоФайла("bin");
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", Путь);
Опции.Вставить("file", ИмяФайла);
Результат = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "СохранитьФайл", Опции);
Постфикс = ПараметрыФункции["Postfix"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Результат, "СохранитьФайл" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат);
Опции.Вставить("conn", Соединение);
Опции.Вставить("path", Путь);
Размер = OPI_ПолучениеДанныхТестов.ВыполнитьТестCLI("ftp", "ПолучитьРазмерОбъекта", Опции);
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(Размер, "СохранитьФайл (размер)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Размер);
ФайлОбъект = Новый Файл(ИмяФайла);
РазмерФайла = ФайлОбъект.Размер();
РазмерРезультата = Результат["bytes"];
РазмерПроверки = Размер["bytes"];
OPI_ПолучениеДанныхТестов.ЗаписатьЛогCLI(РазмерФайла, "СохранитьФайл (размер файла)" + Постфикс, "FTP");
OPI_ПолучениеДанныхТестов.Проверка_Равенство(РазмерФайла, РазмерРезультата);
OPI_ПолучениеДанныхТестов.Проверка_Равенство(РазмерФайла, РазмерПроверки);
Попытка
УдалитьФайлы(ИмяФайла);
Исключение
OPI_ПолучениеДанныхТестов.ЗаписатьЛог(ОписаниеОшибки(), "Ошибка удаления файла картинки", "FTP");
КонецПопытки;
КонецПроцедуры
#КонецОбласти
#КонецОбласти