diff --git a/lib.config b/lib.config index f7eba4d..16d7bc0 100644 --- a/lib.config +++ b/lib.config @@ -1,4 +1,5 @@  + diff --git a/packagedef b/packagedef index 965603a..e662e40 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@  Описание.Имя("irac") - .Версия("0.10.0") + .Версия("0.11.0") .Автор("Artem Kuznetsov") .АдресАвтора("ArKuznetsov@gmail.com") .Описание("Библиотека администрирования кластера серверов 1С") @@ -13,6 +13,7 @@ .ЗависитОт("strings", "0.4.1") .ЗависитОт("1commands", "1.3.1") .ЗависитОт("v8runner") + .ЗависитОт("1connector") .ВключитьФайл("src") .ВключитьФайл("tests") .ВключитьФайл("lib.config") diff --git a/src/lib.config b/src/lib.config index 61884c2..c24edcb 100644 --- a/src/lib.config +++ b/src/lib.config @@ -1,4 +1,5 @@  + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\260.os" index 5c8980f..caa2df3 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\260.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\260.os" @@ -39,6 +39,9 @@ Лог = Служебный.Лог(); + Лог.Предупреждение("[DEPRICATED] Класс ""АдминистрированиеКластера"" устарел, + |используйте класс ""УправлениеКластером1С""!"); + Админ_АдресСервера = АдресСервера; Админ_ПортСервера = ПортСервера; @@ -225,7 +228,7 @@ Функция ВыводКоманды(РазобратьВывод = Истина) Экспорт Если РазобратьВывод Тогда - Возврат РазобратьВыводКоманды(ВыводКоманды); + Возврат Служебный.РазобратьВыводКоманды(ВыводКоманды); КонецЕсли; Возврат ВыводКоманды; @@ -243,51 +246,6 @@ КонецФункции // КодВозврата() -// Функция преобразует переданный текст вывода команды в массив соответствий -// элементы массива создаются по блокам текста, разделенным пустой строкой -// пары <ключ, значение> структуры получаются для каждой строки с учетом разделителя ":" -// -// Параметры: -// ВыводКоманды - Строка - текст для разбора -// -// Возвращаемое значение: -// Массив (Соответствие) - результат разбора -// -Функция РазобратьВыводКоманды(Знач ВыводКоманды) - - Текст = Новый ТекстовыйДокумент(); - Текст.УстановитьТекст(ВыводКоманды); - - МассивРезультатов = Новый Массив(); - Описание = Новый Соответствие(); - - Для й = 1 По Текст.КоличествоСтрок() Цикл - - ТекстСтроки = Текст.ПолучитьСтроку(й); - - ПозРазделителя = СтрНайти(ТекстСтроки, ":"); - - Если НЕ ЗначениеЗаполнено(ТекстСтроки) Тогда - Если й = 1 Тогда - Продолжить; - КонецЕсли; - МассивРезультатов.Добавить(Описание); - Описание = Новый Соответствие(); - Продолжить; - КонецЕсли; - - Если ПозРазделителя = 0 Тогда - Продолжить; - КонецЕсли; - - Описание.Вставить(СокрЛП(Лев(ТекстСтроки, ПозРазделителя - 1)), СокрЛП(Сред(ТекстСтроки, ПозРазделителя + 1))); - - КонецЦикла; - - Возврат МассивРезультатов; - -КонецФункции // РазобратьВыводКоманды() - // Функция возвращает строку описания подключения к серверу администрирования кластера 1С // // Возвращаемое значение: diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\276\320\274\320\260\320\275\320\264.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\276\320\274\320\260\320\275\320\264.os" index 141fbd6..5e8044d 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\276\320\274\320\260\320\275\320\264.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\276\320\274\320\260\320\275\320\264.os" @@ -6,21 +6,26 @@ // ---------------------------------------------------------- // Codebase: https://github.com/ArKuznetsov/irac/ // ---------------------------------------------------------- +#Использовать strings Перем ЭтоWindows; Перем ВыводКоманды; Перем КодВозврата; +Перем СпособПодключения; Перем ПутьКУтилитеАдминистрирования; Перем ВерсияУтилитыАдминистрирования; Перем Лог; +#Область Инициализация + // Конструктор // // Параметры: -// ВерсияИлиПутьКРАК - Строка - маска версии 1С или путь к утилите RAC +// ВерсияИлиПутьКУтилитеАдминистрирования - Строка - маска версии 1С, путь к утилите RAC +// или адрес сервиса hiRAC // -Процедура ПриСозданииОбъекта(ВерсияИлиПутьКРАК = "8.3") +Процедура ПриСозданииОбъекта(ВерсияИлиПутьКУтилитеАдминистрирования = "8.3") Лог = Служебный.Лог(); @@ -29,26 +34,43 @@ ВерсияУтилитыАдминистрирования = ""; - Если ЗначениеЗаполнено(ВерсияИлиПутьКРАК) Тогда - ИнициализироватьУтилитуАдминистрирования(ВерсияИлиПутьКРАК); + Если ЗначениеЗаполнено(ВерсияИлиПутьКУтилитеАдминистрирования) Тогда + ИнициализироватьУтилитуАдминистрирования(ВерсияИлиПутьКУтилитеАдминистрирования); КонецЕсли; КонецПроцедуры // ПриСозданииОбъекта() +#КонецОбласти // Инициализация + +#Область ПрограммныйИнтерфейс + +// Функция возвращает способ подключения к сервису администрирования кластера 1С +// +// Возвращаемое значение: +// Строка - способ подключения к сервису администрирования кластера 1С +// +Функция СпособПодключения() Экспорт + + Возврат СпособПодключения; + +КонецФункции // СпособПодключения() + // Процедура ищет утилиту RAC и выполняет инициализацию // // Параметры: -// ВерсияИлиПутьКРАК - Строка - маска версии 1С или путь к утилите RAC +// ВерсияИлиПутьКУтилитеАдминистрирования - Строка - маска версии 1С, путь к утилите RAC +// или адрес сервиса hiRAC // -Процедура ИнициализироватьУтилитуАдминистрирования(ВерсияИлиПутьКРАК = "") Экспорт +Процедура ИнициализироватьУтилитуАдминистрирования(ВерсияИлиПутьКУтилитеАдминистрирования = "") Экспорт // Если версия установлена и не указано новая, то инициализация не выполняется - Если ЗначениеЗаполнено(ВерсияУтилитыАдминистрирования) И НЕ ЗначениеЗаполнено(ВерсияИлиПутьКРАК) Тогда + Если ЗначениеЗаполнено(ВерсияУтилитыАдминистрирования) + И НЕ ЗначениеЗаполнено(ВерсияИлиПутьКУтилитеАдминистрирования) Тогда Возврат; КонецЕсли; - Если ЗначениеЗаполнено(ВерсияИлиПутьКРАК) Тогда - ПутьКУтилитеАдминистрирования = ВерсияИлиПутьКРАК; + Если ЗначениеЗаполнено(ВерсияИлиПутьКУтилитеАдминистрирования) Тогда + ПутьКУтилитеАдминистрирования = ВерсияИлиПутьКУтилитеАдминистрирования; КонецЕсли; // по-умолчанию ищем последнюю версию 8.3 @@ -56,20 +78,25 @@ ПутьКУтилитеАдминистрирования = "8.3"; КонецЕсли; - ШаблонПроверки = "8."; - Если Лев(ПутьКУтилитеАдминистрирования, СтрДлина(ШаблонПроверки)) = ШаблонПроверки Тогда - ПутьКУтилитеАдминистрирования = ПолучитьПутьКВерсииПлатформы(ВерсияИлиПутьКРАК); - УстановитьПутьКУтилитеАдминистрирования(ПутьКУтилитеАдминистрирования); + СпособПодключения = СпособПодключенияВАдресе(ВерсияИлиПутьКУтилитеАдминистрирования); + + Если СпособПодключения = Перечисления.СпособыПодключения.Локально Тогда + ШаблонПроверки = "8."; + Если Лев(ПутьКУтилитеАдминистрирования, СтрДлина(ШаблонПроверки)) = ШаблонПроверки Тогда + ПутьКУтилитеАдминистрирования = НайтиУтилитуАдминистрирования(ВерсияИлиПутьКУтилитеАдминистрирования); + + ФайлУтилитыАдминистрирования = Новый Файл(ПутьКУтилитеАдминистрирования); + Если Не ФайлУтилитыАдминистрирования.Существует() Тогда + ВызватьИсключение "Нельзя установить несуществующий путь к утилите RAC: " + ФайлУтилитыАдминистрирования.ПолноеИмя; + КонецЕсли; + КонецЕсли; + КонецЕсли; - ВерсияУтилитыАдминистрирования = ПолучитьВерсиюУтилитыАдминистрирования(ПутьКУтилитеАдминистрирования()); + ВерсияУтилитыАдминистрирования = ПолучитьВерсиюУтилитыАдминистрирования(ПутьКУтилитеАдминистрирования); КонецПроцедуры // ИнициализироватьУтилитуАдминистрирования() -/////////////////////////////////////////////////////////////////////////////////// -// Интерфейсные процедуры и функции -/////////////////////////////////////////////////////////////////////////////////// - // Функция возвращает версию утилиты RAC // // Возвращаемое значение: @@ -92,30 +119,10 @@ КонецФункции // ПутьКУтилитеАдминистрирования() -// Процедура устанавливает переданный путь к утилите RAC -// -// Параметры: -// Путь - Строка - новый путь к утилите RAC -// -Процедура УстановитьПутьКУтилитеАдминистрирования(Знач Путь = "") Экспорт - - Если Путь = "" Тогда - Возврат; - КонецЕсли; - - ФайлУтилитыАдминистрирования = Новый Файл(Путь); - Если Не ФайлУтилитыАдминистрирования.Существует() Тогда - ВызватьИсключение "Нельзя установить несуществующий путь к утилите RAC: " + ФайлУтилитыАдминистрирования.ПолноеИмя; - КонецЕсли; - - ПутьКУтилитеАдминистрирования = Путь; - -КонецПроцедуры // УстановитьПутьКУтилитеАдминистрирования() - // Функция выполняет запуск утилиты администрирования кластера 1С (rac) с указанными параметрами // // Параметры: -// ПараметрыКоманды - Масссив - список параметров запуска утилиты администрирования кластера 1С (rac) +// ПараметрыКоманды - Масссив, Строка - список параметров запуска утилиты администрирования кластера 1С (rac) // // Возвращаемое значение: // Строка - вывод команды @@ -124,24 +131,34 @@ ИнициализироватьУтилитуАдминистрирования(); - КодВозврата = ЗапуститьИПодождать(ПараметрыКоманды); - - Если КодВозврата = 0 Тогда - Лог.Отладка("Код возврата равен %1: %2", КодВозврата, ВыводКоманды()); + Если СпособПодключения = Перечисления.СпособыПодключения.Удаленно Тогда + Возврат ВыполнитьКомандуУдаленно(ПараметрыКоманды); Иначе - Лог.Предупреждение("Получен ненулевой код возврата %1: %2", КодВозврата, ВыводКоманды()); + Если ТипЗнч(ПараметрыКоманды) = Тип("Массив") Тогда + ПараметрыДляВыполнения = ПараметрыКоманды; + Иначе + ПараметрыДляВыполнения = Новый Массив(); + ПараметрыДляВыполнения.Добавить(ПараметрыКоманды); + КонецЕсли; + Возврат ВыполнитьКомандуЛокально(ПараметрыДляВыполнения); КонецЕсли; - Возврат ВыводКоманды(); - КонецФункции // ВыполнитьКоманду() // Функция возвращает текст результата выполнения команды // +// Параметры: +// РазобратьВывод - Булево - Истина - выполнить преобразование вывода команды в структуру +// Ложь - вернуть текст вывода команды как есть +// // Возвращаемое значение: -// Строка - вывод команды +// Структура, Строка - вывод команды // -Функция ВыводКоманды() Экспорт +Функция ВыводКоманды(Знач РазобратьВывод = Ложь) Экспорт + + Если РазобратьВывод Тогда + Возврат Служебный.РазобратьВыводКоманды(ВыводКоманды); + КонецЕсли; Возврат ВыводКоманды; @@ -158,9 +175,9 @@ КонецФункции // КодВозврата() -/////////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции поиска платформы -/////////////////////////////////////////////////////////////////////////////////// +#КонецОбласти // ПрограммныйИнтерфейс + +#Область ФункцииПоискаУтилитыАдминистрирования // Функция ищет существующие каталоги с установленной платформой 1С по списку возможных каталогов установки // соответствующие переданной маске версии @@ -285,21 +302,21 @@ КонецФункции // СобратьВозможныеКаталогиУстановкиПлатформыWindows() -// Функция возвращает путь к каталогу платформы 1С в ОС Windows, соответствующей маске версии +// Функция возвращает путь к утилите администрирования кластера 1С (rac) в ОС Windows, соответствующей маске версии // // Параметры: // Версия - Строка - маска версии платформы вида 8.*, 8.3.*, 8.3.5.*, 8.3.10.2561 // // Возвращаемое значение: -// Строка - путь к версии платформы 1С +// Строка - путь к утилите администрирования кластера 1С (rac) // -Функция ПолучитьПутьКВерсииПлатформыWindows(Знач Версия) +Функция НайтиУтилитуАдминистрированияWindows(Знач Версия) КаталогиУстановкиПлатформы = СобратьВозможныеКаталогиУстановкиПлатформыWindows(); МассивКаталогов1С = НайтиПодкаталоги1СПоМаскеВерсии(КаталогиУстановкиПлатформы, Версия); - НужныйФайлПлатформы = Неопределено; + УтилитаАдминистрирования = Неопределено; МассивКаталоговВерсий = Новый Массив; Для Каждого ОписаниеКаталога Из МассивКаталогов1С Цикл @@ -317,33 +334,34 @@ ОписаниеМаксВерсии = МассивКаталоговВерсий[Сч]; КонецЕсли; КонецЦикла; - НужныйФайлПлатформы = ОписаниеМаксВерсии.ФайлУтилитыАдминистрирования; + УтилитаАдминистрирования = ОписаниеМаксВерсии.ФайлУтилитыАдминистрирования; ВерсияУтилитыАдминистрирования = ОписаниеМаксВерсии.Версия; - Лог.Отладка("Утилита RAC: %1", НужныйФайлПлатформы.ПолноеИмя); + Лог.Отладка("Утилита RAC: %1", УтилитаАдминистрирования.ПолноеИмя); КонецЕсли; - Если НужныйФайлПлатформы = Неопределено Тогда + Если УтилитаАдминистрирования = Неопределено Тогда ВызватьИсключение "Не найден путь к платформе 1С <" + Версия + ">"; КонецЕсли; - Если Не НужныйФайлПлатформы.Существует() Тогда - ВызватьИсключение "Ошибка определения версии платформы. Файл <" + НужныйФайлПлатформы.ПолноеИмя + "> не существует"; + Если Не УтилитаАдминистрирования.Существует() Тогда + ВызватьИсключение СтрШаблон("Ошибка определения версии платформы. Файл <%1> не существует", + УтилитаАдминистрирования.ПолноеИмя); КонецЕсли; - Возврат НужныйФайлПлатформы.ПолноеИмя; + Возврат УтилитаАдминистрирования.ПолноеИмя; -КонецФункции // ПолучитьПутьКВерсииПлатформыWindows() +КонецФункции // НайтиУтилитуАдминистрированияWindows() -// Функция возвращает путь к каталогу платформы 1С в ОС Linux, соответствующей маске версии -// +// Функция возвращает путь к утилите администрирования кластера 1С (rac) в ОС Linux, соответствующей маске версии +// // Параметры: // Версия - Строка - маска версии платформы вида 8.*, 8.3.*, 8.3.5.*, 8.3.10.2561 // // Возвращаемое значение: -// Строка - путь к версии платформы 1С +// Строка - путь к утилите администрирования кластера 1С (rac) // -Функция ПолучитьПутьКВерсииПлатформыLinux(Знач Версия) +Функция НайтиУтилитуАдминистрированияLinux(Знач Версия) // help wanted: на Линукс конфиг стартера лежит в ~/.1C/1cestart. КорневойПуть1С = ОбъединитьПути("/opt", "1C", "v8.3"); @@ -351,32 +369,34 @@ Если НЕ КаталогУстановки.Существует() Тогда КаталогУстановки = Новый Файл(ОбъединитьПути(КорневойПуть1С, "x86_64")); КонецЕсли; + // Определим версию приложения - НужныйФайлПлатформы = Новый Файл(ОбъединитьПути(КаталогУстановки.ПолноеИмя, "rac")); + УтилитаАдминистрирования = Новый Файл(ОбъединитьПути(КаталогУстановки.ПолноеИмя, "rac")); Попытка - ВерсияУтилитыАдминистрирования = ПолучитьВерсиюУтилитыАдминистрирования(НужныйФайлПлатформы.ПолноеИмя); + ВерсияУтилитыАдминистрирования = ПолучитьВерсиюУтилитыАдминистрирования(УтилитаАдминистрирования.ПолноеИмя); Исключение Лог.Предупреждение("Не удалось прочитать версию 1С %1, %2. - |" + ОписаниеОшибки(), Версия, НужныйФайлПлатформы.ПолноеИмя); + |" + ОписаниеОшибки(), Версия, УтилитаАдминистрирования.ПолноеИмя); КонецПопытки; - Если Не НужныйФайлПлатформы.Существует() Тогда - ВызватьИсключение "Ошибка определения версии платформы. Файл <" + НужныйФайлПлатформы.ПолноеИмя + "> не существует"; + Если Не УтилитаАдминистрирования.Существует() Тогда + ВызватьИсключение СтрШаблон("Ошибка определения версии платформы. Файл <%1> не существует", + УтилитаАдминистрирования.ПолноеИмя); КонецЕсли; - Возврат НужныйФайлПлатформы.ПолноеИмя; + Возврат УтилитаАдминистрирования.ПолноеИмя; -КонецФункции // ПолучитьПутьКВерсииПлатформыLinux() +КонецФункции // НайтиУтилитуАдминистрированияLinux() -// Функция возвращает путь к каталогу платформы 1С, соответствующей маске версии +// Функция возвращает путь к утилите администрирования кластера 1С (rac), соответствующей маске версии // // Параметры: // Версия - Строка - маска версии платформы вида 8.*, 8.3.*, 8.3.5.*, 8.3.10.2561 // // Возвращаемое значение: -// Строка - путь к версии платформы 1С +// Строка - путь к утилите администрирования кластера 1С (rac) // -Функция ПолучитьПутьКВерсииПлатформы(Знач Версия) +Функция НайтиУтилитуАдминистрирования(Знач Версия) ШаблонПроверки = "8."; Если Лев(Версия, СтрДлина(ШаблонПроверки)) <> ШаблонПроверки Тогда @@ -392,18 +412,18 @@ КонецЕсли; Если ЭтоWindows Тогда - - Возврат ПолучитьПутьКВерсииПлатформыWindows(Версия); + + Возврат НайтиУтилитуАдминистрированияWindows(Версия); Иначе - Возврат ПолучитьПутьКВерсииПлатформыLinux(Версия); + Возврат НайтиУтилитуАдминистрированияLinux(Версия); КонецЕсли; -КонецФункции // ПолучитьПутьКВерсииПлатформы() +КонецФункции // НайтиУтилитуАдминистрирования() -// Функция получает версию утилиты RAC по переданному пути +// Функция получает версию локальной утилиты RAC по переданному пути // // Параметры: // Путь - Строка - путь к утилите RAC @@ -411,7 +431,7 @@ // Возвращаемое значение: // Строка - версия утилиты RAC // -Функция ПолучитьВерсиюУтилитыАдминистрирования(Знач Путь) +Функция ПолучитьВерсиюУтилитыАдминистрированияЛокально(Знач Путь) Команда = Новый Команда; СтрокаЗапуска = Служебный.ОбернутьВКавычки(Путь) + " -v "; @@ -424,52 +444,152 @@ Лог.Предупреждение("Не удалось прочитать версию 1С %1. |" + ОписаниеОшибки(), СтрокаЗапуска); КонецПопытки; - + Возврат ""; -КонецФункции // ПолучитьВерсиюУтилитыАдминистрирования() +КонецФункции // ПолучитьВерсиюУтилитыАдминистрированияЛокально() + +// Функция получает версию удаленной утилиты RAC по переданному адресу HTTP-сервиса (hiRAC) +// +// Параметры: +// Путь - Строка - адрес HTTP-сервиса (hiRAC) +// +// Возвращаемое значение: +// Строка - версия утилиты RAC +// +Функция ПолучитьВерсиюУтилитыАдминистрированияУдаленно(Знач Путь) + + Параметры = Новый Структура(); + Параметры.Вставить("cmd", "--version"); + + Ответ = КоннекторHTTP.Get(Путь, Параметры).Json(); + + Возврат Ответ["Версия"]; -/////////////////////////////////////////////////////////////////////////////////// -// Процедуры и функции выполнения команд системы -/////////////////////////////////////////////////////////////////////////////////// +КонецФункции // ПолучитьВерсиюУтилитыАдминистрированияУдаленно() -// Функция запускает выполнение команды ОС с указанными параметрами и ожидает завершения +// Функция получает версию утилиты RAC по переданному пути // // Параметры: -// Параметры - Массив - параметры выполняемой команды +// Путь - Строка - путь к утилите RAC // // Возвращаемое значение: -// Число - код возврата команды ОС +// Строка - версия утилиты RAC // -Функция ЗапуститьИПодождать(Знач Параметры) +Функция ПолучитьВерсиюУтилитыАдминистрирования(Знач Путь) + + Если СпособПодключения = Перечисления.СпособыПодключения.Удаленно Тогда + Возврат ПолучитьВерсиюУтилитыАдминистрированияУдаленно(Путь); + Иначе + Возврат ПолучитьВерсиюУтилитыАдминистрированияЛокально(Путь); + КонецЕсли; + +КонецФункции // ПолучитьВерсиюУтилитыАдминистрирования() + +#КонецОбласти // ФункцииПоискаУтилитыАдминистрирования + +#Область ВыполнениеКомандСистемы + +// Функция выполняет запуск утилиты администрирования кластера 1С (rac) с указанными параметрами +// +// Параметры: +// ПараметрыКоманды - Масссив - список параметров запуска утилиты администрирования кластера 1С (rac) +// +// Возвращаемое значение: +// Строка - вывод команды +// +Функция ВыполнитьКомандуЛокально(Знач ПараметрыКоманды) + + Приложение = Служебный.ОбернутьВКавычки(ПутьКУтилитеАдминистрирования()); СтрокаДляЛога = ""; - Для Каждого Параметр Из Параметры Цикл + Для Каждого Параметр Из ПараметрыКоманды Цикл Если Найти(Параметр, "-pwd") = 0 Тогда СтрокаДляЛога = СтрокаДляЛога + " " + Параметр; КонецЕсли; - КонецЦикла; КодВозврата = 0; - Приложение = Служебный.ОбернутьВКавычки(ПутьКУтилитеАдминистрирования()); - Лог.Отладка(Приложение + СтрокаДляЛога); + Лог.Отладка("%1 %2", Приложение, СтрокаДляЛога); Команда = Новый Команда; Команда.УстановитьКоманду(Приложение); Команда.УстановитьКодировкуВывода(КодировкаТекста.OEM); - Команда.ДобавитьПараметры(Параметры); + Команда.ДобавитьПараметры(ПараметрыКоманды); Команда.УстановитьИсполнениеЧерезКомандыСистемы(Ложь); Команда.ПоказыватьВыводНемедленно(Ложь); + КодВозврата = Команда.Исполнить(); ВыводКоманды = Команда.ПолучитьВывод(); - Лог.Отладка("Получен код возврата %1", КодВозврата); + Если КодВозврата = 0 Тогда + Лог.Отладка("Код возврата равен %1: %2", КодВозврата, ВыводКоманды()); + Иначе + Лог.Предупреждение("Получен ненулевой код возврата %1: %2", КодВозврата, ВыводКоманды()); + КонецЕсли; + + Возврат ВыводКоманды(); + +КонецФункции // ВыполнитьКомандуЛокально() + +// Функция выполняет вызов удаленной утилиты администрирования кластера 1С через HTTP-сервис (hiRAC) с указанными параметрами +// +// Параметры: +// ПараметрыКоманды - Масссив - список параметров запуска утилиты администрирования кластера 1С (rac) +// +// Возвращаемое значение: +// Строка - вывод команды +// +Функция ВыполнитьКомандуУдаленно(Знач ПараметрыКоманды) + + СтрокаКоманды = ""; + Для Каждого ТекПараметр Из ПараметрыКоманды Цикл + Если ЗначениеЗаполнено(СтрокаКоманды) Тогда + СтрокаКоманды = СтрокаКоманды + " "; + КонецЕсли; + СтрокаКоманды = СтрокаКоманды + ТекПараметр; + КонецЦикла; + + Параметры = Новый Структура(); + Параметры.Вставить("version", ВерсияУтилитыАдминистрирования()); + Параметры.Вставить("cmd", СтрокаКоманды); + + Ответ = КоннекторHTTP.Get(ПутьКУтилитеАдминистрирования, Параметры).Json(); - Возврат КодВозврата; + КодВозврата = Ответ["КодВозврата"]; + ВыводКоманды = Ответ["ВыводКоманды"]; + + Возврат ВыводКоманды(); + +КонецФункции // ВыполнитьКомандуУдаленно() + +#КонецОбласти // ВыполнениеКомандСистемы + +#Область СлужебныеПроцедурыИФункции + +// Функция возвращает способ подключения к сервису администрирования кластера 1С +// по указанному адресу +// +// Параметры: +// ВерсияИлиПутьКУтилитеАдминистрирования - Строка - маска версии 1С, путь к утилите RAC +// или адрес сервиса hiRAC +// +// Возвращаемое значение: +// Строка - способ подключения к сервису администрирования кластера 1С +// +Функция СпособПодключенияВАдресе(ВерсияИлиПутьКУтилитеАдминистрирования) + + Если ВРег(Лев(ВерсияИлиПутьКУтилитеАдминистрирования, "5")) = ВРег("http:") + ИЛИ ВРег(Лев(ВерсияИлиПутьКУтилитеАдминистрирования, "6")) = ВРег("https:") Тогда + Возврат Перечисления.СпособыПодключения.Удаленно; + Иначе + Возврат Перечисления.СпособыПодключения.Локально; + КонецЕсли; + +КонецФункции // СпособПодключенияВАдресе() -КонецФункции // ЗапуститьИПодождать() +#КонецОбласти // СлужебныеПроцедурыИФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\276\320\2741\320\241.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\276\320\2741\320\241.os" new file mode 100644 index 0000000..07e7a47 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\232\320\273\320\260\321\201\321\202\320\265\321\200\320\276\320\2741\320\241.os" @@ -0,0 +1,677 @@ +// ---------------------------------------------------------- +// This Source Code Form is subject to the terms of the +// Mozilla Public License, v.2.0. If a copy of the MPL +// was not distributed with this file, You can obtain one +// at http://mozilla.org/MPL/2.0/. +// ---------------------------------------------------------- +// Codebase: https://github.com/ArKuznetsov/irac/ +// ---------------------------------------------------------- + +Перем Агент_СтрокаПодключения; +Перем Агент_ИсполнительКоманд; +Перем Агент_Администраторы; +Перем Агент_Администратор; +Перем Кластеры_Администраторы; +Перем ВыводКоманды; +Перем Кластеры; + +Перем ПараметрыОбъекта; + +Перем ОбработчикОшибок; + +Перем Лог; + +#Область Инициализация + +// Конструктор +// +// Параметры: +// ВерсияИлиПутьКУтилитеАдминистрирования - Строка - маска версии 1С, путь к утилите RAC +// или адрес сервиса hiRAC +// СтрокаПодключенияСервиса - Строка - адрес сервиса агента администрирования +// (по умолчанию: "localhost:1545") +// Администратор - Структура - администратор агента сервера 1С +// Администратор - Строка - имя администратора агента сервера 1С +// Пароль - Строка - пароль администратора агента сервера 1С +// +Процедура ПриСозданииОбъекта(ВерсияИлиПутьКУтилитеАдминистрирования = "8.3" + , СтрокаПодключенияСервиса = "localhost:1545" + , Администратор = Неопределено) + + Лог = Служебный.Лог(); + + ОписаниеСервиса = СтрРазделить(СтрокаПодключенияСервиса, ":"); + + АдресСервиса = "localhost"; + ПортСервиса = "1545"; + Если ОписаниеСервиса.Количество() > 0 Тогда + АдресСервиса = ОписаниеСервиса[0]; + КонецЕсли; + Если ОписаниеСервиса.Количество() > 1 Тогда + ПортСервиса = ОписаниеСервиса[1]; + КонецЕсли; + + Агент_СтрокаПодключения = СтрШаблон("%1:%2", АдресСервиса, ПортСервиса); + + Агент_ИсполнительКоманд = Новый ИсполнительКоманд(ВерсияИлиПутьКУтилитеАдминистрирования); + + ПараметрыОбъекта = Новый КомандыОбъекта(Перечисления.РежимыАдминистрирования.Агент); + + Если ТипЗнч(Администратор) = Тип("Структура") Тогда + Агент_Администратор = Новый Структура("Администратор, Пароль"); + ЗаполнитьЗначенияСвойств(Агент_Администратор, Администратор); + Иначе + Агент_Администратор = Неопределено; + КонецЕсли; + + Агент_Администраторы = Новый АдминистраторыАгента(ЭтотОбъект); + Кластеры = Новый Кластеры(ЭтотОбъект); + +КонецПроцедуры // ПриСозданииОбъекта() + +#КонецОбласти // Инициализация + +#Область УстановкаПолучениеПараметров + +// Функция возвращает строку параметров подключения к агенту администрирования (RAS) +// +// Возвращаемое значение: +// Строка - строка параметров подключения к агенту администрирования (RAS) +// +Функция СтрокаПодключения() Экспорт + + Возврат Агент_СтрокаПодключения; + +КонецФункции // СтрокаПодключения() + +// Функция возвращает строку параметров авторизации на агенте кластера 1С +// +// Возвращаемое значение: +// Строка - строка параметров авторизации на агенте кластера 1С +// +Функция СтрокаАвторизации() Экспорт + + Если НЕ ТипЗнч(Агент_Администратор) = Тип("Структура") Тогда + Возврат ""; + КонецЕсли; + + Если НЕ Агент_Администратор.Свойство("Администратор") Тогда + Возврат ""; + КонецЕсли; + + Если ПустаяСтрока(Агент_Администратор.Администратор) Тогда + Возврат ""; + КонецЕсли; + + СтрокаАвторизации = СтрШаблон("--agent-user=%1", Служебный.ОбернутьВКавычки(Агент_Администратор.Администратор)); + + Если НЕ ПустаяСтрока(Агент_Администратор.Пароль) Тогда + СтрокаАвторизации = СтрокаАвторизации + СтрШаблон(" --agent-pwd=%1", Агент_Администратор.Пароль); + КонецЕсли; + + Возврат СтрокаАвторизации; + +КонецФункции // СтрокаАвторизации() + +// Процедура устанавливает параметры авторизации на агенте кластера 1С +// +// Параметры: +// Администратор - Строка - администратор агента сервера 1С +// Пароль - Строка - пароль администратора агента сервера 1С +// +Процедура УстановитьАдминистратора(Администратор, Пароль) Экспорт + + Агент_Администратор = Новый Структура("Администратор, Пароль", Администратор, Пароль); + +КонецПроцедуры // УстановитьАдминистратора() + +// Функция возвращает строку описания подключения к серверу администрирования кластера 1С +// +// Возвращаемое значение: +// Строка - описание подключения к серверу администрирования кластера 1С +// +Функция ОписаниеПодключения() Экспорт + + Возврат СтрШаблон("%1 (v.%2)", + СокрЛП(Агент_СтрокаПодключения), + СокрЛП(Агент_ИсполнительКоманд.ВерсияУтилитыАдминистрирования())); + +КонецФункции // ОписаниеПодключения() + +// Функция возвращает адрес сервера RAS +// +// Возвращаемое значение: +// Строка - адрес сервера RAS +// +Функция АдресСервераАдминистрирования() Экспорт + + ОписаниеСервиса = СтрРазделить(Агент_СтрокаПодключения, ":"); + + АдресСервиса = "localhost"; + Если ОписаниеСервиса.Количество() > 0 Тогда + АдресСервиса = ОписаниеСервиса[0]; + КонецЕсли; + + Возврат АдресСервиса; + +КонецФункции // АдресСервераАдминистрирования() + +// Функция возвращает порт сервера RAS +// +// Возвращаемое значение: +// Строка - порт сервера RAS +// +Функция ПортСервераАдминистрирования() Экспорт + + ОписаниеСервиса = СтрРазделить(Агент_СтрокаПодключения, ":"); + + ПортСервиса = "1545"; + Если ОписаниеСервиса.Количество() > 1 Тогда + ПортСервиса = ОписаниеСервиса[1]; + КонецЕсли; + + Возврат ПортСервиса; + +КонецФункции // ПортСервераАдминистрирования() + +// Функция возвращает версию утилиты администрирования RAC +// +// Возвращаемое значение: +// Строка - версия утилиты администрирования RAC +// +Функция ВерсияУтилитыАдминистрирования() Экспорт + + Возврат СокрЛП(Агент_ИсполнительКоманд.ВерсияУтилитыАдминистрирования()); + +КонецФункции // ВерсияУтилитыАдминистрирования() + +// Функция возвращает лог библиотеки +// +// Возвращаемое значение: +// Логгер - лог библиотеки +// +Функция Лог() Экспорт + + Возврат Лог; + +КонецФункции // Лог() + +#КонецОбласти // УстановкаПолучениеПараметров + +#Область СтандартныеПараметры + +// Функция возвращает коллекцию параметров объекта +// +// Параметры: +// ИмяПоляКлюча - Строка - имя поля, значение которого будет использовано +// в качестве ключа возвращаемого соответствия +// +// Возвращаемое значение: +// Соответствие - коллекция параметров объекта, для получения/изменения значений +// +Функция ПараметрыОбъекта(ИмяПоляКлюча = "Имя") Экспорт + + Возврат ПараметрыОбъекта.ОписаниеСвойств(ИмяПоляКлюча); + +КонецФункции // ПараметрыОбъекта() + +// Функция возвращает значение параметра администрирования кластера 1С +// +// Параметры: +// ИмяПоля - Строка - Имя параметра кластера +// ОбновитьПринудительно - Булево - Истина - обновить список (вызов RAC) +// +// Возвращаемое значение: +// Произвольный - значение параметра кластера 1С +// +Функция Получить(ИмяПоля, ОбновитьПринудительно = Ложь) Экспорт + + Если НЕ Найти(ВРЕг("АдресСервераАдминистрирования, ras-host"), ВРег(ИмяПоля)) = 0 Тогда + Возврат АдресСервераАдминистрирования(); + ИначеЕсли НЕ Найти(ВРЕг("ПортСервераАдминистрирования, ras-port"), ВРег(ИмяПоля)) = 0 Тогда + Возврат ПортСервераАдминистрирования(); + ИначеЕсли НЕ Найти(ВРЕг("ВерсияУтилитыАдминистрирования, rac-version"), ВРег(ИмяПоля)) = 0 Тогда + Возврат ВерсияУтилитыАдминистрирования(); + Иначе + ЗначениеПоля = Неопределено; + КонецЕсли; + + Возврат ЗначениеПоля; + +КонецФункции // Получить() + +#КонецОбласти // СтандартныеПараметры + +#Область ДочерниеОбъекты + +// Функция возвращает список администраторов агента кластера 1С +// +// Возвращаемое значение: +// Агент_Администраторы - список администраторов агента кластера 1С +// +Функция Администраторы() Экспорт + + Возврат Агент_Администраторы; + +КонецФункции // Администраторы() + +// Функция возвращает список кластеров 1С +// +// Возвращаемое значение: +// Кластеры - список кластеров 1С +// +Функция Кластеры() Экспорт + + Возврат Кластеры; + +КонецФункции // Кластеры() + +#КонецОбласти // ДочерниеОбъекты + +#Область СписокАдминистраторовКластеров + +// Процедура добавляет параметры авторизации для указанного кластера +// +// Параметры: +// Кластер_Ид - Строка - идентификатор кластера 1С +// Администратор - Строка - администратор кластера 1С +// Пароль - Строка - пароль администратора кластера 1С +// +Процедура ДобавитьАдминистратораКластера(Кластер_Ид, Администратор, Пароль) Экспорт + + Если НЕ ТипЗнч(Кластеры_Администраторы) = Тип("Соответствие") Тогда + Кластеры_Администраторы = Новый Соответствие(); + КонецЕсли; + + Кластеры_Администраторы.Вставить(Кластер_Ид, Новый Структура("Администратор, Пароль", Администратор, Пароль)); + +КонецПроцедуры // ДобавитьАдминистратораКластера() + +// Функция возвращает параметры авторизации для указанного кластера +// +// Параметры: +// Кластер_Ид - Строка - идентификатор кластера 1С +// +// Возвращаемое значение: +// Структура - параметры администратора +// Администратор - Строка - администратор кластера 1С +// Пароль - Строка - пароль администратора кластера 1С +// +Функция ПолучитьАдминистратораКластера(Кластер_Ид) Экспорт + + Если НЕ ТипЗнч(Кластеры_Администраторы) = Тип("Соответствие") Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Кластеры_Администраторы.Получить(Кластер_Ид); + +КонецФункции // ПолучитьАдминистратораКластера() + +#КонецОбласти // СписокАдминистраторовКластеров + +#Область ИсполнительКоманд + +// Функция возвращает текущий объект-исполнитель команд +// +// Возвращаемое значение: +// ИсполнительКоманд - текущее значение объекта-исполнителя команд +// +Функция ИсполнительКоманд() Экспорт + + Возврат Агент_ИсполнительКоманд; + +КонецФункции // ИсполнительКоманд() + +// Процедура устанавливает объект-исполнитель команд +// +// Параметры: +// НовыйИсполнитель - ИсполнительКоманд - новый объект-исполнитель команд +// +Процедура УстановитьИсполнительКоманд(Знач НовыйИсполнитель = Неопределено) Экспорт + + Агент_ИсполнительКоманд = НовыйИсполнитель; + +КонецПроцедуры // УстановитьИсполнительКоманд() + +// Устанавливает объект-обработчик, который будет вызываться в случае неудачи вызова ИсполнителяКоманд. +// Объект обработчик должен определить метод ОбработатьОшибку с параметрами: +// * ПараметрыКоманды - передадутся параметры вызванной команды +// * АгентАдминистрирования - объект АдминистрированиеКластера у которого вызывалась команда +// * КодВозврата - на входе - полученный код возврата команды. В качестве выходного параметра +// можно присвоить новое значение кода возврата +// +// Параметры: +// НовыйОбработчикОшибок - Произвольный - объект-обработчик +// +Процедура УстановитьОбработчикОшибокКоманд(Знач НовыйОбработчикОшибок) Экспорт + + ОбработчикОшибок = НовыйОбработчикОшибок; + +КонецПроцедуры // УстановитьОбработчикОшибокКоманд() + +// Функция выполняет команду и возвращает код возврата команды +// +// Параметры: +// ПараметрыКоманды - Массив - параметры выполнения команды +// +// Возвращаемое значение: +// Число - Код возврата команды +// +Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт + + ВыводКоманды = Агент_ИсполнительКоманд.ВыполнитьКоманду(ПараметрыКоманды); + ПолученныйКод = Агент_ИсполнительКоманд.КодВозврата(); + + Если НЕ ПолученныйКод = 0 И НЕ ОбработчикОшибок = Неопределено Тогда + ОбработчикОшибок.ОбработатьОшибку(ПараметрыКоманды, ЭтотОбъект, ПолученныйКод); + КонецЕсли; + + Возврат ПолученныйКод; + +КонецФункции // ВыполнитьКоманду() + +// Функция возвращает текст результата выполнения команды +// +// Параметры: +// РазобратьВывод - Булево - Истина - выполнить преобразование вывода команды в структуру +// Ложь - вернуть текст вывода команды как есть +// +// Возвращаемое значение: +// Структура, Строка - вывод команды +// +Функция ВыводКоманды(РазобратьВывод = Истина) Экспорт + + Если РазобратьВывод Тогда + Возврат Служебный.РазобратьВыводКоманды(ВыводКоманды); + КонецЕсли; + + Возврат ВыводКоманды; + +КонецФункции // ВыводКоманды() + +// Функция возвращает код возврата выполнения команды +// +// Возвращаемое значение: +// Число - код возврата команды +// +Функция КодВозврата() Экспорт + + Возврат Агент_ИсполнительКоманд.КодВозврата(); + +КонецФункции // КодВозврата() + +#КонецОбласти // ИсполнительКоманд + +#Область ПростыеФункцииПолученияДанныхКластера + +// Функция возвращает описание центрального сервера 1С в виде соответствия, +// с вложенными описаниями кластеров и всех дочерних объектов +// +// Возвращаемое значение: +// Соответствие - описание центрального сервера 1С, +// включая описания кластеров и всех дочерних объектов +// +Функция ОписаниеЦентральногоСервера() Экспорт + + Описание = Новый Соответствие(); + + Описание.Вставить("СервисАдминистрирования", + ПолучитьПоляОбъекта(ЭтотОбъект)); + + СписокАдминистраторов = Новый Массив(); + Попытка + СписокАдминистраторов = ПолучитьСписокОбъектов(ЭтотОбъект.Администраторы().Список(), + ЭтотОбъект.Администраторы().ПараметрыОбъекта()); + Исключение + ТекстОшибки = СтрШаблон("Ошибка получения списка администраторов агента: %1", + ПодробноеПредставлениеОшибки(ИнформацияОбОшибке())); + Лог.Информация(ТекстОшибки); + СписокАдминистраторов.Добавить(СтрШаблон("<%1>", ТекстОшибки)); + КонецПопытки; + + Описание.Вставить("Администраторы", СписокАдминистраторов); + + Описание.Вставить("Кластеры", Новый Массив()); + + Кластеры = Кластеры().Список(); + + Для Каждого ТекКластер Из Кластеры Цикл + + Описание["Кластеры"].Добавить(ОписаниеКластера(ТекКластер)); + + КонецЦикла; + + Возврат Описание; + +КонецФункции // ОписаниеЦентральногоСервера() + +// Функция возвращает описание кластера 1С в виде соответствия, +// с вложенными описаниями всех дочерних объектов +// +// Параметры: +// КластерИлиАдрес - Кластер, Строка - объект или адрес кластера 1С +// +// Возвращаемое значение: +// Соответствие - описание кластера 1С, +// включая описания всех дочерних объектов +// +Функция ОписаниеКластера(Знач КластерИлиАдрес) Экспорт + + Если ТипЗнч(КластерИлиАдрес) = Тип("Строка") Тогда + Кластер = ЭтотОбъект.Кластеры.Получить(КластерИлиАдрес); + Иначе + Кластер = КластерИлиАдрес; + КонецЕсли; + + Описание = ПолучитьПоляОбъекта(Кластер); + + Описание.Вставить("Администраторы", + ПолучитьСписокОбъектов(Кластер.Администраторы().Список(), + Кластер.Администраторы().ПараметрыОбъекта())); + + Описание.Вставить("Серверы", Новый Массив()); + + Серверы = Кластер.Серверы().Список(); + Для Каждого ТекСервер Из Серверы Цикл + ПоляОбъекта = ПолучитьПоляОбъекта(ТекСервер); + ПоляОбъекта.Вставить("НазначенияФункциональности", + ПолучитьСписокОбъектов(ТекСервер.НазначенияФункциональности().Список())); + Описание["Серверы"].Добавить(ПоляОбъекта); + КонецЦикла; + + Описание.Вставить("Менеджеры", + ПолучитьСписокОбъектов(Кластер.Менеджеры().Список())); + + Описание.Вставить("Сервисы", + ПолучитьСписокОбъектов(Кластер.Сервисы().Список())); + + Описание.Вставить("РабочиеПроцессы", + ПолучитьСписокОбъектов(Кластер.РабочиеПроцессы().Список())); + Описание.Вставить("РабочиеПроцессы.Лицензии", + ПолучитьСписокОбъектов(Кластер.РабочиеПроцессы().Лицензии().Список(), + Кластер.РабочиеПроцессы().ПараметрыЛицензий())); + + Описание.Вставить("ИнформационныеБазы", + ПолучитьСписокОбъектов(Кластер.ИнформационныеБазы().Список())); + Описание.Вставить("Соединения", СоединенияКластера(Кластер)); + + Описание.Вставить("Сеансы", СеансыКластера(Кластер)); + Описание.Вставить("Сеансы.Лицензии", + ПолучитьСписокОбъектов(Кластер.Сеансы().Лицензии().Список(), + Кластер.Сеансы().ПараметрыЛицензий())); + + Описание.Вставить("Блокировки", + ПолучитьСписокОбъектов(Кластер.Блокировки().Список())); + + Описание.Вставить("ПрофилиБезопасности", Новый Массив()); + + ПрофилиБезопасности = Кластер.ПрофилиБезопасности().Список(); + + Для Каждого ТекПрофиль Из ПрофилиБезопасности Цикл + + ПоляОбъекта = ПолучитьПоляОбъекта(ТекПрофиль); + + ПоляОбъекта.Вставить("Каталоги", + ПолучитьСписокОбъектов(ТекПрофиль.Каталоги().Список())); + ПоляОбъекта.Вставить("COMКлассы", + ПолучитьСписокОбъектов(ТекПрофиль.COMКлассы().Список())); + + ПоляОбъекта.Вставить("ВнешниеКомпоненты", + ПолучитьСписокОбъектов(ТекПрофиль.ВнешниеКомпоненты().Список())); + + ПоляОбъекта.Вставить("ВнешниеМодули", + ПолучитьСписокОбъектов(ТекПрофиль.ВнешниеМодули().Список())); + + ПоляОбъекта.Вставить("Приложения", + ПолучитьСписокОбъектов(ТекПрофиль.Приложения().Список())); + + ПоляОбъекта.Вставить("ИнтернетРесурсы", + ПолучитьСписокОбъектов(ТекПрофиль.ИнтернетРесурсы().Список())); + + Описание["ПрофилиБезопасности"].Добавить(ПоляОбъекта); + + КонецЦикла; + + Описание.Вставить("СчетчикиРесурсов", + ПолучитьСписокОбъектов(Кластер.СчетчикиРесурсов().Список())); + + Описание.Вставить("ОграниченияРесурсов", + ПолучитьСписокОбъектов(Кластер.ОграниченияРесурсов().Список())); + + Возврат Описание; + +КонецФункции // ОписаниеКластера() + +// Функция возвращает список сеансов всех кластеров центрального сервера 1С в виде массива +// +// Возвращаемое значение: +// Массив (Соответствие) - список сеансов +// +Функция ВсеСеансы() Экспорт + + ВсеКластеры = ЭтотОбъект.Кластеры.Список(); + + ВсеСеансы = Новый Массив(); + + Для Каждого ТекКластер Из ВсеКластеры Цикл + СеансыКластера = СеансыКластера(ТекКластер); + + Для Каждого ТекСеанс Из СеансыКластера Цикл + ВсеСеансы.Добавить(ТекСеанс); + КонецЦикла; + КонецЦикла; + + Возврат ВсеСеансы; + +КонецФункции // ВсеСеансы() + +// Функция возвращает список сеансов кластера 1С в виде массива +// +// Параметры: +// КластерИлиАдрес - Кластер, Строка - объект или адрес кластера 1С +// +// Возвращаемое значение: +// Массив (Соответствие) - список сеансов кластера 1С +// +Функция СеансыКластера(Знач КластерИлиАдрес = Неопределено) Экспорт + + Если НЕ ЗначениеЗаполнено(КластерИлиАдрес) Тогда + Возврат ВсеСеансы(); + КонецЕсли; + + Если ТипЗнч(КластерИлиАдрес) = Тип("Строка") Тогда + Кластер = ЭтотОбъект.Кластеры.Получить(КластерИлиАдрес); + Иначе + Кластер = КластерИлиАдрес; + КонецЕсли; + + Возврат ПолучитьСписокОбъектов(Кластер.Сеансы().Список()); + +КонецФункции // СеансыКластера() + +// Функция возвращает список соединений всех кластеров центрального сервера 1С в виде массива +// +// Возвращаемое значение: +// Массив (Соответствие) - список соединений +// +Функция ВсеСоединения() Экспорт + + ВсеКластеры = ЭтотОбъект.Кластеры.Список(); + + ВсеСоединения = Новый Массив(); + + Для Каждого ТекКластер Из ВсеКластеры Цикл + СоединенияКластера = СоединенияКластера(ТекКластер); + + Для Каждого ТекСеанс Из СоединенияКластера Цикл + ВсеСоединения.Добавить(ТекСеанс); + КонецЦикла; + КонецЦикла; + + Возврат ВсеСоединения; + +КонецФункции // ВсеСоединения() + +// Функция возвращает список соединений кластера 1С в виде массива +// +// Параметры: +// КластерИлиАдрес - Кластер, Строка - объект или адрес кластера 1С +// +// Возвращаемое значение: +// Массив (Соответствие) - список соединений кластера 1С +// +Функция СоединенияКластера(Знач КластерИлиАдрес = Неопределено) Экспорт + + Если НЕ ЗначениеЗаполнено(КластерИлиАдрес) Тогда + Возврат ВсеСоединения(); + КонецЕсли; + + Если ТипЗнч(КластерИлиАдрес) = Тип("Строка") Тогда + Кластер = ЭтотОбъект.Кластеры.Получить(КластерИлиАдрес); + Иначе + Кластер = КластерИлиАдрес; + КонецЕсли; + + Возврат ПолучитьСписокОбъектов(Кластер.Соединения().Список()); + +КонецФункции // СоединенияКластера() + +#КонецОбласти // ПростыеФункцииПолученияДанныхКластера + +#Область СлужебныеМетоды + +Функция ПолучитьСписокОбъектов(Знач Список, Знач Параметры = Неопределено) + + СписокОбъектов = Новый Массив(); + + Для Каждого ТекОбъект Из Список Цикл + СписокОбъектов.Добавить(ПолучитьПоляОбъекта(ТекОбъект, Параметры)); + КонецЦикла; + + Возврат СписокОбъектов; + +КонецФункции // ПолучитьСписокОбъектов() + +Функция ПолучитьПоляОбъекта(Знач ОбъектКластера, Знач Параметры = Неопределено) + + ПоляОбъекта = Новый Соответствие(); + + ИспользоватьПараметрыОбъекта = (Параметры = Неопределено); + Если ИспользоватьПараметрыОбъекта Тогда + Параметры = ОбъектКластера.ПараметрыОбъекта(); + КонецЕсли; + + Для Каждого ТекПараметр Из Параметры Цикл + Если ИспользоватьПараметрыОбъекта Тогда + Ключ = ТекПараметр.Ключ; + Иначе + Ключ = ТекПараметр.Значение.ИмяРАК; + КонецЕсли; + ПоляОбъекта.Вставить(ТекПараметр.Значение.ИмяРАК, ОбъектКластера.Получить(Ключ)); + КонецЦикла; + + Возврат ПоляОбъекта; + +КонецФункции // ПолучитьПоляОбъекта() + +#КонецОбласти // СлужебныеМетоды \ No newline at end of file diff --git "a/src/\320\234\320\260\320\272\320\265\321\202\321\213/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.json" "b/src/\320\234\320\260\320\272\320\265\321\202\321\213/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.json" index 3fe8f7d..46dc841 100644 --- "a/src/\320\234\320\260\320\272\320\265\321\202\321\213/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.json" +++ "b/src/\320\234\320\260\320\272\320\265\321\202\321\213/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.json" @@ -123,5 +123,9 @@ "СнизитьПриоритетПотока" : "set-low-priority-thread", "ЗавершитьТекущийВызов" : "interrupt-current-call", "ЗавершитьСеанс" : "interrupt-session" + }, + "СпособыПодключения":{ + "Локально" : "rac", + "Удаленно" : "hirac" } } diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.os" index d8f22cd..3213bb5 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\265\321\200\320\265\321\207\320\270\321\201\320\273\320\265\320\275\320\270\321\217.os" @@ -30,6 +30,7 @@ Перем СостоянияСчетчиковРесурсов Экспорт; Перем ПоляОтбораСчетчиковРесурсов Экспорт; Перем ДействияОграниченияРесурсов Экспорт; +Перем СпособыПодключения Экспорт; Функция Значение(Знач ПутьКЗначению) Экспорт 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\271.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\271.os" index 4d645de..970ddaa 100644 --- "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\271.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\271.os" @@ -13,7 +13,9 @@ #Использовать strings #Использовать 1commands #Использовать v8runner +#Использовать 1connector +Перем ЭтоПриложениеEXE; Перем Лог; // Функция - читает указанный макет JSON и возвращает содержимое в виде структуры/массива @@ -26,11 +28,17 @@ // Функция ПрочитатьДанныеИзМакетаJSON(ИмяМакета) Экспорт + Если ЭтоСборкаEXE() Тогда + КаталогЗапуска = КаталогПрограммы(); + Иначе + КаталогЗапуска = ТекущийСценарий().Каталог; + КонецЕсли; + Чтение = Новый ЧтениеJSON(); - Чтение.ОткрытьФайл(СтрШаблон("%1/../Макеты/%2.json", ТекущийСценарий().Каталог, ИмяМакета), + Чтение.ОткрытьФайл(СтрШаблон("%1/../Макеты/%2.json", КаталогЗапуска, ИмяМакета), КодировкаТекста.UTF8); - + Возврат ПрочитатьJSON(Чтение, Ложь); КонецФункции // ПрочитатьДанныеИзМакетаJSON() @@ -240,6 +248,55 @@ КонецФункции // ОбъектВСоответствие() +// Функция преобразует переданный текст вывода команды в массив соответствий +// элементы массива создаются по блокам текста, разделенным пустой строкой +// пары <ключ, значение> структуры получаются для каждой строки с учетом разделителя ":" +// +// Параметры: +// ВыводКоманды - Строка - текст для разбора +// +// Возвращаемое значение: +// Массив (Соответствие) - результат разбора +// +Функция РазобратьВыводКоманды(Знач ВыводКоманды) Экспорт + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(ВыводКоманды); + + МассивРезультатов = Новый Массив(); + Описание = Новый Соответствие(); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + + ТекстСтроки = Текст.ПолучитьСтроку(й); + + ПозРазделителя = СтрНайти(ТекстСтроки, ":"); + + Если НЕ ЗначениеЗаполнено(ТекстСтроки) Тогда + Если й = 1 Тогда + Продолжить; + КонецЕсли; + МассивРезультатов.Добавить(Описание); + Описание = Новый Соответствие(); + Продолжить; + КонецЕсли; + + Если ПозРазделителя = 0 Тогда + Описание.Вставить(СокрЛП(ТекстСтроки), ""); + Иначе + Описание.Вставить(СокрЛП(Лев(ТекстСтроки, ПозРазделителя - 1)), СокрЛП(Сред(ТекстСтроки, ПозРазделителя + 1))); + КонецЕсли; + + КонецЦикла; + + Если МассивРезультатов.Количество() = 1 И ТипЗнч(МассивРезультатов[0]) = Тип("Строка") Тогда + Возврат МассивРезультатов[0]; + КонецЕсли; + + Возврат МассивРезультатов; + +КонецФункции // РазобратьВыводКоманды() + // Функция признак необходимости обновления данных // // Параметры: @@ -284,6 +341,21 @@ КонецПроцедуры // ВывестиПоляОбъекта() +// Функция признак того, что выполняется скрипт, собранный в приложение +// +// Возвращаемое значение: +// Булево - Истина - выполняется скрипт, собранный в приложение +// +Функция ЭтоСборкаEXE() Экспорт + + Если ЭтоПриложениеEXE = Неопределено Тогда + ЭтоПриложениеEXE = ВРег(Прав(ТекущийСценарий().Источник, 3)) = "EXE"; + КонецЕсли; + + Возврат ЭтоПриложениеEXE; + +КонецФункции // ЭтоСборкаEXE() + // Функция возвращает лог библиотеки // // Возвращаемое значение: diff --git a/tests/irac-test.os b/tests/irac-test.os index d9dd865..f91a340 100644 --- a/tests/irac-test.os +++ b/tests/irac-test.os @@ -11,14 +11,12 @@ #Использовать "./fixtures" #Использовать asserts #Использовать fs -#Использовать tempfiles #Использовать moskito Перем ЮнитТест; Перем ИспользоватьМок; Перем АгентКластера; Перем ИсполнительКоманд; -Перем ВременныйКаталог; // Процедура выполняется после запуска теста // @@ -28,11 +26,12 @@ Лог.УстановитьУровень(УровниЛога.Отладка); - АдресСервера = ПараметрыТестирования.Параметры().Агент_Адрес; - ПортСервера = ПараметрыТестирования.Параметры().Агент_Порт; + АдресСервера = СтрШаблон("%1:%2", + ПараметрыТестирования.Параметры().Агент_Адрес, + ПараметрыТестирования.Параметры().Агент_Порт); Если АгентКластера = Неопределено Тогда - АгентКластера = Новый АдминистрированиеКластера(АдресСервера, ПортСервера, ""); + АгентКластера = Новый УправлениеКластером1С("", АдресСервера); КонецЕсли; Если ИсполнительКоманд = Неопределено Тогда