From 2db4971f331d3b6817749ccd3fe0bf95ef80d6e2 Mon Sep 17 00:00:00 2001 From: Yuri Goncharuk Date: Sat, 16 Nov 2024 11:55:05 +0200 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81=20=D0=A3=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=D0=90=D0=A1=20(#3)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Добавлен класс УправлениеАС * Добавлены методу установки портов для соединений * Рефакторинг метода формирования кофнигурационного файла * Добавлено формирование параметров секции gates * Добавлено формирование параметров секции features * Добавлено логирование и ожидание вывода при запуске * Добавлены параметры сервера отладки * [BREAK] Уточнен метод параметров файловой ИБ * [BREAK] Изменен метод формирования параметров сервера * Убран прямой вывод сообщений в консоль. * [FIX] Добавлено экранирование пути к файлу * Используем мягкую установку функциональностей сервера * мелкие синтакс-ошибки описаний методов * Включены проверки BSL LS * Исправлены замечания ревью * Исправлены замечания ревью --------- Co-authored-by: Artur Ayukhanov --- lib.config | 3 +- .../configfile_as.os" | 417 ++++++++++++++---- .../ibcmdrunner.os" | 15 +- .../ibsrvrunner.os" | 363 +++++++++++++++ tests/ibsrvrunner_tests.os | 40 ++ 5 files changed, 754 insertions(+), 84 deletions(-) create mode 100644 "src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" create mode 100644 tests/ibsrvrunner_tests.os diff --git a/lib.config b/lib.config index 3a5ed1c..140688f 100644 --- a/lib.config +++ b/lib.config @@ -1,4 +1,5 @@  + - \ No newline at end of file + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" index c2594da..6599cf7 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/configfile_as.os" @@ -1,3 +1,6 @@ +// BSLLS:NumberOfOptionalParams-off +// BSLLS:MagicNumber-off + Перем ПараметрыСервера; // Соответствие - параметры секции server Перем ПараметрыСервернойБазыДанных; // Соответствие - параметры секции database Перем ПараметрыФайловойБазыДанных; // Соответствие - параметры секции database @@ -18,6 +21,10 @@ Перем мсвПараметрыВебСервисов; // массив параметров веб сервисов Перем мсвПараметрыХТТПСервисов; // массив параметров хттп-сервисов +Перем ПараметрыСпособовДоступаКСерверу; // Соответствие - параметры секции gates +Перем ПараметрыФункциональностиСервера; // Соответствие - параметры секции features +Перем ПараметрыОтладкиСервера; // Соответствие - параметры секции debug + #Область ПрограммныйИнтерфейс // ПараметрыСервера @@ -26,15 +33,19 @@ // Адрес - Строка - IP-адрес автономного сервера // Порт - Число - Имя порта автономного сервера // ИмяХоста - Строка - имя хоста (необязательный) -Процедура ПараметрыСервера(Адрес, +// +Процедура ПараметрыСервера(Адрес = "localhost", Порт = 8314, ИмяХоста = Неопределено) Экспорт + ПараметрыСервера. Очистить(); - ПараметрыСервера.Вставить("address", Адрес); ПараметрыСервера.Вставить("port", Порт); - Если ИмяХоста <> Неопределено Тогда + ПараметрыСервера.Вставить("address", Адрес); + + Если ЗначениеЗаполнено(ИмяХоста) Тогда ПараметрыСервера.Вставить("host", ИмяХоста); КонецЕсли; + КонецПроцедуры // ПараметрыСервернойБД @@ -65,17 +76,10 @@ // Установка параметров файловой БД // Параметры: // ПутьКФайлуИБ - Строка - Путь к файлу информационной базы. -// ИмяПользователя - Строка - имя пользователя информационной базы -// Пароль - Строка - пароль пользователя информационной базы -Процедура ПараметрыФайловойБД(ПутьКФайлуИБ, - ИмяПользователя, - Пароль) Экспорт +// +Процедура ПараметрыФайловойБД(ПутьКФайлуИБ) Экспорт - ПараметрыСервернойБазыДанных.Очистить(); - ПараметрыФайловойБазыДанных.Очистить(); ПараметрыФайловойБазыДанных.Вставить("path", ПутьКФайлуИБ); - ПараметрыФайловойБазыДанных.Вставить("user", ИмяПользователя); - ПараметрыФайловойБазыДанных.Вставить("password", Пароль); КонецПроцедуры @@ -338,6 +342,123 @@ КонецПроцедуры +// Параметры доступа к информационной базе по протоколу TCP/IP (с помощью прямого подключения). +// +// Параметры: +// ОсновнойПорт - Число - Основной сетевой порт установки прямого соединения с сервером +// МинимальныйПортПодключения - Число - Нижняя граница диапазона портов для установки соединения +// МаксимальныйПортПодключения - Число - Верхняя граница диапазона портов для установки соединения +// УровеньБезопасности - Число - Уровень безопасности прямого соединения с сервером +// +Процедура ПараметрыШлюзаПрямогоДоступа(ОсновнойПорт = 1541, + МинимальныйПортПодключения = 1560, + МаксимальныйПортПодключения = 1591, + УровеньБезопасности = 0) Экспорт + + ПараметрыШлюза = Новый Соответствие; + ПараметрыШлюза.Вставить("regport", XMLСтрока(ОсновнойПорт)); + ПараметрыШлюза.Вставить("range", + СтрШаблон("%1:%2", XMLСтрока(МинимальныйПортПодключения), XMLСтрока(МаксимальныйПортПодключения))); + ПараметрыШлюза.Вставить("seclevel", XMLСтрока(УровеньБезопасности)); + + ПараметрыСпособовДоступаКСерверу.Вставить("direct", ПараметрыШлюза); + +КонецПроцедуры + +// Параметры доступа к информационной базе по протоколу SSH. +// +// Параметры: +// СетевойИнтерфейс - Строка - Сетевой интерфейс, который используется шлюзом. +// ПутьКЗакрытомуКлючу - Строка - Путь к закрытому ключу хоста. +// ПортПодключения - Число - Порт, обслуживаемый данным шлюзом. +// +Процедура ПараметрыШлюзаSSH(СетевойИнтерфейс = "localhost", + ПутьКЗакрытомуКлючу = "auto", + ПортПодключения = 8282) Экспорт + + ПараметрыШлюза = Новый Соответствие; + ПараметрыШлюза.Вставить("address", СетевойИнтерфейс); + ПараметрыШлюза.Вставить("host-key", ПутьКЗакрытомуКлючу); + ПараметрыШлюза.Вставить("port", XMLСтрока(ПортПодключения)); + + ПараметрыСпособовДоступаКСерверу.Вставить("ssh", ПараметрыШлюза); + +КонецПроцедуры + +// Параметры функциональных характеристик автономного сервера. +// +// Параметры: +// ИспользоватьШлюзПрямогоДоступа - Булево, Неопределено - использовать доступ +// по протоколу TCP/IP (прямое подключение). +// ИспользоватьШлюзHTTP - Булево, Неопределено - использовать доступ к автономному серверу по протоколу HTTP. +// ИспользоватьШлюзSSH - Булево, Неопределено - использовать доступ к автономному серверу по протоколу SSH. +// ИспользоватьРасширеннуюФункциональностьКонифгуратора - Булево, Неопределено - использовать расширенную +// функциональность Конфигуратора. +// +Процедура ПараметрыФункциональностиСервера(ИспользоватьШлюзПрямогоДоступа = Неопределено, + ИспользоватьШлюзHTTP = Неопределено, + ИспользоватьШлюзSSH = Неопределено, + ИспользоватьРасширеннуюФункциональностьКонифгуратора = Неопределено) Экспорт + + ТипБулево = Тип("Булево"); + + Если ТипЗнч(ИспользоватьШлюзПрямогоДоступа) = ТипБулево Тогда + ПараметрыФункциональностиСервера.Вставить("direct-gate", ИспользоватьШлюзПрямогоДоступа); + КонецЕсли; + + Если ТипЗнч(ИспользоватьШлюзHTTP) = ТипБулево Тогда + ПараметрыФункциональностиСервера.Вставить("http-gate", ИспользоватьШлюзHTTP); + КонецЕсли; + + Если ТипЗнч(ИспользоватьШлюзSSH) = ТипБулево Тогда + ПараметрыФункциональностиСервера.Вставить("ssh-gate", ИспользоватьШлюзSSH); + КонецЕсли; + + Если ТипЗнч(ИспользоватьРасширеннуюФункциональностьКонифгуратора) = ТипБулево Тогда + ПараметрыФункциональностиСервера.Вставить("extended-designer-features", + ИспользоватьРасширеннуюФункциональностьКонифгуратора); + КонецЕсли; + +КонецПроцедуры + +// Параметры отладки текущего экземпляра автономномного сервера +// +// Параметры: +// ТипОтладки - Строка - Режим работы отладчика. (none|tcp|http) +// ПортОтладки - Число - Сетевой порт, обслуживаемый сервером отладки +// СетевойИнтерфейс - Строка - IP-адрес, обслуживаемый сервером для отладки +// ПарольОтладки - Строка - Пароль для доступа к серверу отладки. +// +Процедура ПараметрыОтладкиСервера(ТипОтладки = "none", + ПортОтладки = 1550, + СетевойИнтерфейс = "localhost", + ПарольОтладки = "") Экспорт + + ПараметрыОтладкиСервера.Вставить("type", ТипОтладки); + ПараметрыОтладкиСервера.Вставить("port", XMLСтрока(ПортОтладки)); + ПараметрыОтладкиСервера.Вставить("address", СетевойИнтерфейс); + + Если ЗначениеЗаполнено(ПарольОтладки) Тогда + ПараметрыОтладкиСервера.Вставить("password", ПарольОтладки); + КонецЕсли; + +КонецПроцедуры + +// Параметры внешнего сервера отладки +// +// Параметры: +// АдресВнешнегоСервераОтладки - Строка - Адрес внешнего сервера отладки. +// +Процедура ПараметрыВнешнегоСервераОтладки(АдресВнешнегоСервераОтладки) Экспорт + + ПараметрыВнешнегоСервера = Новый Соответствие; + ПараметрыВнешнегоСервера.Вставить("url", АдресВнешнегоСервераОтладки); + + ПараметрыОтладкиСервера.Вставить("type", "server"); + ПараметрыОтладкиСервера.Вставить("server", ПараметрыВнешнегоСервера); + +КонецПроцедуры + // СоздатьКонфигурационныйФайл // Создание конфигурационного файла по ранее заполненным параметрам // Параметры: @@ -346,29 +467,175 @@ Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); + ЗаписатьПараметрыСервера(Конфиг); + ЗаписатьПараметрыБазыДанных(Конфиг); + ЗаписатьПараметрыИнформационнойБазы(Конфиг); + ЗаписатьПараметрыВебДоступа(Конфиг); + ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг); + ЗаписатьПараметрыФункциональностиСервера(Конфиг); + ЗаписатьПараметрыОтладкиСервера(Конфиг); + + Конфиг.Закрыть(); + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта() + + ПараметрыСервера = Новый Соответствие; + ПараметрыСервернойБазыДанных = Новый Соответствие; + ПараметрыФайловойБазыДанных = Новый Соответствие; + ПараметрыИБ = Новый Соответствие; + ПараметрыВеб_Аутентификация = Новый Соответствие; + ПараметрыВеб_Разделители = Новый Соответствие; + ПараметрыВеб_ПубликацияOData = Новый Соответствие; + ПараметрыВеб_РежимПовторногоИспользованияСеансов = Новый Соответствие; + ПараметрыВебСервисовОбщие = Новый Соответствие; + ПараметрыВебСервисов = Новый Соответствие; + ПараметрыХТТП = Новый Соответствие; + ПараметрыХТТПСервисовОбщие = Новый Соответствие; + ПараметрыХТТПСервисов = Новый Соответствие; + ПараметрыПубликацииДистрибутивов = Новый Соответствие; + мсвПараметрыВеб_Разделители = Новый Соответствие; + мсвПараметрыВебСервисов = Новый Соответствие; + мсвПараметрыХТТПСервисов = Новый Соответствие; + ПараметрыСпособовДоступаКСерверу = Новый Соответствие; + ПараметрыФункциональностиСервера = Новый Соответствие; + ПараметрыОтладкиСервера = Новый Соответствие; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Процедура ЗаполнитьСекцию(КонфигФайл, Параметры, Уровень = 1) + + Если Параметры.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Отступ = ""; + Для Счетчик = 1 По Уровень Цикл // BSLLS:UnusedLocalVariable-off + Отступ = Отступ + " "; + КонецЦикла; + + Для Каждого Параметр Из Параметры Цикл + ТипЗнчПараметра = ТипЗнч(Параметр.Значение); + + Если ТипЗнчПараметра = Тип("Число") ИЛИ + ТипЗнчПараметра = Тип("Строка") Тогда + Значение = Параметр.Значение; + ИначеЕсли ТипЗнчПараметра = Тип("Булево") Тогда + Значение = БулевоВСтроку(Параметр.Значение); + + ИначеЕсли ТипЗнчПараметра = Тип("Соответствие") Тогда + КонфигФайл.ЗаписатьСтроку(СтрШаблон("%1%2:", Отступ, Параметр.Ключ)); + ЗаполнитьСекцию(КонфигФайл, Параметр.Значение, Уровень + 1); + Продолжить; + + Иначе + ВызватьИсключение "Значение параметра имеет неизвестный тип"; + КонецЕсли; + + Строка = СтрШаблон("%1%2: %3", Отступ, Параметр.Ключ, Значение); + КонфигФайл.ЗаписатьСтроку(Строка); + + КонецЦикла; + +КонецПроцедуры + +Функция БулевоВСтроку(Значение) + Если Значение = Истина Тогда + Рез = "true"; + ИначеЕсли Значение = Ложь Тогда + Рез = "false"; + Иначе + ВызватьИсключение "Значение должно иметь тип Булево."; + КонецЕсли; + Возврат Рез; +КонецФункции + +Процедура ЗаписатьПараметрыСервера(Конфиг) + + Если ПараметрыСервера.Количество() = 0 Тогда + Возврат; + КонецЕсли; + Конфиг.ЗаписатьСтроку("server:"); ЗаполнитьСекцию(Конфиг, ПараметрыСервера); +КонецПроцедуры + +Процедура ЗаписатьПараметрыБазыДанных(Конфиг) + + Если ПараметрыСервернойБазыДанных.Количество() = 0 И ПараметрыФайловойБазыДанных.Количество() = 0 Тогда + Возврат; + КонецЕсли; + Конфиг.ЗаписатьСтроку("database:"); - Если ПараметрыСервернойБазыДанных.Количество() > 0 Тогда - Для Каждого Параметр Из ПараметрыСервернойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; - ИначеЕсли ПараметрыФайловойБазыДанных.Количество() > 0 Тогда - Для Каждого Параметр Из ПараметрыФайловойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; - Иначе - ВызватьИсключение "Не заданы обязательные параметры базы данных"; - КонецЕсли; + + Для Каждого Параметр Из ПараметрыСервернойБазыДанных Цикл + Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); + Конфиг.ЗаписатьСтроку(Строка); + КонецЦикла; + + Для Каждого Параметр Из ПараметрыФайловойБазыДанных Цикл + Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); + Конфиг.ЗаписатьСтроку(Строка); + КонецЦикла; + +КонецПроцедуры + +Процедура ЗаписатьПараметрыИнформационнойБазы(Конфиг) + + Если ПараметрыИБ.Количество() = 0 Тогда + Возврат; + КонецЕсли; Конфиг.ЗаписатьСтроку("infobase:"); ЗаполнитьСекцию(Конфиг, ПараметрыИБ); +КонецПроцедуры + +Процедура ЗаписатьПараметрыВебДоступа(Конфиг) + + ПропуститьСекциюHTTP = ПараметрыХТТП.Количество() = 0 + И ПараметрыВеб_Аутентификация.Количество() = 0 + И мсвПараметрыВеб_Разделители.Количество() = 0 + И ПараметрыВеб_ПубликацияOData.Количество() = 0 + И ПараметрыВебСервисовОбщие.Количество() = 0 + И ПараметрыХТТПСервисовОбщие.Количество() = 0 + И ПараметрыПубликацииДистрибутивов.Количество() = 0; + + Если ПропуститьСекциюHTTP Тогда + Возврат; + КонецЕсли; + Конфиг.ЗаписатьСтроку("http:"); - ЗаполнитьСекцию(Конфиг, ПараметрыХТТП); + ЗаписатьПараметрыВеб_ХТТП(Конфиг); + ЗаписатьПараметрыВеб_Аутентификация(Конфиг); + ЗаписатьПараметрыВеб_Разделители(Конфиг); + ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг); + ЗаписатьПараметрыВеб_ВебСервисов(Конфиг); + ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг); + ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг); + +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_ХТТП(Конфиг) + + Если ПараметрыХТТП.Количество() > 0 Тогда + ЗаполнитьСекцию(Конфиг, ПараметрыХТТП); + КонецЕсли; + +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_Аутентификация(Конфиг) + Если ПараметрыВеб_Аутентификация.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" auth:"); Конфиг.ЗаписатьСтроку(" rely:"); @@ -391,6 +658,10 @@ КонецЕсли; КонецЕсли; +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_Разделители(Конфиг) + Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" zones:"); Для Каждого Разделитель Из мсвПараметрыВеб_Разделители Цикл @@ -399,6 +670,10 @@ КонецЦикла; КонецЕсли; +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг) + Если ПараметрыВеб_ПубликацияOData.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" odata:"); Значение = ПараметрыВеб_ПубликацияOData.Получить("publish"); @@ -412,6 +687,10 @@ КонецЕсли; КонецЕсли; +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_ВебСервисов(Конфиг) + Если ПараметрыВебСервисовОбщие.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" web-services:"); ЗаполнитьСекцию(Конфиг, ПараметрыВебСервисовОбщие, 2); @@ -423,7 +702,11 @@ КонецЦикла; КонецЕсли; КонецЕсли; + +КонецПроцедуры +Процедура ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг) + Если ПараметрыХТТПСервисовОбщие.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" http-services:"); ЗаполнитьСекцию(Конфиг, ПараметрыХТТПСервисовОбщие, 2); @@ -436,66 +719,48 @@ КонецЕсли; КонецЕсли; +КонецПроцедуры + +Процедура ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг) + Если ПараметрыПубликацииДистрибутивов.Количество() > 0 Тогда Конфиг.ЗаписатьСтроку(" pubdst:"); ЗаполнитьСекцию(Конфиг, ПараметрыПубликацииДистрибутивов, 2); КонецЕсли; КонецПроцедуры -#КонецОбласти -#Область СлужебныеПроцедурыИФункции +Процедура ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг) -Процедура ЗаполнитьСекцию(КонфигФайл, Параметры, Уровень = 1) - Если Параметры.Количество() > 0 Тогда - Для Каждого Параметр Из ПараметрыСервера Цикл - Если ТипЗнч(Параметр.Значение) = Тип("Число") ИЛИ - ТипЗнч(Параметр.Значение) = Тип("Строка") Тогда - Значение = Параметр.Значение; - ИначеЕсли ТипЗнч(Параметр.Значение) = Тип("Булево") Тогда - Значение = БулевоВСтроку(Параметр.Значение); - Иначе - ВызватьИсключение "Значение параметра имеет неизвестный тип"; - КонецЕсли; - Если Уровень = 1 Тогда - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Значение); - ИначеЕсли Уровень = 2 Тогда - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Значение); - ИначеЕсли Уровень = 3 Тогда - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Значение); - Иначе - ВызватьИсключение "Неверно задано значение параметра Уровень"; - КонецЕсли; - КонфигФайл.ЗаписатьСтроку(Строка); - КонецЦикла; - КонецЕсли; -КонецПроцедуры + Если ПараметрыСпособовДоступаКСерверу.Количество() = 0 Тогда + Возврат; + КонецЕсли; -Функция БулевоВСтроку(Значение) - Если Значение = Истина Тогда - Рез = "true"; - ИначеЕсли Значение = Ложь Тогда - Рез = "false"; - Иначе - ВызватьИсключение "Значение должно иметь тип Булево."; + Конфиг.ЗаписатьСтроку("gates:"); + ЗаполнитьСекцию(Конфиг, ПараметрыСпособовДоступаКСерверу); + +КонецПроцедуры + +Процедура ЗаписатьПараметрыФункциональностиСервера(Конфиг) + + Если ПараметрыФункциональностиСервера.Количество() = 0 Тогда + Возврат; КонецЕсли; - Возврат Рез; -КонецФункции -Процедура ПриСозданииОбъекта() - ПараметрыСервера = Новый Соответствие; - ПараметрыСервернойБазыДанных = Новый Соответствие; - ПараметрыФайловойБазыДанных = Новый Соответствие; - ПараметрыИБ = Новый Соответствие; - ПараметрыВеб_Аутентификация = Новый Соответствие; - ПараметрыВеб_Разделители = Новый Соответствие; - ПараметрыВеб_ПубликацияOData = Новый Соответствие; - ПараметрыВеб_РежимПовторногоИспользованияСеансов = Новый Соответствие; - ПараметрыВебСервисовОбщие = Новый Соответствие; - ПараметрыВебСервисов = Новый Соответствие; - ПараметрыХТТП = Новый Соответствие; - ПараметрыХТТПСервисовОбщие = Новый Соответствие; - ПараметрыХТТПСервисов = Новый Соответствие; - ПараметрыПубликацииДистрибутивов = Новый Соответствие; + Конфиг.ЗаписатьСтроку("features:"); + ЗаполнитьСекцию(Конфиг, ПараметрыФункциональностиСервера); + КонецПроцедуры + +Процедура ЗаписатьПараметрыОтладкиСервера(Конфиг) + + Если ПараметрыОтладкиСервера.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + Конфиг.ЗаписатьСтроку("debug:"); + ЗаполнитьСекцию(Конфиг, ПараметрыОтладкиСервера); + +КонецПроцедуры + #КонецОбласти diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" index 738db08..3191168 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibcmdrunner.os" @@ -1,5 +1,6 @@ -// BSLLS-off -// BSLLS-off + +// BSLLS:LatinAndCyrillicSymbolInWord-off + #Использовать logos #Использовать v8find #Использовать asserts @@ -547,8 +548,8 @@ ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); - Рез = ВыполнитьКоманду(); - Сообщить(Рез); + ВыполнитьКоманду(); + КонецПроцедуры // // Очистить информационную базу @@ -656,8 +657,8 @@ ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); КонецЕсли; - Рез = ВыполнитьКоманду(); - Сообщить(Рез); + ВыполнитьКоманду(); + КонецПроцедуры // ВозвратитьсяККонфигурацииБазыДанных @@ -682,7 +683,7 @@ НачатьЗаполнениеПараметровЗапуска("infobase config export info"); - ДобавитьПараметрЕслиЗаполнен("--out", ПутьКФайлуXML); + ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(ПутьКФайлуXML)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ВыполнитьКоманду(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" new file mode 100644 index 0000000..e85d196 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/ibsrvrunner.os" @@ -0,0 +1,363 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +#Использовать v8find +#Использовать 1commands +#Использовать asserts + +#Область ОписаниеПеременных + +Перем Лог; // Экземпляр логгера +Перем ПутьКIbsrv; // Путь к утилите ibsrv +Перем ПараметрыЗапускаАС; // Коллекция параметров командной строки + +Перем Процесс; // Процесс запущенного автономного сервера + +Перем Версия; // Версия платформы, используемая утилитой +Перем КаталогДанных; // Каталог данных автономного сервера + +#КонецОбласти + +#Область ПрограммныйИнтерфейс + +// Текущая версия утилиты ibsrv +// +// Возвращаемое значение: +// Строка - версия утилиты +// +Функция Версия() Экспорт + + Если Версия = "8.3" Тогда + ВычислитьВерсиюIbsrv(Версия, Неопределено); + КонецЕсли; + + Возврат Версия; + +КонецФункции + +// Устанавливает версию платформы, которая будет использована для запуска утилиты ibsrv +// +// Параметры: +// НомерВерсии - Строка - номер версии в формате 8.3.13.1341 (допустимо указание 8.3, 8.3.13) +// Разрядность - Строка, Неопределено - разрядность требуемой версии (перечисление из РазрядностьПлатформы) +// +Процедура УстановитьВерсиюПлатформы(Знач НомерВерсии, Знач Разрядность = Неопределено) Экспорт + + Ожидаем.Что(НомерВерсии).ИмеетТип("Строка"); + Если Разрядность <> Неопределено Тогда + Ожидаем.Что(Разрядность).ИмеетТип("Строка"); + КонецЕсли; + + ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность); + +КонецПроцедуры + +// Устанавливает путь к каталогу данных автономного сервера. +// +// Параметры: +// КаталогДанныхСервера - Строка - Путь к каталогу данных сервера. +// +Процедура УстановитьКаталогДанных(Знач КаталогДанныхСервера) Экспорт + + Ожидаем.Что(КаталогДанныхСервера).ИмеетТип("Строка"); + Ожидаем.Что(ФС.КаталогСуществует(КаталогДанныхСервера)).ЭтоИстина(); + + КаталогДанных = КаталогДанныхСервера; + ПараметрыЗапускаАС.Вставить("data", ОбернутьВКавычки(КаталогДанных)); + +КонецПроцедуры + +// Устанавливает параметры доступа к файловой базе данных. +// +// Параметры: +// КаталогИБ - Строка - Путь к каталогу файловой базы данных «1С:Предприятия». +// +Процедура УстановитьПараметрыФайловойИБ(Знач КаталогИБ) Экспорт + + Ожидаем.Что(КаталогИБ).ИмеетТип("Строка"); + Ожидаем.Что(ФС.КаталогСуществует(КаталогИБ)).ЭтоИстина(); + + ПараметрыЗапускаАС.Вставить("db-path", ОбернутьВКавычки(КаталогИБ)); + +КонецПроцедуры + +// Устанавливает путь к конфигурационному файлу автономного сервера. +// +// Параметры: +// ПутьККонфигурационномуФайлу - Строка - Путь к конфигурационному файлу. +// +Процедура УстановитьКонфигурационныйФайл(Знач ПутьККонфигурационномуФайлу) Экспорт + + Ожидаем.Что(ПутьККонфигурационномуФайлу).ИмеетТип("Строка"); + Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу)).ЭтоИстина(); + + ПараметрыЗапускаАС.Вставить("config", ОбернутьВКавычки(ПутьККонфигурационномуФайлу)); + +КонецПроцедуры + +// Установить порт установки прямого соединения с сервером. +// +// Параметры: +// НомерПорта - Число - порт установки прямого соединения с сервером (от 1000 до 65535) +// +Процедура УстановитьПортПрямогоДоступа(Знач НомерПорта) Экспорт + + Ожидаем.Что(НомерПорта).ИмеетТип("Число"); + Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + + ПараметрыЗапускаАС.Вставить("direct-regport", НомерПорта); + +КонецПроцедуры + +// Установить порт установки http-соединения с сервером. +// +// Параметры: +// НомерПорта - Число - порт установки http соединения с сервером (от 1000 до 65535) +// +Процедура УстановитьПортHttpДоступа(Знач НомерПорта) Экспорт + + Ожидаем.Что(НомерПорта).ИмеетТип("Число"); + Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + + ПараметрыЗапускаАС.Вставить("http-port", НомерПорта); + +КонецПроцедуры + +// Выполняет запуск автономного сервера. При ошибке запуска вызывается исключение, которео можно проверить +// методом см. ЭтоИсключенияЗапускаАС +// +Процедура Запустить() Экспорт + + Если Запущен() Тогда + ВызватьИсключение "Процесс ibsrv уже запущен!"; + КонецЕсли; + + Ожидаем.Что(КаталогДанных).Заполнено(); + + ПараметрыКоманды = ЗаполнитьПараметрыКоманды(); + ЗапуститьПроцессIbsrv(ПараметрыКоманды); + + ОжидатьЗапускаIbsrv(); + + Лог.Отладка("Процесс %1 ibsrv запущен с параметрами %2", Процесс.Идентификатор, СтрСоединить(ПараметрыКоманды)); + +КонецПроцедуры + +// Проверяет, что исключение было вызвано программно при запуске автономного сервера. +// +// Параметры: +// ИнформацияОбОшибке - ИнформацияОбОшибке - Описание ошибки проверяемого исключения +// +// Возвращаемое значение: +// Булево - Истина, если это исключение запуска автономного сервера +// +Функция ЭтоИсключенияЗапускаАС(ИнформацияОбОшибке) Экспорт + + Возврат СтрНайти(КраткоеПредставлениеОшибки(ИнформацияОбОшибке), ТекстИсключенияЗапускаАС()) > 0; + +КонецФункции + +// Проверяет запущен ли процесс автономного сервера +// +// Возвращаемое значение: +// Булево - Истина - если процесс запущен, Ложь - в остальных случаях +// +Функция Запущен() Экспорт + + Если Процесс = Неопределено Тогда + Возврат Ложь; + Иначе + Возврат Не Процесс.Завершен; + КонецЕсли; + +КонецФункции + +// Останавливает запущенный автономный сервер. +// +Процедура Остановить() Экспорт + + Если Не Запущен() Тогда + Возврат; + КонецЕсли; + + Процесс.Завершить(); + + ПрочитатьПотокиIbsrv(); + + Лог.Отладка("Процесс %1 ibsrv завершен.", Процесс.Идентификатор); + + Процесс = Неопределено; + +КонецПроцедуры + +#КонецОбласти + +#Область ОбработчикиСобытий + +Процедура ПриСозданииОбъекта() + + Версия = "8.3"; + Лог = Логирование.ПолучитьЛог(ИмяЛога()); + ПараметрыЗапускаАС = Новый Соответствие; + КаталогДанных = ""; + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ИмяЛога() + Возврат "oscript.lib.ibcmdrunner"; +КонецФункции + +Функция ОбернутьВКавычки(Строка) + Возврат СтрШаблон("""%1""", Строка); +КонецФункции + +Процедура ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность) + + ПутьКIbsrv = Платформа1С.ПутьКIBSRV(НомерВерсии, Разрядность); + Ожидаем.Что(ПутьКIbsrv, "Не найдена установленная версия платформы: " + НомерВерсии).Заполнено(); + + ПараметрыКоманды = Новый Массив; + ПараметрыКоманды.Добавить("--version"); + + ВыводКоманды = ВыполнитьКомандуIbsrv(ПараметрыКоманды); + + Версия = СокрЛП(ВыводКоманды); + +КонецПроцедуры + +Функция ВыполнитьКомандуIbsrv(ПараметрыКоманды) + + Команда = Новый Команда(); + Команда.УстановитьКоманду(ПутьКIbsrv); + Команда.ДобавитьПараметры(ПараметрыКоманды); + Команда.УстановитьИсполнениеЧерезКомандыСистемы(Ложь); + Команда.УстановитьКодировкуВывода(КодировкаТекста.UTF8); + Команда.УстановитьПравильныйКодВозврата(0); + + Команда.Исполнить(); + + Возврат Команда.ПолучитьВывод(); + +КонецФункции + +Функция ЗапуститьПроцессIbsrv(Знач ПараметрыКоманды) + + ПараметрыКоманды.Вставить(0, ОбернутьВКавычки(ПутьКIbsrv)); + + КоманднаяСтрока = СтрСоединить(ПараметрыКоманды, " "); + ТекущийКаталог = КаталогДанных; + ПеренаправлятьПотокВывода = Истина; + ПеренаправлятьПотокВвода = Ложь; + КодировкаПотоков = КодировкаТекста.UTF8; + + Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, + ПеренаправлятьПотокВывода, ПеренаправлятьПотокВвода, КодировкаПотоков); + Процесс.Запустить(); + + Возврат Процесс; + +КонецФункции + +Процедура ОжидатьЗапускаIbsrv() + + ИнтервалПроверкиМс = 500; // 0.5 сек + ПредельныйПериодОжиданияМс = 10000; // 10 сек + ТекущийПериодОжидания = 0; + ФайлСуществует = Ложь; + ИмяФайла = ОбъединитьПути(КаталогДанных, "lock.pid"); + ЕстьДанные = Ложь; + + Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл + Приостановить(ИнтервалПроверкиМс); + + ЕстьДанные = ЕстьДанные ИЛИ ПрочитатьПотокиIbsrv(); + ФайлСуществует = ФайлСуществует ИЛИ ФС.ФайлСуществует(ИмяФайла); + + Если ЕстьДанные И ФайлСуществует Тогда + Прервать; + КонецЕсли; + + ТекущийПериодОжидания = ТекущийПериодОжидания + ИнтервалПроверкиМс; + + КонецЦикла; + + Если ФайлСуществует Тогда + Возврат; + КонецЕсли; + + Если Запущен() Тогда + Остановить(); + КонецЕсли; + + ВызватьИсключение ТекстИсключенияЗапускаАС(); + +КонецПроцедуры + +Функция ТекстИсключенияЗапускаАС() + + Возврат "Процесс ibsrv не запустился!"; + +КонецФункции + +Функция ЗаполнитьПараметрыКоманды() + + ПараметрыКоманды = Новый Массив; + + Для Каждого КлючИЗначение Из ПараметрыЗапускаАС Цикл + Если КлючИЗначение.Значение = Неопределено Тогда // это параметр-флаг + ПараметрыКоманды.Добавить(КлючИЗначение.Ключ); + Продолжить; + + ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Строка") И ПустаяСтрока(КлючИЗначение.Значение) Тогда + Продолжить; + + ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Булево") Тогда + Значение = ?(КлючИЗначение.Значение, "allow", "deny"); + + ИначеЕсли ТипЗнч(КлючИЗначение.Значение) = Тип("Число") Тогда + Значение = XMLСтрока(КлючИЗначение.Значение); + + Иначе + Значение = КлючИЗначение.Значение; + + КонецЕсли; + + ПараметрЗапуска = СтрШаблон("--%1=%2", КлючИЗначение.Ключ, Значение); + ПараметрыКоманды.Добавить(ПараметрЗапуска); + + КонецЦикла; + + Возврат ПараметрыКоманды; + +КонецФункции + +Функция ПрочитатьПотокиIbsrv() + + ЕстьДанные = Ложь; + + Пока Процесс.ПотокВывода.ЕстьДанные Цикл + СтрокаВывода = Процесс.ПотокВывода.ПрочитатьСтроку(); + Если ЗначениеЗаполнено(СтрокаВывода) Тогда + Лог.Отладка(СтрокаВывода); + ЕстьДанные = Истина; + КонецЕсли; + КонецЦикла; + + Пока Процесс.ПотокОшибок.ЕстьДанные Цикл + СтрокаОшибки = Процесс.ПотокОшибок.ПрочитатьСтроку(); + Если ЗначениеЗаполнено(СтрокаОшибки) Тогда + Лог.Ошибка(СтрокаОшибки); + ЕстьДанные = Истина; + КонецЕсли; + КонецЦикла; + + Возврат ЕстьДанные; + +КонецФункции + +#КонецОбласти diff --git a/tests/ibsrvrunner_tests.os b/tests/ibsrvrunner_tests.os new file mode 100644 index 0000000..659019c --- /dev/null +++ b/tests/ibsrvrunner_tests.os @@ -0,0 +1,40 @@ + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_ПолучитьВерсию() Экспорт + + // Дано + УправлениеАС = Новый УправлениеАС; + + // Когда + НомерВерсии = УправлениеАС.Версия(); + + // Тогда + РегулярноеВыражение = Новый РегулярноеВыражение("^(\d+)\.(\d+)\.(\d+)\.(\d+)\z"); + Утверждения.ПроверитьИстину(РегулярноеВыражение.Совпадает(НомерВерсии), + "Номер версии должен соответствовать шаблону:" + НомерВерсии); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_УстановитьНекорректнуюВерсию() Экспорт + + // Дано + УправлениеАС = Новый УправлениеАС; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("8.3.23.1111"); + + // Тогда + Ожидаем.Что(УправлениеАС) + .Метод("УстановитьВерсию", ПараметрыМетода) + .ВыбрасываетИсключение("Не найдена установленная версия платформы"); + +КонецПроцедуры + +#КонецОбласти