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/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..9870073 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С""!"); + Админ_АдресСервера = АдресСервера; Админ_ПортСервера = ПортСервера; 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..dac5cf2 --- /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,425 @@ +// ---------------------------------------------------------- +// 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С +// +Процедура ДобавитьАдминистратораКластера(Кластер_Ид, Администратор, Пароль) Экспорт + + Если НЕ ТипЗнч(Кластеры_Администраторы) = Тип("Соответствие") Тогда + Кластеры_Администраторы = Новый Соответствие(); + КонецЕсли; + + Кластеры_Администраторы.Вставить(Кластер_Ид, Новый Структура("Администратор, Пароль", Администратор, Пароль)); + +КонецПроцедуры // ДобавитьАдминистратораКластера() + +// Функция возвращает параметры авторизации для указанного кластера +// +// Параметры: +// Кластер_Ид - Строка - идентификатор кластера 1С +// +// Возвращаемое значение: +// Структура - параметры администратора +// Администратор - Строка - администратор кластера 1С +// Пароль - Строка - пароль администратора кластера 1С +// +Функция ПолучитьАдминистратораКластера(Кластер_Ид) Экспорт + + Если НЕ ТипЗнч(Кластеры_Администраторы) = Тип("Соответствие") Тогда + Возврат Неопределено; + КонецЕсли; + + Возврат Кластеры_Администраторы.Получить(Кластер_Ид); + +КонецФункции // ПолучитьАдминистратораКластера() + +// Функция возвращает текущий объект-исполнитель команд +// +// Возвращаемое значение: +// ИсполнительКоманд - текущее значение объекта-исполнителя команд +// +Функция ИсполнительКоманд() Экспорт + + Возврат Агент_ИсполнительКоманд; + +КонецФункции // ИсполнительКоманд() + +// Процедура устанавливает объект-исполнитель команд +// +// Параметры: +// НовыйИсполнитель - ИсполнительКоманд - новый объект-исполнитель команд +// +Процедура УстановитьИсполнительКоманд(Знач НовыйИсполнитель = Неопределено) Экспорт + + Агент_ИсполнительКоманд = НовыйИсполнитель; + +КонецПроцедуры // УстановитьИсполнительКоманд() + +// Устанавливает объект-обработчик, который будет вызываться в случае неудачи вызова ИсполнителяКоманд. +// Объект обработчик должен определить метод ОбработатьОшибку с параметрами: +// * ПараметрыКоманды - передадутся параметры вызванной команды +// * АгентАдминистрирования - объект АдминистрированиеКластера у которого вызывалась команда +// * КодВозврата - на входе - полученный код возврата команды. В качестве выходного параметра +// можно присвоить новое значение кода возврата +// +// Параметры: +// НовыйОбработчикОшибок - Произвольный - объект-обработчик +// +Процедура УстановитьОбработчикОшибокКоманд(Знач НовыйОбработчикОшибок) Экспорт + + ОбработчикОшибок = НовыйОбработчикОшибок; + +КонецПроцедуры // УстановитьОбработчикОшибокКоманд() + +// Функция выполняет команду и возвращает код возврата команды +// +// Параметры: +// ПараметрыКоманды - Массив - параметры выполнения команды +// +// Возвращаемое значение: +// Число - Код возврата команды +// +Функция ВыполнитьКоманду(ПараметрыКоманды) Экспорт + + ВыводКоманды = Агент_ИсполнительКоманд.ВыполнитьКоманду(ПараметрыКоманды); + ПолученныйКод = Агент_ИсполнительКоманд.КодВозврата(); + + Если НЕ ПолученныйКод = 0 И НЕ ОбработчикОшибок = Неопределено Тогда + ОбработчикОшибок.ОбработатьОшибку(ПараметрыКоманды, ЭтотОбъект, ПолученныйКод); + КонецЕсли; + + Возврат ПолученныйКод; + +КонецФункции // ВыполнитьКоманду() + +// Функция возвращает текст результата выполнения команды +// +// Параметры: +// РазобратьВывод - Булево - Истина - выполнить преобразование вывода команды в структуру +// Ложь - вернуть текст вывода команды как есть +// +// Возвращаемое значение: +// Структура, Строка - вывод команды +// +Функция ВыводКоманды(РазобратьВывод = Истина) Экспорт + + Если РазобратьВывод Тогда + Возврат РазобратьВыводКоманды(ВыводКоманды); + КонецЕсли; + + Возврат ВыводКоманды; + +КонецФункции // ВыводКоманды() + +// Функция возвращает код возврата выполнения команды +// +// Возвращаемое значение: +// Число - код возврата команды +// +Функция КодВозврата() Экспорт + + Возврат Агент_ИсполнительКоманд.КодВозврата(); + +КонецФункции // КодВозврата() + +// Функция преобразует переданный текст вывода команды в массив соответствий +// элементы массива создаются по блокам текста, разделенным пустой строкой +// пары <ключ, значение> структуры получаются для каждой строки с учетом разделителя ":" +// +// Параметры: +// ВыводКоманды - Строка - текст для разбора +// +// Возвращаемое значение: +// Массив (Соответствие) - результат разбора +// +Функция РазобратьВыводКоманды(Знач ВыводКоманды) + + Текст = Новый ТекстовыйДокумент(); + Текст.УстановитьТекст(ВыводКоманды); + + МассивРезультатов = Новый Массив(); + Описание = Новый Соответствие(); + + Для й = 1 По Текст.КоличествоСтрок() Цикл + + ТекстСтроки = Текст.ПолучитьСтроку(й); + + ПозРазделителя = СтрНайти(ТекстСтроки, ":"); + + Если НЕ ЗначениеЗаполнено(ТекстСтроки) Тогда + Если й = 1 Тогда + Продолжить; + КонецЕсли; + МассивРезультатов.Добавить(Описание); + Описание = Новый Соответствие(); + Продолжить; + КонецЕсли; + + Если ПозРазделителя = 0 Тогда + Продолжить; + КонецЕсли; + + Описание.Вставить(СокрЛП(Лев(ТекстСтроки, ПозРазделителя - 1)), СокрЛП(Сред(ТекстСтроки, ПозРазделителя + 1))); + + КонецЦикла; + + Возврат МассивРезультатов; + +КонецФункции // РазобратьВыводКоманды() + +// Функция возвращает строку описания подключения к серверу администрирования кластера 1С +// +// Возвращаемое значение: +// Строка - описание подключения к серверу администрирования кластера 1С +// +Функция ОписаниеПодключения() Экспорт + + Возврат СтрШаблон("%1 (v.%2)", + СокрЛП(Агент_СтрокаПодключения), + СокрЛП(Агент_ИсполнительКоманд.ВерсияУтилитыАдминистрирования())); + +КонецФункции // ОписаниеПодключения() + +// Функция возвращает адрес сервера RAS +// +// Возвращаемое значение: +// Строка - адрес сервера RAS +// +Функция АдресСервераАдминистрирования() Экспорт + + ОписаниеСервиса = СтрРазделить(Агент_СтрокаПодключения, ":"); + + АдресСервиса = "localhost"; + Если ОписаниеСервиса.Количество() > 0 Тогда + АдресСервиса = ОписаниеСервиса[0]; + КонецЕсли; + + Возврат АдресСервиса; + +КонецФункции // АдресСервераАдминистрирования() + +// Функция возвращает порт сервера RAS +// +// Возвращаемое значение: +// Строка - порт сервера RAS +// +Функция ПортСервераАдминистрирования() Экспорт + + ОписаниеСервиса = СтрРазделить(Агент_СтрокаПодключения, ":"); + + ПортСервиса = "1545"; + Если ОписаниеСервиса.Количество() > 1 Тогда + ПортСервиса = ОписаниеСервиса[1]; + КонецЕсли; + + Возврат ПортСервиса; + +КонецФункции // ПортСервераАдминистрирования() + +// Функция возвращает версию утилиты администрирования RAC +// +// Возвращаемое значение: +// Строка - версия утилиты администрирования RAC +// +Функция ВерсияУтилитыАдминистрирования() Экспорт + + Возврат СокрЛП(Агент_ИсполнительКоманд.ВерсияУтилитыАдминистрирования()); + +КонецФункции // ВерсияУтилитыАдминистрирования() + +// Функция возвращает список администраторов агента кластера 1С +// +// Возвращаемое значение: +// Агент_Администраторы - список администраторов агента кластера 1С +// +Функция Администраторы() Экспорт + + Возврат Агент_Администраторы; + +КонецФункции // Администраторы() + +// Функция возвращает список кластеров 1С +// +// Возвращаемое значение: +// Кластеры - список кластеров 1С +// +Функция Кластеры() Экспорт + + Возврат Кластеры; + +КонецФункции // Кластеры() + +// Функция возвращает коллекцию параметров объекта +// +// Параметры: +// ИмяПоляКлюча - Строка - имя поля, значение которого будет использовано +// в качестве ключа возвращаемого соответствия +// +// Возвращаемое значение: +// Соответствие - коллекция параметров объекта, для получения/изменения значений +// +Функция ПараметрыОбъекта(ИмяПоляКлюча = "Имя") Экспорт + + Возврат ПараметрыОбъекта.ОписаниеСвойств(ИмяПоляКлюча); + +КонецФункции // ПараметрыОбъекта() + +// Функция возвращает значение параметра администрирования кластера 1С +// +// Параметры: +// ИмяПоля - Строка - Имя параметра кластера +// ОбновитьПринудительно - Булево - Истина - обновить список (вызов RAC) +// +// Возвращаемое значение: +// Произвольный - значение параметра кластера 1С +// +Функция Получить(ИмяПоля, ОбновитьПринудительно = Ложь) Экспорт + + Если НЕ Найти(ВРЕг("АдресСервераАдминистрирования, ras-host"), ВРег(ИмяПоля)) = 0 Тогда + Возврат АдресСервераАдминистрирования(); + ИначеЕсли НЕ Найти(ВРЕг("ПортСервераАдминистрирования, ras-port"), ВРег(ИмяПоля)) = 0 Тогда + Возврат ПортСервераАдминистрирования(); + ИначеЕсли НЕ Найти(ВРЕг("ВерсияУтилитыАдминистрирования, rac-version"), ВРег(ИмяПоля)) = 0 Тогда + Возврат ВерсияУтилитыАдминистрирования(); + Иначе + ЗначениеПоля = Неопределено; + КонецЕсли; + + Возврат ЗначениеПоля; + +КонецФункции // Получить() + +// Функция возвращает лог библиотеки +// +// Возвращаемое значение: +// Логгер - лог библиотеки +// +Функция Лог() Экспорт + + Возврат Лог; + +КонецФункции // Лог() diff --git a/tests/irac-test.os b/tests/irac-test.os index d9dd865..e912f78 100644 --- a/tests/irac-test.os +++ b/tests/irac-test.os @@ -28,11 +28,12 @@ Лог.УстановитьУровень(УровниЛога.Отладка); - АдресСервера = ПараметрыТестирования.Параметры().Агент_Адрес; - ПортСервера = ПараметрыТестирования.Параметры().Агент_Порт; + АдресСервера = СтрШаблон("%1:%2", + ПараметрыТестирования.Параметры().Агент_Адрес, + ПараметрыТестирования.Параметры().Агент_Порт); Если АгентКластера = Неопределено Тогда - АгентКластера = Новый АдминистрированиеКластера(АдресСервера, ПортСервера, ""); + АгентКластера = Новый УправлениеКластером1С("", АдресСервера); КонецЕсли; Если ИсполнительКоманд = Неопределено Тогда