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