Рефакторинг ssh

This commit is contained in:
Anton Titovets
2026-06-03 15:42:09 +03:00
parent 640905bfe0
commit 41fad47bc5
5 changed files with 159 additions and 60 deletions
+8 -8
View File
@@ -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
View File
@@ -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();
}
}
+27 -42
View File
@@ -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");
+71
View File
@@ -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
#КонецОбласти // АтомарныеТесты