Skip to content
КомандаУправлениеСеансами.os 11.2 KiB
Newer Older

///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс

Перем мНастройки;
Перем Лог;
Перем мИдентификаторКластера;

Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт
	
    ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы");
    
    Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "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");