diff --git a/ci/os/internal/Modules/МетодыПримеровКода.os b/ci/os/internal/Modules/МетодыПримеровКода.os index 8387b52369..be5fefc2f5 100644 --- a/ci/os/internal/Modules/МетодыПримеровКода.os +++ b/ci/os/internal/Modules/МетодыПримеровКода.os @@ -247,6 +247,7 @@ СоответствиеЗамен.Вставить("MDB_CString", "mongodb://bayselonarrend:***@127.0.0.1:27017"); СоответствиеЗамен.Вставить("PG_Connection", "postgresql://bayselonarrend:***@127.0.0.1:5432/"); СоответствиеЗамен.Вставить("PG_IP", "127.0.0.1"); + СоответствиеЗамен.Вставить("RCON_URL", "127.0.0.1:25565"); Для Каждого Признак Из СоответствиеПризнаковСекретов Цикл diff --git a/src/addins/rcon/src/component/mod.rs b/src/addins/rcon/src/component/mod.rs index f149c97efd..48a624d645 100644 --- a/src/addins/rcon/src/component/mod.rs +++ b/src/addins/rcon/src/component/mod.rs @@ -31,9 +31,9 @@ pub fn cal_func(obj: &mut AddIn, num: usize, params: &mut [Variant]) -> Box { let url = params[0].get_string().unwrap_or("".to_string()); - let password = params[0].get_string().unwrap_or("".to_string()); + let password = params[1].get_string().unwrap_or("".to_string()); let read_timeout = params[2].get_i32().unwrap_or(0); - let write_timeout = params[2].get_i32().unwrap_or(0); + let write_timeout = params[3].get_i32().unwrap_or(0); Box::new(methods::connect(obj, &url, &password, read_timeout, write_timeout)) }, diff --git a/src/ru/OPI/src/CommonModules/OPI_RCON/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_RCON/Module.bsl new file mode 100644 index 0000000000..d1fd546a56 --- /dev/null +++ b/src/ru/OPI/src/CommonModules/OPI_RCON/Module.bsl @@ -0,0 +1,182 @@ +// OneScript: ./OInt/core/Modules/OPI_RCON.os +// Lib: RCON +// CLI: rcon + +// MIT License + +// Copyright (c) 2023 Anton Tsitavets + +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +// https://github.com/Bayselonarrend/OpenIntegrations + +// BSLLS:Typo-off +// BSLLS:LatinAndCyrillicSymbolInWord-off +// BSLLS:IncorrectLineBreak-off +// BSLLS:NumberOfOptionalParams-off +// BSLLS:UsingServiceTag-off +// BSLLS:LineLength-off + +//@skip-check module-structure-top-region +//@skip-check module-structure-method-in-regions +//@skip-check wrong-string-literal-content +//@skip-check method-too-many-params + +// Раскомментировать, если выполняется OneScript +// #Использовать "../../tools" + +#Область ПрограммныйИнтерфейс + +#Область ВыполнениеКоманд + +// !NOCLI Открыть соединение +// Открывает новое соединения RCON +// +// Параметры: +// ПараметрыСоединения - Структура Из КлючИЗначение - Параметры соединения. См. СформироватьПараметрыСоединения - params +// +// Возвращаемое значение: +// Произвольный - Объект коннектора или структура с информацией об ошибке +Функция ОткрытьСоединение(Знач ПараметрыСоединения) Экспорт + + Если ЭтоКоннектор(ПараметрыСоединения) Тогда + Возврат ПараметрыСоединения; + КонецЕсли; + + OPI_ПреобразованиеТипов.ПолучитьКоллекциюКлючИЗначение(ПараметрыСоединения); + + МассивОбязательных = СтрРазделить("url,password,read_timeout,write_timeout", ","); + МассивНедостающих = OPI_Инструменты.НайтиОтсутствующиеПоляКоллекции(ПараметрыСоединения, МассивОбязательных); + + Если ЗначениеЗаполнено(МассивНедостающих) Тогда + ВызватьИсключение СтрШаблон("Отсутствуют параметры подключения: %1", СтрСоединить(МассивНедостающих)); + КонецЕсли; + + Коннектор = ПодключитьКомпонентуНаСервере("OPI_RCON"); + + URL = ПараметрыСоединения["url"]; + Пароль = ПараметрыСоединения["password"]; + ТаймаутЧтения = ПараметрыСоединения["read_timeout"]; + ТаймаутЗаписи = ПараметрыСоединения["write_timeout"]; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(URL); + OPI_ПреобразованиеТипов.ПолучитьСтроку(Пароль); + OPI_ПреобразованиеТипов.ПолучитьЧисло(ТаймаутЧтения); + OPI_ПреобразованиеТипов.ПолучитьЧисло(ТаймаутЗаписи); + + Результат = Коннектор.Connect(URL, Пароль, ТаймаутЧтения, ТаймаутЗаписи); + Результат = OPI_Инструменты.JsonВСтруктуру(Результат, Ложь); + + Возврат ?(Результат["result"], Коннектор, Результат); + +КонецФункции + +// Выполнить команду +// Выполняет команду на сервере +// +// Примечание: +// При передаче параметров соединения, новое соединение будет создано и закрыто в рамках выполнения одной команды.^^ +// Для выполнения нескольких команд (в версиях для OS и 1С) рекомендуется использовать заранее созданное соединение (см. ОткрытьСоединение) +// +// Параметры: +// Команда - Строка - Текст команды - exec +// Соединение - Произвольный, Структура Из КлючИЗначение - Соединение или параметры соединения - conn +// +// Возвращаемое значение: +// Соответствие Из КлючИЗначение - Результат выполнения команды +Функция ВыполнитьКоманду(Знач Команда, Знач Соединение) Экспорт + + Если ЭтоКоннектор(Соединение) Тогда + Коннектор = Соединение; + Иначе + Коннектор = ОткрытьСоединение(Соединение); + КонецЕсли; + + Если Не ЭтоКоннектор(Коннектор) Тогда + Возврат Коннектор; + КонецЕсли; + + OPI_ПреобразованиеТипов.ПолучитьСтроку(Команда); + + Результат = Коннектор.Command(Команда); + Результат = OPI_Инструменты.JsonВСтруктуру(Результат); + + Возврат Результат; + +КонецФункции + +// Сформировать параметры соединения +// Формирует коллекцию параметров соединения +// +// Параметры: +// URL - Строка - URL сервера - url +// Пароль - Строка - Пароль для подключения - pass +// ТаймаутЧтения - Число - Таймаут ожидания ответа (в секундах) - rtout +// ТаймаутЗаписи - Число - Таймаут ожидания отправки запроса (в секундах) - wtout +// +// Возвращаемое значение: +// Структура Из КлючИЗначение - Структура параметров соединения +Функция СформироватьПараметрыСоединения(Знач URL, Знач Пароль, Знач ТаймаутЧтения = 30, Знач ТаймаутЗаписи = 30) Экспорт + + ПараметрыСоединения = Новый Структура; + OPI_Инструменты.ДобавитьПоле("url" , URL , "Строка", ПараметрыСоединения); + OPI_Инструменты.ДобавитьПоле("password" , Пароль , "Строка", ПараметрыСоединения); + OPI_Инструменты.ДобавитьПоле("read_timeout" , ТаймаутЧтения, "Число" , ПараметрыСоединения); + OPI_Инструменты.ДобавитьПоле("write_timeout", ТаймаутЗаписи, "Число" , ПараметрыСоединения); + + Возврат ПараметрыСоединения; + +КонецФункции + +// Это коннектор !NOCLI +// Проверяет, что значение является объектом внешней компоненты RCON +// +// Параметры: +// Значение - Произвольный - Значение для проверки - value +// +// Возвращаемое значение: +// Булево - Это коннектор +Функция ЭтоКоннектор(Знач Значение) Экспорт + + Возврат Строка(ТипЗнч(Значение)) = "AddIn.OPI_RCON.Main"; + +КонецФункции + +#КонецОбласти + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ПодключитьКомпонентуНаСервере(Знач ИмяКомпоненты, Знач Класс = "Main") + + Если OPI_Инструменты.ЭтоOneScript() Тогда + ИмяМакета = OPI_Инструменты.КаталогКомпонентOS() + ИмяКомпоненты + ".zip"; + Иначе + ИмяМакета = "ОбщийМакет." + ИмяКомпоненты; + КонецЕсли; + + ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native); + + Компонента = Новый ("AddIn." + ИмяКомпоненты + "." + Класс); + Возврат Компонента; + +КонецФункции + +#КонецОбласти \ No newline at end of file diff --git a/src/ru/OPI/src/CommonModules/OPI_RCON/OPI_RCON.mdo b/src/ru/OPI/src/CommonModules/OPI_RCON/OPI_RCON.mdo new file mode 100644 index 0000000000..5087b38c1b --- /dev/null +++ b/src/ru/OPI/src/CommonModules/OPI_RCON/OPI_RCON.mdo @@ -0,0 +1,11 @@ + + + OPI_RCON + + ru + RCON (ОПИ) + + true + true + true + diff --git a/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl index d03e589213..bef4f0777b 100644 --- a/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_ПолучениеДанныхТестов/Module.bsl @@ -56,6 +56,7 @@ Разделы.Вставить("Twitter" , 4); Разделы.Вставить("PostgreSQL" , 5); Разделы.Вставить("SQLite" , 5); + Разделы.Вставить("RCON" , 5); Разделы.Вставить("YandexDisk" , 5); Разделы.Вставить("GoogleWorkspace", 2); Разделы.Вставить("GoogleCalendar" , 5); @@ -91,6 +92,7 @@ Разделы.Вставить("Twitter" , СтандартныеЗависимости); Разделы.Вставить("PostgreSQL" , СтандартныеЗависимости); Разделы.Вставить("SQLite" , СтандартныеЗависимости); + Разделы.Вставить("RCON" , СтандартныеЗависимости); Разделы.Вставить("YandexDisk" , СтандартныеЗависимости); Разделы.Вставить("GoogleWorkspace", СтандартныеЗависимости); Разделы.Вставить("GoogleCalendar" , ЗависимостиГугл); @@ -140,6 +142,7 @@ SQLite = "SQLite"; Postgres = "PostgreSQL"; GreenAPI = "GreenAPI"; + RCON = "RCON"; ТаблицаТестов = Новый ТаблицаЗначений; ТаблицаТестов.Колонки.Добавить("Метод"); @@ -285,6 +288,7 @@ НовыйТест(ТаблицаТестов, "GAPI_ОчередьСообщений" , "Очередь сообщений" , GreenAPI); НовыйТест(ТаблицаТестов, "GAPI_ЖурналыСообщений" , "Журналы сообщений" , GreenAPI); НовыйТест(ТаблицаТестов, "GAPI_Аккаунт" , "Аккаунт" , GreenAPI); + НовыйТест(ТаблицаТестов, "RC_ВыполнениеКоманд" , "Выполнение команд" , RCON); Возврат ТаблицаТестов; diff --git a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl index bf2f8966aa..1e28b2c8bf 100644 --- a/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl +++ b/src/ru/OPI/src/CommonModules/OPI_Тесты/Module.bsl @@ -53,6 +53,7 @@ // #Использовать "../../../tools" // #Использовать "../../../core" // #Использовать asserts + #Область СлужебныйПрограммныйИнтерфейс // Для YaxUnit @@ -2505,6 +2506,22 @@ #КонецОбласти +#Область RCON + +Процедура RC_ВыполнениеКоманд() Экспорт + + ПараметрыТеста = Новый Структура; + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("RCON_URL", ПараметрыТеста); + OPI_ПолучениеДанныхТестов.ПараметрВКоллекцию("RCON_Password", ПараметрыТеста); + + RCON_СформироватьПараметрыСоединения(ПараметрыТеста); + RCON_ОткрытьСоединение(ПараметрыТеста); + RCON_ВыполнитьКоманду(ПараметрыТеста); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #КонецОбласти @@ -19295,6 +19312,64 @@ #КонецОбласти +#Область RCON + +Процедура RCON_СформироватьПараметрыСоединения(ПараметрыФункции) + + URL = ПараметрыФункции["RCON_URL"]; + Пароль = ПараметрыФункции["RCON_Password"]; + ТаймаутЗаписи = 20; + ТаймаутЧтения = 20; + + Результат = OPI_RCON.СформироватьПараметрыСоединения(URL, Пароль, ТаймаутЧтения, ТаймаутЗаписи); + + // END + + Результат["URL"] = "127.0.0.1:25565"; + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "СформироватьПараметрыСоединения", "RCON"); + OPI_ПолучениеДанныхТестов.Проверка_Структура(Результат); + +КонецПроцедуры + +Процедура RCON_ОткрытьСоединение(ПараметрыФункции) + + URL = ПараметрыФункции["RCON_URL"]; + Пароль = ПараметрыФункции["RCON_Password"]; + ТаймаутЗаписи = 20; + ТаймаутЧтения = 20; + + ПараметрыСоединения = OPI_RCON.СформироватьПараметрыСоединения(URL, Пароль, ТаймаутЧтения, ТаймаутЗаписи); + Результат = OPI_RCON.ОткрытьСоединение(ПараметрыСоединения); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ОткрытьСоединение", "RCON"); + OPI_ПолучениеДанныхТестов.Проверка_Компонента(Результат, "OPI_RCON"); + +КонецПроцедуры + +Процедура RCON_ВыполнитьКоманду(ПараметрыФункции) + + URL = ПараметрыФункции["RCON_URL"]; + Пароль = ПараметрыФункции["RCON_Password"]; + ТаймаутЗаписи = 20; + ТаймаутЧтения = 20; + + ПараметрыСоединения = OPI_RCON.СформироватьПараметрыСоединения(URL, Пароль, ТаймаутЧтения, ТаймаутЗаписи); + Соединение = OPI_RCON.ОткрытьСоединение(ПараметрыСоединения); + + Команда = "version"; + Результат = OPI_RCON.ВыполнитьКоманду(Команда, Соединение); + + // END + + OPI_ПолучениеДанныхТестов.ЗаписатьЛог(Результат, "ВыполнитьКоманду", "RCON"); + OPI_ПолучениеДанныхТестов.Проверка_РезультатИстина(Результат); + +КонецПроцедуры + +#КонецОбласти + #КонецОбласти #КонецОбласти diff --git a/src/ru/OPI/src/Configuration/Configuration.mdo b/src/ru/OPI/src/Configuration/Configuration.mdo index fcef856049..d938635c93 100644 --- a/src/ru/OPI/src/Configuration/Configuration.mdo +++ b/src/ru/OPI/src/Configuration/Configuration.mdo @@ -56,6 +56,7 @@ CommonModule.OPI_Notion CommonModule.OPI_Ozon CommonModule.OPI_PostgreSQL + CommonModule.OPI_RCON CommonModule.OPI_Slack CommonModule.OPI_SQLite CommonModule.OPI_S3