/////////////////////////////////////////////////////////////////////////////////////////////////// // Прикладной интерфейс Перем мНастройки; Перем Лог; Перем мИдентификаторКластера; Перем мИдентификаторБазы; Перем ЭтоWindows; Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "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); ОтключитьСоединенияСРабочимиПроцессами(); КонецЕсли; КонецПроцедуры Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать) КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); ИдентификаторКластера = ИдентификаторКластера(); ИдентификаторБазы = ИдентификаторБазы(); Если Блокировать Тогда КлючРазрешенияЗапускаПоУмолчанию = ИдентификаторБазы; Иначе КлючРазрешенияЗапускаПоУмолчанию = ""; КонецЕсли; КлючРазрешенияЗапуска = ?(ПустаяСтрока(мНастройки.КлючРазрешенияЗапуска), КлючРазрешенияЗапускаПоУмолчанию, мНастройки.КлючРазрешенияЗапуска); ВремяБлокировки = мНастройки.ВремяСтартаБлокировки; Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтартаБлокировкиЧерез) Тогда Секунды = 0; Попытка Секунды = Число(мНастройки.ВремяСтартаБлокировкиЧерез); Исключение КонецПопытки; ВремяБлокировки = Формат(ТекущаяДата()+Секунды,"ДФ='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); мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера,Символы.ПС,""));