mirror of
https://github.com/Bayselonarrend/OpenIntegrations.git
synced 2026-06-20 09:19:27 +02:00
Рефакторинг ssh
This commit is contained in:
@@ -1,12 +1,12 @@
|
||||
"MAIN ---"
|
||||
linux-vdso.so.1 (0x00007ffc859cf000)
|
||||
libssl.so.3 => /lib64/libssl.so.3 (0x00007e9baca00000)
|
||||
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x00007e9bac200000)
|
||||
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007e9babe00000)
|
||||
libc.so.6 => /lib64/libc.so.6 (0x00007e9baba00000)
|
||||
libdl.so.2 => /lib64/libdl.so.2 (0x00007e9bab600000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x00007e9bace00000)
|
||||
libz.so.1 => /lib64/libz.so.1 (0x00007e9bab200000)
|
||||
linux-vdso.so.1 (0x00007ffc59fce000)
|
||||
libssl.so.3 => /lib64/libssl.so.3 (0x000072539ea00000)
|
||||
libcrypto.so.3 => /lib64/libcrypto.so.3 (0x000072539e200000)
|
||||
libpthread.so.0 => /lib64/libpthread.so.0 (0x000072539de00000)
|
||||
libc.so.6 => /lib64/libc.so.6 (0x000072539da00000)
|
||||
libdl.so.2 => /lib64/libdl.so.2 (0x000072539d600000)
|
||||
/lib64/ld-linux-x86-64.so.2 (0x000072539ee00000)
|
||||
libz.so.1 => /lib64/libz.so.1 (0x000072539d200000)
|
||||
GLIBC_2.2.5
|
||||
GLIBC_2.12
|
||||
GLIBC_2.3
|
||||
|
||||
+16
-10
@@ -91,7 +91,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn make_sftp(&mut self) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.make_sftp() {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -99,7 +99,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn make_directory(&mut self, path: &str, mode: i32) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.make_directory(path, mode) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -107,7 +107,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn remove_directory(&mut self, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.remove_directory(path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -115,7 +115,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn list_directory(&mut self, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.list_directory(path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -123,7 +123,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn upload_file(&mut self, file: &str, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.upload_file(file, path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -131,7 +131,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn upload_data(&mut self, data: Vec<u8>, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.upload_data(data, path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -139,7 +139,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn delete_file(&mut self, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.delete_file(path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -151,7 +151,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn download_to_file(&mut self, path: &str, filepath: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.download_to_file(path, filepath) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -163,7 +163,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn rename_object(&mut self, path: &str, new_path: &str, overwrite: bool) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.rename_object(path, new_path, overwrite) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -171,7 +171,7 @@ impl AddIn {
|
||||
}
|
||||
|
||||
pub fn get_file_info(&mut self, path: &str) -> JanxValue {
|
||||
let mut backend = self.lock_backend();
|
||||
let backend = self.lock_backend();
|
||||
match backend.get_file_info(path) {
|
||||
Ok(result) => result,
|
||||
Err(e) => janx_error(e),
|
||||
@@ -188,3 +188,9 @@ impl AddIn {
|
||||
self.get_field_ptr(index) as *mut _
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for AddIn {
|
||||
fn drop(&mut self) {
|
||||
self.lock_backend().close_backend();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,10 +107,7 @@ impl SshBackend {
|
||||
return Err("No session".to_string());
|
||||
}
|
||||
|
||||
let thread = self
|
||||
.thread
|
||||
.as_ref()
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())?;
|
||||
let thread = self.require_thread()?;
|
||||
|
||||
thread
|
||||
.call(|response| WorkerCommand::Disconnect { response })
|
||||
@@ -118,14 +115,7 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn execute(&self, command: &str) -> Result<JanxValue, String> {
|
||||
if !self.is_connected() {
|
||||
return Err("No session".to_string());
|
||||
}
|
||||
|
||||
let thread = self
|
||||
.thread
|
||||
.as_ref()
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())?;
|
||||
let thread = self.require_connected()?;
|
||||
|
||||
thread.call(|response| WorkerCommand::Execute {
|
||||
command: command.to_string(),
|
||||
@@ -178,11 +168,11 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn make_sftp(&self) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::ToSftp { response })
|
||||
self.call_connected(|response| WorkerCommand::ToSftp { response })
|
||||
}
|
||||
|
||||
pub fn make_directory(&self, path: &str, mode: i32) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::MakeDirectory {
|
||||
self.call_connected(|response| WorkerCommand::MakeDirectory {
|
||||
path: path.to_string(),
|
||||
mode,
|
||||
response,
|
||||
@@ -190,21 +180,21 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn remove_directory(&self, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::RemoveDirectory {
|
||||
self.call_connected(|response| WorkerCommand::RemoveDirectory {
|
||||
path: path.to_string(),
|
||||
response,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn list_directory(&self, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::ListDirectory {
|
||||
self.call_connected(|response| WorkerCommand::ListDirectory {
|
||||
path: path.to_string(),
|
||||
response,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn upload_file(&self, file: &str, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::UploadFile {
|
||||
self.call_connected(|response| WorkerCommand::UploadFile {
|
||||
file: file.to_string(),
|
||||
path: path.to_string(),
|
||||
response,
|
||||
@@ -212,7 +202,7 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn upload_data(&self, data: Vec<u8>, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::UploadData {
|
||||
self.call_connected(|response| WorkerCommand::UploadData {
|
||||
data,
|
||||
path: path.to_string(),
|
||||
response,
|
||||
@@ -220,7 +210,7 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn delete_file(&self, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::RemoveFile {
|
||||
self.call_connected(|response| WorkerCommand::RemoveFile {
|
||||
path: path.to_string(),
|
||||
response,
|
||||
})
|
||||
@@ -231,16 +221,13 @@ impl SshBackend {
|
||||
return Ok(false);
|
||||
}
|
||||
|
||||
let thread = self
|
||||
.thread
|
||||
.as_ref()
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())?;
|
||||
let thread = self.require_thread()?;
|
||||
|
||||
thread.call(|response| WorkerCommand::IsSftp { response })
|
||||
}
|
||||
|
||||
pub fn download_to_file(&self, path: &str, filepath: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::DownloadToFile {
|
||||
self.call_connected(|response| WorkerCommand::DownloadToFile {
|
||||
path: path.to_string(),
|
||||
filepath: filepath.to_string(),
|
||||
response,
|
||||
@@ -248,14 +235,7 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn download_to_vec(&self, path: &str) -> Result<Vec<u8>, String> {
|
||||
if !self.is_connected() {
|
||||
return Err("No session".to_string());
|
||||
}
|
||||
|
||||
let thread = self
|
||||
.thread
|
||||
.as_ref()
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())?;
|
||||
let thread = self.require_connected()?;
|
||||
|
||||
thread
|
||||
.call(|response| WorkerCommand::DownloadToBuffer {
|
||||
@@ -266,7 +246,7 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn rename_object(&self, path: &str, new_path: &str, overwrite: bool) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::RenameObject {
|
||||
self.call_connected(|response| WorkerCommand::RenameObject {
|
||||
path: path.to_string(),
|
||||
new_path: new_path.to_string(),
|
||||
overwrite,
|
||||
@@ -275,32 +255,37 @@ impl SshBackend {
|
||||
}
|
||||
|
||||
pub fn get_file_info(&self, path: &str) -> Result<JanxValue, String> {
|
||||
self.call(|response| WorkerCommand::GetFileInfo {
|
||||
self.call_connected(|response| WorkerCommand::GetFileInfo {
|
||||
path: path.to_string(),
|
||||
response,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn close(&mut self) {
|
||||
pub fn close_backend(&mut self) {
|
||||
if let Some(mut thread) = self.thread.take() {
|
||||
let _ = thread.shutdown(Some(WorkerCommand::Shutdown));
|
||||
}
|
||||
}
|
||||
|
||||
fn call<F>(&self, build: F) -> Result<JanxValue, String>
|
||||
fn call_connected<F>(&self, build: F) -> Result<JanxValue, String>
|
||||
where
|
||||
F: FnOnce(std::sync::mpsc::Sender<JanxValue>) -> WorkerCommand,
|
||||
{
|
||||
let thread = self.require_connected()?;
|
||||
thread.call(build)
|
||||
}
|
||||
|
||||
fn require_connected(&self) -> Result<&SyncBackendThread<WorkerCommand>, String> {
|
||||
if !self.is_connected() {
|
||||
return Err("No session".to_string());
|
||||
}
|
||||
self.require_thread()
|
||||
}
|
||||
|
||||
let thread = self
|
||||
.thread
|
||||
fn require_thread(&self) -> Result<&SyncBackendThread<WorkerCommand>, String> {
|
||||
self.thread
|
||||
.as_ref()
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())?;
|
||||
|
||||
thread.call(build)
|
||||
.ok_or_else(|| "Backend thread is not available".to_string())
|
||||
}
|
||||
|
||||
fn ensure_thread(&mut self) -> Result<(), String> {
|
||||
@@ -316,6 +301,6 @@ impl SshBackend {
|
||||
|
||||
impl Drop for SshBackend {
|
||||
fn drop(&mut self) {
|
||||
self.close();
|
||||
self.close_backend();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,6 +404,7 @@
|
||||
НовыйТест(МассивТестов, МодульТестов, "RPortal_УправлениеПроектами" , "Управление проектами" , RPortal);
|
||||
НовыйТест(МассивТестов, МодульТестов, "RPortal_УправлениеПользователями" , "Управление пользователями" , RPortal);
|
||||
НовыйТест(МассивТестов, МодульТестов, "SShell_ОсновныеМетоды" , "Основные методы" , SSH);
|
||||
НовыйТест(МассивТестов, МодульТестов, "SShell_РасширеннаяПроверка" , "Расширенная проверка" , SSH);
|
||||
НовыйТест(МассивТестов, МодульТестов, "SF_ОсновныеМетоды" , "Основные методы" , SFTP);
|
||||
НовыйТест(МассивТестов, МодульТестов, "SF_РаботаСДиректориями" , "Работа с директориями" , SFTP);
|
||||
НовыйТест(МассивТестов, МодульТестов, "SF_РаботаСФайлами" , "Работа с файлами" , SFTP);
|
||||
@@ -12710,6 +12711,42 @@
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Проверка_SSH_Расширенная_ВыполнитьКомандуБезПодключения(Знач Результат, Знач Вариант)
|
||||
|
||||
ОжидаетЧто(Результат["result"]).Равно(Ложь);
|
||||
ОжидаетЧто(СтрНайти(нРег(Результат["error"]), "no session") > 0).Равно(Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Проверка_SSH_Расширенная_ПодключениеБезНастроек(Знач Результат, Знач Вариант)
|
||||
|
||||
ТекстОшибки = нРег(Результат["error"]);
|
||||
ЭтоОшибкаНастроек = СтрНайти(ТекстОшибки, "no configuration") > 0
|
||||
Или СтрНайти(ТекстОшибки, "no settings") > 0;
|
||||
|
||||
ОжидаетЧто(Результат["result"]).Равно(Ложь);
|
||||
ОжидаетЧто(ЭтоОшибкаНастроек).Равно(Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Проверка_SSH_Расширенная_ПолучитьЛогПриПодключении(Знач Результат, Знач Вариант, ФайлЛога = "")
|
||||
|
||||
ОжидаетЧто(Результат["result"]).Равно(Истина);
|
||||
ОжидаетЧто(Результат["logs"]).ИмеетТип("Массив");
|
||||
ОжидаетЧто(Результат["logs"].Количество() > 0).Равно(Истина);
|
||||
|
||||
ОбъектЛога = Новый Файл(ФайлЛога);
|
||||
ОжидаетЧто(ОбъектЛога.Существует()).Равно(Истина);
|
||||
ОжидаетЧто(ОбъектЛога.Размер() > 0).Равно(Истина);
|
||||
|
||||
Возврат Результат;
|
||||
|
||||
КонецФункции
|
||||
|
||||
Функция Проверка_SSH_ПолучитьНастройкиЛогинПароль(Знач Результат, Знач Вариант)
|
||||
|
||||
ОжидаетЧто(Результат["auth_type"]).Равно("password");
|
||||
|
||||
@@ -120,6 +120,23 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура SShell_РасширеннаяПроверка() Экспорт
|
||||
|
||||
OPI_ПолучениеДанныхТестов.УстановитьПризнакТестаCLI(Ложь);
|
||||
|
||||
Если OPI_ПолучениеДанныхТестов.ЭтоТестCLI() Тогда
|
||||
Сообщить("CLI SKIP");
|
||||
Возврат;
|
||||
КонецЕсли;
|
||||
|
||||
ПараметрыТеста = OPI_ПолучениеДанныхТестов.ПолучитьВариантыПараметровSSH()[0];
|
||||
|
||||
SSH_Расширенная_ВыполнитьКомандуБезПодключения(ПараметрыТеста);
|
||||
SSH_Расширенная_ПодключениеБезНастроек(ПараметрыТеста);
|
||||
SSH_Расширенная_ПолучитьЛогПриПодключении(ПараметрыТеста);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти // SSH
|
||||
|
||||
#КонецОбласти // ЗапускаемыеТесты
|
||||
@@ -710,6 +727,60 @@
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#Область РасширеннаяПроверка
|
||||
|
||||
Процедура SSH_Расширенная_ВыполнитьКомандуБезПодключения(ПараметрыФункции)
|
||||
|
||||
Коннектор = OPI_Компоненты.ПолучитьКомпоненту("SSH");
|
||||
Результат = OPI_SSH.ВыполнитьКоманду(Коннектор, "whoami");
|
||||
|
||||
// END
|
||||
|
||||
OPI_ПолучениеДанныхТестов.Обработать(Результат, "SSH", "Расширенная_ВыполнитьКомандуБезПодключения");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура SSH_Расширенная_ПодключениеБезНастроек(ПараметрыФункции)
|
||||
|
||||
Коннектор = OPI_Компоненты.ПолучитьКомпоненту("SSH");
|
||||
Результат = OPI_Компоненты.ДесериализоватьJanx(Коннектор.Connect());
|
||||
|
||||
// END
|
||||
|
||||
OPI_ПолучениеДанныхТестов.Обработать(Результат, "SSH", "Расширенная_ПодключениеБезНастроек");
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
Процедура SSH_Расширенная_ПолучитьЛогПриПодключении(ПараметрыФункции)
|
||||
|
||||
ФайлЛога = ПолучитьИмяВременногоФайла("txt");
|
||||
НастройкиЛогирования = OPI_SSH.ПолучитьНастройкиЛогирования(Истина, 100, ФайлЛога);
|
||||
|
||||
Хост = ПараметрыФункции["SSH_Host"];
|
||||
Порт = ПараметрыФункции["SSH_Port"];
|
||||
Логин = ПараметрыФункции["SSH_User"];
|
||||
Пароль = ПараметрыФункции["SSH_Password"];
|
||||
|
||||
НастройкиSSH = OPI_SSH.ПолучитьНастройкиЛогинПароль(Хост, Порт, Логин, Пароль);
|
||||
Соединение = OPI_SSH.ОткрытьСоединение(НастройкиSSH, , НастройкиЛогирования);
|
||||
|
||||
Если Не OPI_SSH.ЭтоКоннектор(Соединение) Тогда
|
||||
ВызватьИсключение OPI_Инструменты.JSONСтрокой(Соединение);
|
||||
КонецЕсли;
|
||||
|
||||
OPI_SSH.ВыполнитьКоманду(Соединение, "whoami");
|
||||
|
||||
Результат = OPI_SSH.ПолучитьЛог(Соединение);
|
||||
|
||||
// END
|
||||
|
||||
OPI_ПолучениеДанныхТестов.Обработать(Результат, "SSH", "Расширенная_ПолучитьЛогПриПодключении", , ФайлЛога);
|
||||
OPI_SSH.ЗакрытьСоединение(Соединение);
|
||||
|
||||
КонецПроцедуры
|
||||
|
||||
#КонецОбласти // РасширеннаяПроверка
|
||||
|
||||
#КонецОбласти // SSH
|
||||
|
||||
#КонецОбласти // АтомарныеТесты
|
||||
|
||||
Reference in New Issue
Block a user