/////////////////////////////////////////////////////////////////////////////////////////////////// // Прикладной интерфейс Перем мНастройки; Перем Лог; Перем мИдентификаторКластера; Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-raс", "Команда запуска RAC"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db-user", "Пользователь информационной базы"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db-pwd", "Пароль пользователя информационной базы"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-cluster-admin", "Администратор кластера"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-cluster-admin-pwd", "Пароль администратора кластера"); Парсер.ДобавитьКоманду(ОписаниеКоманды); КонецПроцедуры Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт ПрочитатьПараметры(ПараметрыКоманды); Если Не ПараметрыВведеныКорректно() Тогда Возврат МенеджерКомандПриложения.РезультатКоманды().НеверныеПараметры; КонецЕсли; Возврат МенеджерКомандПриложения.РезультатКоманды().НеРеализована; КонецФункции Процедура ПрочитатьПараметры(Знач ПараметрыКоманды) мНастройки = Новый Структура; мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]); мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-raс"]); мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]); мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]); мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]); мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]); мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-admin-pwd"]); мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); КонецПроцедуры Функция ПараметрыВведеныКорректно() Успех = Истина; Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда Лог.Ошибка("Не указан сервер администрирования"); Успех = Ложь; КонецЕсли; Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда Лог.Ошибка("Не указан клиент администрирования"); Успех = Ложь; КонецЕсли; Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда Лог.Ошибка("Не указано имя базы данных"); Успех = Ложь; КонецЕсли; Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда Лог.Ошибка("Не указано действие lock/unlock"); Успех = Ложь; КонецЕсли; Возврат Успех; КонецФункции ///////////////////////////////////////////////////////////////////////////////// // Взаимодействие с кластером Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать) УИДИБ = НайтиБазуВКластере(); КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase --cluster=""%1""" + ?(мНастройки.АдминистраторКластера<>""," --cluster-user=""%2""", "") + ?(мНастройки.ПарольАдминистратораКластера<>""," --cluster-pwd=""%3""", ""), ИдентификаторКластера(), мНастройки.АдминистраторКластера, мНастройки.ПарольАдминистратораКластера) + СтрШаблон(" update --infobase=%1" + ?(мНастройки.АдминистраторИБ<>""," --infobase-user=""%2""","") + ?(мНастройки.ПарольАдминистратораИБ<>""," --infobase-pwd=""%3""","")) + " sessions-deny=" + ?(Блокировать, "on", "off"); ЗапуститьПроцесс(КомандаВыполнения); КонецПроцедуры Функция ИдентификаторКластера() Если мИдентификаторКластера = Неопределено Тогда Лог.Информация("Получаю список кластеров"); КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list"; СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); УИДКластера = Сред(СписокКластеров,(Найти(СписокКластеров,":")+1),Найти(СписокКластеров,"host")-Найти(СписокКластеров,":")-1); мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера,Символы.ПС,"")); КонецЕсли; Если ПустаяСтрока(мИдентификаторКластера) Тогда ВызватьИсключение "Кластер серверов отсутствует"; КонецЕсли; Возврат мИдентификаторКластера; КонецФункции Функция НайтиБазуВКластере() КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase summary --cluster=""%1""" + ?(мНастройки.АдминистраторКластера<>""," --cluster-user=""%2""", "") + ?(мНастройки.ПарольАдминистратораКластера<>""," --cluster-pwd=""%3""", "") + " list", ИдентификаторКластера(), мНастройки.АдминистраторКластера, мНастройки.ПарольАдминистратораКластера); Лог.Информация("Получаю список баз кластера"); СписокБазВКластере = ЗапуститьПроцесс(КомандаВыполнения); ЧислоСтрок = СтрЧислоСтрок(СписокБазВКластере); НайденаБазаВКластере = Ложь; Для К = 1 По ЧислоСтрок Цикл СтрокаРазбора = СтрПолучитьСтроку(СписокБазВКластере,К); ПозицияРазделителя = Найти(СтрокаРазбора,":"); Если Найти(СтрокаРазбора,"infobase")>0 Тогда УИДИБ = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1)); ИначеЕсли Найти(СтрокаРазбора,"name")>0 Тогда ИмяБазы = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1)); Если ИмяБазы = мНастройки.ИмяБазыДанных Тогда Сообщить("Получен УИД базы"); НайденаБазаВКластере = Истина; Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если Не НайденаБазаВКластере Тогда ВызватьИсключение "База "+мНастройки.ИмяБазыДанных +" не найдена в кластере"; КонецЕсли; Возврат УИДИБ; КонецФункции Функция СтрокаЗапускаКлиента() Возврат ЗапускПриложений.ОбернутьВКавычки(мНастройки.ПутьКлиентаАдминистрирования) + " " + мНастройки.АдресСервераАдминистрирования + " "; КонецФункции Функция ЗапуститьПроцесс(Знач СтрокаВыполнения) Процесс = СоздатьПроцесс(СтрокаВыполнения,,Истина); Процесс.Запустить(); Процесс.ОжидатьЗавершения(); Если Процесс.КодВозврата = 0 Тогда Текст = Процесс.ПотокВывода.Прочитать(); Лог.Отладка(Текст); Возврат Текст; Иначе ВызватьИсключение Процесс.ПотокОшибок.Прочитать(); КонецЕсли; КонецФункции ///////////////////////////////////////////////////////////////////////////////// Лог = Логирование.ПолучитьЛог("vanessa.app.deployka");