1
0
mirror of https://github.com/Bayselonarrend/OpenIntegrations.git synced 2025-11-29 22:27:42 +02:00

FTP: Произвольные команды, смена рабочего каталога

This commit is contained in:
Anton Titovets
2025-09-10 14:46:37 +03:00
parent e9ba4c2639
commit 0400f81387
12 changed files with 9884 additions and 9002 deletions

View File

@@ -8,6 +8,53 @@ keywords: [1C, 1С, 1С:Предприятие, 1С:Предприятие 8.3,
# FTP(s)
Этот раздел посвящен библиотеке для работы с протоколом FTP(s) в 1С:Предприятие, OneScript и CLI. На данной странице описаны все действия, необходимые для полноценного начала работы
## Начало работы
Данная библиотека предоставляет различные методы работы с FTP(s) на стороне клиента. Каждый из них принимает в качестве первого параметра `Соединение`, значение для которого может быть инициализировано одним из двух способов:
1. При помощи функции `ОткрытьСоединение`. В этом случае возвращается объект компоненты, поддерживающий единое соединение для множества запросов
2. При помощи функции `ПолучитьКонфигурациюСоединения`. В этом случае возвращается лишь структура описания соединения. Каждая функция, в которую эта структура будет передана в качестве `Соединения`, будет создавать новое подключение внутри себя и закрывать его по окончанию работы
При выполнении множественных последовательных запросов к серверу FTP рекомендуется использовать полноценное соединение, получаемое при помощи функции `ОткрытьСоединение`
## Использование прокси
Данные клиент поддерживает создание соединения через прокси сервер. Получить структуру настроек прокси можно при помощи функции `ПолучитьНастройкиПрокси`. Полученная структура далее должна быть передана в функцию `ОткрытьСоединение` или `ПолучитьКонфигурациюСоединения` при начале работы
```bsl
...
ТипПрокси = "http"; // http, socks5, socks4
АдресПрокси = "127.0.0.1";
ПортПрокси = "8071";
ЛогинПрокси = "proxyuser";
ПарольПрокси = "12we...";
НастройкиПрокси = OPI_FTP.ПолучитьНастройкиПрокси(АдресПрокси, ПортПрокси, ТипПрокси, ЛогинПрокси, ПарольПрокси);
Соединение = OPI_FTP.ОткрытьСоединение(НастройкиFTP, НастройкиПрокси, НастройкиTLS);
```
Поддерживается работа через socks4, socks5 и http-прокси сервера
:::warning
Работа через http-прокси является эксперементальной и может быть нестабильной в зависимости от реализации прокси-сервера, его настроек и возможностей. Рекомендуется по возможности использовать socks-прокси для стабильной передачи трафика
:::
## FTPS (TLS)
Также клиент поддерживает защищенное соединение через TLS. Для его включения необходимо передать структуру настроек в функцию `ОткрытьСоединение` или `ПолучитьКонфигурациюСоединения` при начале работы. Структура настроек может быть получена при помощий функции `ПолучитьНастройкиTls`
```bsl
...
НастройкиTLS = OPI_FTP.ПолучитьНастройкиTLS(Истина);
Соединение = OPI_FTP.ОткрытьСоединение(НастройкиFTP, НастройкиПрокси, НастройкиTLS);
```

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
"MAIN ---"
linux-vdso.so.1 (0x00007fffbf1b3000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007d660d600000)
libc.so.6 => /lib64/libc.so.6 (0x00007d660d200000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007d660ce00000)
/lib64/ld-linux-x86-64.so.2 (0x00007d660dc00000)
linux-vdso.so.1 (0x00007ffc25bf7000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000075e3af200000)
libc.so.6 => /lib64/libc.so.6 (0x000075e3aee00000)
libdl.so.2 => /lib64/libdl.so.2 (0x000075e3aea00000)
/lib64/ld-linux-x86-64.so.2 (0x000075e3af800000)
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.3.4

View File

@@ -1,7 +1,7 @@
use std::io::{copy, BufReader, Cursor, ErrorKind, Read, Write};
use std::net::{SocketAddr, TcpStream};
use serde_json::json;
use suppaftp::{FtpError, FtpResult, FtpStream, Mode, RustlsConnector, RustlsFtpStream};
use suppaftp::{FtpError, FtpResult, FtpStream, Mode, RustlsConnector, RustlsFtpStream, Status};
use suppaftp::list::File;
use std::str::FromStr;
use chrono::{DateTime, Utc};
@@ -10,6 +10,7 @@ use std::string::String;
use std::time::{Duration, Instant};
use base64::Engine;
use base64::engine::general_purpose;
use suppaftp::types::Response;
use crate::component::configuration::{FtpProxySettings, FtpSettings, FtpTlsSettings};
use crate::component::tls_establish;
use crate::component::tcp_establish;
@@ -229,7 +230,7 @@ impl FtpClient {
}
}
pub fn execute_custom_command(&mut self, command: &str) -> String {
pub fn execute_command(&mut self, command: &str) -> String {
let result = match self {
FtpClient::Secure(stream) => stream.site(command),
@@ -237,22 +238,20 @@ impl FtpClient {
};
match result {
Ok(r) => {
let code = r.status.code();
let body = r.body;
Ok(r) => process_ftp_response(r),
Err(e) => format_json_error(&e.to_string())
}
}
let body_json = match String::from_utf8(body) {
Ok(text) => {
json!(text)
}
Err(original_bytes) => {
let base64 = general_purpose::STANDARD.encode(&original_bytes.into_bytes());
json!({ "BYTES": base64 })
}
};
pub fn execute_standard_command(&mut self, command: &str) -> String {
json!({"result": true, "data": body_json, "status": code}).to_string()
},
let result = match self {
FtpClient::Secure(stream) => stream.custom_command(command, all_status_variants().as_slice()),
FtpClient::Insecure(stream) => stream.custom_command(command, all_status_variants().as_slice()),
};
match result {
Ok(r) => process_ftp_response(r),
Err(e) => format_json_error(&e.to_string())
}
}
@@ -271,6 +270,46 @@ impl FtpClient {
}
pub fn get_features(&mut self) -> String {
let result = match self {
FtpClient::Secure(stream) => stream.feat(),
FtpClient::Insecure(stream) => stream.feat(),
};
match result {
Ok(f) => json!({"result": true, "data": f}).to_string(),
Err(e) => format_json_error(&e.to_string())
}
}
pub fn get_current_directory(&mut self) -> String {
let result = match self {
FtpClient::Secure(stream) => stream.pwd(),
FtpClient::Insecure(stream) => stream.pwd(),
};
match result {
Ok(p) => json!({"result": true, "path": p}).to_string(),
Err(e) => format_json_error(&e.to_string())
}
}
pub fn change_current_directory(&mut self, path: &str) -> String {
let result = match self {
FtpClient::Secure(stream) => stream.cwd(path),
FtpClient::Insecure(stream) => stream.cwd(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,
@@ -345,6 +384,7 @@ impl FtpClient {
FtpClient::Insecure(stream) => stream.size(path),
}
}
}
pub fn configure_ftp_client(
@@ -429,4 +469,76 @@ where
Err(e) => return Err(format!("Check error: {}", e.to_string())),
}
}
}
pub fn process_ftp_response(response: Response) -> String{
let code = response.status.code();
let body = response.body;
let body_json = match String::from_utf8(body) {
Ok(text) => {
json!(text)
}
Err(original_bytes) => {
let base64 = general_purpose::STANDARD.encode(&original_bytes.into_bytes());
json!({ "BYTES": base64 })
}
};
json!({"result": true, "data": body_json, "status": code}).to_string()
}
pub fn all_status_variants() -> Vec<Status> {
use Status::*;
vec![
RestartMarker,
ReadyMinute,
AlreadyOpen,
AboutToSend,
CommandOk,
CommandNotImplemented,
System,
Directory,
File,
Help,
Name,
Ready,
Closing,
DataConnectionOpen,
ClosingDataConnection,
PassiveMode,
LongPassiveMode,
ExtendedPassiveMode,
LoggedIn,
LoggedOut,
LogoutAck,
AuthOk,
RequestedFileActionOk,
PathCreated,
NeedPassword,
LoginNeedAccount,
RequestFilePending,
NotAvailable,
CannotOpenDataConnection,
TransferAborted,
InvalidCredentials,
HostUnavailable,
RequestFileActionIgnored,
ActionAborted,
RequestedActionNotTaken,
BadCommand,
BadArguments,
NotImplemented,
BadSequence,
NotImplementedParameter,
NotLoggedIn,
StoringNeedAccount,
FileUnavailable,
PageTypeUnknown,
ExceededStorage,
BadFilename,
Unknown,
]
}

View File

@@ -38,6 +38,11 @@ pub const METHODS: &[&[u16]] = &[
name!("DownloadToFile"),
name!("DownloadToBuffer"),
name!("Ping"),
name!("ExecuteCommand"),
name!("GetCurrentDirectory"),
name!("ChangeCurrentDirectory"),
name!("GetFeatures"),
name!("ExecuteStandardCommand"),
];
// Число параметров функций компоненты
@@ -62,6 +67,11 @@ pub fn get_params_amount(num: usize) -> usize {
16 => 2,
17 => 1,
18 => 0,
19 => 1,
20 => 0,
21 => 1,
22 => 0,
23 => 1,
_ => 0,
}
}
@@ -211,7 +221,46 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box<dyn
Ok(c) => c.ping(),
Err(_) => false
})
}
},
19 => {
let command = params[0].get_string().unwrap_or("".to_string());
Box::new(match &mut obj.get_client(){
Ok(c) => c.execute_command(&command),
Err(e) => e.to_string()
})
},
20 => {
Box::new(match &mut obj.get_client(){
Ok(c) => c.get_current_directory(),
Err(e) => e.to_string()
})
},
21 => {
let path = params[0].get_string().unwrap_or("".to_string());
Box::new(match &mut obj.get_client(){
Ok(c) => c.change_current_directory(&path),
Err(e) => e.to_string()
})
},
22 => {
Box::new(match &mut obj.get_client(){
Ok(c) => c.get_features(),
Err(e) => e.to_string()
})
},
23 => {
let command = params[0].get_string().unwrap_or("".to_string());
Box::new(match &mut obj.get_client(){
Ok(c) => c.execute_standard_command(&command),
Err(e) => e.to_string()
})
},
_ => Box::new(false), // Неверный номер команды
};

Binary file not shown.

Binary file not shown.

View File

@@ -162,8 +162,138 @@
КонецФункции
// Получить список расширений протокола
// Получает список расширений протокола FTP, поддерживаемых сервером
//
// Примечание:
// Команда FTP: `FEAT`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьСписокРасширенийПротокола(Знач Соединение) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
Результат = Соединение.GetFeatures();
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Пинг
// Проверяет активность соединения и сбрасывает таймаут до его автоматического закрытия
//
// Примечание:
// Команда FTP: `NOOP`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
//
// Возвращаемое значение:
// Булево - Успешность обращения к серверу
Функция Пинг(Знач Соединение) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
Результат = Соединение.Ping();
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Выполнить нестандартную команду
// Выполняет специфическую (SITE) команду сервера и возвращает ответ
//
// Примечание:
// Результат может быть возвращен как текст или Base64 довичные данные в структуре `{"BYTES": <B64 строка>}`
// Команда FTP: `SITE`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
// ТекстКоманды - Строка - Текст выполняемой команды - cmd
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ВыполнитьНестандартнуюКоманду(Знач Соединение, Знач ТекстКоманды) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстКоманды);
Результат = Соединение.ExecuteCommand(ТекстКоманды);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Выполнить произвольную команду
// Отправляет произвольный текстовый запрос на сервер для обработки
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
// ТекстКоманды - Строка - Текст выполняемой команды - cmd
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ВыполнитьПроизвольнуюКоманду(Знач Соединение, Знач ТекстКоманды) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(ТекстКоманды);
Результат = Соединение.ExecuteStandardCommand(ТекстКоманды);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Получить размер объекта
// Получает размер файла или директории, если она существуют
//
// Примечание:
// Команда FTP: `SIZE`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -198,7 +328,8 @@
// Изменяет путь объекта на указанный
//
// Примечание:
// Возможность перемещения объекта из одного каталога в другой при помощи переименования зависит от настроек сервера
// Возможность перемещения объекта из одного каталога в другой при помощи изменения пути зависит от настроек сервера
// Команда FTP: `RNFR + RNTO`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -359,6 +490,9 @@
// Получить список объектов
// Получает информацию о содержимом директории по выбранному пути
//
// Примечание:
// Команда FTP: `LIST`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -433,6 +567,9 @@
// Создать директорию
// Создает директорию по указанному пути
//
// Примечание:
// Команда FTP: `MKD`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -465,6 +602,9 @@
// Удалить директорию
// Удаляет существующую директорию
//
// Примечание:
// Команда FTP: `RMD`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -493,12 +633,80 @@
КонецФункции
// Получить текущий каталог
// Получает текущий каталог, от которого вычисляются относительные пути
//
// Примечание:
// Команда FTP: `PWD`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ПолучитьТекущийКаталог(Знач Соединение) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
Результат = Соединение.GetCurrentDirectory();
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
// Изменить текущий каталог !NOCLI
// Изменяет текущий каталог, от которого вычисляются относительные пути
//
// Примечание:
// Команда FTP: `CWD`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
// Путь - Строка - Путь к новой директории - path
//
// Возвращаемое значение:
// Соответствие Из КлючИЗначение - Результат обработки
Функция ИзменитьТекущийКаталог(Знач Соединение, Знач Путь) Экспорт
ЗакрыватьСоединение = ПроверитьСоздатьСоединение(Соединение);
Если Не ЭтоКоннектор(Соединение) Тогда
Возврат Соединение;
Иначе
OPI_ПреобразованиеТипов.ПолучитьСтроку(Путь);
Результат = Соединение.ChangeCurrentDirectory(Путь);
Результат = OPI_Инструменты.JsonВСтруктуру(Результат);
КонецЕсли;
Если ЗакрыватьСоединение Тогда
Результат.Вставить("close_connection", ЗакрытьСоединение(Соединение));
КонецЕсли;
Возврат Результат;
КонецФункции
#КонецОбласти
#Область РаботаСФайлами
// Загрузить файл
// Загружает файл с диска или двоичные данные на сервер FTP
//
// Примечание:
// Команда FTP: `STOR`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -564,6 +772,9 @@
// Удалить файл
// Удаляет файл с сервера
//
// Примечание:
// Команда FTP: `DELE`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -596,6 +807,9 @@
// Сохранить файл
// Сохраняет файл с сервера по указанному пути
//
// Примечание:
// Команда FTP: `RETR`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn
@@ -630,6 +844,9 @@
// Получить данные файла !NOCLI
// Получает файл с сервера как двоичные данные
//
// Примечание:
// Команда FTP: `RETR`
//
// Параметры:
// Соединение - Произвольный - Существующее соединение или конфигурация соединения - conn

View File

@@ -10983,6 +10983,93 @@
КонецФункции
Функция Проверка_FTP_ПолучитьСписокРасширенийПротокола(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
ОжидаетЧто(Результат["data"]).Заполнено();
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_Пинг(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат).Равно(Истина);
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_ВыполнитьНестандартнуюКоманду(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
ОжидаетЧто(Результат["status"]).Заполнено();
ОжидаетЧто(Результат["data"]).Заполнено();
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_ВыполнитьПроизвольнуюКоманду(Знач Результат, Знач Вариант)
ОжидаетЧто(Результат["result"]).Равно(Истина);
ОжидаетЧто(Результат["status"]).Заполнено();
ОжидаетЧто(Результат["data"]).Заполнено();
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_ПолучитьТекущийКаталог(Знач Результат, Знач Вариант, Параметры = "")
Путь = Результат["path"];
ОжидаетЧто(Результат["result"]).Равно(Истина);
ОжидаетЧто(Путь).Заполнено();
ЗаписатьПараметр("FTP_RootPath", Путь);
OPI_Инструменты.ДобавитьПоле("FTP_RootPath", Путь, "Строка", Параметры);
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_ИзменитьТекущийКаталог(Знач Результат, Знач Вариант, Путь = "")
ОжидаетЧто(Результат["result"]).Равно(Истина);
Если СтрНайти(Вариант, "Проверка") Тогда
ОжидаетЧто(СтрЗаканчиваетсяНа(Результат["path"], Путь)).Равно(Истина);
КонецЕсли;
Если СтрНайти(Вариант, "HTTP") Тогда
OPI_Инструменты.Пауза(5);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция Проверка_FTP_ПолучитьКонфигурациюСоединения(Знач Результат, Знач Вариант, Параметры = "")
Если СтрНайти(Вариант, "Проверка") > 0 Тогда

View File

@@ -2880,9 +2880,11 @@
FTP_ОчиститьДиректорию(ПараметрыТеста);
FTP_СоздатьДиректорию(ПараметрыТеста);
FTP_ПолучитьТекущийКаталог(ПараметрыТеста);
FTP_ИзменитьТекущийКаталог(ПараметрыТеста);
FTP_ПолучитьСписокОбъектов(ПараметрыТеста);
FTP_УдалитьДиректорию(ПараметрыТеста);
КонецЦикла;
КонецПроцедуры
@@ -2910,6 +2912,7 @@
FTP_ОткрытьСоединение(ПараметрыТеста);
FTP_ПолучитьПриветственноеСообщение(ПараметрыТеста);
FTP_ПолучитьСписокРасширенийПротокола(ПараметрыТеста);
FTP_ПолучитьКонфигурациюСоединения(ПараметрыТеста);
FTP_ЗакрытьСоединение(ПараметрыТеста);
FTP_ЭтоКоннектор(ПараметрыТеста);
@@ -2918,6 +2921,9 @@
FTP_ПолучитьНастройкиTLS(ПараметрыТеста);
FTP_ПолучитьРазмерОбъекта(ПараметрыТеста);
FTP_ИзменитьПуть(ПараметрыТеста);
FTP_ВыполнитьНестандартнуюКоманду(ПараметрыТеста);
FTP_ВыполнитьПроизвольнуюКоманду(ПараметрыТеста);
FTP_Пинг(ПараметрыТеста);
КонецЦикла;
@@ -22364,6 +22370,332 @@
КонецПроцедуры
Процедура FTP_Пинг(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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.Пинг(Соединение);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "Пинг", Постфикс);
КонецПроцедуры
Процедура FTP_ВыполнитьНестандартнуюКоманду(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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.ЭтоКоннектор(Соединение) Тогда
ТекстКоманды = "UMASK";
Результат = OPI_FTP.ВыполнитьНестандартнуюКоманду(Соединение, ТекстКоманды);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "ВыполнитьНестандартнуюКоманду", Постфикс);
КонецПроцедуры
Процедура FTP_ВыполнитьПроизвольнуюКоманду(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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.ЭтоКоннектор(Соединение) Тогда
ТекстКоманды = "PWD";
Результат = OPI_FTP.ВыполнитьПроизвольнуюКоманду(Соединение, ТекстКоманды);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "ВыполнитьПроизвольнуюКоманду", Постфикс);
КонецПроцедуры
Процедура FTP_ПолучитьТекущийКаталог(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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.ПолучитьТекущийКаталог(Соединение);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "ПолучитьТекущийКаталог", Постфикс, ПараметрыФункции);
КонецПроцедуры
Процедура FTP_ИзменитьТекущийКаталог(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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";
Результат = OPI_FTP.ИзменитьТекущийКаталог(Соединение, Путь);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "ИзменитьТекущийКаталог", Постфикс);
Результат = OPI_FTP.ПолучитьТекущийКаталог(Соединение);
Обработать(Результат, "FTP", "ИзменитьТекущийКаталог", "Проверка, " + Постфикс, Путь);
Путь = ПараметрыФункции["FTP_RootPath"];
Результат = OPI_FTP.ИзменитьТекущийКаталог(Соединение, Путь);
Обработать(Результат, "FTP", "ИзменитьТекущийКаталог", "Обратно, " + Постфикс);
Результат = OPI_FTP.ПолучитьТекущийКаталог(Соединение);
Обработать(Результат, "FTP", "ИзменитьТекущийКаталог", "Проверка, обратно, " + Постфикс, Путь);
КонецПроцедуры
Процедура FTP_ПолучитьСписокРасширенийПротокола(ПараметрыФункции)
Постфикс = ПараметрыФункции["Postfix"]; // SKIP
Хост = ПараметрыФункции["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.ПолучитьСписокРасширенийПротокола(Соединение);
Иначе
Результат = Соединение; // Ошибка соединения
КонецЕсли;
// END
Обработать(Результат, "FTP", "ПолучитьСписокРасширенийПротокола", Постфикс);
КонецПроцедуры
#КонецОбласти
#Область ReportPortal