Newer
Older
///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс
Перем мНастройки;
Перем Лог;
Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт
ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы");
Сосна Евгений
committed
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-db-user",
"Пользователь информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-db-pwd",
"Пароль пользователя информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-cluster-admin",
"Администратор кластера");
Сосна Евгений
committed
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-cluster-pwd",
"Пароль администратора кластера");
Сосна Евгений
committed
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-v8version",
"Маска версии платформы 1С");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-lockmessage",
"Сообщение блокировки");
Сосна Евгений
committed
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-lockuccode",
"Ключ разрешения запуска");
Сосна Евгений
committed
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-lockstart",
"Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'");
Сосна Евгений
committed
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-lockstartat",
"Время старта блокировки через n сек");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-try",
"Число попыток обращения по протоколу rac/ras");
Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры
Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт
ПрочитатьПараметры(ПараметрыКоманды);
Если Не ПараметрыВведеныКорректно() Тогда
Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
СерверАдминистрирования = Новый СерверАдминистрирования;
СерверАдминистрирования.Инициализация(мНастройки.АдресСервераАдминистрирования,
мНастройки.ПутьКлиентаАдминистрирования,
мНастройки.ИмяБазыДанных,
мНастройки.АдминистраторИБ,
мНастройки.ПарольАдминистратораИБ,
мНастройки.АдминистраторКластера,
мНастройки.ПарольАдминистратораКластера,
мНастройки.ИспользуемаяВерсияПлатформы,
мНастройки.КлючРазрешенияЗапуска);
УстановитьСтатусБлокировкиСеансов(Истина);
ИначеЕсли мНастройки.Действие = "unlock" Тогда
УстановитьСтатусБлокировкиСеансов(Ложь);
ИначеЕсли мНастройки.Действие = "kill" Тогда
УдалитьВсеСеансыИСоединенияБазы();
Иначе
Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие);
Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры;
КонецЕсли;
Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех;
КонецФункции
Процедура ПрочитатьПараметры(Знач ПараметрыКоманды)
мНастройки = Новый Структура;
Для Каждого КЗ Из ПараметрыКоманды Цикл
Лог.Отладка(КЗ.Ключ + " = " + КЗ.Значение);
КонецЦикла;
мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]);
мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-rac"]);
мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]);
мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]);
мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]);
мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]);
мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-pwd"]);
Сосна Евгений
committed
мНастройки.Вставить("ИспользуемаяВерсияПлатформы", ПараметрыКоманды["-v8version"]);
мНастройки.Вставить("КлючРазрешенияЗапуска", ПараметрыКоманды["-lockuccode"]);
мНастройки.Вставить("СообщениеОблокировке", ПараметрыКоманды["-lockmessage"]);
мНастройки.Вставить("ВремяСтартаБлокировки", ПараметрыКоманды["-lockstart"]);
мНастройки.Вставить("ВремяСтартаБлокировкиЧерез", ПараметрыКоманды["-lockstartat"]);
мНастройки.Вставить("ЧислоПопыток", ПараметрыКоманды["-try"]);
мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]);
Сосна Евгений
committed
КонецПроцедуры
Функция ПараметрыВведеныКорректно()
Успех = Истина;
Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда
Лог.Ошибка("Не указано имя базы данных");
Успех = Ложь;
КонецЕсли;
Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда
Лог.Ошибка("Не указано действие lock/unlock");
Успех = Ложь;
КонецЕсли;
Если мНастройки.ЧислоПопыток <> Неопределено Тогда
Попытка
ПопыткиЧислом = Число(мНастройки.ЧислоПопыток);
Исключение
Лог.Ошибка("Параметр -try не является числовым.");
Успех = Ложь;
КонецПопытки;
Если Успех и ПопыткиЧислом <= 0 Тогда
ПопыткиЧислом = 1;
Лог.Предупреждение("Параметр -try не представляет собой число попыток. Он будет проигнорирован");
КонецЕсли;
Если Успех Тогда
мНастройки.ЧислоПопыток = ПопыткиЧислом;
Иначе
мНастройки.ЧислоПопыток = 1;
КонецЕсли;
Иначе
мНастройки.ЧислоПопыток = 1;
КонецЕсли;
Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать)
ВремяБлокировки = мНастройки.ВремяСтартаБлокировки;
Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтартаБлокировкиЧерез) Тогда
Секунды = 0;
Попытка
Секунды = Число(мНастройки.ВремяСтартаБлокировкиЧерез);
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
Исключение
КонецПопытки;
ВремяБлокировки = Формат(ТекущаяДата()+Секунды,"ДФ='yyyy-MM-ddTHH:mm:ss'");
КонецЕсли;
РезультатБлокировки = СерверАдминистрирования.УстановитьСтатусБлокировкиСеансов(Блокировать, ВремяБлокировки, мНастройки.СообщениеОблокировке, мНастройки.ЧислоПопыток);
Если НЕ РезультатБлокировки Тогда
Лог.Ошибка("Не удалось "+ ?(Блокировать, "заблокировать", "разблокировать") +" сеансы");
КонецЕсли;
КонецПроцедуры
Процедура УдалитьВсеСеансыИСоединенияБазы()
УстановитьСтатусБлокировкиСеансов(Истина);
Для Сч = 1 По мНастройки.ЧислоПопыток Цикл
Попытка
СерверАдминистрирования.ОтключитьСуществующиеСеансы();
Приостановить(500);
Сеансы = СерверАдминистрирования.ПолучитьСписокСеансов();
Если Сеансы.Количество() Тогда
Лог.Информация("Пауза перед отключением соединений");
Приостановить(10000);
СерверАдминистрирования.ОтключитьСоединенияСРабочимиПроцессами();
КонецЕсли;
Прервать;
Исключение
Лог.Предупреждение("Попытка удаления сеансов не удалась. Текст ошибки:
|%1", ИнформацияОбОшибке().Описание);
КонецПопытки;
КонецЦикла
КонецПроцедуры