Skip to content
КомандаУправлениеСеансами.os 12 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 сек");

	Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
		"-try",
		"Число попыток обращения по протоколу rac/ras");
	
	Парсер.ДобавитьКоманду(ОписаниеКоманды);
	
КонецПроцедуры

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

	ПрочитатьПараметры(ПараметрыКоманды);
	
	Если Не ПараметрыВведеныКорректно() Тогда
		Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры;
	КонецЕсли;

	СерверАдминистрирования = Новый СерверАдминистрирования;

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

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

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

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

	Если мНастройки.ЧислоПопыток <> Неопределено Тогда
		Попытка
			ПопыткиЧислом = Число(мНастройки.ЧислоПопыток);
		Исключение
			Лог.Ошибка("Параметр -try не является числовым.");
			Успех = Ложь;
		КонецПопытки;

		Если Успех и ПопыткиЧислом <= 0 Тогда
			ПопыткиЧислом = 1;
			Лог.Предупреждение("Параметр -try не представляет собой число попыток. Он будет проигнорирован");
		КонецЕсли;

		Если Успех Тогда
			мНастройки.ЧислоПопыток = ПопыткиЧислом;
		Иначе
			мНастройки.ЧислоПопыток = 1;
		КонецЕсли;
	Иначе
		мНастройки.ЧислоПопыток = 1;
	КонецЕсли;
Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать)
	
	ВремяБлокировки = мНастройки.ВремяСтартаБлокировки;
	Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтартаБлокировкиЧерез) Тогда
		Секунды = 0;
		Попытка
			Секунды = Число(мНастройки.ВремяСтартаБлокировкиЧерез);
		Исключение
		КонецПопытки;
		
		ВремяБлокировки = Формат(ТекущаяДата()+Секунды,"ДФ='yyyy-MM-ddTHH:mm:ss'");
	КонецЕсли;
	
	РезультатБлокировки = СерверАдминистрирования.УстановитьСтатусБлокировкиСеансов(Блокировать, ВремяБлокировки, мНастройки.СообщениеОблокировке, мНастройки.ЧислоПопыток);
	
	Если НЕ РезультатБлокировки Тогда
		Лог.Ошибка("Не удалось "+ ?(Блокировать, "заблокировать", "разблокировать") +" сеансы");
	КонецЕсли;

КонецПроцедуры

Процедура УдалитьВсеСеансыИСоединенияБазы()
	
	УстановитьСтатусБлокировкиСеансов(Истина);

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

		Исключение
			Лог.Предупреждение("Попытка удаления сеансов не удалась. Текст ошибки:
			|%1", ИнформацияОбОшибке().Описание);
		КонецПопытки;
	КонецЦикла
		
КонецПроцедуры

Nikita Gryzlov's avatar
Nikita Gryzlov committed
Лог = Логирование.ПолучитьЛог("vanessa.app.deployka");