diff --git a/Readme.md b/Readme.md index 7d29d97..380e989 100644 --- a/Readme.md +++ b/Readme.md @@ -27,6 +27,19 @@ КонфигФайл.СоздатьКонфигурационныйФайл("c:\tmp\my-config.yml"); ``` +## Логирование + +Библиотека пишет подробный отладочный лог через [logos](https://github.com/oscript-library/logos) +в лог с именем `oscript.lib.ibcmdrunner`: командные строки запуска ibcmd/ibsrv, длительность +и коды возврата команд, установку параметров. Значения паролей в лог не выводятся. + +Чтобы включить отладочный вывод: + +```bsl +Лог = Логирование.ПолучитьЛог("oscript.lib.ibcmdrunner"); +Лог.УстановитьУровень(УровниЛога.Отладка); +``` + ## [Программный интерфейс](https://github.com/alex-bob-lip/ibcmdrunner/tree/main/doc/doc.md) ## Лицензия diff --git a/lib.config b/lib.config index 140688f..cb3767e 100644 --- a/lib.config +++ b/lib.config @@ -1,4 +1,5 @@ - + + diff --git a/packagedef b/packagedef index 715e03d..d635c58 100644 --- a/packagedef +++ b/packagedef @@ -1,9 +1,9 @@ Описание.Имя("ibcmdrunner") - .Версия("0.3.3") + .Версия("0.4.0") .Автор("Alexey Bobylkin") .АдресАвтора("alex_bob@lipetsk.ru") .Описание("Библиотека для упрощения работы с утилитами ibcmd и ibsrv из oscript.") - .ВерсияСреды("1.9.2") + .ВерсияСреды("2.0.0") .ВключитьФайл("lib.config") .ВключитьФайл("Readme.md") .ВключитьФайл("src") @@ -14,6 +14,7 @@ .ЗависитОт("v8find", "0.3.1") .ЗависитОт("logos", "1.7.0") .ЗависитОт("fs", "1.2.0") + .ЗависитОт("oscript-yaml", "0.3.0") .РазработкаЗависитОт("1testrunner", "1.8.0") .РазработкаЗависитОт("coverage", "0.6.1") 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 6599cf7..27a4338 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,5 +1,11 @@ // BSLLS:NumberOfOptionalParams-off // BSLLS:MagicNumber-off +// BSLLS:LatinAndCyrillicSymbolInWord-off + +#Использовать logos +#Использовать oscript-yaml + +Перем Лог; // Экземпляр логгера Перем ПараметрыСервера; // Соответствие - параметры секции server Перем ПараметрыСервернойБазыДанных; // Соответствие - параметры секции database @@ -38,6 +44,8 @@ Порт = 8314, ИмяХоста = Неопределено) Экспорт + Лог.Отладка("Установка параметров сервера (адрес: %1, порт: %2, имя хоста: %3)", Адрес, Порт, ИмяХоста); + ПараметрыСервера. Очистить(); ПараметрыСервера.Вставить("port", Порт); ПараметрыСервера.Вставить("address", Адрес); @@ -62,6 +70,9 @@ ИмяПользователя, Пароль) Экспорт + Лог.Отладка("Установка параметров серверной БД (СУБД: %1, сервер: %2, база: %3, пользователь: %4, пароль не выводится в лог)", + ТипСУБД, Сервер, ИмяДБ, ИмяПользователя); + ПараметрыСервернойБазыДанных.Очистить(); ПараметрыФайловойБазыДанных.Очистить(); ПараметрыСервернойБазыДанных.Вставить("dbms", ТипСУБД); @@ -79,6 +90,8 @@ // Процедура ПараметрыФайловойБД(ПутьКФайлуИБ) Экспорт + Лог.Отладка("Установка параметров файловой БД (путь: %1)", ПутьКФайлуИБ); + ПараметрыФайловойБазыДанных.Вставить("path", ПутьКФайлуИБ); КонецПроцедуры @@ -96,6 +109,8 @@ РазрешитьРегламентныеЗадания, ИД = "unique") Экспорт + Лог.Отладка("Установка параметров ИБ (имя: %1, ИД: %2)", ИмяИБ, ИД); + ПараметрыИБ.Очистить(); ПараметрыИБ.Вставить("id", ИД); ПараметрыИБ.Вставить("name", ИмяИБ); @@ -113,6 +128,8 @@ // Значение по умолчанию:/. Процедура ПараметрыХТТП(БазовыйУРЛ = "/") Экспорт + Лог.Отладка("Установка параметров веб-доступа (базовый УРЛ: %1)", БазовыйУРЛ); + ПараметрыХТТП.Очистить(); ПараметрыХТТП.Вставить("base", БазовыйУРЛ); КонецПроцедуры @@ -138,12 +155,14 @@ ПровайдерыOpenIDConnect = Неопределено, РазрешитьАутентификацию1С = Истина) Экспорт + Лог.Отладка("Установка параметров веб-аутентификации (провайдер: %1)", УРИПровайдера); + ПараметрыВеб_Аутентификация.Очистить(); ПараметрыВеб_Аутентификация.Вставить("url", УРИПровайдера); ПараметрыВеб_Аутентификация.Вставить("lifetime", ВремяЖизни); ПараметрыВеб_Аутентификация.Вставить("return-to", МаскаРазрешенныхИмен); ПараметрыВеб_Аутентификация.Вставить("providers", ПровайдерыOpenIDConnect); - ПараметрыВеб_Аутентификация.Вставить("allow-standart", РазрешитьАутентификацию1С); + ПараметрыВеб_Аутентификация.Вставить("allow-standard", РазрешитьАутентификацию1С); КонецПроцедуры @@ -165,7 +184,9 @@ ДобавлятьЗначениеВАдрес = Ложь, ЭтоПервоеЗначениеРазделителя = Истина) Экспорт - ПараметрыВеб_Разделители.Очистить(); + Лог.Отладка("Добавление параметров разделителя (значение: %1)", Разделитель); + + ПараметрыВеб_Разделители = Новый Соответствие; ПараметрыВеб_Разделители.Вставить("value", Разделитель); ПараметрыВеб_Разделители.Вставить("safe", РазрешитьИзменение); ПараметрыВеб_Разделители.Вставить("specify", ДобавлятьЗначениеВАдрес); @@ -184,6 +205,10 @@ // Публиковать - Булево - Определяет возможность использовать клиентское приложение для доступа // к информационной базе. Процедура ПараметрыВеб_Приложение(УРИВозврата, Публиковать = Истина) Экспорт + + Лог.Отладка("Установка параметров публикации приложения (УРИ возврата: %1, публиковать: %2)", + УРИВозврата, Публиковать); + ПараметрыВеб_Приложение = Новый Соответствие; ПараметрыВеб_Приложение.Вставить("publish", Публиковать); ПараметрыВеб_Приложение.Вставить("exit-url", УРИВозврата); @@ -198,10 +223,12 @@ Процедура ПараметрыВеб_ПубликацияOData(Публиковать = Ложь, ПараметрыРежимаПовторногоИспользованияСеансов = Неопределено) Экспорт + Лог.Отладка("Установка параметров публикации OData (публиковать: %1)", Публиковать); + ПараметрыВеб_ПубликацияOData.Очистить(); ПараметрыВеб_ПубликацияOData.Вставить("publish", Публиковать); Если ПараметрыРежимаПовторногоИспользованияСеансов <> Неопределено Тогда - ПараметрыВеб_ПубликацияOData.Вставмит("reuse-sessions", ПараметрыРежимаПовторногоИспользованияСеансов); + ПараметрыВеб_ПубликацияOData.Вставить("reuse-sessions", ПараметрыРежимаПовторногоИспользованияСеансов); КонецЕсли; КонецПроцедуры @@ -220,6 +247,8 @@ МаксимальноеКоличествоСеансов = 10, ТаймаутОжиданияСвободногоСеанса = 5) Экспорт + Лог.Отладка("Установка параметров повторного использования сеансов (режим: %1)", Режим); + ПараметрыВеб_РежимПовторногоИспользованияСеансов.Очистить(); ПараметрыВеб_РежимПовторногоИспользованияСеансов.Вставить("mode", Режим); ПараметрыВеб_РежимПовторногоИспользованияСеансов.Вставить("max-age", ВремяБездействия); @@ -236,6 +265,9 @@ Процедура ПараметрыВебСервисовОбщие(ПубликоватьВебСервисы = Истина, ПубликоватьВебСервисыРасширений = Ложь) Экспорт + Лог.Отладка("Установка общих параметров веб-сервисов (публиковать: %1, публиковать расширения: %2)", + ПубликоватьВебСервисы, ПубликоватьВебСервисыРасширений); + ПараметрыВебСервисовОбщие.Очистить(); ПараметрыВебСервисовОбщие.Вставить("publish-by-default", ПубликоватьВебСервисы); ПараметрыВебСервисовОбщие.Вставить("publish-extensions-by-default", ПубликоватьВебСервисыРасширений); @@ -263,11 +295,16 @@ ПараметрыПовторногоИспользования, ЭтоПервыйСервис) Экспорт + Лог.Отладка("Добавление параметров веб-сервиса (имя: %1, синоним: %2, публиковать: %3)", + Имя, Синоним, Публиковать); + ПараметрыВебСервисов = Новый Соответствие; ПараметрыВебСервисов.Вставить("publish", Публиковать); ПараметрыВебСервисов.Вставить("name", Имя); ПараметрыВебСервисов.Вставить("alias", Синоним); - ПараметрыВебСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + Если ЗначениеЗаполнено(ПараметрыПовторногоИспользования) Тогда + ПараметрыВебСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + КонецЕсли; Если ЭтоПервыйСервис Тогда мсвПараметрыВебСервисов = Новый Массив; @@ -284,6 +321,9 @@ Процедура ПараметрыХТТПСервисовОбщие(ПубликоватьХТТПСервисы = Истина, ПубликоватьХТТПСервисыРасширений = Ложь) Экспорт + Лог.Отладка("Установка общих параметров http-сервисов (публиковать: %1, публиковать расширения: %2)", + ПубликоватьХТТПСервисы, ПубликоватьХТТПСервисыРасширений); + ПараметрыХТТПСервисовОбщие.Очистить(); ПараметрыХТТПСервисовОбщие.Вставить("publish-by-default", ПубликоватьХТТПСервисы); ПараметрыХТТПСервисовОбщие.Вставить("publish-extensions-by-default", ПубликоватьХТТПСервисыРасширений); @@ -311,16 +351,21 @@ ПараметрыПовторногоИспользования = Неопределено, ЭтоПервыйСервис = Ложь) Экспорт + Лог.Отладка("Добавление параметров http-сервиса (имя: %1, корневой УРЛ: %2, публиковать: %3)", + Имя, КорневойУРЛ, Публиковать); + ПараметрыХТТПСервисов = Новый Соответствие; ПараметрыХТТПСервисов.Вставить("publish", Публиковать); ПараметрыХТТПСервисов.Вставить("name", Имя); ПараметрыХТТПСервисов.Вставить("root", КорневойУРЛ); - ПараметрыХТТПСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + Если ЗначениеЗаполнено(ПараметрыПовторногоИспользования) Тогда + ПараметрыХТТПСервисов.Вставить("reuse-sessions", ПараметрыПовторногоИспользования); + КонецЕсли; Если ЭтоПервыйСервис Тогда мсвПараметрыХТТПСервисов = Новый Массив; КонецЕсли; - мсвПараметрыВебСервисов.Добавить(ПараметрыХТТПСервисов); + мсвПараметрыХТТПСервисов.Добавить(ПараметрыХТТПСервисов); КонецПроцедуры @@ -335,6 +380,8 @@ // 64-разрядного клиентского приложения для ОС macOS. Процедура ПараметрыПубликацииДистрибутивов(ПутьКФайлуВин32, ПутьКФайлуВин64, ПутьКФайлуМак64) Экспорт + Лог.Отладка("Установка параметров публикации дистрибутивов"); + ПараметрыПубликацииДистрибутивов.Очистить(); ПараметрыПубликацииДистрибутивов.Вставить("win32", ПутьКФайлуВин32); ПараметрыПубликацииДистрибутивов.Вставить("win64", ПутьКФайлуВин64); @@ -355,11 +402,13 @@ МаксимальныйПортПодключения = 1591, УровеньБезопасности = 0) Экспорт + Лог.Отладка("Установка параметров шлюза прямого доступа (основной порт: %1)", ОсновнойПорт); + ПараметрыШлюза = Новый Соответствие; - ПараметрыШлюза.Вставить("regport", XMLСтрока(ОсновнойПорт)); + ПараметрыШлюза.Вставить("regport", ОсновнойПорт); ПараметрыШлюза.Вставить("range", - СтрШаблон("%1:%2", XMLСтрока(МинимальныйПортПодключения), XMLСтрока(МаксимальныйПортПодключения))); - ПараметрыШлюза.Вставить("seclevel", XMLСтрока(УровеньБезопасности)); + СтрШаблон("%1:%2", МинимальныйПортПодключения, МаксимальныйПортПодключения)); + ПараметрыШлюза.Вставить("seclevel", УровеньБезопасности); ПараметрыСпособовДоступаКСерверу.Вставить("direct", ПараметрыШлюза); @@ -376,10 +425,12 @@ ПутьКЗакрытомуКлючу = "auto", ПортПодключения = 8282) Экспорт + Лог.Отладка("Установка параметров шлюза SSH (интерфейс: %1, порт: %2)", СетевойИнтерфейс, ПортПодключения); + ПараметрыШлюза = Новый Соответствие; ПараметрыШлюза.Вставить("address", СетевойИнтерфейс); ПараметрыШлюза.Вставить("host-key", ПутьКЗакрытомуКлючу); - ПараметрыШлюза.Вставить("port", XMLСтрока(ПортПодключения)); + ПараметрыШлюза.Вставить("port", ПортПодключения); ПараметрыСпособовДоступаКСерверу.Вставить("ssh", ПараметрыШлюза); @@ -400,25 +451,14 @@ ИспользоватьШлюзSSH = Неопределено, ИспользоватьРасширеннуюФункциональностьКонифгуратора = Неопределено) Экспорт - ТипБулево = Тип("Булево"); - - Если ТипЗнч(ИспользоватьШлюзПрямогоДоступа) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("direct-gate", ИспользоватьШлюзПрямогоДоступа); - КонецЕсли; - - Если ТипЗнч(ИспользоватьШлюзHTTP) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("http-gate", ИспользоватьШлюзHTTP); - КонецЕсли; + Лог.Отладка("Установка параметров функциональности сервера"); - Если ТипЗнч(ИспользоватьШлюзSSH) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("ssh-gate", ИспользоватьШлюзSSH); - КонецЕсли; + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "direct-gate", ИспользоватьШлюзПрямогоДоступа); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "http-gate", ИспользоватьШлюзHTTP); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "ssh-gate", ИспользоватьШлюзSSH); + ВставитьЕслиБулево(ПараметрыФункциональностиСервера, "extended-designer-features", + ИспользоватьРасширеннуюФункциональностьКонифгуратора); - Если ТипЗнч(ИспользоватьРасширеннуюФункциональностьКонифгуратора) = ТипБулево Тогда - ПараметрыФункциональностиСервера.Вставить("extended-designer-features", - ИспользоватьРасширеннуюФункциональностьКонифгуратора); - КонецЕсли; - КонецПроцедуры // Параметры отладки текущего экземпляра автономномного сервера @@ -434,8 +474,11 @@ СетевойИнтерфейс = "localhost", ПарольОтладки = "") Экспорт + Лог.Отладка("Установка параметров отладки сервера (тип: %1, порт: %2, интерфейс: %3, пароль не выводится в лог)", + ТипОтладки, ПортОтладки, СетевойИнтерфейс); + ПараметрыОтладкиСервера.Вставить("type", ТипОтладки); - ПараметрыОтладкиСервера.Вставить("port", XMLСтрока(ПортОтладки)); + ПараметрыОтладкиСервера.Вставить("port", ПортОтладки); ПараметрыОтладкиСервера.Вставить("address", СетевойИнтерфейс); Если ЗначениеЗаполнено(ПарольОтладки) Тогда @@ -451,6 +494,8 @@ // Процедура ПараметрыВнешнегоСервераОтладки(АдресВнешнегоСервераОтладки) Экспорт + Лог.Отладка("Установка параметров внешнего сервера отладки (адрес: %1)", АдресВнешнегоСервераОтладки); + ПараметрыВнешнегоСервера = Новый Соответствие; ПараметрыВнешнегоСервера.Вставить("url", АдресВнешнегоСервераОтладки); @@ -460,23 +505,27 @@ КонецПроцедуры // СоздатьКонфигурационныйФайл -// Создание конфигурационного файла по ранее заполненным параметрам +// Создание конфигурационного файла по ранее заполненным параметрам. +// Файл записывается в формате YAML (сериализация - библиотека oscript-yaml). // Параметры: // ПутьКФайлу - Строка - полный путь к конфигурационному файлу Процедура СоздатьКонфигурационныйФайл(ПутьКФайлу) Экспорт - Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); - - ЗаписатьПараметрыСервера(Конфиг); - ЗаписатьПараметрыБазыДанных(Конфиг); - ЗаписатьПараметрыИнформационнойБазы(Конфиг); - ЗаписатьПараметрыВебДоступа(Конфиг); - ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг); - ЗаписатьПараметрыФункциональностиСервера(Конфиг); - ЗаписатьПараметрыОтладкиСервера(Конфиг); - - Конфиг.Закрыть(); + Лог.Информация("Создание конфигурационного файла автономного сервера: %1", ПутьКФайлу); + + ДанныеКонфигурации = СобратьДанныеКонфигурации(); + Если ДанныеКонфигурации.Количество() = 0 Тогда + // Историческое поведение: без установленных параметров создается пустой файл + Конфиг = Новый ЗаписьТекста(ПутьКФайлу, "UTF-8"); + Конфиг.Закрыть(); + Иначе + Парсер = Новый ПарсерYaml; + Парсер.ЗаписатьВФайл(ПутьКФайлу, ДанныеКонфигурации); + КонецЕсли; + + Лог.Отладка("Конфигурационный файл %1 записан (секций: %2)", ПутьКФайлу, ДанныеКонфигурации.Количество()); + КонецПроцедуры #КонецОбласти @@ -485,12 +534,15 @@ Процедура ПриСозданииОбъекта() + Лог = Логирование.ПолучитьЛог(СлужебныйIbcmdRunner.ИмяЛога()); + ПараметрыСервера = Новый Соответствие; ПараметрыСервернойБазыДанных = Новый Соответствие; ПараметрыФайловойБазыДанных = Новый Соответствие; ПараметрыИБ = Новый Соответствие; ПараметрыВеб_Аутентификация = Новый Соответствие; ПараметрыВеб_Разделители = Новый Соответствие; + ПараметрыВеб_Приложение = Новый Соответствие; ПараметрыВеб_ПубликацияOData = Новый Соответствие; ПараметрыВеб_РежимПовторногоИспользованияСеансов = Новый Соответствие; ПараметрыВебСервисовОбщие = Новый Соответствие; @@ -499,9 +551,9 @@ ПараметрыХТТПСервисовОбщие = Новый Соответствие; ПараметрыХТТПСервисов = Новый Соответствие; ПараметрыПубликацииДистрибутивов = Новый Соответствие; - мсвПараметрыВеб_Разделители = Новый Соответствие; - мсвПараметрыВебСервисов = Новый Соответствие; - мсвПараметрыХТТПСервисов = Новый Соответствие; + мсвПараметрыВеб_Разделители = Новый Массив; + мсвПараметрыВебСервисов = Новый Массив; + мсвПараметрыХТТПСервисов = Новый Массив; ПараметрыСпособовДоступаКСерверу = Новый Соответствие; ПараметрыФункциональностиСервера = Новый Соответствие; ПараметрыОтладкиСервера = Новый Соответствие; @@ -512,255 +564,165 @@ #Область СлужебныеПроцедурыИФункции -Процедура ЗаполнитьСекцию(КонфигФайл, Параметры, Уровень = 1) - - Если Параметры.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - Отступ = ""; - Для Счетчик = 1 По Уровень Цикл // BSLLS:UnusedLocalVariable-off - Отступ = Отступ + " "; - КонецЦикла; - - Для Каждого Параметр Из Параметры Цикл - ТипЗнчПараметра = ТипЗнч(Параметр.Значение); - - Если ТипЗнчПараметра = Тип("Число") ИЛИ - ТипЗнчПараметра = Тип("Строка") Тогда - Значение = Параметр.Значение; - ИначеЕсли ТипЗнчПараметра = Тип("Булево") Тогда - Значение = БулевоВСтроку(Параметр.Значение); - - ИначеЕсли ТипЗнчПараметра = Тип("Соответствие") Тогда - КонфигФайл.ЗаписатьСтроку(СтрШаблон("%1%2:", Отступ, Параметр.Ключ)); - ЗаполнитьСекцию(КонфигФайл, Параметр.Значение, Уровень + 1); - Продолжить; - - Иначе - ВызватьИсключение "Значение параметра имеет неизвестный тип"; - КонецЕсли; - - Строка = СтрШаблон("%1%2: %3", Отступ, Параметр.Ключ, Значение); - КонфигФайл.ЗаписатьСтроку(Строка); - - КонецЦикла; - -КонецПроцедуры +// Собрать полную структуру данных конфигурационного файла +// из ранее установленных параметров секций. +// Незаполненные секции в структуру не включаются. +// Возвращаемое значение: +// Соответствие - данные конфигурационного файла для сериализации в YAML +Функция СобратьДанныеКонфигурации() -Функция БулевоВСтроку(Значение) - Если Значение = Истина Тогда - Рез = "true"; - ИначеЕсли Значение = Ложь Тогда - Рез = "false"; - Иначе - ВызватьИсключение "Значение должно иметь тип Булево."; - КонецЕсли; - Возврат Рез; -КонецФункции + ДанныеКонфигурации = Новый Соответствие; -Процедура ЗаписатьПараметрыСервера(Конфиг) + СекцияБазыДанных = Новый Соответствие; + ПеренестиПараметры(СекцияБазыДанных, ПараметрыСервернойБазыДанных); + ПеренестиПараметры(СекцияБазыДанных, ПараметрыФайловойБазыДанных); - Если ПараметрыСервера.Количество() = 0 Тогда - Возврат; - КонецЕсли; + ДобавитьСекцию(ДанныеКонфигурации, "server", ПараметрыСервера); + ДобавитьСекцию(ДанныеКонфигурации, "database", СекцияБазыДанных); + ДобавитьСекцию(ДанныеКонфигурации, "infobase", ПараметрыИБ); + ДобавитьСекцию(ДанныеКонфигурации, "http", СобратьСекциюHTTP()); + ДобавитьСекцию(ДанныеКонфигурации, "gates", ПараметрыСпособовДоступаКСерверу); + ДобавитьСекцию(ДанныеКонфигурации, "features", ПараметрыФункциональностиСервера); + ДобавитьСекцию(ДанныеКонфигурации, "debug", ПараметрыОтладкиСервера); - Конфиг.ЗаписатьСтроку("server:"); - ЗаполнитьСекцию(Конфиг, ПараметрыСервера); + Возврат ДанныеКонфигурации; -КонецПроцедуры +КонецФункции -Процедура ЗаписатьПараметрыБазыДанных(Конфиг) +// Собрать секцию http со всеми подсекциями веб-доступа +// Возвращаемое значение: +// Соответствие - параметры секции http +Функция СобратьСекциюHTTP() - Если ПараметрыСервернойБазыДанных.Количество() = 0 И ПараметрыФайловойБазыДанных.Количество() = 0 Тогда - Возврат; + СекцияHTTP = Новый Соответствие; + + ПеренестиПараметры(СекцияHTTP, ПараметрыХТТП); + ДобавитьСекцию(СекцияHTTP, "auth", СобратьСекциюАутентификации()); + Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда + СекцияHTTP.Вставить("zones", мсвПараметрыВеб_Разделители); КонецЕсли; + ДобавитьСекцию(СекцияHTTP, "application", ПараметрыВеб_Приложение); + ДобавитьСекцию(СекцияHTTP, "odata", ПараметрыВеб_ПубликацияOData); + ДобавитьСекцию(СекцияHTTP, "web-services", + СобратьСекциюСервисов(ПараметрыВебСервисовОбщие, мсвПараметрыВебСервисов)); + ДобавитьСекцию(СекцияHTTP, "http-services", + СобратьСекциюСервисов(ПараметрыХТТПСервисовОбщие, мсвПараметрыХТТПСервисов)); + ДобавитьСекцию(СекцияHTTP, "pubdst", ПараметрыПубликацииДистрибутивов); - Конфиг.ЗаписатьСтроку("database:"); + Возврат СекцияHTTP; - Для Каждого Параметр Из ПараметрыСервернойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; +КонецФункции - Для Каждого Параметр Из ПараметрыФайловойБазыДанных Цикл - Строка = СтрШаблон(" %1: %2", Параметр.Ключ, Параметр.Значение); - Конфиг.ЗаписатьСтроку(Строка); - КонецЦикла; +// Собрать секцию аутентификации (auth) с подсекциями rely и provider +// Возвращаемое значение: +// Соответствие - параметры секции auth +Функция СобратьСекциюАутентификации() -КонецПроцедуры + СекцияАутентификации = Новый Соответствие; -Процедура ЗаписатьПараметрыИнформационнойБазы(Конфиг) - - Если ПараметрыИБ.Количество() = 0 Тогда - Возврат; + Если ПараметрыВеб_Аутентификация.Количество() = 0 Тогда + Возврат СекцияАутентификации; КонецЕсли; - Конфиг.ЗаписатьСтроку("infobase:"); - ЗаполнитьСекцию(Конфиг, ПараметрыИБ); - -КонецПроцедуры + СекцияRely = Новый Соответствие; + СекцияRely.Вставить("url", ПараметрыВеб_Аутентификация.Получить("url")); + СекцияRely.Вставить("lifetime", ПараметрыВеб_Аутентификация.Получить("lifetime")); + СекцияАутентификации.Вставить("rely", СекцияRely); -Процедура ЗаписатьПараметрыВебДоступа(Конфиг) + СекцияProvider = Новый Соответствие; + ВставитьЕслиЗаполнено(СекцияProvider, "return-to", ПараметрыВеб_Аутентификация.Получить("return-to")); + ВставитьЕслиЗаполнено(СекцияProvider, "providers", ПараметрыВеб_Аутентификация.Получить("providers")); + Если ПараметрыВеб_Аутентификация.Получить("allow-standard") = Ложь Тогда + СекцияProvider.Вставить("allow-standard", Ложь); + КонецЕсли; + ДобавитьСекцию(СекцияАутентификации, "provider", СекцияProvider); - ПропуститьСекциюHTTP = ПараметрыХТТП.Количество() = 0 - И ПараметрыВеб_Аутентификация.Количество() = 0 - И мсвПараметрыВеб_Разделители.Количество() = 0 - И ПараметрыВеб_ПубликацияOData.Количество() = 0 - И ПараметрыВебСервисовОбщие.Количество() = 0 - И ПараметрыХТТПСервисовОбщие.Количество() = 0 - И ПараметрыПубликацииДистрибутивов.Количество() = 0; + Возврат СекцияАутентификации; - Если ПропуститьСекциюHTTP Тогда - Возврат; - КонецЕсли; +КонецФункции - Конфиг.ЗаписатьСтроку("http:"); - ЗаписатьПараметрыВеб_ХТТП(Конфиг); - ЗаписатьПараметрыВеб_Аутентификация(Конфиг); - ЗаписатьПараметрыВеб_Разделители(Конфиг); - ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг); - ЗаписатьПараметрыВеб_ВебСервисов(Конфиг); - ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг); - ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг); - -КонецПроцедуры +// Собрать подсекцию сервисов (web-services или http-services): +// общие параметры плюс массив описаний отдельных сервисов под ключом service +// Параметры: +// ОбщиеПараметры - Соответствие - общие параметры сервисов +// МассивСервисов - Массив - массив соответствий с параметрами отдельных сервисов +// Возвращаемое значение: +// Соответствие - параметры подсекции сервисов +Функция СобратьСекциюСервисов(Знач ОбщиеПараметры, Знач МассивСервисов) -Процедура ЗаписатьПараметрыВеб_ХТТП(Конфиг) + СекцияСервисов = Новый Соответствие; - Если ПараметрыХТТП.Количество() > 0 Тогда - ЗаполнитьСекцию(Конфиг, ПараметрыХТТП); + Если ОбщиеПараметры.Количество() = 0 Тогда + Возврат СекцияСервисов; КонецЕсли; -КонецПроцедуры + ПеренестиПараметры(СекцияСервисов, ОбщиеПараметры); + Если МассивСервисов.Количество() > 0 Тогда + СекцияСервисов.Вставить("service", МассивСервисов); + КонецЕсли; -Процедура ЗаписатьПараметрыВеб_Аутентификация(Конфиг) - - Если ПараметрыВеб_Аутентификация.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" auth:"); - Конфиг.ЗаписатьСтроку(" rely:"); - Значение = ПараметрыВеб_Аутентификация.Получить("url"); - Конфиг.ЗаписатьСтроку(" url: " + Значение); - Значение = ПараметрыВеб_Аутентификация.Получить("lifetime"); - Конфиг.ЗаписатьСтроку(" lifetime: " + Значение); - Конфиг.ЗаписатьСтроку(" provider:"); - Значение = ПараметрыВеб_Аутентификация.Получить("return-to"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" return-to: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("providers"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" providers: " + Значение); - КонецЕсли; - Значение = ПараметрыВеб_Аутентификация.Получить("allow-standard"); - Если Значение = Ложь Тогда - Конфиг.ЗаписатьСтроку(" allow-standard: false"); - КонецЕсли; - КонецЕсли; + Возврат СекцияСервисов; -КонецПроцедуры +КонецФункции -Процедура ЗаписатьПараметрыВеб_Разделители(Конфиг) - - Если мсвПараметрыВеб_Разделители.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" zones:"); - Для Каждого Разделитель Из мсвПараметрыВеб_Разделители Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, Разделитель, 3); - КонецЦикла; - КонецЕсли; +// Добавить секцию в структуру данных, если она заполнена +// Параметры: +// Приемник - Соответствие - структура-приемник +// ИмяСекции - Строка - имя секции +// ПараметрыСекции - Соответствие - параметры секции +Процедура ДобавитьСекцию(Приемник, Знач ИмяСекции, Знач ПараметрыСекции) -КонецПроцедуры + Секция = Новый Соответствие; + ПеренестиПараметры(Секция, ПараметрыСекции); -Процедура ЗаписатьПараметрыВеб_ПубликацияOData(Конфиг) - - Если ПараметрыВеб_ПубликацияOData.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" odata:"); - Значение = ПараметрыВеб_ПубликацияOData.Получить("publish"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" publish: " + БулевоВСтроку(Значение)); - КонецЕсли; - Значение = ПараметрыВеб_ПубликацияOData.Получить("reuse-session"); - Если Значение <> Неопределено Тогда - Конфиг.ЗаписатьСтроку(" reuse-session:"); - ЗаполнитьСекцию(Конфиг, Значение, 3); - КонецЕсли; + Если Секция.Количество() = 0 Тогда + Возврат; КонецЕсли; -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_ВебСервисов(Конфиг) - - Если ПараметрыВебСервисовОбщие.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" web-services:"); - ЗаполнитьСекцию(Конфиг, ПараметрыВебСервисовОбщие, 2); - Если мсвПараметрыВебСервисов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" service:"); - Для Каждого ПараметрыВебСервиса Из мсвПараметрыВебСервисов Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, ПараметрыВебСервиса, 3); - КонецЦикла; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Процедура ЗаписатьПараметрыВеб_ХТТПСервисов(Конфиг) - - Если ПараметрыХТТПСервисовОбщие.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" http-services:"); - ЗаполнитьСекцию(Конфиг, ПараметрыХТТПСервисовОбщие, 2); - Если мсвПараметрыХТТПСервисов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" service:"); - Для Каждого ПараметрыХТТПСервиса Из мсвПараметрыХТТПСервисов Цикл - Конфиг.ЗаписатьСтроку(" -"); - ЗаполнитьСекцию(Конфиг, ПараметрыХТТПСервиса, 3); - КонецЦикла; - КонецЕсли; - КонецЕсли; - -КонецПроцедуры + Лог.Отладка("Секция '%1' включена в конфигурационный файл", ИмяСекции); -Процедура ЗаписатьПараметрыВеб_ПубликацииДистрибутивов(Конфиг) - - Если ПараметрыПубликацииДистрибутивов.Количество() > 0 Тогда - Конфиг.ЗаписатьСтроку(" pubdst:"); - ЗаполнитьСекцию(Конфиг, ПараметрыПубликацииДистрибутивов, 2); - КонецЕсли; + Приемник.Вставить(ИмяСекции, Секция); КонецПроцедуры -Процедура ЗаписатьПараметрыСпособовДоступаКСерверу(Конфиг) - - Если ПараметрыСпособовДоступаКСерверу.Количество() = 0 Тогда - Возврат; - КонецЕсли; +// Перенести в приемник все заполненные (не Неопределено) параметры источника. +// Незаполненный параметр не попадает в конфигурационный файл - +// автономный сервер использует значение по умолчанию. +// Параметры: +// Приемник - Соответствие - соответствие-приемник +// Источник - Соответствие - соответствие-источник +Процедура ПеренестиПараметры(Приемник, Знач Источник) - Конфиг.ЗаписатьСтроку("gates:"); - ЗаполнитьСекцию(Конфиг, ПараметрыСпособовДоступаКСерверу); + Для Каждого Параметр Из Источник Цикл + ВставитьЕслиЗаполнено(Приемник, Параметр.Ключ, Параметр.Значение); + КонецЦикла; КонецПроцедуры -Процедура ЗаписатьПараметрыФункциональностиСервера(Конфиг) +// Вставить значение в соответствие, если оно задано (не Неопределено) +// Параметры: +// Приемник - Соответствие - целевое соответствие +// Ключ - Строка - ключ +// Значение - Произвольный - значение +Процедура ВставитьЕслиЗаполнено(Приемник, Знач Ключ, Знач Значение) - Если ПараметрыФункциональностиСервера.Количество() = 0 Тогда - Возврат; + Если Значение <> Неопределено Тогда + Приемник.Вставить(Ключ, Значение); КонецЕсли; - Конфиг.ЗаписатьСтроку("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 da49a38..90f3a03 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" @@ -36,7 +36,9 @@ // Процедура СнятьСПоддержки() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Информация("Снятие конфигурации с поддержки"); НачатьЗаполнениеПараметровЗапуска("infobase config support disable"); ВыполнитьКоманду(); @@ -56,9 +58,13 @@ Знач ВосстановитьМетаданные ) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); Ожидаем.Что(ЗавершитьОперацию).ИмеетТип("Булево"); Ожидаем.Что(ВосстановитьМетаданные).ИмеетТип("Булево"); + + Лог.Информация("Тестирование и исправление информационной базы (ЗавершитьОперацию: %1, ВосстановитьМетаданные: %2)", + ЗавершитьОперацию, ВосстановитьМетаданные); + НачатьЗаполнениеПараметровЗапуска("infobase config repair"); Если ЗавершитьОперацию Тогда ПараметрыЗапуска.Добавить("--commit"); @@ -78,7 +84,9 @@ // Строка - список имен общих реквизитов конфигурации. Функция СписокОбщихРеквизитов() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Отладка("Получение списка общих реквизитов"); НачатьЗаполнениеПараметровЗапуска("infobase config data-separation list"); Результат = ВыполнитьКоманду(); @@ -93,7 +101,9 @@ // Строка - идентификатор. Функция ИДПоколенияДанных(Знач ИмяРасширения = "") Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + + Лог.Отладка("Получение идентификатора поколения данных (расширение: '%1')", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config generation-id"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения, ""); @@ -120,17 +130,16 @@ Знач НазначениеРасширения = "add-on" ) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ПрефиксИмен), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + ПроверитьИмя(ПрефиксИмен); Ожидаем.Что(СтрНайти("customization,add-on,patch", НРег(НазначениеРасширения)) > 0, - "Назначение расширения может быть одним из customization, add-on, patch").ЭтоИстина(); + СтрШаблон("Назначение расширения может быть одним из customization, add-on, patch, получено: '%1'", + НазначениеРасширения)) + .ЭтоИстина(); + + Лог.Информация("Создание расширения '%1' (префикс: '%2', назначение: %3)", + ИмяРасширения, ПрефиксИмен, НазначениеРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension create"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -164,13 +173,10 @@ // hash-sum : "DH5A+FGtydy+dZ9jsjV2ZBuskfE="
Функция ИнформацияОРасширении(Знач ИмяРасширения) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + Лог.Отладка("Получение информации о расширении '%1'", ИмяРасширения); НачатьЗаполнениеПараметровЗапуска("infobase config extension info"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -185,8 +191,9 @@ // Строка - Список расширений Функция СписокРасширений() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + Лог.Отладка("Получение списка расширений"); НачатьЗаполнениеПараметровЗапуска("infobase config extension list"); Результат = ВыполнитьКоманду(); @@ -194,7 +201,9 @@ КонецФункции // ИзменитьСвойстваРасширения -// Изменить свойства расширения +// Изменить свойства расширения. +// Параметры со значением Неопределено (для имени профиля безопасности - с пустой строкой) +// не изменяются. // Параметры: // ИмяРасширения - Строка - Имя расширения, у которого будем изменять свойства // Активность - Булево, Неопределено - Активность @@ -215,44 +224,27 @@ Знач ИспользуетсяВ_РИБ = Неопределено, Знач ОбластьДействия_ИБ = Неопределено) Экспорт - ТипБулево = "Булево"; - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + Ожидаем.Что(ИмяПрофиляБезопасности).ИмеетТип("Строка"); + Лог.Информация("Изменение свойств расширения '%1'", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config extension update"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); - Если Активность <> Неопределено Тогда - Ожидаем.Что(Активность).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--active=" + БулевоВСтроку(Активность)); - КонецЕсли; - - Если БезопасныйРежим <> Неопределено Тогда - Ожидаем.Что(БезопасныйРежим).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--safe-mode=" + БулевоВСтроку(БезопасныйРежим)); - КонецЕсли; + ДобавитьПараметрБулевоЕслиЗадан("--active", Активность); + ДобавитьПараметрБулевоЕслиЗадан("--safe-mode", БезопасныйРежим); - Ожидаем.Что(ИмяПрофиляБезопасности).ИмеетТип("Строка"); Если НЕ ПустаяСтрока(ИмяПрофиляБезопасности) Тогда ПараметрыЗапуска.Добавить("--security-profile-name=" + ОбернутьВКавычки(ИмяПрофиляБезопасности)); КонецЕсли; - Если ЗащитаОтОпасныхДействий <> Неопределено Тогда - Ожидаем.Что(ЗащитаОтОпасныхДействий).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--unsafe-action-protection=" + БулевоВСтроку(ЗащитаОтОпасныхДействий)); - КонецЕсли; - - Если ИспользуетсяВ_РИБ <> Неопределено Тогда - Ожидаем.Что(ИспользуетсяВ_РИБ).ИмеетТип(ТипБулево); - ПараметрыЗапуска.Добавить("--used-in-distributed-infobase=" + БулевоВСтроку(ИспользуетсяВ_РИБ)); - КонецЕсли; + ДобавитьПараметрБулевоЕслиЗадан("--unsafe-action-protection", ЗащитаОтОпасныхДействий); + ДобавитьПараметрБулевоЕслиЗадан("--used-in-distributed-infobase", ИспользуетсяВ_РИБ); Если ОбластьДействия_ИБ <> Неопределено Тогда - Ожидаем.Что(ОбластьДействия_ИБ).ИмеетТип(ТипБулево); + Ожидаем.Что(ОбластьДействия_ИБ).ИмеетТип("Булево"); Если ОбластьДействия_ИБ Тогда ПараметрыЗапуска.Добавить("--scope=infobase"); @@ -276,13 +268,11 @@ Знач ИмяРасширения ) Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, - "Версия платформы 1С должна быть старше, чем 8.3.20") - .ЭтоИстина(); - Ожидаем.Что(ЯвляетсяИменем(ИмяРасширения), - "Параметром должна быть строка, удовлетворяющая требованиям к имени переменной") - .ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + ПроверитьИмя(ИмяРасширения); + Лог.Информация("Удаление расширения '%1'", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config extension delete"); ДобавитьПараметрЕслиЗаполнен("--name", ИмяРасширения); @@ -296,8 +286,10 @@ // Процедура УдалитьВсеРасширения() Экспорт - Ожидаем.Что(СравнитьВерсии(Версия, "8.3.20") > 0, "Версия платформы 1С должна быть старше, чем 8.3.20").ЭтоИстина(); + ПроверитьМинимальнуюВерсиюПлатформы("8.3.20"); + Лог.Информация("Удаление всех расширений"); + НачатьЗаполнениеПараметровЗапуска("infobase config extension delete --all"); ВыполнитьКоманду(); @@ -319,6 +311,7 @@ Если Путь <> Неопределено Тогда Ожидаем.Что(Путь).ИмеетТип("Строка"); + Лог.Отладка("Установка пути к приложению ibcmd: %1", Путь); ПутьКПриложению = Путь; Версия(); КонецЕсли; @@ -341,33 +334,24 @@ Процедура УстановитьПараметрыСервернойИБ(Знач ТипСУБД,Знач СерверСУБД,Знач ИмяБД,Знач ПользовательБД,Знач ПарольБД) Экспорт - ПараметрыФайловойИБ.Очистить(); - ПараметрыСервернойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); - - ПеременнаяСредыПользовательБД = "IBCMD_DB_USR"; - ПеременнаяСредыПарольБД = "IBCMD_DB_PSW"; - Ожидаем.Что(СтрНайти("mssqlserver,postgresql,ibmdb2,oracledatabase", НРег(ТипСУБД)) > 0, - "Тип СУБД должен быть один из MSSQLServer, PostgreSQL,IBMDB2,OracleDatabase").ЭтоИстина(); + СтрШаблон("Тип СУБД должен быть один из MSSQLServer, PostgreSQL,IBMDB2,OracleDatabase, получено: '%1'", ТипСУБД)) + .ЭтоИстина(); + ОчиститьОбщиеПараметрыИБ(); - - + Лог.Отладка("Установлены параметры серверной ИБ (СУБД: %1, сервер: %2, база: %3, пользователь и пароль передаются через переменные среды)", + ТипСУБД, СерверСУБД, ИмяБД); + + ПеременнаяСредыПользовательБД = "IBCMD_DB_USR"; + ПеременнаяСредыПарольБД = "IBCMD_DB_PSW"; ПараметрыСервернойИБ.Добавить(СтрШаблон("--dbms=%1", ТипСУБД)); ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-server=%1", СерверСУБД)); ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-name=%1", ИмяБД)); - - Если ЗначениеЗаполнено(ПользовательБД) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПользовательБД, ПользовательБД); - ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-user=%1", ШаблонПеременнойСреды(ПеременнаяСредыПользовательБД))); - КонецЕсли; - Если ЗначениеЗаполнено(ПарольБД) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПарольБД, ПарольБД); - ПараметрыСервернойИБ.Добавить(СтрШаблон("--db-pwd=%1", ШаблонПеременнойСреды(ПеременнаяСредыПарольБД))); - КонецЕсли; + ДобавитьСекретныйПараметр(ПараметрыСервернойИБ, "--db-user", ПеременнаяСредыПользовательБД, ПользовательБД); + ДобавитьСекретныйПараметр(ПараметрыСервернойИБ, "--db-pwd", ПеременнаяСредыПарольБД, ПарольБД); КонецПроцедуры @@ -377,9 +361,9 @@ // КаталогИБ - Строка - Путь к файловой информационной базе; Процедура УстановитьПараметрыФайловойИБ(Знач КаталогИБ) Экспорт - ПараметрыСервернойИБ.Очистить(); - ПараметрыФайловойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); + ОчиститьОбщиеПараметрыИБ(); + + Лог.Отладка("Установлены параметры файловой ИБ (каталог: %1)", КаталогИБ); ПараметрыФайловойИБ.Добавить("--db-path=" + ОбернутьВКавычки(КаталогИБ)); @@ -391,10 +375,10 @@ // ИмяФайла - Строка - Полный путь к файлу конфигурации автономного сервера (yml); Процедура УстановитьКонфигурационныйФайл(Знач ИмяФайла) Экспорт - ПараметрыСервернойИБ.Очистить(); - ПараметрыФайловойИБ.Очистить(); - ПараметрыКонфигурацииАС.Очистить(); + ОчиститьОбщиеПараметрыИБ(); + Лог.Отладка("Установлен конфигурационный файл автономного сервера: %1", ИмяФайла); + ПараметрыКонфигурацииАС.Добавить("--config=" + ОбернутьВКавычки(ИмяФайла)); КонецПроцедуры @@ -415,15 +399,13 @@ Если СравнитьВерсии(Версия, "8.3.18.1563") > 0 Тогда - Если ЗначениеЗаполнено(ПользовательИБ) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПользовательИБ, ПользовательИБ); - ПараметрыАвторизацииИБ.Добавить(СтрШаблон("--user=%1", ШаблонПеременнойСреды(ПеременнаяСредыПользовательИБ))); - КонецЕсли; + Лог.Отладка("Установлены параметры авторизации ИБ (пользователь: %1, пароль передается через переменную среды)", + ПользовательИБ); - Если ЗначениеЗаполнено(ПарольИБ) Тогда - ПеременныеСредыКоманды.Вставить(ПеременнаяСредыПарольИБ, ПарольИБ); - ПараметрыАвторизацииИБ.Добавить(СтрШаблон("--password=%1", ШаблонПеременнойСреды(ПеременнаяСредыПарольИБ))); - КонецЕсли; + ДобавитьСекретныйПараметр(ПараметрыАвторизацииИБ, "--user", ПеременнаяСредыПользовательИБ, ПользовательИБ); + ДобавитьСекретныйПараметр(ПараметрыАвторизацииИБ, "--password", ПеременнаяСредыПарольИБ, ПарольИБ); + Иначе + Лог.Отладка("Параметры авторизации ИБ не установлены: версия платформы %1 не старше 8.3.18.1563", Версия); КонецЕсли; КонецПроцедуры @@ -438,7 +420,10 @@ ПараметрыАвтономногоСервера.Очистить(); Ожидаем.Что(КаталогДанныхАС).ИмеетТип("Строка"); Если СравнитьВерсии(Версия, "8.3.20") > 0 Тогда + Лог.Отладка("Установлен каталог данных автономного сервера: %1", КаталогДанныхАС); ПараметрыАвтономногоСервера.Добавить("--data=" + ОбернутьВКавычки(КаталогДанныхАС)); + Иначе + Лог.Отладка("Каталог данных автономного сервера не установлен: версия платформы %1 не старше 8.3.20", Версия); КонецЕсли; КонецПроцедуры @@ -453,16 +438,9 @@ Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - НачатьЗаполнениеПараметровЗапуска("infobase create"); + Лог.Информация("Создание пустой информационной базы"); - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - - ПараметрыЗапуска.Добавить("--create-database"); - - ПараметрыЗапуска.Добавить("--force"); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат); КонецПроцедуры @@ -479,17 +457,9 @@ Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - НачатьЗаполнениеПараметровЗапуска("infobase create"); + Лог.Информация("Создание информационной базы из файла выгрузки %1", ПутьКФайлуВыгрузки); - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--restore", ПутьКФайлуВыгрузки, ""); - - ПараметрыЗапуска.Добавить("--force"); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--restore", ПутьКФайлуВыгрузки); КонецПроцедуры // СоздатьИБИзФайлаКонфигурации @@ -505,17 +475,9 @@ Знач Локаль = Неопределено, Знач СмещениеДат = 2000) Экспорт - НачатьЗаполнениеПараметровЗапуска("infobase create"); + Лог.Информация("Создание информационной базы из файла конфигурации %1", ПутьКФайлуКонфигурации); - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--load", ПутьКФайлуКонфигурации, ""); - - ПараметрыЗапуска.Добавить("--force"); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--load", ПутьКФайлуКонфигурации); КонецПроцедуры // СоздатьИБИзФайловКонфигурации @@ -532,17 +494,9 @@ Знач СмещениеДат = 2000 ) Экспорт - НачатьЗаполнениеПараметровЗапуска("infobase create"); + Лог.Информация("Создание информационной базы из файлов конфигурации (каталог: %1)", ПутьККаталогуВыгрузки); - ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); - ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); - ПараметрыЗапуска.Добавить("--create-database"); - - ДобавитьПараметрЕслиЗаполнен("--import", ПутьККаталогуВыгрузки, ""); - - ПараметрыЗапуска.Добавить("--force"); - - ВыполнитьКоманду(); + ВыполнитьСозданиеИБ(Локаль, СмещениеДат, "--import", ПутьККаталогуВыгрузки); КонецПроцедуры // ВыгрузитьДанныеИБ @@ -551,6 +505,8 @@ // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ВыгрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт + Лог.Информация("Выгрузка данных информационной базы в файл %1", ПутьКФайлуВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase dump"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); @@ -565,6 +521,8 @@ // ПутьКФайлуВыгрузки - Строка - Путь к файлу выгрузки Процедура ЗагрузитьДанныеИБ(Знач ПутьКФайлуВыгрузки) Экспорт + Лог.Информация("Загрузка данных информационной базы из файла %1", ПутьКФайлуВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase restore"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ПутьКФайлуВыгрузки)); @@ -573,15 +531,6 @@ КонецПроцедуры -// // Очистить информационную базу -// Процедура ОчиститьИБ() Экспорт - -// НачатьЗаполнениеПараметровЗапуска("infobase clear"); - -// ВыполнитьКоманду(); - -// КонецПроцедуры - // ЗагрузитьКонфигурацию // Загрузить конфигурацию из файла // Параметры: @@ -590,6 +539,8 @@ // основная конфигурация Процедура ЗагрузитьКонфигурацию(Знач ПутьКФайлуКонфигурации, Знач ИмяРасширения = "") Экспорт + Лог.Информация("Загрузка конфигурации из файла %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config load"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); @@ -612,12 +563,15 @@ Знач ИмяРасширения = "", Знач ВыгружатьОсновнуюКонфигурацию = ЛОЖЬ) Экспорт + Лог.Информация("Выгрузка конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуКонфигурации, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config save"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - // ПараметрыЗапуска.Добавить("--force"); Если ВыгружатьОсновнуюКонфигурацию Тогда - Если СравнитьВерсии(Версия, "8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда ПараметрыЗапуска.Добавить("--db"); Иначе ПараметрыЗапуска.Добавить("--staging"); @@ -636,6 +590,8 @@ // Строка - строка консольного вывода команды Функция ПроверитьКонфигурацию(Знач ИмяРасширения = "") Экспорт + Лог.Отладка("Проверка конфигурации (расширение: '%1')", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config check"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); @@ -665,15 +621,22 @@ Знач ДинамическоеОбновление = "auto", Знач ЗавершатьСеансы = "auto") Экспорт + Лог.Информация("Обновление конфигурации базы данных (расширение: '%1', динамическое обновление: %2, завершение сеансов: %3)", + ИмяРасширения, ДинамическоеОбновление, ЗавершатьСеансы); + НачатьЗаполнениеПараметровЗапуска("infobase config apply"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); ПараметрыЗапуска.Добавить("--force"); - Если СравнитьВерсии(Версия, "8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ДинамическоеОбновление) > 0, - "Должно быть одно из auto, disable, prompt, force").ЭтоИстина(); + СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ДинамическоеОбновление)) + .ЭтоИстина(); Ожидаем.Что(СтрНайти("auto,disable,prompt,force", ЗавершатьСеансы) > 0, - "Должно быть одно из auto, disable, prompt, force").ЭтоИстина(); + СтрШаблон("Должно быть одно из auto, disable, prompt, force, получено: '%1'", ЗавершатьСеансы)) + .ЭтоИстина(); ДобавитьПараметрЕслиЗаполнен("--dynamic", ДинамическоеОбновление, "auto"); ДобавитьПараметрЕслиЗаполнен("--session-terminate", ЗавершатьСеансы, "auto"); КонецЕсли; @@ -688,6 +651,8 @@ // ИмяРасширения - Строка - имя расширения Процедура ВозвратитьсяККонфигурацииБазыДанных(Знач ИмяРасширения = "") Экспорт + Лог.Информация("Возврат к конфигурации базы данных (расширение: '%1')", ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config reset"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); @@ -702,6 +667,8 @@ // ИмяРасширения - Строка - Имя расширения Процедура ВыгрузитьВФайлСостояниеКонфигурации(Знач ПутьКФайлуXML, Знач ИмяРасширения = "") Экспорт + Лог.Информация("Выгрузка состояния конфигурации в файл %1 (расширение: '%2')", ПутьКФайлуXML, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export info"); ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(ПутьКФайлуXML)); @@ -725,14 +692,15 @@ Знач ВыводитьВКраткомФормате = ЛОЖЬ ) Экспорт + Лог.Информация("Выгрузка изменений конфигурации в файл %1 (базовый файл: %2, расширение: '%3')", + ПутьКФайлуXMLИзменений, ПутьКФайлуXMLВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export status"); ДобавитьПараметрЕслиЗаполнен("--out", ПутьКФайлуXMLИзменений); ДобавитьПараметрЕслиЗаполнен("--base", ПутьКФайлуXMLВыгрузки); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если ВыводитьВКраткомФормате Тогда - ПараметрыЗапуска.Добавить("--short"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--short", ВыводитьВКраткомФормате); ВыполнитьКоманду(); КонецПроцедуры @@ -761,30 +729,22 @@ Ожидаем.Что(Объекты).ИмеетТип("Массив"); + Лог.Информация("Выгрузка объектов конфигурации в файлы (каталог: %1, объектов: %2, расширение: '%3')", + КаталогВыгрузки, Объекты.Количество(), ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export objects"); ДобавитьПараметрЕслиЗаполнен("--out", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если ВыгружатьРекурсивно Тогда - ПараметрыЗапуска.Добавить("--recursive"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--recursive", ВыгружатьРекурсивно); Если Объекты.Количество() > 0 Тогда - Для Каждого Объект Из Объекты Цикл - ПараметрыЗапуска.Добавить(Объект); - КонецЦикла; + ДобавитьМассивПараметров(Объекты); Иначе ВызватьИсключение "Не заданы объекты конфигурации для экспорта в файлы!"; КонецЕсли; Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); КонецЕсли; ВыполнитьКоманду(); КонецПроцедуры @@ -806,17 +766,12 @@ Знач НаСервере = Ложь, Знач КоличествоПотоков = 0) Экспорт + Лог.Информация("Выгрузка всех расширений в файлы (каталог: %1)", КаталогВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase config export all-extensions"); Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); @@ -852,24 +807,16 @@ Знач НеВыгружатьНеСуществующиеОбъекты = Ложь ) Экспорт + Лог.Информация("Выгрузка конфигурации в файлы (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config export"); ДобавитьПараметрЕслиЗаполнен("--base", ОбернутьВКавычки(ПутьКФайлуXMLВыгрузки), """"""); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если Синхронизировать Тогда - ПараметрыЗапуска.Добавить("--sync"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--sync", Синхронизировать); Если СравнитьВерсии(Версия, "8.3.21") > 0 Тогда - Если ВАрхив Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; - Если НаСервере Тогда - ПараметрыЗапуска.Добавить("--server"); - КонецЕсли; - ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); - Если НеВыгружатьНеСуществующиеОбъекты Тогда - ПараметрыЗапуска.Добавить("--ignore-unresolved-refs"); - КонецЕсли; + ДобавитьПараметрыФоновойВыгрузки(ВАрхив, НаСервере, КоличествоПотоков); + ДобавитьФлагЕслиИстина("--ignore-unresolved-refs", НеВыгружатьНеСуществующиеОбъекты); КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); ВыполнитьКоманду(); @@ -888,15 +835,17 @@ Знач ОтключитьПроверку = Ложь ) Экспорт + Лог.Информация("Загрузка конфигурации из файлов (каталог: %1, расширение: '%2')", КаталогВыгрузки, ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config import"); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если СравнитьВерсии(Версия,"8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); @@ -922,20 +871,21 @@ Ожидаем.Что(ВыбранныеФайлы).ИмеетТип("Массив"); Ожидаем.Что(ВыбранныеФайлы, "Не заданы файлы конфигурации для импорта в объекты метаданных!").Заполнено(); + Лог.Информация("Загрузка выбранных файлов конфигурации (каталог: %1, файлов: %2, расширение: '%3')", + КаталогВыгрузки, ВыбранныеФайлы.Количество(), ИмяРасширения); + НачатьЗаполнениеПараметровЗапуска("infobase config import files"); ДобавитьПараметрЕслиЗаполнен("--base-dir", ОбернутьВКавычки(КаталогВыгрузки)); ДобавитьПараметрЕслиЗаполнен("--extension", ИмяРасширения, ""); - Если СравнитьВерсии(Версия,"8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; - Если ИзАрхива Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); + ДобавитьФлагЕслиИстина("--archive", ИзАрхива); КонецЕсли; ИмяФайлаПараметров = ВременныеФайлы.НовоеИмяФайла("txt"); @@ -944,18 +894,7 @@ ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ВыбранныйФайл)); Иначе - СтрокаДляЗаписи = ""; - Если ЭтоWindows Тогда - Кодировка = КодировкаТекста.ANSI; - Иначе - Кодировка = КодировкаТекста.UTF8NoBOM; - КонецЕсли; - ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПараметров, Кодировка); - Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл - СтрокаДляЗаписи = ?(СтрокаДляЗаписи="", "", Символы.ПС)+ СокрЛП(ВыбранныйФайл); - КонецЦикла; - ЗаписьТекста.ЗаписатьСтроку(СокрЛП(СтрокаДляЗаписи),""); - ЗаписьТекста.Закрыть(); + ЗаписатьСписокФайловВФайлПараметров(ИмяФайлаПараметров, ВыбранныеФайлы); ПараметрыЗапуска.Добавить("<"); ПараметрыЗапуска.Добавить(ОбернутьВКавычки(ИмяФайлаПараметров)); @@ -980,17 +919,17 @@ Знач ИзАрхива = Ложь ) Экспорт + Лог.Информация("Загрузка всех расширений из файлов (каталог: %1)", КаталогВыгрузки); + НачатьЗаполнениеПараметровЗапуска("infobase config import all-extensions"); - Если СравнитьВерсии(Версия,"8.3.20") Тогда + // Здесь сохранено историческое поведение: условие срабатывает + // для любой версии платформы, кроме равной 8.3.20. + Если СравнитьВерсии(Версия, "8.3.20") <> 0 Тогда Ожидаем.Что(ОтключитьПроверку).ИмеетТип("Булево"); Ожидаем.Что(ИзАрхива).ИмеетТип("Булево"); - Если ОтключитьПроверку Тогда - ПараметрыЗапуска.Добавить("--no-check"); - КонецЕсли; - Если ИзАрхива Тогда - ПараметрыЗапуска.Добавить("--archive"); - КонецЕсли; + ДобавитьФлагЕслиИстина("--no-check", ОтключитьПроверку); + ДобавитьФлагЕслиИстина("--archive", ИзАрхива); КонецЕсли; ПараметрыЗапуска.Добавить(ОбернутьВКавычки(КаталогВыгрузки)); @@ -1049,53 +988,9 @@ // Функция ОписанияРасширений() Экспорт - ОписанияРасширений = Новый Массив; - СписокРасширений = СписокРасширений(); - Если Не ЗначениеЗаполнено(СписокРасширений) Тогда - Возврат ОписанияРасширений; - КонецЕсли; - - ИндикаторБлока = "name :"; - - Для Каждого БлокТекста Из СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(СписокРасширений, ИндикаторБлока, Истина, Истина) Цикл - - СтрокиБлока = СтрРазделить(БлокТекста, Символы.ПС); - Если Не ЗначениеЗаполнено(СтрокиБлока) Тогда - Продолжить; - КонецЕсли; - - СтрокаСИменем = СтрокиБлока[0]; - СтрокаСИменем = СтрЗаменить(СтрокаСИменем, """", ""); - СтрокаСИменем = СтрЗаменить(СтрокаСИменем, символы.ВК, ""); - - СтрокиБлока.Удалить(0); - - ОписаниеРасширения = НовыйОписаниеРасширения(); - - ОписаниеРасширения.Вставить("name", СтрокаСИменем); - - Для Каждого СтрокаСвойства Из СтрокиБлока Цикл - - ИмяЗначение = СтрРазделить(СтрокаСвойства, ":", Ложь); - - ИмяСвойства = СокрЛП(ИмяЗначение[0]); - ЗначениеСвойства = СтрЗаменить(СокрЛП(ИмяЗначение[1]), """", ""); - - Если ТипЗнч(ОписаниеРасширения.Получить(ИмяСвойства)) = Тип("Булево") Тогда - ЗначениеСвойства = СтрокаВБулево(ЗначениеСвойства); - КонецЕсли; - - ОписаниеРасширения.Вставить(ИмяСвойства, ЗначениеСвойства); - - КонецЦикла; - - ОписанияРасширений.Добавить(ОписаниеРасширения); - - КонецЦикла; - - Возврат ОписанияРасширений; + Возврат РазобратьСписокРасширений(СписокРасширений); КонецФункции @@ -1118,50 +1013,54 @@ // число меньше 0, если ЭтаВерсия < БольшеЧемВерсия. // Функция СравнитьВерсии(Знач ЭтаВерсия, Знач БольшеЧемВерсия) Экспорт - - Ожидаем.Что(ЭтаВерсия).ИмеетТип("Строка"); - Ожидаем.Что(БольшеЧемВерсия).ИмеетТип("Строка"); - - компонентыЭтойВерсии = МассивКомпонентВерсии( ЭтаВерсия ); - компонентыДругойВерсии = МассивКомпонентВерсии( БольшеЧемВерсия ); - // Выравниваем количество компонент + Возврат СлужебныйIbcmdRunner.СравнитьВерсии(ЭтаВерсия, БольшеЧемВерсия); - вГраница = Макс( компонентыЭтойВерсии.Количество(), компонентыДругойВерсии.Количество() ) - 1; +КонецФункции - Для ц = компонентыЭтойВерсии.Количество() - 1 По ВГраница Цикл - компонентыЭтойВерсии.Добавить(0); - КонецЦикла; +// Получить имя лога продукта +// +// Возвращаемое значение: +// Строка - имя лога продукта +// +Функция ИмяЛога() Экспорт + Возврат СлужебныйIbcmdRunner.ИмяЛога(); +КонецФункции - Для ц = компонентыДругойВерсии.Количество() - 1 По ВГраница Цикл - компонентыДругойВерсии.Добавить(0); - КонецЦикла; +// РазобратьСписокРасширений +// Разбирает текстовый вывод команды "extension list" в массив описаний расширений. +// Выделен в отдельный метод для возможности модульного тестирования разбора. +// +// Параметры: +// ТекстСпискаРасширений - Строка - вывод команды ibcmd infobase config extension list +// +// Возвращаемое значение: +// Массив - массив соответствий, см. НовыйОписаниеРасширения() +// +Функция РазобратьСписокРасширений(Знач ТекстСпискаРасширений) Экспорт - результат = 0; + ОписанияРасширений = Новый Массив; - Для ц = 0 По вГраница Цикл + Если Не ЗначениеЗаполнено(ТекстСпискаРасширений) Тогда + Возврат ОписанияРасширений; + КонецЕсли; + + ИндикаторБлока = "name :"; - Если компонентыЭтойВерсии[ц] > компонентыДругойВерсии[ц] Тогда - результат = 1; - Прервать; - ИначеЕсли компонентыЭтойВерсии[ц] < компонентыДругойВерсии[ц] Тогда - результат = -1; - Прервать; + БлокиТекста = СтроковыеФункции.РазложитьСтрокуВМассивПодстрок(ТекстСпискаРасширений, ИндикаторБлока, Истина, Истина); + Для Каждого БлокТекста Из БлокиТекста Цикл + + ОписаниеРасширения = РазобратьБлокОписанияРасширения(БлокТекста); + Если ОписаниеРасширения <> Неопределено Тогда + ОписанияРасширений.Добавить(ОписаниеРасширения); КонецЕсли; - КонецЦикла; + КонецЦикла; - Возврат результат; + Лог.Отладка("Разобрано описаний расширений: %1", ОписанияРасширений.Количество()); -КонецФункции + Возврат ОписанияРасширений; -// Получить имя лога продукта -// -// Возвращаемое значение: -// Строка - имя лога продукта -// -Функция ИмяЛога() Экспорт - Возврат "oscript.lib.ibcmdrunner"; КонецФункции #КонецОбласти @@ -1179,7 +1078,7 @@ // Функция ВыполнитьКоманду(УстановленныйКодВозврата = 0) - Если ТипЗнч(УстановленныйКодВозврата) = Тип("Массив") Тогда + Если ТипЗнч(УстановленныйКодВозврата) = Тип("Массив") Тогда УспешныеКодыВозврата = УстановленныйКодВозврата; Иначе УспешныеКодыВозврата = Новый Массив; @@ -1188,6 +1087,10 @@ КомандаВыполнения = ПутьКПриложению; + Лог.Отладка("Запуск: %1 %2", КомандаВыполнения, СтрСоединить(ПараметрыЗапуска, " ")); + + НачалоВыполнения = ТекущаяУниверсальнаяДатаВМиллисекундах(); + Команда = Новый Команда(); Команда.УстановитьПеременныеСреды(Новый Соответствие); Команда.УстановитьПеременныеСреды(ПеременныеСредыКоманды); @@ -1198,8 +1101,24 @@ КодВозврата = Команда.Исполнить(); + ДлительностьМс = ТекущаяУниверсальнаяДатаВМиллисекундах() - НачалоВыполнения; + Лог.Отладка("Команда завершена за %1 мс с кодом возврата %2", ДлительностьМс, КодВозврата); + Если УспешныеКодыВозврата.Найти(КодВозврата) = Неопределено Тогда - ВызватьИсключение Команда.ПолучитьВывод(); + ОжидаемыеКоды = ""; + Для Каждого Код Из УспешныеКодыВозврата Цикл + ОжидаемыеКоды = ОжидаемыеКоды + ?(ОжидаемыеКоды = "", "", ", ") + Код; + КонецЦикла; + ТекстОшибки = СтрШаблон("%1 + |Команда ibcmd завершилась с недопустимым кодом возврата %2 (ожидались коды: %3). + |Команда: %4 %5", + Команда.ПолучитьВывод(), + КодВозврата, + ОжидаемыеКоды, + КомандаВыполнения, + СтрСоединить(ПараметрыЗапуска, " ")); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецЕсли; Возврат Команда.ПолучитьВывод(); @@ -1224,15 +1143,8 @@ // Возвращаемое значение: // - Строка - обернутая в кавычки строка Функция ОбернутьВКавычки(Знач Строка) - - Если Сред(Строка,1,1) = """" И - Сред(Строка, СтрДлина(Строка), 1) = """" Тогда - Результат = Строка; - Иначе - Результат = """" + Строка + """"; - КонецЕсли; - Возврат Результат; + Возврат СлужебныйIbcmdRunner.ОбернутьВКавычки(Строка); КонецФункции @@ -1241,136 +1153,116 @@ Процедура ДобавитьОбщиеПараметрыИБ() Если ПараметрыСервернойИБ.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыСервернойИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; + ДобавитьМассивПараметров(ПараметрыСервернойИБ); ИначеЕсли ПараметрыФайловойИБ.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыФайловойИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; + ДобавитьМассивПараметров(ПараметрыФайловойИБ); ИначеЕсли ПараметрыКонфигурацииАС.Количество() > 0 Тогда - Для Каждого Элемент Из ПараметрыКонфигурацииАС Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; + ДобавитьМассивПараметров(ПараметрыКонфигурацииАС); Иначе - ВызватьИсключение "Необходимо установить общие параметры информационной базы!"; + ВызватьИсключение СтрШаблон( + "Необходимо установить общие параметры информационной базы! + |Перед выполнением команды '%1' вызовите один из методов: + |УстановитьПараметрыФайловойИБ, УстановитьПараметрыСервернойИБ или УстановитьКонфигурационныйФайл.", + ПараметрыЗапуска[0]); КонецЕсли; Если ПараметрыЗапуска.Найти("infobase create") = Неопределено Тогда - Если ПараметрыАвторизацииИБ.Количество() > 0 Тогда - Для каждого Элемент Из ПараметрыАвторизацииИБ Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; - КонецЕсли; + ДобавитьМассивПараметров(ПараметрыАвторизацииИБ); КонецЕсли; - Если ПараметрыАвтономногоСервера.Количество() > 0 Тогда - Для каждого Элемент Из ПараметрыАвтономногоСервера Цикл - ПараметрыЗапуска.Добавить(Элемент); - КонецЦикла; - КонецЕсли; + ДобавитьМассивПараметров(ПараметрыАвтономногоСервера); КонецПроцедуры -// Раскладывает строку с версией на компоненты -// Параметры: -// пВерсия - Строка - Версия -// Возвращаемое значение: -// Массив - массив чисел -// -Функция МассивКомпонентВерсии( Знач пВерсия ) - - // Убираем все пробелы. Считаем "1 002" = 1002 - - регулярноеВыражение = Новый РегулярноеВыражение( "\s" ); - строкаБезПробелов = регулярноеВыражение.Заменить( пВерсия, "" ); +// Очистить массивы взаимоисключающих общих параметров информационной базы. +// Вызывается перед установкой одного из вариантов подключения к ИБ: +// файлового, серверного или через конфигурационный файл автономного сервера. +Процедура ОчиститьОбщиеПараметрыИБ() - // Вырезаем все числа. Считаем, что любой разделитель является именно - // разделителем между компонентами, а не дробным числом, например - регулярноеВыражение = Новый РегулярноеВыражение( "(\d+)" ); + ПараметрыСервернойИБ.Очистить(); + ПараметрыФайловойИБ.Очистить(); + ПараметрыКонфигурацииАС.Очистить(); - массивСовпадений = регулярноеВыражение.НайтиСовпадения( строкаБезПробелов ); +КонецПроцедуры - массивКомпонент = Новый Массив; -// !!! Следующие параметры при версии платформы < 8.3.21 игнорируются !!! -// ВАрхив - Булево - выгьружать в zip-архив XML-файлов. Параметр КаталогВыгрузки должен быть именем файла. -// НаСервере - Булево - если Истина, то выгружать на сервере. -// КоличествоПотоков - Число - количество потоков выгрузки. По умолчанию будет создано количество потоков, -// по количеству ядер процессоров. - Для каждого цЭлемент Из массивСовпадений Цикл - массивКомпонент.Добавить( Число( цЭлемент.Значение ) ); - КонецЦикла; +// Добавить все элементы массива в параметры запуска +// Параметры: +// МассивПараметров - Массив - добавляемые параметры +Процедура ДобавитьМассивПараметров(Знач МассивПараметров) - Возврат массивКомпонент; + Для Каждого Элемент Из МассивПараметров Цикл + ПараметрыЗапуска.Добавить(Элемент); + КонецЦикла; -КонецФункции +КонецПроцедуры -// Для значения типа Булево возвращает yes или no +// Добавить в массив параметр, значение которого передается через переменную среды +// (имя пользователя, пароль). В командную строку попадает только подстановка +// переменной среды, само значение в параметрах и логах не появляется. // Параметры: -// Значение - Булево - значение -// Возвращаемое значение: -// Строка - yes или no -// -Функция БулевоВСтроку(Значение) - Ожидаем.Что(Значение).ИмеетТип("Булево"); - Рез = "no"; - Если Значение Тогда - Рез = "yes"; +// МассивПараметров - Массив - массив, в который добавляется параметр +// ИмяПараметра - Строка - имя параметра командной строки (например, "--db-pwd") +// ИмяПеременнойСреды - Строка - имя переменной среды для передачи значения +// Значение - Строка - секретное значение параметра +Процедура ДобавитьСекретныйПараметр(МассивПараметров, Знач ИмяПараметра, Знач ИмяПеременнойСреды, Знач Значение) + + Если Не ЗначениеЗаполнено(Значение) Тогда + Возврат; КонецЕсли; - Возврат Рез; -КонецФункции -// Для строки yes или no возвращает Булево + Лог.Отладка("Значение параметра %1 передается через переменную среды %2", ИмяПараметра, ИмяПеременнойСреды); + + ПеременныеСредыКоманды.Вставить(ИмяПеременнойСреды, Значение); + МассивПараметров.Добавить(СтрШаблон("%1=%2", ИмяПараметра, + СлужебныйIbcmdRunner.ШаблонПеременнойСреды(ИмяПеременнойСреды, ЭтоWindows))); + +КонецПроцедуры + +// Выполнить команду создания информационной базы. +// Общая часть всех методов СоздатьИБ*: команда "infobase create", +// локаль, смещение дат, флаги "--create-database" и "--force" и, +// при необходимости, параметр источника данных. // Параметры: -// Значение - Строка - значение -// Возвращаемое значение: -// Булево -// -Функция СтрокаВБулево(Значение) - Ожидаем.Что(Значение).ИмеетТип("Строка"); - Результат = Ложь; - Если Значение = "yes" Тогда - Результат = Истина; - ИначеЕсли Значение = "no" Тогда - Результат = Ложь; - Иначе - ВызватьИсключение "Значение для преобразования в тип Булево должно быть только 'yes' или 'no'"; +// Локаль - Строка - имя локали +// СмещениеДат - Число - смещение дат в годах +// ИмяПараметраИсточника - Строка - имя параметра источника данных +// ("--restore", "--load", "--import") или пустая строка +// ЗначениеИсточника - Строка - путь к источнику данных +Процедура ВыполнитьСозданиеИБ( + Знач Локаль, + Знач СмещениеДат, + Знач ИмяПараметраИсточника = "", + Знач ЗначениеИсточника = "") + + НачатьЗаполнениеПараметровЗапуска("infobase create"); + + ДобавитьПараметрЕслиЗаполнен("--locale", Локаль); + ДобавитьПараметрЕслиЗаполнен("--date-offset", СмещениеДат, 2000); + ПараметрыЗапуска.Добавить("--create-database"); + + Если ЗначениеЗаполнено(ИмяПараметраИсточника) Тогда + ДобавитьПараметрЕслиЗаполнен(ИмяПараметраИсточника, ЗначениеИсточника, ""); КонецЕсли; - Возврат Результат; -КонецФункции -// Проверяет, что переданная строка удовлетворяет требованиям для имен 1С + ПараметрыЗапуска.Добавить("--force"); + + ВыполнитьКоманду(); + +КонецПроцедуры + +// Добавить параметры фоновой (серверной) выгрузки, доступные с версии 8.3.21: +// выгрузка в архив, выгрузка на сервере, количество потоков. // Параметры: -// Стр - Строка - проверяемая строка -// Возвращаемое значение: -// Булево - удовлетворяет требованиям к именам 1С или нет -// -Функция ЯвляетсяИменем(Стр) - - Рез = Истина; - РазрешенныйПервыйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz"; - РазрешенныйСимвол = "_абвгдеёжзийклмнопрстуфхцчшщьыъэюяabcdefghijklmnopqrstuvwxyz0123456789"; - ДлинаСтр = СтрДлина(Стр); - Если ДлинаСтр = 0 Тогда - Рез = Ложь; - КонецЕсли; - Для ъ = 1 По ДлинаСтр Цикл - Симв = НРег(Сред(Стр, ъ, 1)); - Если ъ = 1 Тогда - Если СтрНайти(РазрешенныйПервыйСимвол, Симв) = 0 Тогда - Рез = Ложь; - Прервать; - КонецЕсли; - Иначе - Если СтрНайти(РазрешенныйСимвол, Симв) = 0 Тогда - Рез = Ложь; - Прервать; - КонецЕсли; - КонецЕсли; - КонецЦикла; - Возврат Рез; +// ВАрхив - Булево - выгружать в zip-архив +// НаСервере - Булево - выгружать на сервере +// КоличествоПотоков - Число - количество потоков выгрузки +Процедура ДобавитьПараметрыФоновойВыгрузки(Знач ВАрхив, Знач НаСервере, Знач КоличествоПотоков) -КонецФункции + ДобавитьФлагЕслиИстина("--archive", ВАрхив); + ДобавитьФлагЕслиИстина("--server", НаСервере); + ДобавитьПараметрЕслиЗаполнен("--threads", КоличествоПотоков, 0); + +КонецПроцедуры // Добавить параметр запуска, если заполнено его значение // Параметры: @@ -1385,21 +1277,169 @@ Ожидаем.Что(ИмяПараметра).ИмеетТип("Строка"); Если ЗначениеПараметра <> ЗначениеПоУмолчанию Тогда Ожидаем.Что(ЗначениеПараметра).ИмеетТип("Строка"); - Параметр = ИмяПараметра + "=%1"; - ПараметрыЗапуска.Добавить(СтрШаблон(Параметр, ЗначениеПараметра)); + ПараметрыЗапуска.Добавить(СтрШаблон(ИмяПараметра + "=%1", ЗначениеПараметра)); КонецЕсли; -КонецПроцедуры -Функция ШаблонПеременнойСреды(ИмяПеременной) +КонецПроцедуры + +// Добавить флаг в параметры запуска, если условие истинно +// Параметры: +// Флаг - Строка - добавляемый флаг командной строки +// Условие - Булево - добавлять ли флаг +Процедура ДобавитьФлагЕслиИстина(Знач Флаг, Знач Условие) + + Если Условие Тогда + ПараметрыЗапуска.Добавить(Флаг); + КонецЕсли; + +КонецПроцедуры + +// Добавить параметр с булевым значением в формате имя=yes/no +// Параметры: +// ИмяПараметра - Строка - имя параметра командной строки +// Значение - Булево - значение параметра +Процедура ДобавитьПараметрБулево(Знач ИмяПараметра, Знач Значение) + + ПараметрыЗапуска.Добавить(СтрШаблон("%1=%2", ИмяПараметра, БулевоВСтроку(Значение))); + +КонецПроцедуры + +// Добавить параметр с булевым значением, если значение задано (не Неопределено) +// Параметры: +// ИмяПараметра - Строка - имя параметра командной строки +// Значение - Булево, Неопределено - значение параметра +Процедура ДобавитьПараметрБулевоЕслиЗадан(Знач ИмяПараметра, Знач Значение) + + Если Значение = Неопределено Тогда + Возврат; + КонецЕсли; + + Ожидаем.Что(Значение).ИмеетТип("Булево"); + ДобавитьПараметрБулево(ИмяПараметра, Значение); + +КонецПроцедуры + +// Записать список файлов в файл параметров для передачи через stdin +// Параметры: +// ИмяФайлаПараметров - Строка - путь к создаваемому файлу параметров +// ВыбранныеФайлы - Массив - список путей к файлам +Процедура ЗаписатьСписокФайловВФайлПараметров(Знач ИмяФайлаПараметров, Знач ВыбранныеФайлы) Если ЭтоWindows Тогда - Возврат СтрШаблон("%%%1%%", ИмяПеременной); + Кодировка = КодировкаТекста.ANSI; Иначе - Возврат СтрШаблон("$%1", ИмяПеременной); + Кодировка = КодировкаТекста.UTF8NoBOM; КонецЕсли; + Лог.Отладка("Запись списка из %1 файлов в файл параметров %2", ВыбранныеФайлы.Количество(), ИмяФайлаПараметров); + + СтрокаДляЗаписи = ""; + ЗаписьТекста = Новый ЗаписьТекста(ИмяФайлаПараметров, Кодировка); + Для Каждого ВыбранныйФайл Из ВыбранныеФайлы Цикл + СтрокаДляЗаписи = ?(СтрокаДляЗаписи = "", "", Символы.ПС) + СокрЛП(ВыбранныйФайл); + КонецЦикла; + ЗаписьТекста.ЗаписатьСтроку(СокрЛП(СтрокаДляЗаписи), ""); + ЗаписьТекста.Закрыть(); + +КонецПроцедуры + +// Разложить один текстовый блок вывода команды "extension list" +// в соответствие свойств расширения +// Параметры: +// БлокТекста - Строка - блок текста с описанием одного расширения +// Возвращаемое значение: +// Соответствие, Неопределено - описание расширения, см. НовыйОписаниеРасширения() +Функция РазобратьБлокОписанияРасширения(Знач БлокТекста) + + СтрокиБлока = СтрРазделить(БлокТекста, Символы.ПС); + Если Не ЗначениеЗаполнено(СтрокиБлока) Тогда + Возврат Неопределено; + КонецЕсли; + + СтрокаСИменем = СтрокиБлока[0]; + СтрокаСИменем = СтрЗаменить(СтрокаСИменем, """", ""); + СтрокаСИменем = СтрЗаменить(СтрокаСИменем, Символы.ВК, ""); + + СтрокиБлока.Удалить(0); + + ОписаниеРасширения = НовыйОписаниеРасширения(); + + ОписаниеРасширения.Вставить("name", СтрокаСИменем); + + Для Каждого СтрокаСвойства Из СтрокиБлока Цикл + + ИмяЗначение = СтрРазделить(СтрокаСвойства, ":", Ложь); + + Если ИмяЗначение.Количество() = 0 Тогда + Продолжить; + КонецЕсли; + + ИмяСвойства = СокрЛП(ИмяЗначение[0]); + Если ИмяЗначение.Количество() > 1 Тогда + ЗначениеСвойства = СтрЗаменить(СокрЛП(ИмяЗначение[1]), """", ""); + Иначе + // Свойство без значения (например, "version :" без хвостового пробела) + ЗначениеСвойства = ""; + КонецЕсли; + + Если ТипЗнч(ОписаниеРасширения.Получить(ИмяСвойства)) = Тип("Булево") Тогда + ЗначениеСвойства = СтрокаВБулево(ЗначениеСвойства); + КонецЕсли; + + ОписаниеРасширения.Вставить(ИмяСвойства, ЗначениеСвойства); + + КонецЦикла; + + Возврат ОписаниеРасширения; + +КонецФункции + +// Для значения типа Булево возвращает yes или no +// Параметры: +// Значение - Булево - значение +// Возвращаемое значение: +// Строка - yes или no +// +Функция БулевоВСтроку(Значение) + Возврат СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Значение); +КонецФункции + +// Для строки yes или no возвращает Булево +// Параметры: +// Значение - Строка - значение +// Возвращаемое значение: +// Булево +// +Функция СтрокаВБулево(Значение) + Возврат СлужебныйIbcmdRunner.СтрокаYesNoВБулево(Значение); КонецФункции +// Проверить, что версия платформы 1С строго больше указанной. +// При невыполнении условия вызывается исключение с текстом, +// содержащим требуемую и текущую версии. +// Параметры: +// МинимальнаяВерсия - Строка - минимальная версия платформы +Процедура ПроверитьМинимальнуюВерсиюПлатформы(Знач МинимальнаяВерсия) + + Ожидаем.Что(СравнитьВерсии(Версия, МинимальнаяВерсия) > 0, + СтрШаблон("Версия платформы 1С должна быть старше, чем %1 (текущая версия: %2)", МинимальнаяВерсия, Версия)) + .ЭтоИстина(); + +КонецПроцедуры + +// Проверить, что строка удовлетворяет требованиям к именам 1С. +// При невыполнении условия вызывается исключение. +// Параметры: +// ПроверяемоеИмя - Строка - проверяемая строка +Процедура ПроверитьИмя(Знач ПроверяемоеИмя) + + Ожидаем.Что(СлужебныйIbcmdRunner.ЯвляетсяИменем(ПроверяемоеИмя), + СтрШаблон("Параметром должна быть строка, удовлетворяющая требованиям к имени переменной, получено: '%1'", + ПроверяемоеИмя)) + .ЭтоИстина(); + +КонецПроцедуры + // Инициализация работы библиотеки. // Задает минимальные настройки. // @@ -1421,10 +1461,16 @@ ПутьКПриложению = Платформа1С.ПутьКIBCMD(ВерсияПлатформы, Разрядность); Если Не ЗначениеЗаполнено(ПутьКПриложению) Тогда - ВызватьИсключение "Приложение ibcmd не обнаружено!"; + ВызватьИсключение СтрШаблон( + "Приложение ibcmd не обнаружено! Версия платформы: '%1', разрядность: '%2'. + |Убедитесь, что платформа 1С требуемой версии установлена.", + ВерсияПлатформы, Разрядность); КонецЕсли; Версия(); + + Лог.Отладка("Инициализирован УправлениеИБ (путь к ibcmd: %1, версия платформы: %2)", ПутьКПриложению, Версия); + КонецПроцедуры Функция НовыйОписаниеРасширения() 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" index 3f263d6..90731f5 100644 --- "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" @@ -4,6 +4,7 @@ #Использовать 1commands #Использовать asserts #Использовать fs +#Использовать logos #Область ОписаниеПеременных @@ -48,6 +49,8 @@ Ожидаем.Что(Разрядность).ИмеетТип("Строка"); КонецЕсли; + Лог.Отладка("Установка версии платформы для ibsrv: %1 (разрядность: %2)", НомерВерсии, Разрядность); + ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность); КонецПроцедуры @@ -60,7 +63,10 @@ Процедура УстановитьКаталогДанных(Знач КаталогДанныхСервера) Экспорт Ожидаем.Что(КаталогДанныхСервера).ИмеетТип("Строка"); - Ожидаем.Что(ФС.КаталогСуществует(КаталогДанныхСервера)).ЭтоИстина(); + Ожидаем.Что(ФС.КаталогСуществует(КаталогДанныхСервера), + СтрШаблон("Каталог данных автономного сервера не существует: %1", КаталогДанныхСервера)).ЭтоИстина(); + + Лог.Отладка("Установлен каталог данных автономного сервера: %1", КаталогДанныхСервера); КаталогДанных = КаталогДанныхСервера; ПараметрыЗапускаАС.Вставить("data", ОбернутьВКавычки(КаталогДанных)); @@ -75,7 +81,10 @@ Процедура УстановитьПараметрыФайловойИБ(Знач КаталогИБ) Экспорт Ожидаем.Что(КаталогИБ).ИмеетТип("Строка"); - Ожидаем.Что(ФС.КаталогСуществует(КаталогИБ)).ЭтоИстина(); + Ожидаем.Что(ФС.КаталогСуществует(КаталогИБ), + СтрШаблон("Каталог файловой информационной базы не существует: %1", КаталогИБ)).ЭтоИстина(); + + Лог.Отладка("Установлен каталог файловой ИБ: %1", КаталогИБ); ПараметрыЗапускаАС.Вставить("db-path", ОбернутьВКавычки(КаталогИБ)); @@ -89,7 +98,11 @@ Процедура УстановитьКонфигурационныйФайл(Знач ПутьККонфигурационномуФайлу) Экспорт Ожидаем.Что(ПутьККонфигурационномуФайлу).ИмеетТип("Строка"); - Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу)).ЭтоИстина(); + Ожидаем.Что(ФС.ФайлСуществует(ПутьККонфигурационномуФайлу), + СтрШаблон("Конфигурационный файл автономного сервера не существует: %1", ПутьККонфигурационномуФайлу)) + .ЭтоИстина(); + + Лог.Отладка("Установлен конфигурационный файл автономного сервера: %1", ПутьККонфигурационномуФайлу); ПараметрыЗапускаАС.Вставить("config", ОбернутьВКавычки(ПутьККонфигурационномуФайлу)); @@ -102,9 +115,9 @@ // Процедура УстановитьПортПрямогоДоступа(Знач НомерПорта) Экспорт - Ожидаем.Что(НомерПорта).ИмеетТип("Число"); - Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off - Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + ПроверитьНомерПорта(НомерПорта); + + Лог.Отладка("Установлен порт прямого доступа: %1", НомерПорта); ПараметрыЗапускаАС.Вставить("direct-regport", НомерПорта); @@ -117,9 +130,9 @@ // Процедура УстановитьПортHttpДоступа(Знач НомерПорта) Экспорт - Ожидаем.Что(НомерПорта).ИмеетТип("Число"); - Ожидаем.Что(НомерПорта).Больше(1000); // BSLLS:MagicNumber-off - Ожидаем.Что(НомерПорта).Меньше(65535); // BSLLS:MagicNumber-off + ПроверитьНомерПорта(НомерПорта); + + Лог.Отладка("Установлен порт http-доступа: %1", НомерПорта); ПараметрыЗапускаАС.Вставить("http-port", НомерПорта); @@ -131,12 +144,17 @@ Процедура Запустить() Экспорт Если Запущен() Тогда - ВызватьИсключение "Процесс ibsrv уже запущен!"; + ВызватьИсключение СтрШаблон("Процесс ibsrv уже запущен! Идентификатор процесса: %1", Процесс.Идентификатор); КонецЕсли; - Ожидаем.Что(КаталогДанных).Заполнено(); + Ожидаем.Что(КаталогДанных, + "Не установлен каталог данных автономного сервера. Вызовите УстановитьКаталогДанных перед запуском.") + .Заполнено(); ПараметрыКоманды = ЗаполнитьПараметрыКоманды(); + + Лог.Информация("Запуск автономного сервера ibsrv (каталог данных: %1)", КаталогДанных); + ЗапуститьПроцессIbsrv(ПараметрыКоманды); ОжидатьЗапускаIbsrv(); @@ -179,9 +197,12 @@ Процедура Остановить() Экспорт Если Не Запущен() Тогда + Лог.Отладка("Остановка не требуется: процесс ibsrv не запущен"); Возврат; КонецЕсли; + Лог.Информация("Остановка автономного сервера ibsrv (идентификатор процесса: %1)", Процесс.Идентификатор); + Процесс.Завершить(); ПрочитатьПотокиIbsrv(); @@ -210,18 +231,29 @@ #Область СлужебныеПроцедурыИФункции Функция ИмяЛога() - Возврат "oscript.lib.ibcmdrunner"; + Возврат СлужебныйIbcmdRunner.ИмяЛога(); КонецФункции Функция ОбернутьВКавычки(Строка) - Возврат СтрШаблон("""%1""", Строка); + Возврат СлужебныйIbcmdRunner.ОбернутьВКавычки(Строка); КонецФункции +Процедура ПроверитьНомерПорта(Знач НомерПорта) + + ТекстОшибки = СтрШаблон("Номер порта должен быть в диапазоне от 1000 до 65535, получено: %1", НомерПорта); + Ожидаем.Что(НомерПорта).ИмеетТип("Число"); + Ожидаем.Что(НомерПорта, ТекстОшибки).Больше(1000); // BSLLS:MagicNumber-off + Ожидаем.Что(НомерПорта, ТекстОшибки).Меньше(65535); // BSLLS:MagicNumber-off + +КонецПроцедуры + Процедура ВычислитьВерсиюIbsrv(НомерВерсии, Разрядность) ПутьКIbsrv = Платформа1С.ПутьКIBSRV(НомерВерсии, Разрядность); Ожидаем.Что(ПутьКIbsrv, "Не найдена установленная версия платформы: " + НомерВерсии).Заполнено(); + Лог.Отладка("Путь к утилите ibsrv: %1", ПутьКIbsrv); + ПараметрыКоманды = Новый Массив; ПараметрыКоманды.Добавить("--version"); @@ -229,10 +261,14 @@ Версия = СокрЛП(ВыводКоманды); + Лог.Отладка("Версия утилиты ibsrv: %1", Версия); + КонецПроцедуры Функция ВыполнитьКомандуIbsrv(ПараметрыКоманды) + Лог.Отладка("Запуск: %1 %2", ПутьКIbsrv, СтрСоединить(ПараметрыКоманды, " ")); + Команда = Новый Команда(); Команда.УстановитьКоманду(ПутьКIbsrv); Команда.ДобавитьПараметры(ПараметрыКоманды); @@ -256,6 +292,8 @@ ПеренаправлятьПотокВвода = Ложь; КодировкаПотоков = КодировкаТекста.UTF8; + Лог.Отладка("Командная строка запуска ibsrv: %1 (текущий каталог: %2)", КоманднаяСтрока, ТекущийКаталог); + Процесс = СоздатьПроцесс(КоманднаяСтрока, ТекущийКаталог, ПеренаправлятьПотокВывода, ПеренаправлятьПотокВвода, КодировкаПотоков); Процесс.Запустить(); @@ -273,6 +311,9 @@ ИмяФайла = ОбъединитьПути(КаталогДанных, "lock.pid"); ЕстьДанные = Ложь; + Лог.Отладка("Ожидание запуска ibsrv (файл готовности: %1, предельное время ожидания: %2 мс)", + ИмяФайла, ПредельныйПериодОжиданияМс); + Пока Запущен() И ТекущийПериодОжидания < ПредельныйПериодОжиданияМс Цикл Приостановить(ИнтервалПроверкиМс); @@ -288,6 +329,7 @@ КонецЦикла; Если ФайлСуществует Тогда + Лог.Отладка("Сервер ibsrv готов к работе (время ожидания: %1 мс)", ТекущийПериодОжидания); Возврат; КонецЕсли; @@ -295,7 +337,10 @@ Остановить(); КонецЕсли; - ВызватьИсключение ТекстИсключенияЗапускаАС(); + ТекстОшибки = СтрШаблон("%1 Файл готовности %2 не появился за %3 мс. Подробности смотрите в отладочном логе %4.", + ТекстИсключенияЗапускаАС(), ИмяФайла, ПредельныйПериодОжиданияМс, ИмяЛога()); + Лог.Ошибка(ТекстОшибки); + ВызватьИсключение ТекстОшибки; КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" new file mode 100644 index 0000000..8147d69 --- /dev/null +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271IbcmdRunner.os" @@ -0,0 +1,191 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +#Использовать asserts + +// Общие служебные функции библиотеки ibcmdrunner. +// Модуль устраняет дублирование кода между классами УправлениеИБ, УправлениеАС и КонфигурационныйФайлАС. +// Не предназначен для использования за пределами библиотеки, но экспортируется +// для возможности модульного тестирования. + +#Область ПрограммныйИнтерфейс + +// ИмяЛога +// Возвращает имя лога библиотеки. +// +// Возвращаемое значение: +// Строка - имя лога библиотеки +// +Функция ИмяЛога() Экспорт + Возврат "oscript.lib.ibcmdrunner"; +КонецФункции + +// ОбернутьВКавычки +// Оборачивает строку в двойные кавычки, если это не сделано ранее. +// +// Параметры: +// Строка - Строка - исходная строка +// +// Возвращаемое значение: +// Строка - обернутая в кавычки строка +// +Функция ОбернутьВКавычки(Знач Строка) Экспорт + + Если Сред(Строка, 1, 1) = """" + И Сред(Строка, СтрДлина(Строка), 1) = """" + И СтрДлина(Строка) > 1 Тогда + Результат = Строка; + Иначе + Результат = """" + Строка + """"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// СравнитьВерсии +// Сравнивает две строки версий по числовым компонентам. +// +// Параметры: +// ЭтаВерсия - Строка - первый сравниваемый номер версии +// ДругаяВерсия - Строка - второй сравниваемый номер версии +// +// Возвращаемое значение: +// Число - больше 0, если ЭтаВерсия > ДругаяВерсия; +// 0, если версии равны; +// меньше 0, если ЭтаВерсия < ДругаяВерсия. +// +Функция СравнитьВерсии(Знач ЭтаВерсия, Знач ДругаяВерсия) Экспорт + + Ожидаем.Что(ЭтаВерсия).ИмеетТип("Строка"); + Ожидаем.Что(ДругаяВерсия).ИмеетТип("Строка"); + + КомпонентыЭтойВерсии = МассивКомпонентВерсии(ЭтаВерсия); + КомпонентыДругойВерсии = МассивКомпонентВерсии(ДругаяВерсия); + + // Недостающие компоненты считаются нулями: "8.3" = "8.3.0.0" + Для Индекс = 0 По Макс(КомпонентыЭтойВерсии.Количество(), КомпонентыДругойВерсии.Количество()) - 1 Цикл + + ЭтаКомпонента = ?(Индекс < КомпонентыЭтойВерсии.Количество(), КомпонентыЭтойВерсии[Индекс], 0); + ДругаяКомпонента = ?(Индекс < КомпонентыДругойВерсии.Количество(), КомпонентыДругойВерсии[Индекс], 0); + + Если ЭтаКомпонента <> ДругаяКомпонента Тогда + Возврат ?(ЭтаКомпонента > ДругаяКомпонента, 1, -1); + КонецЕсли; + + КонецЦикла; + + Возврат 0; + +КонецФункции + +// МассивКомпонентВерсии +// Раскладывает строку с версией на числовые компоненты. +// Пробелы игнорируются ("1 002" читается как 1002), любой нечисловой +// символ считается разделителем компонент. +// +// Параметры: +// Версия - Строка - строка с номером версии +// +// Возвращаемое значение: +// Массив - массив чисел - компонент версии +// +Функция МассивКомпонентВерсии(Знач Версия) Экспорт + + РегулярноеВыражение = Новый РегулярноеВыражение("\s"); + СтрокаБезПробелов = РегулярноеВыражение.Заменить(Версия, ""); + + РегулярноеВыражение = Новый РегулярноеВыражение("(\d+)"); + МассивСовпадений = РегулярноеВыражение.НайтиСовпадения(СтрокаБезПробелов); + + МассивКомпонент = Новый Массив; + Для Каждого Совпадение Из МассивСовпадений Цикл + МассивКомпонент.Добавить(Число(Совпадение.Значение)); + КонецЦикла; + + Возврат МассивКомпонент; + +КонецФункции + +// БулевоВСтрокуYesNo +// Преобразует Булево в строку "yes" или "no" (формат параметров ibcmd). +// +// Параметры: +// Значение - Булево - преобразуемое значение +// +// Возвращаемое значение: +// Строка - "yes" или "no" +// +Функция БулевоВСтрокуYesNo(Знач Значение) Экспорт + + Ожидаем.Что(Значение).ИмеетТип("Булево"); + Возврат ?(Значение, "yes", "no"); + +КонецФункции + +// СтрокаYesNoВБулево +// Преобразует строку "yes" или "no" в Булево. +// Для любого другого значения вызывает исключение. +// +// Параметры: +// Значение - Строка - "yes" или "no" +// +// Возвращаемое значение: +// Булево +// +Функция СтрокаYesNoВБулево(Знач Значение) Экспорт + + Ожидаем.Что(Значение).ИмеетТип("Строка"); + + Если Значение = "yes" Тогда + Результат = Истина; + ИначеЕсли Значение = "no" Тогда + Результат = Ложь; + Иначе + ВызватьИсключение СтрШаблон( + "Значение для преобразования в тип Булево должно быть только 'yes' или 'no', получено: '%1'", Значение); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +// ЯвляетсяИменем +// Проверяет, что переданная строка удовлетворяет требованиям к именам 1С: +// состоит из одного слова, начинается с буквы или "_" и не содержит +// специальных символов, кроме "_". +// +// Параметры: +// ПроверяемаяСтрока - Строка - проверяемая строка +// +// Возвращаемое значение: +// Булево - Истина, если строка удовлетворяет требованиям к именам 1С +// +Функция ЯвляетсяИменем(Знач ПроверяемаяСтрока) Экспорт + + РегулярноеВыражение = Новый РегулярноеВыражение("^[a-zа-яёA-ZА-ЯЁ_][a-zа-яёA-ZА-ЯЁ0-9_]*$"); + Возврат РегулярноеВыражение.Совпадает(ПроверяемаяСтрока); + +КонецФункции + +// ШаблонПеременнойСреды +// Возвращает подстановку переменной среды в синтаксисе командной оболочки +// текущей ОС: %ИМЯ% для Windows, $ИМЯ для остальных ОС. +// +// Параметры: +// ИмяПеременной - Строка - имя переменной среды +// ЭтоWindows - Булево - Истина, если текущая ОС - Windows +// +// Возвращаемое значение: +// Строка - подстановка переменной среды +// +Функция ШаблонПеременнойСреды(Знач ИмяПеременной, Знач ЭтоWindows) Экспорт + + Если ЭтоWindows Тогда + Возврат СтрШаблон("%%%1%%", ИмяПеременной); + Иначе + Возврат СтрШаблон("$%1", ИмяПеременной); + КонецЕсли; + +КонецФункции + +#КонецОбласти diff --git a/tests/common_functions_tests.os b/tests/common_functions_tests.os new file mode 100644 index 0000000..96636bf --- /dev/null +++ b/tests/common_functions_tests.os @@ -0,0 +1,147 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Модульные тесты общего служебного модуля СлужебныйIbcmdRunner. +// Не требуют установленной платформы 1С. + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_СравнитьРавныеВерсии() Экспорт + + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20", "8.3.20")); + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("8.3", "8.3.0.0")); + Утверждения.ПроверитьРавенство(0, СлужебныйIbcmdRunner.СравнитьВерсии("1 002", "1002")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьБольшуюВерсиюСМеньшей() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.21", "8.3.20") > 0, + "8.3.21 должна быть больше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20.1563", "8.3.20") > 0, + "8.3.20.1563 должна быть больше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("9", "8.3.22.1704") > 0, + "9 должна быть больше 8.3.22.1704"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьМеньшуюВерсиюСБольшей() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.19", "8.3.20") < 0, + "8.3.19 должна быть меньше 8.3.20"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.СравнитьВерсии("8.3.20", "8.3.20.100") < 0, + "8.3.20 должна быть меньше 8.3.20.100"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазложитьВерсиюНаКомпоненты() Экспорт + + Компоненты = СлужебныйIbcmdRunner.МассивКомпонентВерсии("8.3.22.1704"); + + Утверждения.ПроверитьРавенство(4, Компоненты.Количество()); + Утверждения.ПроверитьРавенство(8, Компоненты[0]); + Утверждения.ПроверитьРавенство(3, Компоненты[1]); + Утверждения.ПроверитьРавенство(22, Компоненты[2]); + Утверждения.ПроверитьРавенство(1704, Компоненты[3]); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОбернутьСтрокуВКавычки() Экспорт + + Утверждения.ПроверитьРавенство("""путь к файлу""", СлужебныйIbcmdRunner.ОбернутьВКавычки("путь к файлу")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеОборачиватьВКавычкиПовторно() Экспорт + + Утверждения.ПроверитьРавенство("""путь""", СлужебныйIbcmdRunner.ОбернутьВКавычки("""путь""")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ОбернутьПустуюСтрокуВКавычки() Экспорт + + Утверждения.ПроверитьРавенство("""""", СлужебныйIbcmdRunner.ОбернутьВКавычки("")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПреобразоватьБулевоВYesNo() Экспорт + + Утверждения.ПроверитьРавенство("yes", СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Истина)); + Утверждения.ПроверитьРавенство("no", СлужебныйIbcmdRunner.БулевоВСтрокуYesNo(Ложь)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПреобразоватьYesNoВБулево() Экспорт + + Утверждения.ПроверитьРавенство(Истина, СлужебныйIbcmdRunner.СтрокаYesNoВБулево("yes")); + Утверждения.ПроверитьРавенство(Ложь, СлужебныйIbcmdRunner.СтрокаYesNoВБулево("no")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеДляНекорректногоYesNo() Экспорт + + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("maybe"); + + Ожидаем.Что(СлужебныйIbcmdRunner) + .Метод("СтрокаYesNoВБулево", ПараметрыМетода) + .ВыбрасываетИсключение("должно быть только 'yes' или 'no'"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПроверитьКорректныеИмена() Экспорт + + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("СуперРасширение"), + "Имя 'СуперРасширение' должно быть корректным"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("_служебное1"), + "Имя '_служебное1' должно быть корректным"); + Утверждения.ПроверитьИстину(СлужебныйIbcmdRunner.ЯвляетсяИменем("extension_2"), + "Имя 'extension_2' должно быть корректным"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПроверитьНекорректныеИмена() Экспорт + + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем(""), + "Пустая строка не должна быть корректным именем"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("1Расширение"), + "Имя, начинающееся с цифры, не должно быть корректным"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("Имя Расширения"), + "Имя с пробелом не должно быть корректным"); + Утверждения.ПроверитьЛожь(СлужебныйIbcmdRunner.ЯвляетсяИменем("Имя-Расширения"), + "Имя с дефисом не должно быть корректным"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ПостроитьШаблонПеременнойСреды() Экспорт + + Утверждения.ПроверитьРавенство("%IBCMD_IB_PSW%", + СлужебныйIbcmdRunner.ШаблонПеременнойСреды("IBCMD_IB_PSW", Истина)); + Утверждения.ПроверитьРавенство("$IBCMD_IB_PSW", + СлужебныйIbcmdRunner.ШаблонПеременнойСреды("IBCMD_IB_PSW", Ложь)); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьИмяЛога() Экспорт + + Утверждения.ПроверитьРавенство("oscript.lib.ibcmdrunner", СлужебныйIbcmdRunner.ИмяЛога()); + +КонецПроцедуры + +#КонецОбласти diff --git a/tests/configfile_as_tests.os b/tests/configfile_as_tests.os new file mode 100644 index 0000000..3efb9ac --- /dev/null +++ b/tests/configfile_as_tests.os @@ -0,0 +1,329 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Тесты генератора конфигурационного файла автономного сервера +// (класс КонфигурационныйФайлАС). +// Созданный YAML-файл разбирается обратно библиотекой oscript-yaml, +// проверяется структура и значения секций. Установленная платформа 1С не требуется. + +#Использовать ".." +#Использовать asserts +#Использовать oscript-yaml + +Перем ПоследнийТекстКонфигурации; // Строка - текст последнего созданного конфигурационного файла + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюСервераИФайловойБазы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервера("127.0.0.1", 8314, "MyServer"); + КонфигФайл.ПараметрыФайловойБД("d:\bases\mybase"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Сервер = Данные.Получить("server"); + Утверждения.ПроверитьРавенство(8314, Сервер.Получить("port"), "Порт должен быть числом 8314"); + Утверждения.ПроверитьРавенство("127.0.0.1", Сервер.Получить("address")); + Утверждения.ПроверитьРавенство("MyServer", Сервер.Получить("host")); + + // Путь с обратными слэшами проверяется по тексту файла: + // в oscript-yaml 0.3.0 десериализатор некорректно разбирает "\\b" + // (эскейп "\b" обрабатывается раньше "\\"), хотя сериализация корректна. + ТекстФайла = ПоследнийТекстКонфигурации; + Утверждения.ПроверитьИстину(СтрНайти(ТекстФайла, "path: ""d:\\bases\\mybase""") > 0, + "Путь к файловой базе должен быть корректно экранирован в YAML: " + ТекстФайла); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеЗаписыватьХостЕслиНеЗадан() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервера("localhost", 8314); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Сервер = Данные.Получить("server"); + Утверждения.ПроверитьРавенство(Неопределено, Сервер.Получить("host"), + "Незаданное имя хоста не должно попадать в файл"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюСервернойБазыДанных() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыСервернойБД("PostgreSQL", "db-host", "base1", "dbuser", "dbpwd"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + БазаДанных = Данные.Получить("database"); + Утверждения.ПроверитьРавенство("PostgreSQL", БазаДанных.Получить("dbms")); + Утверждения.ПроверитьРавенство("db-host", БазаДанных.Получить("server")); + Утверждения.ПроверитьРавенство("base1", БазаДанных.Получить("name")); + Утверждения.ПроверитьРавенство("dbuser", БазаДанных.Получить("user")); + Утверждения.ПроверитьРавенство("dbpwd", БазаДанных.Получить("password")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюИнформационнойБазы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыИБ("test", Истина, Ложь, "b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + ИБ = Данные.Получить("infobase"); + Утверждения.ПроверитьРавенство("b4faf1f6-8f9c-40a9-b42d-6a08eb6c99ab", ИБ.Получить("id")); + Утверждения.ПроверитьРавенство("test", ИБ.Получить("name")); + Утверждения.ПроверитьРавенство(Истина, ИБ.Получить("distribute-licenses"), + "Разрешение выдачи лицензий должно быть булевым true"); + Утверждения.ПроверитьРавенство(Ложь, ИБ.Получить("shedule-jobs")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьРазделителиСРазнымиЗначениями() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone1", Истина, Ложь, Истина); + КонфигФайл.ДобавитьПараметрыВеб_Разделители("zone2", Ложь, Истина, Ложь); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Хттп = Данные.Получить("http"); + Утверждения.ПроверитьРавенство("/", Хттп.Получить("base")); + + Зоны = Хттп.Получить("zones"); + Утверждения.ПроверитьТип(Зоны, "Массив", "Разделители должны быть массивом"); + Утверждения.ПроверитьРавенство(2, Зоны.Количество()); + + Утверждения.ПроверитьРавенство("zone1", Зоны[0].Получить("value"), + "Первый разделитель должен сохранить свое значение"); + Утверждения.ПроверитьРавенство(Истина, Зоны[0].Получить("safe")); + Утверждения.ПроверитьРавенство(Ложь, Зоны[0].Получить("specify")); + + Утверждения.ПроверитьРавенство("zone2", Зоны[1].Получить("value"), + "Второй разделитель должен сохранить свое значение"); + Утверждения.ПроверитьРавенство(Ложь, Зоны[1].Получить("safe")); + Утверждения.ПроверитьРавенство(Истина, Зоны[1].Получить("specify")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьСекциюПриложения() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Приложение("http://exit.url", Истина); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Приложение = Данные.Получить("http").Получить("application"); + Утверждения.ПроверитьТип(Приложение, "Соответствие", "Секция application должна присутствовать"); + Утверждения.ПроверитьРавенство(Истина, Приложение.Получить("publish")); + Утверждения.ПроверитьРавенство("http://exit.url", Приложение.Получить("exit-url")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьАутентификациюБезСтандартной() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Аутентификация("http://openid.local", 86400, , , Ложь); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Аутентификация = Данные.Получить("http").Получить("auth"); + Утверждения.ПроверитьРавенство("http://openid.local", Аутентификация.Получить("rely").Получить("url")); + Утверждения.ПроверитьРавенство(86400, Аутентификация.Получить("rely").Получить("lifetime")); + Утверждения.ПроверитьРавенство(Ложь, Аутентификация.Получить("provider").Получить("allow-standard"), + "При запрете стандартной аутентификации должен быть записан allow-standard: false"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_НеЗаписыватьРазрешеннуюСтандартнуюАутентификацию() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВеб_Аутентификация("http://openid.local"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Аутентификация = Данные.Получить("http").Получить("auth"); + Утверждения.ПроверитьРавенство(Неопределено, Аутентификация.Получить("provider"), + "При разрешенной стандартной аутентификации подсекция provider не записывается"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьПубликациюODataСПовторнымИспользованием() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + ПараметрыСеансов = Новый Соответствие; + ПараметрыСеансов.Вставить("mode", "AutoUse"); + ПараметрыСеансов.Вставить("pool-size", 10); + КонфигФайл.ПараметрыВеб_ПубликацияOData(Истина, ПараметрыСеансов); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + OData = Данные.Получить("http").Получить("odata"); + Утверждения.ПроверитьРавенство(Истина, OData.Получить("publish")); + СеансыИзФайла = OData.Получить("reuse-sessions"); + Утверждения.ПроверитьТип(СеансыИзФайла, "Соответствие", + "Параметры повторного использования сеансов должны попадать в файл"); + Утверждения.ПроверитьРавенство("AutoUse", СеансыИзФайла.Получить("mode")); + Утверждения.ПроверитьРавенство(10, СеансыИзФайла.Получить("pool-size")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьВебИХттпСервисы() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыВебСервисовОбщие(Истина, Ложь); + КонфигФайл.ДобавитьПараметрыВебСервиса(Истина, "ws1", "ws1alias", Неопределено, Истина); + КонфигФайл.ПараметрыХТТПСервисовОбщие(Истина, Истина); + КонфигФайл.ДобавитьПараметрыХТТПСервиса(Истина, "hs1", "/hs1", , Истина); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + ВебСервисы = Данные.Получить("http").Получить("web-services"); + Утверждения.ПроверитьРавенство(Истина, ВебСервисы.Получить("publish-by-default")); + Утверждения.ПроверитьРавенство(Ложь, ВебСервисы.Получить("publish-extensions-by-default")); + СписокВебСервисов = ВебСервисы.Получить("service"); + Утверждения.ПроверитьРавенство(1, СписокВебСервисов.Количество()); + Утверждения.ПроверитьРавенство("ws1", СписокВебСервисов[0].Получить("name")); + Утверждения.ПроверитьРавенство("ws1alias", СписокВебСервисов[0].Получить("alias")); + + ХттпСервисы = Данные.Получить("http").Получить("http-services"); + Утверждения.ПроверитьРавенство(Истина, ХттпСервисы.Получить("publish-extensions-by-default")); + СписокХттпСервисов = ХттпСервисы.Получить("service"); + Утверждения.ПроверитьРавенство(1, СписокХттпСервисов.Количество(), + "http-сервис должен попасть в подсекцию http-services, а не web-services"); + Утверждения.ПроверитьРавенство("hs1", СписокХттпСервисов[0].Получить("name")); + Утверждения.ПроверитьРавенство("/hs1", СписокХттпСервисов[0].Получить("root")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьШлюзыФункциональностьИОтладку() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыШлюзаПрямогоДоступа(1541, 1560, 1591, 0); + КонфигФайл.ПараметрыШлюзаSSH("localhost", "auto", 8282); + КонфигФайл.ПараметрыФункциональностиСервера(Истина, Ложь); + КонфигФайл.ПараметрыОтладкиСервера("tcp", 1550, "localhost"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + ПрямойШлюз = Данные.Получить("gates").Получить("direct"); + Утверждения.ПроверитьРавенство(1541, ПрямойШлюз.Получить("regport"), "Порт шлюза должен быть числом"); + Утверждения.ПроверитьРавенство("1560:1591", ПрямойШлюз.Получить("range")); + Утверждения.ПроверитьРавенство(0, ПрямойШлюз.Получить("seclevel")); + + ШлюзSSH = Данные.Получить("gates").Получить("ssh"); + Утверждения.ПроверитьРавенство("localhost", ШлюзSSH.Получить("address")); + Утверждения.ПроверитьРавенство("auto", ШлюзSSH.Получить("host-key")); + Утверждения.ПроверитьРавенство(8282, ШлюзSSH.Получить("port")); + + Функциональность = Данные.Получить("features"); + Утверждения.ПроверитьРавенство(Истина, Функциональность.Получить("direct-gate")); + Утверждения.ПроверитьРавенство(Ложь, Функциональность.Получить("http-gate")); + Утверждения.ПроверитьРавенство(Неопределено, Функциональность.Получить("ssh-gate"), + "Незаданная функциональность не должна попадать в файл"); + + Отладка = Данные.Получить("debug"); + Утверждения.ПроверитьРавенство("tcp", Отладка.Получить("type")); + Утверждения.ПроверитьРавенство(1550, Отладка.Получить("port")); + Утверждения.ПроверитьРавенство("localhost", Отладка.Получить("address")); + Утверждения.ПроверитьРавенство(Неопределено, Отладка.Получить("password"), + "Пустой пароль отладки не должен попадать в файл"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьВнешнийСерверОтладки() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыВнешнегоСервераОтладки("http://debug-server:1550"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Отладка = Данные.Получить("debug"); + Утверждения.ПроверитьРавенство("server", Отладка.Получить("type")); + Утверждения.ПроверитьРавенство("http://debug-server:1550", Отладка.Получить("server").Получить("url")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ЗаписатьПубликациюДистрибутивов() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + КонфигФайл.ПараметрыХТТП("/"); + КонфигФайл.ПараметрыПубликацииДистрибутивов("w32.zip", "w64.zip", "m64.zip"); + + Данные = СоздатьИРазобратьКонфиг(КонфигФайл); + + Дистрибутивы = Данные.Получить("http").Получить("pubdst"); + Утверждения.ПроверитьРавенство("w32.zip", Дистрибутивы.Получить("win32")); + Утверждения.ПроверитьРавенство("w64.zip", Дистрибутивы.Получить("win64")); + Утверждения.ПроверитьРавенство("m64.zip", Дистрибутивы.Получить("mac64")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СоздатьПустойФайлБезПараметров() Экспорт + + КонфигФайл = Новый КонфигурационныйФайлАС; + + ИмяФайла = ИмяВременногоФайлаКонфигурации(); + КонфигФайл.СоздатьКонфигурационныйФайл(ИмяФайла); + + Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); + Текст = Чтение.Прочитать(); + Чтение.Закрыть(); + УдалитьФайлы(ИмяФайла); + + Утверждения.ПроверитьИстину(Текст = Неопределено ИЛИ ПустаяСтрока(Текст), + "Без установленных параметров должен быть создан пустой файл"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция СоздатьИРазобратьКонфиг(КонфигФайл) + + ИмяФайла = ИмяВременногоФайлаКонфигурации(); + + КонфигФайл.СоздатьКонфигурационныйФайл(ИмяФайла); + + Чтение = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.UTF8); + ПоследнийТекстКонфигурации = Чтение.Прочитать(); + Чтение.Закрыть(); + + Парсер = Новый ПарсерYaml; + Данные = Парсер.ПрочитатьИзФайла(ИмяФайла); + + УдалитьФайлы(ИмяФайла); + + Утверждения.ПроверитьТип(Данные, "Соответствие", "Файл должен содержать корректный YAML-документ"); + + Возврат Данные; + +КонецФункции + +Функция ИмяВременногоФайлаКонфигурации() + Возврат ОбъединитьПути(КаталогВременныхФайлов(), "configfile_as_test.yml"); +КонецФункции + +#КонецОбласти diff --git a/tests/ibcmdrunner-test.os b/tests/ibcmdrunner-test.os index b6367e9..06a3878 100644 --- a/tests/ibcmdrunner-test.os +++ b/tests/ibcmdrunner-test.os @@ -469,7 +469,7 @@ УправлениеИБ.УстановитьПараметрыАвторизацииИБ("admin", "admin"); УправлениеИБ.СоздатьРасширение("СуперРасширение", "ср", "ru = ""Расширение для всего""", "add-on"); //УправлениеИБ.ОбновитьКонфигурациюБазыДанных("СуперРасширение"); - УправлениеИБ.ИзменитьСвойстваРасширения("СуперРасширение", Ложь, Истина, Истина, Истина, Ложь, Истина); + УправлениеИБ.ИзменитьСвойстваРасширения("СуперРасширение", Ложь, Истина, "", Истина, Ложь, Истина); Результат = УправлениеИБ.ИнформацияОРасширении("СуперРасширение"); Сообщить(Результат); Утверждения.ПроверитьИстину(СтрНайти(Результат, "active : no") > 0, "Вывод команды должен содержать строку active : no."); diff --git a/tests/ibcmdrunner_unit_tests.os b/tests/ibcmdrunner_unit_tests.os new file mode 100644 index 0000000..bcb7823 --- /dev/null +++ b/tests/ibcmdrunner_unit_tests.os @@ -0,0 +1,208 @@ +// BSLLS:LatinAndCyrillicSymbolInWord-off + +// Модульные тесты класса УправлениеИБ, не требующие создания информационных баз. +// Для создания объекта требуется установленная платформа 1С (утилита ibcmd). + +#Использовать ".." +#Использовать asserts + +#Область СлужебныйПрограммныйИнтерфейс + +&Тест +Процедура ТестДолжен_ВернутьНомерВерсииПлатформы() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + НомерВерсии = УправлениеИБ.Версия(); + + // Тогда + РегулярноеВыражение = Новый РегулярноеВыражение("^(\d+)\.(\d+)\.(\d+)\.(\d+)\z"); + Утверждения.ПроверитьИстину(РегулярноеВыражение.Совпадает(НомерВерсии), + "Номер версии должен соответствовать шаблону: " + НомерВерсии); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьПутьКПриложению() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + Путь = УправлениеИБ.ПутьКПриложению(); + + // Тогда + Утверждения.ПроверитьИстину(ЗначениеЗаполнено(Путь), "Путь к приложению ibcmd должен быть заполнен"); + Утверждения.ПроверитьИстину(СтрНайти(НРег(Путь), "ibcmd") > 0, + "Путь к приложению должен содержать 'ibcmd': " + Путь); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_СравнитьВерсииЧерезУправлениеИБ() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Тогда + Утверждения.ПроверитьИстину(УправлениеИБ.СравнитьВерсии("8.3.21", "8.3.20") > 0, + "8.3.21 должна быть больше 8.3.20"); + Утверждения.ПроверитьРавенство(0, УправлениеИБ.СравнитьВерсии("8.3.20", "8.3.20")); + Утверждения.ПроверитьИстину(УправлениеИБ.СравнитьВерсии("8.3.19", "8.3.20") < 0, + "8.3.19 должна быть меньше 8.3.20"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьПустойСписокРасширений() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + Описания = УправлениеИБ.РазобратьСписокРасширений(""); + + // Тогда + Утверждения.ПроверитьТип(Описания, "Массив", "Метод должен вернуть массив"); + Утверждения.ПроверитьРавенство(0, Описания.Количество(), "Массив должен быть пустым"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_РазобратьСписокРасширений() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + ТекстСписка = ТекстВыводаСпискаРасширений(); + + // Когда + Описания = УправлениеИБ.РазобратьСписокРасширений(ТекстСписка); + + // Тогда + Утверждения.ПроверитьРавенство(2, Описания.Количество(), "Должно быть разобрано два описания расширений"); + + ПервоеОписание = Описания[0]; + Утверждения.ПроверитьТип(ПервоеОписание, "Соответствие", "Описание расширения должно быть соответствием"); + Утверждения.ПроверитьРавенство("СуперРасширение", ПервоеОписание.Получить("name")); + Утверждения.ПроверитьРавенство(Истина, ПервоеОписание.Получить("active"), + "Свойство active должно быть преобразовано в Булево"); + Утверждения.ПроверитьРавенство(Ложь, ПервоеОписание.Получить("used-in-distributed-infobase")); + Утверждения.ПроверитьРавенство("add-on", ПервоеОписание.Получить("purpose")); + Утверждения.ПроверитьРавенство("infobase", ПервоеОписание.Получить("scope")); + Утверждения.ПроверитьРавенство("lq86kvw7xY6UpGB33UOtGzx01IQ=", ПервоеОписание.Получить("hash-sum"), + "Хеш-сумма должна быть очищена от кавычек"); + + ВтороеОписание = Описания[1]; + Утверждения.ПроверитьРавенство("ВтороеРасширение", ВтороеОписание.Получить("name")); + Утверждения.ПроверитьРавенство(Ложь, ВтороеОписание.Получить("active")); + Утверждения.ПроверитьРавенство("patch", ВтороеОписание.Получить("purpose")); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеБезОбщихПараметровИБ() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("c:\tmp\dump.dt"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("ВыгрузитьДанныеИБ", ПараметрыМетода) + .ВыбрасываетИсключение("Необходимо установить общие параметры информационной базы"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеПриНекорректномИмениРасширения() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("1НекорректноеИмя"); + ПараметрыМетода.Добавить("ср"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("СоздатьРасширение", ПараметрыМетода) + .ВыбрасываетИсключение("удовлетворяющая требованиям к имени"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВызватьИсключениеПриНекорректномТипеСУБД() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда + ПараметрыМетода = Новый Массив; + ПараметрыМетода.Добавить("MySQL"); + ПараметрыМетода.Добавить("db-host"); + ПараметрыМетода.Добавить("base1"); + ПараметрыМетода.Добавить("user"); + ПараметрыМетода.Добавить("pwd"); + + // Тогда + Ожидаем.Что(УправлениеИБ) + .Метод("УстановитьПараметрыСервернойИБ", ПараметрыМетода) + .ВыбрасываетИсключение("Тип СУБД должен быть один из"); + +КонецПроцедуры + +&Тест +Процедура ТестДолжен_ВернутьПустойВыводПоследнейКомандыПоУмолчанию() Экспорт + + // Дано + УправлениеИБ = Новый УправлениеИБ; + + // Когда (при создании объекта уже выполнялась команда --version) + Вывод = УправлениеИБ.ВыводПоследнейКоманды(); + + // Тогда + Утверждения.ПроверитьИстину(ЗначениеЗаполнено(Вывод), + "Вывод последней команды должен содержать версию платформы"); + Утверждения.ПроверитьРавенство(0, УправлениеИБ.КодВозвратаПоследнейКоманды(), + "Код возврата успешной команды должен быть равен 0"); + +КонецПроцедуры + +#КонецОбласти + +#Область СлужебныеПроцедурыИФункции + +Функция ТекстВыводаСпискаРасширений() + + Возврат "name : ""СуперРасширение"" + |version : + |active : yes + |purpose : add-on + |safe-mode : yes + |security-profile-name : + |unsafe-action-protection : yes + |used-in-distributed-infobase : no + |scope : infobase + |hash-sum : ""lq86kvw7xY6UpGB33UOtGzx01IQ="" + | + |name : ""ВтороеРасширение"" + |version : 1.0.0.1 + |active : no + |purpose : patch + |safe-mode : no + |security-profile-name : + |unsafe-action-protection : no + |used-in-distributed-infobase : no + |scope : infobase + |hash-sum : ""XEOqtmInlTN/lMHIp7ylpc4Q2RU="" + |"; + +КонецФункции + +#КонецОбласти diff --git a/tests/ibsrvrunner_tests.os b/tests/ibsrvrunner_tests.os index 659019c..5181af3 100644 --- a/tests/ibsrvrunner_tests.os +++ b/tests/ibsrvrunner_tests.os @@ -32,7 +32,7 @@ // Тогда Ожидаем.Что(УправлениеАС) - .Метод("УстановитьВерсию", ПараметрыМетода) + .Метод("УстановитьВерсиюПлатформы", ПараметрыМетода) .ВыбрасываетИсключение("Не найдена установленная версия платформы"); КонецПроцедуры