diff --git a/README.md b/README.md index 56fa6ff44ef04dd01ffc662dc9a02da981a5b294..9a7b1acb5d174da3cbe3eece779682d27e0a5e9a 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ ## session - Управление сеансами информационной базы ### Параметры: -* <Действие> - lock|unlock|kill +* <Действие> - lock|unlock|kill|search * -ras - Сетевой адрес RAS, по умолчанию localhost:1545 * -rac - Команда запуска RAC, по умолчанию находим в каталоге установки 1с * -db - Имя информационной базы @@ -30,7 +30,16 @@ * -lockuccode - Ключ разрешения запуска * -lockstart - Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59' * -lockstartat - Время старта блокировки через n сек - +* -with-nolock - Не блокировать сеансы (y/n). Применяется для действия kill - +по умолчанию, при его выполнении автоматически блокируется начало сеансов. +Пример: ... kill -with-nolock y ... +* -filter - Фильтр поиска сеансов. Предполагает возможность указания множественных вариантов фильтрации. Задается в формате '[filter1]|[filter2]|...|[filterN]', где filter - составляющая фильтра. +Составляющая фильтра задается в формате [[appid=приложение1[;приложение2]][[name=username1[;username2]] +Пока предусмотрено только два фильтра - по имени приложения (appid) и по имени пользователя 1С (name). +Для фильтра по приложению доступны следующие имена: 1CV8 1CV8C WebClient Designer COMConnection WSConnection BackgroundJob WebServerExtension. +Использование wildchar/regex пока не предусмотрено. Регистронечувствительно. Параметры должны разделяться через |. +Действует для команд kill и search. +Пример: ... kill -filter appid=Designer|name=регламент;администратор ... ## loadcfg - Загрузка/обновление конфигурации @@ -84,6 +93,7 @@ * -uccode - Ключ разрешения запуска * -command - Строка передаваемя в ПараметрыЗапуска, /C'' * -execute - Путь обработки для запуска +* -log - Полное имя файла для записи лога работы Предприятия, /Out ## disablesupport - Снять базу данных с поддержки @@ -94,4 +104,37 @@ * -db-pwd - Пароль пользователя информационной базы * -v8version - Маска версии платформы 1С * -uccode - Ключ разрешения запуска -* -force - Принудительное выполнение \ No newline at end of file +* -force - Принудительное выполнение + +## unbindrepo - Отключить конфигурацию от хранилища. Приводит в появлению ключа запуска Конфигуратора /ConfigurationRepositoryUnbindCfg -force + +### Параметры: + +* <СтрокаПодключения> - Строка подключения к рабочему контуру +* -db-user - Пользователь информационной базы +* -db-pwd - Пароль пользователя информационной базы +* -v8version - Маска версии платформы 1С + +## info - Получение информации о базе данных (выводится в консоль выполнения скрипта). +Может применяться для проверки работы RAS/RAC. +### Параметры: +* -ras - Сетевой адрес RAS, по умолчанию localhost:1545 +* -rac - Команда запуска RAC, по умолчанию находим в каталоге установки 1с +* -db - Имя информационной базы +* -db-user - Пользователь информационной базы +* -db-pwd - Пароль пользователя информационной базы +* -cluster-admin - Администратор кластера +* -cluster-pwd - Пароль администратора кластера +* -v8version - Маска версии платформы 1С + +## scheduledjobs - Управление сеансами/регламентами информационной базы +### Параметры: +* <Действие> - lock|unlock +* -ras - Сетевой адрес RAS, по умолчанию localhost:1545 +* -rac - Команда запуска RAC, по умолчанию находим в каталоге установки 1с +* -db - Имя информационной базы +* -db-user - Пользователь информационной базы +* -db-pwd - Пароль пользователя информационной базы +* -cluster-admin - Администратор кластера +* -cluster-pwd - Пароль администратора кластера +* -v8version - Маска версии платформы 1С \ No newline at end of file diff --git a/packagedef b/packagedef index e9752bd7c70a2030283181606d99ede8f7737dd2..2925ac0f04d8745fb4b6e3802253b5e6ffca0bbb 100644 --- a/packagedef +++ b/packagedef @@ -1,6 +1,6 @@  Описание.Имя("deployka") - .Версия("0.3") + .Версия("0.4") .ВерсияСреды("1.0.16") .ЗависитОт("logos") .ЗависитОт("cmdline") diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" index 80bbf3708cd0b50a4e8485f47a87ea0679ae3937..e0c54273b5d23f739c0b3156f7a5c0aa6f5fb9bb 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\227\320\260\320\277\321\203\321\201\321\202\320\270\321\202\321\214\320\222\320\240\320\265\320\266\320\270\320\274\320\265\320\237\321\200\320\265\320\264\320\277\321\200\320\270\321\217\321\202\320\270\321\217.os" @@ -35,6 +35,10 @@ "-additional", "Дополнительные ключи запуска 1С"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-log", + "Лог-файл для вывода сообщений платформы. В итоге, задает ключ запуска /Out."); + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-thin-client", "Запускать тонкий клиент принудительно"); @@ -53,6 +57,7 @@ КлючРазрешенияЗапуска = ПараметрыКоманды["-uccode"]; ПараметрЗапускаПредприятия = ПараметрыКоманды["-command"]; ОбработкаДляЗапуска = ПараметрыКоманды["-execute"]; + ЛогФайл = ПараметрыКоманды["-log"]; Если ПустаяСтрока(СтрокаПодключения) Тогда Лог.Ошибка("Не задана строка подключения"); @@ -82,6 +87,10 @@ ДополнительныеКлючи = ДополнительныеКлючи + "/Execute"+ЗапускПриложений.ОбернутьВКавычки(ОбработкаДляЗапуска); КонецЕсли; + Если Не ПустаяСтрока(ЛогФайл) Тогда + Конфигуратор.УстановитьИмяФайлаСообщенийПлатформы(ЛогФайл); + КонецЕсли; + Лог.Информация("Запускаю в режиме предприятия"); Попытка Конфигуратор.УстановитьОбработчикОжидания(ЭтотОбъект); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\321\202\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\236\321\202\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\321\202\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\236\321\202\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" new file mode 100644 index 0000000000000000000000000000000000000000..496caf32d945112e17a00940094f507ad21d3d08 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\236\321\202\320\272\320\273\321\216\321\207\320\270\321\202\321\214\321\201\321\217\320\236\321\202\320\245\321\200\320\260\320\275\320\270\320\273\320\270\321\211\320\260.os" @@ -0,0 +1,67 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Перем Лог; + +Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Отключить конфигурацию от хранилища. Приводит в появлению ключа запуска Конфигуратора /ConfigurationRepositoryUnbindCfg -force"); + + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "СтрокаПодключения", "Строка подключения к рабочему контуру"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-user", + "Пользователь информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-pwd", + "Пароль пользователя информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-v8version", + "Маска версии платформы 1С"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + +КонецПроцедуры + +Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт + + СтрокаПодключения = ПараметрыКоманды["СтрокаПодключения"]; + ПользовательБазы = ПараметрыКоманды["-db-user"]; + ПарольПользователяБазы = ПараметрыКоманды["-db-pwd"]; + + МаскаВерсии = ПараметрыКоманды["-v8version"]; + + ВозможныйРезультат = МенеджерКомандПриложения.РезультатыКоманд(); + + Если ПустаяСтрока(СтрокаПодключения) Тогда + Лог.Ошибка("Не задана строка подключения к базе"); + Возврат ВозможныйРезультат.НеверныеПараметры; + КонецЕсли; + + Конфигуратор = ЗапускПриложений.НастроитьКонфигуратор( + СтрокаПодключения, ПользовательБазы, ПарольПользователяБазы, МаскаВерсии); + + Параметры = Конфигуратор.ПолучитьПараметрыЗапуска(); + + Параметры.Добавить("/ConfigurationRepositoryUnbindCfg"); + Параметры.Добавить("-force"); + + Попытка + Конфигуратор.ВыполнитьКоманду(Параметры); + Текст = Конфигуратор.ВыводКоманды(); + Если Не ПустаяСтрока(Текст) Тогда + Лог.Информация(Текст); + КонецЕсли; + + Возврат ВозможныйРезультат.Успех; + Исключение + Лог.Ошибка(Конфигуратор.ВыводКоманды()); + Возврат ВозможныйРезультат.ОшибкаВремениВыполнения; + КонецПопытки; + +КонецФункции + +Лог = Логирование.ПолучитьЛог("vanessa.app.deployka"); \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" index bbf68eacec4514b7cc67838611b1e8bb7c6211b0..aea007d24ccbecf2b23acca228265b674bdddc0e 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\241\320\265\320\260\320\275\321\201\320\260\320\274\320\270.os" @@ -7,12 +7,28 @@ Перем мИдентификаторКластера; Перем мИдентификаторБазы; Перем ЭтоWindows; +Перем мЭтоУправлениеСеансами, мЭтоУправлениеРегламентнымиЗаданиями, мЭтоПолучениеИнформацииИБ; Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); + мЭтоУправлениеСеансами = НРег(ИмяКоманды)="session"; + мЭтоУправлениеРегламентнымиЗаданиями = НРег(ИмяКоманды)="scheduledjobs"; + мЭтоПолучениеИнформацииИБ = НРег(ИмяКоманды)="info"; + + Если Не мЭтоПолучениеИнформацииИБ И НЕ мЭтоУправлениеРегламентнымиЗаданиями И Не мЭтоУправлениеСеансами Тогда + ВызватьИсключение("Непредусмотренная команда"); + КонецЕсли; + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, + ?(мЭтоПолучениеИнформацииИБ, + "Получение информации о базе данных (выводится в консоль выполнения скрипта). + |Может применяться для проверки работы RAS/RAC.", + "Управление сеансами/регламентами информационной базы") + ); - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill"); + Если мЭтоУправлениеРегламентнымиЗаданиями Или мЭтоУправлениеСеансами Тогда + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", ?(мЭтоУправлениеСеансами, "lock|unlock|kill|search", "lock|unlock")); + КонецЕсли; Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); @@ -36,22 +52,46 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-v8version", "Маска версии платформы 1С"); + + Если мЭтоУправлениеСеансами Тогда - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockmessage", - "Сообщение блокировки"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-lockmessage", + "Сообщение блокировки"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-lockuccode", + "Ключ разрешения запуска"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockuccode", - "Ключ разрешения запуска"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockstart", - "Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-lockstart", + "Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-lockstartat", + "Время старта блокировки через n сек"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-try", + "Число попыток обращения по протоколу rac/ras"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-with-nolock", + "Не блокировать сеансы (y/n). Применяется для действия kill - + |по умолчанию, при его выполнении автоматически блокируется начало сеансов. + |Пример: ... kill -with-nolock y ..."); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-filter", + "Фильтр поиска сеансов. Предполагает возможность указания множественных вариантов фильтрации. Задается в формате '[filter1]|[filter2]|...|[filterN]'. + |Составляющая фильтра задается в формате [[appid=приложение1[;приложение2]][[name=username1[;username2]]'. + |Пока предусмотрено только два фильтра - по имени приложения (appid) и по имени пользователя 1С (name). + |Для фильтра по приложению доступны следующие имена: 1CV8 1CV8C WebClient Designer COMConnection WSConnection BackgroundJob WebServerExtension. + |Использование wildchar/regex пока не предусмотрено. Регистронечувствительно. Параметры должны разделяться через |. + |Действует для команд kill и search. + |Пример: ... kill -filter appid=Designer|name=регламент;администратор ..."); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockstartat", - "Время старта блокировки через n сек"); + КонецЕсли; Парсер.ДобавитьКоманду(ОписаниеКоманды); @@ -65,12 +105,28 @@ Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; КонецЕсли; - Если мНастройки.Действие = "lock" Тогда + Если мЭтоУправлениеСеансами И мНастройки.Действие = "lock" Тогда УстановитьСтатусБлокировкиСеансов(Истина); - ИначеЕсли мНастройки.Действие = "unlock" Тогда + ИначеЕсли мЭтоУправлениеСеансами И мНастройки.Действие = "unlock" Тогда УстановитьСтатусБлокировкиСеансов(Ложь); - ИначеЕсли мНастройки.Действие = "kill" Тогда + ИначеЕсли мЭтоУправлениеСеансами И мНастройки.Действие = "kill" Тогда УдалитьВсеСеансыИСоединенияБазы(); + ИначеЕсли мЭтоУправлениеСеансами И мНастройки.Действие = "search" Тогда + Возврат ?(ПолучитьСписокСеансов().Количество()<>0, + МенеджерКомандПриложения.РезультатыКоманд().Успех, + МенеджерКомандПриложения.РезультатыКоманд().ОшибкаВремениВыполнения + ); + + ИначеЕсли мЭтоУправлениеРегламентнымиЗаданиями И мНастройки.Действие = "lock" Тогда + УстановитьСтатусБлокировкиРЗ(Истина); + ИначеЕсли мЭтоУправлениеРегламентнымиЗаданиями И мНастройки.Действие = "unlock" Тогда + УстановитьСтатусБлокировкиРЗ(Ложь); + + ИначеЕсли мЭтоПолучениеИнформацииИБ Тогда + // сообщить информацию + Информация = ПолучитьИнформациюОБазеДанных(); + Сообщить(Информация); + Иначе Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие); Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; @@ -99,8 +155,10 @@ мНастройки.Вставить("СообщениеОблокировке", ПараметрыКоманды["-lockmessage"]); мНастройки.Вставить("ВремяСтартаБлокировки", ПараметрыКоманды["-lockstart"]); мНастройки.Вставить("ВремяСтартаБлокировкиЧерез", ПараметрыКоманды["-lockstartat"]); - - + мНастройки.Вставить("ЧислоПопыток", ПараметрыКоманды["-try"]); + мНастройки.Вставить("НеБлокироватьСеансы", ПараметрыКоманды["-with-nolock"]); + мНастройки.Вставить("ФильтрСеансов", ПолучитьСоставляющиеФильтра(ПараметрыКоманды["-filter"])); + мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); //Получим путь к платформе если вдруг не установленна @@ -130,10 +188,32 @@ Успех = Ложь; КонецЕсли; - Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда + Если (мЭтоУправлениеРегламентнымиЗаданиями Или мЭтоУправлениеСеансами) И Не ЗначениеЗаполнено(мНастройки.Действие) Тогда Лог.Ошибка("Не указано действие lock/unlock"); Успех = Ложь; КонецЕсли; + + Если мНастройки.ЧислоПопыток <> Неопределено Тогда + Попытка + ПопыткиЧислом = Число(мНастройки.ЧислоПопыток); + Исключение + Лог.Ошибка("Параметр -try не является числовым."); + Успех = Ложь; + КонецПопытки; + + Если Успех и ПопыткиЧислом <= 0 Тогда + ПопыткиЧислом = 1; + Лог.Предупреждение("Параметр -try не представляет собой число попыток. Он будет проигнорирован"); + КонецЕсли; + + Если Успех Тогда + мНастройки.ЧислоПопыток = ПопыткиЧислом; + Иначе + мНастройки.ЧислоПопыток = 1; + КонецЕсли; + Иначе + мНастройки.ЧислоПопыток = 1; + КонецЕсли; Возврат Успех; @@ -143,17 +223,33 @@ // Взаимодействие с кластером Процедура УдалитьВсеСеансыИСоединенияБазы() - - УстановитьСтатусБлокировкиСеансов(Истина); - ОтключитьСуществующиеСеансы(); - Приостановить(500); - Сеансы = ПолучитьСписокСеансов(); - - Если Сеансы.Количество() Тогда - Лог.Информация("Пауза перед отключением соединений"); - Приостановить(10000); - ОтключитьСоединенияСРабочимиПроцессами(); + + Если Не ЗначениеЗаполнено(мНастройки.НеБлокироватьСеансы) Или + ВРег(мНастройки.НеБлокироватьСеансы)<>"Y" + Тогда + УстановитьСтатусБлокировкиСеансов(Истина); КонецЕсли; + + Для Сч = 1 По мНастройки.ЧислоПопыток Цикл + Попытка + + ОтключитьСуществующиеСеансы(); + Приостановить(500); + Сеансы = ПолучитьСписокСеансов(); + + Если Сеансы.Количество() Тогда + Лог.Информация("Пауза перед отключением соединений"); + Приостановить(10000); + ОтключитьСоединенияСРабочимиПроцессами(); + КонецЕсли; + + Прервать; + + Исключение + Лог.Предупреждение("Попытка удаления сеансов не удалась. Текст ошибки: + |%1", ИнформацияОбОшибке().Описание); + КонецПопытки; + КонецЦикла КонецПроцедуры @@ -192,12 +288,63 @@ КлючРазрешенияЗапуска, ВремяБлокировки) + " "+мНастройки.АдресСервераАдминистрирования; - ЗапуститьПроцесс(КомандаВыполнения); + Для Сч = 1 По мНастройки.ЧислоПопыток Цикл + Попытка + ЗапуститьПроцесс(КомандаВыполнения); + Прервать; + Исключение + Лог.Предупреждение("Попытка запуска rac не удалась. Текст ошибки: + |%1", ИнформацияОбОшибке().Описание); + КонецПопытки; + КонецЦикла; Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); КонецПроцедуры +Процедура УстановитьСтатусБлокировкиРЗ(Знач Блокировать) + + КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); + + ИдентификаторКластера = ИдентификаторКластера(); + ИдентификаторБазы = ИдентификаторБазы(); + + КомандаВыполнения = СтрокаЗапускаКлиента() + + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --scheduled-jobs-deny=%5", + ИдентификаторКластера, + КлючиАвторизацииВКластере(), + ИдентификаторБазы, + КлючиАвторизацииВБазе, + ?(Блокировать, "on", "off") + ) + " "+мНастройки.АдресСервераАдминистрирования; + + ЗапуститьПроцесс(КомандаВыполнения); + + Лог.Информация("Регламентные задания " + ?(Блокировать, "запрещены", "разрешены")); + +КонецПроцедуры + +Функция ПолучитьИнформациюОБазеДанных() + + КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); + + ИдентификаторКластера = ИдентификаторКластера(); + ИдентификаторБазы = ИдентификаторБазы(); + + КомандаВыполнения = СтрокаЗапускаКлиента() + + СтрШаблон("infobase info --infobase=""%3""%4 --cluster=""%1""%2", + ИдентификаторКластера, + КлючиАвторизацииВКластере(), + ИдентификаторБазы, + КлючиАвторизацииВБазе + ) + " "+мНастройки.АдресСервераАдминистрирования; + + Результат = ЗапуститьПроцесс(КомандаВыполнения); + + Возврат Результат; + +КонецФункции + Функция КлючиАвторизацииВБазе() КлючиАвторизацииВБазе = ""; Если ЗначениеЗаполнено(мНастройки.АдминистраторИБ) Тогда @@ -218,9 +365,9 @@ Если мИдентификаторКластера = Неопределено Тогда Лог.Информация("Получаю список кластеров"); - КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list" + " "+мНастройки.АдресСервераАдминистрирования; + КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list" + " "+мНастройки.АдресСервераАдминистрирования; - СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); + СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); УИДКластера = Сред(СписокКластеров, (Найти(СписокКластеров, ":") + 1), Найти(СписокКластеров, "host") - Найти(СписокКластеров, ":") - 1); мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера, Символы.ПС, "")); @@ -350,7 +497,7 @@ КонецПроцедуры Процедура ОтключитьСуществующиеСеансы() - + Лог.Информация("Отключаю существующие сеансы"); СеансыБазы = ПолучитьСписокСеансов(); @@ -373,9 +520,9 @@ ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); КомандаЗапуска = СтрокаЗапускаКлиента() + СтрШаблон("session list --cluster=""%1""%2 --infobase=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы()) + " " + мНастройки.АдресСервераАдминистрирования; + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + ИдентификаторБазы()) + " " + мНастройки.АдресСервераАдминистрирования; СписокСеансовИБ = ЗапуститьПроцесс(КомандаЗапуска); @@ -383,12 +530,16 @@ Для Каждого Элемент Из Данные Цикл + Если Не СеансВФильтре(Новый Структура("Приложение, Пользователь", Элемент["app-id"], Элемент["user-name"])) Тогда + Продолжить; + КонецЕсли; + ТекСтрока = ТаблицаСеансов.Добавить(); ТекСтрока.Идентификатор = Элемент["session"]; ТекСтрока.Пользователь = Элемент["user-name"]; ТекСтрока.Приложение = Элемент["app-id"]; ТекСтрока.НомерСеанса = Элемент["session-id"]; - + КонецЦикла; Возврат ТаблицаСеансов; @@ -396,16 +547,16 @@ КонецФункции Процедура ОтключитьСеанс(Знач Сеанс) - + СтрокаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("session terminate --cluster=""%1""%2 --session=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - Сеанс.Идентификатор) + " " + мНастройки.АдресСервераАдминистрирования; + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + Сеанс.Идентификатор) + " " + мНастройки.АдресСервераАдминистрирования; Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); ЗапуститьПроцесс(СтрокаВыполнения); - + КонецПроцедуры Функция ОтключитьСоединенияСРабочимиПроцессами() @@ -434,27 +585,40 @@ Функция ПолучитьСписокРабочихПроцессов() КомандаЗапускаПроцессы = СтрокаЗапускаКлиента() + СтрШаблон("process list --cluster=""%1""%2", - ИдентификаторКластера(), - КлючиАвторизацииВКластере()) + " " + мНастройки.АдресСервераАдминистрирования; - + ИдентификаторКластера(), + КлючиАвторизацииВКластере()) + " " + мНастройки.АдресСервераАдминистрирования; + Лог.Информация("Получаю список рабочих процессов..."); - СписокПроцессов = ВыполнитьКоманду(КомандаЗапускаПроцессы); + СписокПроцессов = ЗапуститьПроцесс(КомандаЗапускаПроцессы); - Возврат РазобратьПоток(СписокПроцессов); + Результат = РазобратьПоток(СписокПроцессов); + + НеВФильтре = Новый Массив; + Для Каждого ТекПроцесс Из Результат Цикл + Если Не СеансВФильтре(Новый Структура("Приложение, Пользователь", ТекПроцесс["app-id"], ТекПроцесс["user-name"])) Тогда + НеВФильтре.Добавить(ТекПроцесс); + КонецЕсли; + КонецЦикла; + + Для Каждого Уд Из НеВФильтре Цикл + Результат.Удалить(Уд); + КонецЦикла; + + Возврат Результат; КонецФункции Функция ПолучитьСоединенияРабочегоПроцесса(Знач РабочийПроцесс) КомандаЗапускаСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection list --cluster=""%1""%2 --infobase=%3%4 --process=%5", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы(), - КлючиАвторизацииВБазе(), - РабочийПроцесс["process"]) + " " + мНастройки.АдресСервераАдминистрирования; + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + ИдентификаторБазы(), + КлючиАвторизацииВБазе(), + РабочийПроцесс["process"]) + " " + мНастройки.АдресСервераАдминистрирования; Лог.Информация("Получаю список соединений..."); - Возврат РазобратьПоток(ВыполнитьКоманду(КомандаЗапускаСоединения)); + Возврат РазобратьПоток(ЗапуститьПроцесс(КомандаЗапускаСоединения)); КонецФункции @@ -475,7 +639,7 @@ Лог.Информация(Сообщение); - Возврат ВыполнитьКоманду(КомандаРазрывСоединения); + Возврат ЗапуститьПроцесс(КомандаРазрывСоединения); КонецФункции @@ -563,6 +727,77 @@ КонецФункции +Функция ПолучитьСоставляющиеФильтра(СтрокаФильтра) + + Результат = Новый Структура; + СоставФильтра = СтрРазделить(СтрокаФильтра, "|", Ложь); + + Для Каждого ТекСтр Из СоставФильтра Цикл + РазобратьСоставляющуюФильтра(Результат, ТекСтр); + КонецЦикла; + + Возврат Результат; + +КонецФункции + +Процедура РазобратьСоставляющуюФильтра(РезультатСтруктура, Составляющая) + + ПозРавно = СтрНайти(Составляющая, "="); + Если ПозРавно=0 Тогда + Возврат; + КонецЕсли; + + ИмяФильтра = Лев(Составляющая, ПозРавно - 1); + + Попытка + ПроверкаИмени = Новый Структура(ИмяФильтра); + Исключение + Возврат; + КонецПопытки; + + СодержаниеСтрока = Сред(Составляющая, ПозРавно + 1); + Если ПустаяСтрока(СодержаниеСтрока) Тогда + Возврат; + КонецЕсли; + + СодержаниеМассив = СтрРазделить(СодержаниеСтрока, ";", Ложь); + РезультатСтруктура.Вставить(ИмяФильтра, СодержаниеМассив); + +КонецПроцедуры + +Функция СеансВФильтре(Сеанс) + + Результат = Истина; + + Если Не ЗначениеЗаполнено(мНастройки.ФильтрСеансов) Тогда + Возврат Результат; + КонецЕсли; + + Результат = Результат И ПараметрСеансаВФильтре("appid", Сеанс.Приложение); + Результат = Результат И ПараметрСеансаВФильтре("name", Сеанс.Пользователь); + + Возврат Результат; + +КонецФункции + +Функция ПараметрСеансаВФильтре(ИмяФильтра, ПроверяемоеЗначение) + + Если Не ЗначениеЗаполнено(мНастройки.ФильтрСеансов) Или Не мНастройки.ФильтрСеансов.Свойство(ИмяФильтра) Тогда + Возврат Истина; + КонецЕсли; + + ЗначенияФильтра = мНастройки.ФильтрСеансов[ИмяФильтра]; + Для Каждого ТекЗначение Из ЗначенияФильтра Цикл + ВФильтре = ВРег(ТекЗначение)=ВРег(ПроверяемоеЗначение); + Если ВФильтре Тогда + Возврат Истина; + КонецЕсли; + КонецЦикла; + + Возврат Ложь; + +КонецФункции + ///////////////////////////////////////////////////////////////////////////////// СистемнаяИнформация = Новый СистемнаяИнформация; ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" index 878364e1af45deb4291dc9352a9af2f45d018b55..d243dafc74fa45602ec6a7e2e59b5ec3b18c440d 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217.os" @@ -12,6 +12,9 @@ ДобавитьКоманду("dbupdate", "КомандаОбновитьКонфигурациюБД", Парсер); ДобавитьКоманду("run", "КомандаЗапуститьВРежимеПредприятия", Парсер); ДобавитьКоманду("disablesupport", "КомандаСнятьСПоддержки", Парсер); + ДобавитьКоманду("unbindrepo", "КомандаОтключитьсяОтХранилища", Парсер); ДобавитьКоманду("scheduledjobs", "КомандаУправлениеСеансами", Парсер); + ДобавитьКоманду("scheduledjobs", "КомандаУправлениеСеансами", Парсер); + ДобавитьКоманду("info", "КомандаУправлениеСеансами", Парсер); КонецПроцедуры