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

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

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

Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт
	
	ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы");
	Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с");
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы");
	
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-db-user",
		"Пользователь информационной базы");

	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-db-pwd",
		"Пароль пользователя информационной базы");
		
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-cluster-admin",
		"Администратор кластера");

	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-cluster-pwd",
		"Пароль администратора кластера");
	
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-v8version",
		"Маска версии платформы 1С");
	
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-lockmessage",
		"Сообщение блокировки");
		
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-lockuccode",
		"Ключ разрешения запуска");
	
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-lockstart",
		"Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'");
	
	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, 
		"-lockstartat",
		"Время старта блокировки через n сек");
	
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
	
КонецПроцедуры

Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт

	ПрочитатьПараметры(ПараметрыКоманды);
	
	Если Не ПараметрыВведеныКорректно() Тогда
		Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры;
	КонецЕсли;
	
	Если мНастройки.Действие = "lock" Тогда
		УстановитьСтатусБлокировкиСеансов(Истина);
	ИначеЕсли мНастройки.Действие = "unlock" Тогда
		УстановитьСтатусБлокировкиСеансов(Ложь);
	ИначеЕсли мНастройки.Действие = "kill" Тогда
		УдалитьВсеСеансыИСоединенияБазы();
	Иначе
		Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие);
		Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры;
	КонецЕсли;

	Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех;
КонецФункции

Процедура ПрочитатьПараметры(Знач ПараметрыКоманды)
	мНастройки = Новый Структура;
	
	Для Каждого КЗ Из ПараметрыКоманды Цикл
		Лог.Отладка(КЗ.Ключ + " = " + КЗ.Значение);
	КонецЦикла;
	
	мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]);
	мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-rac"]);
	мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]);
	мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]);
	мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]);
	мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]);
	мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-pwd"]);
	мНастройки.Вставить("ИспользуемаяВерсияПлатформы", ПараметрыКоманды["-v8version"]);
	мНастройки.Вставить("КлючРазрешенияЗапуска", ПараметрыКоманды["-lockuccode"]);
	мНастройки.Вставить("СообщениеОблокировке", ПараметрыКоманды["-lockmessage"]);
	мНастройки.Вставить("ВремяСтартаБлокировки", ПараметрыКоманды["-lockstart"]);
	мНастройки.Вставить("ВремяСтартаБлокировкиЧерез", ПараметрыКоманды["-lockstartat"]);
	мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]);
	
	//Получим путь к платформе если вдруг не установленна
	мНастройки.ПутьКлиентаАдминистрирования = ПолучитьПутьКRAC(мНастройки.ПутьКлиентаАдминистрирования, мНастройки.ИспользуемаяВерсияПлатформы);
	Если ПустаяСтрока(мНастройки.АдресСервераАдминистрирования) Тогда
		мНастройки.АдресСервераАдминистрирования = "localhost:1545";
	КонецЕсли;
КонецПроцедуры

Функция ПараметрыВведеныКорректно()
	
	Успех = Истина;
	
	Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда
		Лог.Ошибка("Не указан сервер администрирования");
		Успех = Ложь;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда
		Лог.Ошибка("Не указан клиент администрирования");
		Успех = Ложь;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда
		Лог.Ошибка("Не указано имя базы данных");
		Успех = Ложь;
	КонецЕсли;
	
	Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда
		Лог.Ошибка("Не указано действие lock/unlock");
		Успех = Ложь;
	КонецЕсли;
	
	Возврат Успех;
	
КонецФункции

/////////////////////////////////////////////////////////////////////////////////
// Взаимодействие с кластером

Процедура УдалитьВсеСеансыИСоединенияБазы()
	УстановитьСтатусБлокировкиСеансов(Истина);
	ОтключитьСуществующиеСеансы();
	Приостановить(500);
	Сеансы = ПолучитьСписокСеансов();
	Если Сеансы.Количество() Тогда
		Лог.Информация("Пауза перед отключением соединений");
		Приостановить(10000);
		ОтключитьСоединенияСРабочимиПроцессами();
		
КонецПроцедуры

Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать)
	
	КлючиАвторизацииВБазе = КлючиАвторизацииВБазе();
	
	ИдентификаторКластера = ИдентификаторКластера();
	ИдентификаторБазы = ИдентификаторБазы();
	
	Если Блокировать Тогда
		КлючРазрешенияЗапускаПоУмолчанию = ИдентификаторБазы;
	Иначе
		КлючРазрешенияЗапускаПоУмолчанию = "";
	КонецЕсли;
	КлючРазрешенияЗапуска = ?(ПустаяСтрока(мНастройки.КлючРазрешенияЗапуска), КлючРазрешенияЗапускаПоУмолчанию, мНастройки.КлючРазрешенияЗапуска);

	ВремяБлокировки = мНастройки.ВремяСтартаБлокировки;
	Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтартаБлокировкиЧерез) Тогда
			Секунды = Число(мНастройки.ВремяСтартаБлокировкиЧерез);
		ВремяБлокировки = Формат(ТекущаяДата()+Секунды,"ДФ='yyyy-MM-ddTHH:mm:ss'");
	КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --sessions-deny=%5 --denied-message=""%6"" --denied-from=""%8"" --permission-code=""%7""",
		ИдентификаторКластера,
		КлючиАвторизацииВКластере(),
		ИдентификаторБазы,
		КлючиАвторизацииВБазе,
		?(Блокировать, "on", "off"), 
		мНастройки.СообщениеОблокировке, 
		КлючРазрешенияЗапуска, 
		ВремяБлокировки) + " "+мНастройки.АдресСервераАдминистрирования;
		
	ЗапуститьПроцесс(КомандаВыполнения);
	
	Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены"));
	
Функция КлючиАвторизацииВБазе()
	КлючиАвторизацииВБазе = "";
	Если ЗначениеЗаполнено(мНастройки.АдминистраторИБ) Тогда
		КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-user=""%1""", мНастройки.АдминистраторИБ);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораИБ) Тогда
		КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-pwd=""%1""", мНастройки.ПарольАдминистратораИБ);
	КонецЕсли;
	
	Возврат КлючиАвторизацииВБазе;
	
КонецФункции


Функция ИдентификаторКластера()

	Если мИдентификаторКластера = Неопределено Тогда
		Лог.Информация("Получаю список кластеров");
		
	   КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list" + " "+мНастройки.АдресСервераАдминистрирования;
	   
	   СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения);
	   
	   УИДКластера = Сред(СписокКластеров,(Найти(СписокКластеров,":")+1),Найти(СписокКластеров,"host")-Найти(СписокКластеров,":")-1);	
	   мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера,Символы.ПС,""));