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\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\274\320\270\320\227\320\260\320\264\320\260\320\275\320\270\321\217\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\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\274\320\270\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\274\320\270.os" new file mode 100644 index 0000000000000000000000000000000000000000..cf056acfa8fc035704ff3ad154f9320c64d568e1 --- /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\243\320\277\321\200\320\260\320\262\320\273\320\265\320\275\320\270\320\265\320\240\320\265\320\263\320\273\320\260\320\274\320\265\320\275\321\202\320\275\321\213\320\274\320\270\320\227\320\260\320\264\320\260\320\275\320\270\321\217\320\274\320\270.os" @@ -0,0 +1,111 @@ + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс + +Перем мНастройки; +Перем Лог; + +Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление регламентынми заданиями информационной базы"); + + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "on|off"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-user", + "Пользователь информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-pwd", + "Пароль пользователя информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-cluster-admin", + "Администратор кластера"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-cluster-pwd", + "Пароль администратора кластера"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-v8version", + "Маска версии платформы 1С"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + +КонецПроцедуры + +Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт + + ПрочитатьПараметры(ПараметрыКоманды); + + Если Не ПараметрыВведеныКорректно() Тогда + Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; + КонецЕсли; + + СерверАдминистрирования = Новый СерверАдминистрирования; + + СерверАдминистрирования.Инициализация(мНастройки.АдресСервераАдминистрирования, + мНастройки.ПутьКлиентаАдминистрирования, + мНастройки.ИмяБазыДанных, + мНастройки.АдминистраторИБ, + мНастройки.ПарольАдминистратораИБ, + мНастройки.АдминистраторКластера, + мНастройки.ПарольАдминистратораКластера, + мНастройки.ИспользуемаяВерсияПлатформы); + + Если мНастройки.Действие = "off" Тогда + СерверАдминистрирования.УстановитьСтатусБлокировкиРегламентныхЗаданий(Истина); + ИначеЕсли мНастройки.Действие = "on" Тогда + СерверАдминистрирования.УстановитьСтатусБлокировкиРегламентныхЗаданий(Ложь); + Иначе + Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие); + Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; + КонецЕсли; + + Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; + +КонецФункции + +Процедура ПрочитатьПараметры(Знач ПараметрыКоманды) + мНастройки = Новый Структура; + + Для Каждого КЗ Из ПараметрыКоманды Цикл + Лог.Отладка(КЗ.Ключ + " = " + КЗ.Значение); + КонецЦикла; + + мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]); + мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-rac"]); + мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]); + мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]); + мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]); + мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]); + мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-pwd"]); + мНастройки.Вставить("ИспользуемаяВерсияПлатформы", ПараметрыКоманды["-v8version"]); + + мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); + +КонецПроцедуры + +Функция ПараметрыВведеныКорректно() + + Успех = Истина; + + Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда + Лог.Ошибка("Не указано имя базы данных"); + Успех = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда + Лог.Ошибка("Не указано действие on|off"); + Успех = Ложь; + КонецЕсли; + + Возврат Успех; + +КонецФункции + +Лог = Логирование.ПолучитьЛог("vanessa.app.deployka"); 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 f07afc0533d5617cafacfb230323e78c42ceb6cd..9e63cbe07759082f764f0abde3af2e447ef53a0d 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" @@ -4,15 +4,12 @@ Перем мНастройки; Перем Лог; -Перем мИдентификаторКластера; -Перем мИдентификаторБазы; -Перем ЭтоWindows; Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill"); + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); @@ -54,8 +51,9 @@ "Время старта блокировки через n сек"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-try", - "Число попыток обращения по протоколу rac/ras"); + "-try", + "Число попыток обращения по протоколу rac/ras"); + Парсер.ДобавитьКоманду(ОписаниеКоманды); @@ -68,13 +66,25 @@ Если Не ПараметрыВведеныКорректно() Тогда Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; КонецЕсли; + + СерверАдминистрирования = Новый СерверАдминистрирования; + + СерверАдминистрирования.Инициализация(мНастройки.АдресСервераАдминистрирования, + мНастройки.ПутьКлиентаАдминистрирования, + мНастройки.ИмяБазыДанных, + мНастройки.АдминистраторИБ, + мНастройки.ПарольАдминистратораИБ, + мНастройки.АдминистраторКластера, + мНастройки.ПарольАдминистратораКластера, + мНастройки.ИспользуемаяВерсияПлатформы, + мНастройки.КлючРазрешенияЗапуска); Если мНастройки.Действие = "lock" Тогда - УстановитьСтатусБлокировкиСеансов(Истина); + СерверАдминистрирования.УстановитьСтатусБлокировкиСеансов(Истина, мНастройки.ВремяСтартаБлокировки, мНастройки.ВремяСтартаБлокировкиЧерез, мНастройки.СообщениеОблокировке, мНастройки.ЧислоПопыток); ИначеЕсли мНастройки.Действие = "unlock" Тогда - УстановитьСтатусБлокировкиСеансов(Ложь); + СерверАдминистрирования.УстановитьСтатусБлокировкиСеансов(Ложь, мНастройки.ВремяСтартаБлокировки, мНастройки.ВремяСтартаБлокировкиЧерез, мНастройки.СообщениеОблокировке, мНастройки.ЧислоПопыток); ИначеЕсли мНастройки.Действие = "kill" Тогда - УдалитьВсеСеансыИСоединенияБазы(); + СерверАдминистрирования.УдалитьВсеСеансыИСоединенияБазы(мНастройки.ЧислоПопыток); Иначе Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие); Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; @@ -107,28 +117,12 @@ мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); - //Получим путь к платформе если вдруг не установленна - мНастройки.ПутьКлиентаАдминистрирования = ПолучитьПутьКRAC(мНастройки.ПутьКлиентаАдминистрирования, мНастройки.ИспользуемаяВерсияПлатформы); - Если ПустаяСтрока(мНастройки.АдресСервераАдминистрирования) Тогда - мНастройки.АдресСервераАдминистрирования = "localhost:1545"; - КонецЕсли; - КонецПроцедуры Функция ПараметрыВведеныКорректно() Успех = Истина; - Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда - Лог.Ошибка("Не указан сервер администрирования"); - Успех = Ложь; - КонецЕсли; - - Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда - Лог.Ошибка("Не указан клиент администрирования"); - Успех = Ложь; - КонецЕсли; - Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда Лог.Ошибка("Не указано имя базы данных"); Успех = Ложь; @@ -165,451 +159,4 @@ КонецФункции -///////////////////////////////////////////////////////////////////////////////// -// Взаимодействие с кластером - -Процедура УдалитьВсеСеансыИСоединенияБазы() - - УстановитьСтатусБлокировкиСеансов(Истина); - - Для Сч = 1 По мНастройки.ЧислоПопыток Цикл - Попытка - - ОтключитьСуществующиеСеансы(); - Приостановить(500); - Сеансы = ПолучитьСписокСеансов(); - - Если Сеансы.Количество() Тогда - Лог.Информация("Пауза перед отключением соединений"); - Приостановить(10000); - ОтключитьСоединенияСРабочимиПроцессами(); - КонецЕсли; - - Прервать; - - Исключение - Лог.Предупреждение("Попытка удаления сеансов не удалась. Текст ошибки: - |%1", ИнформацияОбОшибке().Описание); - КонецПопытки; - КонецЦикла - -КонецПроцедуры - -Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать) - - КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); - - ИдентификаторКластера = ИдентификаторКластера(); - ИдентификаторБазы = ИдентификаторБазы(); - - Если Блокировать Тогда - КлючРазрешенияЗапускаПоУмолчанию = ИдентификаторБазы; - Иначе - КлючРазрешенияЗапускаПоУмолчанию = ""; - КонецЕсли; - КлючРазрешенияЗапуска = ?(ПустаяСтрока(мНастройки.КлючРазрешенияЗапуска), КлючРазрешенияЗапускаПоУмолчанию, мНастройки.КлючРазрешенияЗапуска); - - ВремяБлокировки = мНастройки.ВремяСтартаБлокировки; - Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтартаБлокировкиЧерез) Тогда - Секунды = 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"), - мНастройки.СообщениеОблокировке, - КлючРазрешенияЗапуска, - ВремяБлокировки) + " "+мНастройки.АдресСервераАдминистрирования; - - Для Сч = 1 По мНастройки.ЧислоПопыток Цикл - Попытка - ЗапуститьПроцесс(КомандаВыполнения); - Прервать; - Исключение - Лог.Предупреждение("Попытка запуска rac не удалась. Текст ошибки: - |%1", ИнформацияОбОшибке().Описание); - КонецПопытки; - КонецЦикла; - - Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); - -КонецПроцедуры - -Функция КлючиАвторизацииВБазе() - КлючиАвторизацииВБазе = ""; - Если ЗначениеЗаполнено(мНастройки.АдминистраторИБ) Тогда - КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-user=""%1""", мНастройки.АдминистраторИБ); - КонецЕсли; - - Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораИБ) Тогда - КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-pwd=""%1""", мНастройки.ПарольАдминистратораИБ); - КонецЕсли; - - Возврат КлючиАвторизацииВБазе; - -КонецФункции - - -Функция ИдентификаторКластера() - - Если мИдентификаторКластера = Неопределено Тогда - Лог.Информация("Получаю список кластеров"); - - КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list" + " "+мНастройки.АдресСервераАдминистрирования; - - СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); - - УИДКластера = Сред(СписокКластеров, (Найти(СписокКластеров, ":") + 1), Найти(СписокКластеров, "host") - Найти(СписокКластеров, ":") - 1); - мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера, Символы.ПС, "")); - - КонецЕсли; - - Если ПустаяСтрока(мИдентификаторКластера) Тогда - ВызватьИсключение "Кластер серверов отсутствует"; - КонецЕсли; - - Возврат мИдентификаторКластера; - -КонецФункции - -Функция ИдентификаторБазы() - Если мИдентификаторБазы = Неопределено Тогда - мИдентификаторБазы = НайтиБазуВКластере(); - КонецЕсли; - - Возврат мИдентификаторБазы; -КонецФункции - -Функция НайтиБазуВКластере() - - КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase summary list --cluster=""%1""%2", - ИдентификаторКластера(), - КлючиАвторизацииВКластере()) + " " + мНастройки.АдресСервераАдминистрирования; - - Лог.Информация("Получаю список баз кластера"); - - СписокБазВКластере = СокрЛП(ЗапуститьПроцесс(КомандаВыполнения)); - Лог.Отладка(СписокБазВКластере); - ЧислоСтрок = СтрЧислоСтрок(СписокБазВКластере); - НайденаБазаВКластере = Ложь; - Для К = 1 По ЧислоСтрок Цикл - - СтрокаРазбора = СтрПолучитьСтроку(СписокБазВКластере, К); - ПозицияРазделителя = Найти(СтрокаРазбора, ":"); - Если Найти(СтрокаРазбора, "infobase") > 0 Тогда - УИДИБ = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); - ИначеЕсли Найти(СтрокаРазбора, "name") > 0 Тогда - ИмяБазы = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); - Если Нрег(ИмяБазы) = НРег(мНастройки.ИмяБазыДанных) Тогда - Лог.Информация("Получен УИД базы"); - НайденаБазаВКластере = Истина; - Прервать; - КонецЕсли; - КонецЕсли; - - КонецЦикла; - Если Не НайденаБазаВКластере Тогда - ВызватьИсключение "База " + мНастройки.ИмяБазыДанных + " не найдена в кластере"; - КонецЕсли; - - Возврат УИДИБ; - -КонецФункции - -Функция КлючиАвторизацииВКластере() - КомандаВыполнения = ""; - Если ЗначениеЗаполнено(мНастройки.АдминистраторКластера) Тогда - КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-user=""%1""", мНастройки.АдминистраторКластера); - КонецЕсли; - - Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораКластера) Тогда - КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-pwd=""%1""", мНастройки.ПарольАдминистратораКластера); - КонецЕсли; - Возврат КомандаВыполнения; -КонецФункции - -Функция СтрокаЗапускаКлиента() - Перем ПутьКлиентаАдминистрирования; - Если ЭтоWindows Тогда - ПутьКлиентаАдминистрирования = ЗапускПриложений.ОбернутьВКавычки(мНастройки.ПутьКлиентаАдминистрирования); - Иначе - ПутьКлиентаАдминистрирования = мНастройки.ПутьКлиентаАдминистрирования; - КонецЕсли; - - Возврат ПутьКлиентаАдминистрирования + " "; - -КонецФункции - - -Функция ЗапуститьПроцесс(Знач СтрокаВыполнения) - Перем ПаузаОжиданияЧтенияБуфера; - - ПаузаОжиданияЧтенияБуфера = 20; - - Лог.Отладка(СтрокаВыполнения); - Процесс = СоздатьПроцесс(СтрокаВыполнения, ,Истина); - Процесс.Запустить(); - - Текст = Новый ТекстовыйДокумент; - - Пока Истина Цикл - - ВывестиДанныеПроцесса(Процесс, Текст); - - Если Процесс.Завершен Тогда - Процесс.ОжидатьЗавершения(); // финальный сброс буферов - ВывестиДанныеПроцесса(Процесс, Текст); - Прервать; - КонецЕсли; - - Приостановить(ПаузаОжиданияЧтенияБуфера); - - КонецЦикла; - - Если Процесс.КодВозврата = 0 Тогда - Возврат Текст.ПолучитьТекст(); - Иначе - ВызватьИсключение "Сообщение от RAS/RAC - |" + Текст.ПолучитьТекст(); - КонецЕсли; - -КонецФункции - -Процедура ВывестиДанныеПроцесса(Знач Процесс, Знач Приемник) - Вывод = Процесс.ПотокВывода.Прочитать(); - Ошибки = Процесс.ПотокОшибок.Прочитать(); - Если СтрДлина(Строка(Вывод)) > 0 Тогда - Приемник.ДобавитьСтроку(Вывод); - КонецЕсли; - Если СтрДлина(Строка(Ошибки)) > 0 Тогда - Приемник.ДобавитьСтроку(Ошибки); - КонецЕсли; -КонецПроцедуры - -Процедура ОтключитьСуществующиеСеансы() - - Лог.Информация("Отключаю существующие сеансы"); - - СеансыБазы = ПолучитьСписокСеансов(); - Для Каждого Сеанс Из СеансыБазы Цикл - Попытка - ОтключитьСеанс(Сеанс); - Исключение - Лог.Ошибка(ОписаниеОшибки()); - КонецПопытки; - КонецЦикла; - -КонецПроцедуры - -Функция ПолучитьСписокСеансов() - - ТаблицаСеансов = Новый ТаблицаЗначений; - ТаблицаСеансов.Колонки.Добавить("Идентификатор"); - ТаблицаСеансов.Колонки.Добавить("Приложение"); - ТаблицаСеансов.Колонки.Добавить("Пользователь"); - ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); - - КомандаЗапуска = СтрокаЗапускаКлиента() + СтрШаблон("session list --cluster=""%1""%2 --infobase=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы()) + " " + мНастройки.АдресСервераАдминистрирования; - - СписокСеансовИБ = ЗапуститьПроцесс(КомандаЗапуска); - - Данные = РазобратьПоток(СписокСеансовИБ); - - Для Каждого Элемент Из Данные Цикл - - ТекСтрока = ТаблицаСеансов.Добавить(); - ТекСтрока.Идентификатор = Элемент["session"]; - ТекСтрока.Пользователь = Элемент["user-name"]; - ТекСтрока.Приложение = Элемент["app-id"]; - ТекСтрока.НомерСеанса = Элемент["session-id"]; - - КонецЦикла; - - Возврат ТаблицаСеансов; - -КонецФункции - -Процедура ОтключитьСеанс(Знач Сеанс) - - СтрокаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("session terminate --cluster=""%1""%2 --session=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - Сеанс.Идентификатор) + " " + мНастройки.АдресСервераАдминистрирования; - - Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); - - ЗапуститьПроцесс(СтрокаВыполнения); - -КонецПроцедуры - -Функция ОтключитьСоединенияСРабочимиПроцессами() - - Процессы = ПолучитьСписокРабочихПроцессов(); - - Для Каждого РабочийПроцесс Из Процессы Цикл - Если РабочийПроцесс["running"] = "yes" Тогда - - СписокСоединений = ПолучитьСоединенияРабочегоПроцесса(РабочийПроцесс); - Для Каждого Соединение Из СписокСоединений Цикл - - Попытка - РазорватьСоединениеСПроцессом(РабочийПроцесс, Соединение); - Исключение - Лог.Ошибка(ОписаниеОшибки()); - КонецПопытки; - - КонецЦикла; - - КонецЕсли; - КонецЦикла; - -КонецФункции - -Функция ПолучитьСписокРабочихПроцессов() - - КомандаЗапускаПроцессы = СтрокаЗапускаКлиента() + СтрШаблон("process list --cluster=""%1""%2", - ИдентификаторКластера(), - КлючиАвторизацииВКластере()) + " " + мНастройки.АдресСервераАдминистрирования; - - Лог.Информация("Получаю список рабочих процессов..."); - СписокПроцессов = ВыполнитьКоманду(КомандаЗапускаПроцессы); - - Возврат РазобратьПоток(СписокПроцессов); - -КонецФункции - -Функция ПолучитьСоединенияРабочегоПроцесса(Знач РабочийПроцесс) - - КомандаЗапускаСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection list --cluster=""%1""%2 --infobase=%3%4 --process=%5", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы(), - КлючиАвторизацииВБазе(), - РабочийПроцесс["process"]) + " " + мНастройки.АдресСервераАдминистрирования; - - Лог.Информация("Получаю список соединений..."); - Возврат РазобратьПоток(ВыполнитьКоманду(КомандаЗапускаСоединения)); - -КонецФункции - -Функция РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) - - КомандаРазрывСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 --infobase=%3%4 --process=%5 --connection=%6", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы(), - КлючиАвторизацииВБазе(), - РабочийПроцесс["process"], - Соединение["connection"]) + " " + мНастройки.АдресСервераАдминистрирования; - - Сообщение = СтрШаблон("Отключаю соединение %1 [%2] (%3)", - Соединение["conn-id"], - Соединение["app-id"], - Соединение["user-name"]); - - Лог.Информация(Сообщение); - - Возврат ВыполнитьКоманду(КомандаРазрывСоединения); - -КонецФункции - -Функция РазобратьПоток(Знач Поток) Экспорт - - ТД = Новый ТекстовыйДокумент; - ТД.УстановитьТекст(Поток); - - СписокОбъектов = Новый Массив; - ТекущийОбъект = Неопределено; - - Для Сч = 1 По ТД.КоличествоСтрок() Цикл - - Текст = ТД.ПолучитьСтроку(Сч); - Если ПустаяСтрока(Текст) или ТекущийОбъект = Неопределено Тогда - Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда - Продолжить; // очередная пустая строка подряд - КонецЕсли; - - ТекущийОбъект = Новый Соответствие; - СписокОбъектов.Добавить(ТекущийОбъект); - КонецЕсли; - - СтрокаРазбораИмя = ""; - СтрокаРазбораЗначение = ""; - - Если РазобратьНаКлючИЗначение(Текст, СтрокаРазбораИмя, СтрокаРазбораЗначение) Тогда - ТекущийОбъект[СтрокаРазбораИмя] = СтрокаРазбораЗначение; - КонецЕсли; - - КонецЦикла; - - Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда - СписокОбъектов.Удалить(СписокОбъектов.ВГраница()); - КонецЕсли; - - Возврат СписокОбъектов; - -КонецФункции - -Функция ПолучитьПутьКRAC(ТекущийПуть, Знач ВерсияПлатформы = "") - - Если НЕ ПустаяСтрока(ТекущийПуть) Тогда - ФайлУтилиты = Новый Файл(ТекущийПуть); - Если ФайлУтилиты.Существует() Тогда - Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя); - Возврат ФайлУтилиты.ПолноеИмя; - КонецЕсли; - КонецЕсли; - - Если ПустаяСтрока(ВерсияПлатформы) Тогда - ВерсияПлатформы = "8.3"; - КонецЕсли; - - Конфигуратор = Новый УправлениеКонфигуратором; - ПутьКПлатформе = Конфигуратор.ПолучитьПутьКВерсииПлатформы(ВерсияПлатформы); - Лог.Отладка("Используемый путь для поиска rac " + ПутьКПлатформе); - КаталогУстановки = Новый Файл(ПутьКПлатформе); - Лог.Отладка(КаталогУстановки.Путь); - - - ИмяФайла = ?(ЭтоWindows, "rac.exe", "rac"); - - ФайлУтилиты = Новый Файл(ОбъединитьПути(Строка(КаталогУстановки.Путь), ИмяФайла)); - Если ФайлУтилиты.Существует() Тогда - Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя); - Возврат ФайлУтилиты.ПолноеИмя; - КонецЕсли; - - Возврат ТекущийПуть; - -КонецФункции - -Функция РазобратьНаКлючИЗначение(Знач СтрокаРазбора, Ключ, Значение) - - ПозицияРазделителя = Найти(СтрокаРазбора, ":"); - Если ПозицияРазделителя = 0 Тогда - Возврат Ложь; - КонецЕсли; - - Ключ = СокрЛП(Лев(СтрокаРазбора, ПозицияРазделителя - 1)); - Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); - - Возврат Истина; - -КонецФункции - -///////////////////////////////////////////////////////////////////////////////// -СистемнаяИнформация = Новый СистемнаяИнформация; -ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; Лог = Логирование.ПолучитьЛог("vanessa.app.deployka"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217.os" new file mode 100644 index 0000000000000000000000000000000000000000..89d47ade6cb71e7bcbd0d0e2ff7d13fc00176ce1 --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\220\320\264\320\274\320\270\320\275\320\270\321\201\321\202\321\200\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217.os" @@ -0,0 +1,499 @@ + +Перем Лог; +Перем ЭтоWindows; + +Перем АдресСервераАдминистрирования; +Перем ПутьКлиентаАдминистрирования; +Перем ИмяБазыДанных; +Перем АдминистраторИБ; +Перем ПарольАдминистратораИБ; +Перем АдминистраторКластера; +Перем ПарольАдминистратораКластера; +Перем ИспользуемаяВерсияПлатформы; +Перем КлючРазрешенияЗапуска; + +Перем КлючиАвторизацииВКластере; +Перем ИдентификаторКластера; + +Перем КлючиАвторизацииВБазе; +Перем ИдентификаторБазы; + +Функция Инициализация(лАдресСервераАдминистрирования = "localhost:1545", + лПутьДоКлиентаАдминистрирования = "", + лИмяБазыДанных = "", + лАдминистраторИБ = "", + лПарольАдминистратораИБ = "", + лАдминистраторКластера = "", + лПарольАдминистратораКластера = "", + лИспользуемаяВерсияПлатформы = "", + лКлючРазрешенияЗапуска = "") Экспорт + + + АдресСервераАдминистрирования = лАдресСервераАдминистрирования; + ПутьКлиентаАдминистрирования = лПутьДоКлиентаАдминистрирования; + ИмяБазыДанных = лИмяБазыДанных; + АдминистраторИБ = лАдминистраторИБ; + ПарольАдминистратораИБ = лПарольАдминистратораИБ; + АдминистраторКластера = лАдминистраторКластера; + ПарольАдминистратораКластера = лПарольАдминистратораКластера; + ИспользуемаяВерсияПлатформы = лИспользуемаяВерсияПлатформы; + КлючРазрешенияЗапуска = лКлючРазрешенияЗапуска; + + ПутьКлиентаАдминистрирования = ПолучитьПутьКRAC(); + + КлючиАвторизацииВКластере = КлючиАвторизацииВКластере(); + ИдентификаторКластера = ИдентификаторКластера(); + + КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); + ИдентификаторБазы = ИдентификаторБазы(); + +КонецФункции + +Процедура УстановитьСтатусБлокировкиСеансов(Блокировать, ВремяСтартаБлокировки="", ВремяСтартаБлокировкиЧерез="", СообщениеОблокировке="", ЧислоПопыток=1) Экспорт + + ВремяБлокировки = ВремяСтартаБлокировки; + Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(ВремяСтартаБлокировкиЧерез) Тогда + Секунды = 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"), + СообщениеОблокировке, + КлючРазрешенияЗапуска, + ВремяБлокировки) + " "+АдресСервераАдминистрирования; + + Для Сч = 1 По ЧислоПопыток Цикл + Попытка + ЗапуститьПроцесс(КомандаВыполнения); + Прервать; + Исключение + Лог.Предупреждение("Попытка запуска rac не удалась. Текст ошибки: + |%1", ИнформацияОбОшибке().Описание); + КонецПопытки; + КонецЦикла; + + Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); + +КонецПроцедуры + +Процедура УстановитьСтатусБлокировкиРегламентныхЗаданий(Блокировать) Экспорт + + КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase update --infobase=""%3""%4 --cluster=""%1""%2 --scheduled-jobs-deny=%5", + ИдентификаторКластера, + КлючиАвторизацииВКластере, + ИдентификаторБазы, + КлючиАвторизацииВБазе, + ?(Блокировать, "on", "off")) + " "+АдресСервераАдминистрирования; + + ЗапуститьПроцесс(КомандаВыполнения); + + Лог.Информация("Запуск регламентных заданий " + ?(Блокировать, "запрещен", "разрешен")); + +КонецПроцедуры + +Процедура УдалитьВсеСеансыИСоединенияБазы(ЧислоПопыток=1) Экспорт + + УстановитьСтатусБлокировкиСеансов(Истина); + + Для Сч = 1 По ЧислоПопыток Цикл + Попытка + + ОтключитьСуществующиеСеансы(); + Приостановить(500); + Сеансы = ПолучитьСписокСеансов(); + + Если Сеансы.Количество() Тогда + Лог.Информация("Пауза перед отключением соединений"); + Приостановить(10000); + ОтключитьСоединенияСРабочимиПроцессами(); + КонецЕсли; + + Прервать; + + Исключение + Лог.Предупреждение("Попытка удаления сеансов не удалась. Текст ошибки: + |%1", ИнформацияОбОшибке().Описание); + КонецПопытки; + КонецЦикла + +КонецПроцедуры + +Процедура ОтключитьСуществующиеСеансы() + + Лог.Информация("Отключаю существующие сеансы"); + + СеансыБазы = ПолучитьСписокСеансов(); + Для Каждого Сеанс Из СеансыБазы Цикл + Попытка + ОтключитьСеанс(Сеанс); + Исключение + Лог.Ошибка(ОписаниеОшибки()); + КонецПопытки; + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьСписокСеансов() Экспорт + + ТаблицаСеансов = Новый ТаблицаЗначений; + ТаблицаСеансов.Колонки.Добавить("Идентификатор"); + ТаблицаСеансов.Колонки.Добавить("Приложение"); + ТаблицаСеансов.Колонки.Добавить("Пользователь"); + ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); + + КомандаЗапуска = СтрокаЗапускаКлиента() + СтрШаблон("session list --cluster=""%1""%2 --infobase=""%3""", + ИдентификаторКластера, + КлючиАвторизацииВКластере, + ИдентификаторБазы) + " " + АдресСервераАдминистрирования; + + СписокСеансовИБ = ЗапуститьПроцесс(КомандаЗапуска); + + Данные = РазобратьПоток(СписокСеансовИБ); + + Для Каждого Элемент Из Данные Цикл + + ТекСтрока = ТаблицаСеансов.Добавить(); + ТекСтрока.Идентификатор = Элемент["session"]; + ТекСтрока.Пользователь = Элемент["user-name"]; + ТекСтрока.Приложение = Элемент["app-id"]; + ТекСтрока.НомерСеанса = Элемент["session-id"]; + + КонецЦикла; + + Возврат ТаблицаСеансов; + +КонецФункции + +Процедура ОтключитьСеанс(Знач Сеанс) + + СтрокаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("session terminate --cluster=""%1""%2 --session=""%3""", + ИдентификаторКластера, + КлючиАвторизацииВКластере, + Сеанс.Идентификатор) + " " + АдресСервераАдминистрирования; + + Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); + + ЗапуститьПроцесс(СтрокаВыполнения); + +КонецПроцедуры + +Функция ОтключитьСоединенияСРабочимиПроцессами() + + Процессы = ПолучитьСписокРабочихПроцессов(); + + Для Каждого РабочийПроцесс Из Процессы Цикл + Если РабочийПроцесс["running"] = "yes" Тогда + + СписокСоединений = ПолучитьСоединенияРабочегоПроцесса(РабочийПроцесс); + Для Каждого Соединение Из СписокСоединений Цикл + + Попытка + РазорватьСоединениеСПроцессом(РабочийПроцесс, Соединение); + Исключение + Лог.Ошибка(ОписаниеОшибки()); + КонецПопытки; + + КонецЦикла; + + КонецЕсли; + КонецЦикла; + +КонецФункции + +Функция ПолучитьСписокРабочихПроцессов() + + КомандаЗапускаПроцессы = СтрокаЗапускаКлиента() + СтрШаблон("process list --cluster=""%1""%2", + ИдентификаторКластера, + КлючиАвторизацииВКластере) + " " + АдресСервераАдминистрирования; + + Лог.Информация("Получаю список рабочих процессов..."); + СписокПроцессов = ЗапуститьПроцесс(КомандаЗапускаПроцессы); + + Возврат РазобратьПоток(СписокПроцессов); + +КонецФункции + +Функция ПолучитьСоединенияРабочегоПроцесса(Знач РабочийПроцесс) + + КомандаЗапускаСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection list --cluster=""%1""%2 --infobase=%3%4 --process=%5", + ИдентификаторКластера, + КлючиАвторизацииВКластере, + ИдентификаторБазы, + КлючиАвторизацииВБазе, + РабочийПроцесс["process"]) + " " + АдресСервераАдминистрирования; + + Лог.Информация("Получаю список соединений..."); + Возврат РазобратьПоток(ЗапуститьПроцесс(КомандаЗапускаСоединения)); + +КонецФункции + +Функция РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) + + КомандаРазрывСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 --infobase=%3%4 --process=%5 --connection=%6", + ИдентификаторКластера, + КлючиАвторизацииВКластере, + ИдентификаторБазы, + КлючиАвторизацииВБазе, + РабочийПроцесс["process"], + Соединение["connection"]) + " " + АдресСервераАдминистрирования; + + Сообщение = СтрШаблон("Отключаю соединение %1 [%2] (%3)", + Соединение["conn-id"], + Соединение["app-id"], + Соединение["user-name"]); + + Лог.Информация(Сообщение); + + Возврат ЗапуститьПроцесс(КомандаРазрывСоединения); + +КонецФункции + +Функция РазобратьПоток(Знач Поток) Экспорт + + ТД = Новый ТекстовыйДокумент; + ТД.УстановитьТекст(Поток); + + СписокОбъектов = Новый Массив; + ТекущийОбъект = Неопределено; + + Для Сч = 1 По ТД.КоличествоСтрок() Цикл + + Текст = ТД.ПолучитьСтроку(Сч); + Если ПустаяСтрока(Текст) или ТекущийОбъект = Неопределено Тогда + Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда + Продолжить; // очередная пустая строка подряд + КонецЕсли; + + ТекущийОбъект = Новый Соответствие; + СписокОбъектов.Добавить(ТекущийОбъект); + КонецЕсли; + + СтрокаРазбораИмя = ""; + СтрокаРазбораЗначение = ""; + + Если РазобратьНаКлючИЗначение(Текст, СтрокаРазбораИмя, СтрокаРазбораЗначение) Тогда + ТекущийОбъект[СтрокаРазбораИмя] = СтрокаРазбораЗначение; + КонецЕсли; + + КонецЦикла; + + Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда + СписокОбъектов.Удалить(СписокОбъектов.ВГраница()); + КонецЕсли; + + Возврат СписокОбъектов; + +КонецФункции + +Функция РазобратьНаКлючИЗначение(Знач СтрокаРазбора, Ключ, Значение) + + ПозицияРазделителя = Найти(СтрокаРазбора, ":"); + Если ПозицияРазделителя = 0 Тогда + Возврат Ложь; + КонецЕсли; + + Ключ = СокрЛП(Лев(СтрокаРазбора, ПозицияРазделителя - 1)); + Значение = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); + + Возврат Истина; + +КонецФункции + + + +Функция ПолучитьПутьКRAC() + + Результат = ""; + + Если НЕ ПустаяСтрока(ПутьКлиентаАдминистрирования) Тогда + ФайлУтилиты = Новый Файл(ПутьКлиентаАдминистрирования); + Если ФайлУтилиты.Существует() Тогда + Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя); + Возврат ФайлУтилиты.ПолноеИмя; + КонецЕсли; + КонецЕсли; + + Если ПустаяСтрока(ИспользуемаяВерсияПлатформы) Тогда + ИспользуемаяВерсияПлатформы = "8.3"; + КонецЕсли; + + Конфигуратор = Новый УправлениеКонфигуратором; + ПутьКПлатформе = Конфигуратор.ПолучитьПутьКВерсииПлатформы(ИспользуемаяВерсияПлатформы); + Лог.Отладка("Используемый путь для поиска rac " + ПутьКПлатформе); + КаталогУстановки = Новый Файл(ПутьКПлатформе); + Лог.Отладка(КаталогУстановки.Путь); + + + ИмяФайла = ?(ЭтоWindows, "rac.exe", "rac"); + + ФайлУтилиты = Новый Файл(ОбъединитьПути(Строка(КаталогУстановки.Путь), ИмяФайла)); + Если ФайлУтилиты.Существует() Тогда + Лог.Отладка("Текущая версия rac " + ФайлУтилиты.ПолноеИмя); + Возврат ФайлУтилиты.ПолноеИмя; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция КлючиАвторизацииВБазе() + + Результат = ""; + + Если ЗначениеЗаполнено(АдминистраторИБ) Тогда + Результат = Результат + СтрШаблон(" --infobase-user=""%1""", АдминистраторИБ); + КонецЕсли; + + Если ЗначениеЗаполнено(ПарольАдминистратораИБ) Тогда + Результат = Результат + СтрШаблон(" --infobase-pwd=""%1""", ПарольАдминистратораИБ); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция КлючиАвторизацииВКластере() + + Результат = ""; + + Если ЗначениеЗаполнено(АдминистраторКластера) Тогда + Результат = Результат + СтрШаблон(" --cluster-user=""%1""", АдминистраторКластера); + КонецЕсли; + + Если ЗначениеЗаполнено(ПарольАдминистратораКластера) Тогда + Результат = Результат + СтрШаблон(" --cluster-pwd=""%1""", ПарольАдминистратораКластера); + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ИдентификаторКластера() + + Результат = ""; + + Лог.Информация("Получаю список кластеров"); + + КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list" + " " + АдресСервераАдминистрирования; + + СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); + + УИДКластера = Сред(СписокКластеров, (Найти(СписокКластеров, ":") + 1), Найти(СписокКластеров, "host") - Найти(СписокКластеров, ":") - 1); + Результат = СокрЛП(СтрЗаменить(УИДКластера, Символы.ПС, "")); + + Если ПустаяСтрока(Результат) Тогда + ВызватьИсключение "Кластер серверов отсутствует"; + КонецЕсли; + + Возврат Результат; + +КонецФункции + +Функция ИдентификаторБазы() + + КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase summary list --cluster=""%1""%2", + ИдентификаторКластера, + КлючиАвторизацииВКластере) + " " + АдресСервераАдминистрирования; + + Лог.Информация("Получаю список баз кластера"); + + СписокБазВКластере = СокрЛП(ЗапуститьПроцесс(КомандаВыполнения)); + Лог.Отладка(СписокБазВКластере); + ЧислоСтрок = СтрЧислоСтрок(СписокБазВКластере); + НайденаБазаВКластере = Ложь; + Для К = 1 По ЧислоСтрок Цикл + + СтрокаРазбора = СтрПолучитьСтроку(СписокБазВКластере, К); + ПозицияРазделителя = Найти(СтрокаРазбора, ":"); + Если Найти(СтрокаРазбора, "infobase") > 0 Тогда + УИДИБ = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); + ИначеЕсли Найти(СтрокаРазбора, "name") > 0 Тогда + ИмяБазы = СокрЛП(Сред(СтрокаРазбора, ПозицияРазделителя + 1)); + Если Нрег(ИмяБазы) = НРег(ИмяБазыДанных) Тогда + Лог.Информация("Получен УИД базы"); + НайденаБазаВКластере = Истина; + Прервать; + КонецЕсли; + КонецЕсли; + + КонецЦикла; + Если Не НайденаБазаВКластере Тогда + ВызватьИсключение "База " + ИмяБазыДанных + " не найдена в кластере"; + КонецЕсли; + + Возврат УИДИБ; + +КонецФункции + +Функция СтрокаЗапускаКлиента() + + Результат = ""; + + Если ЭтоWindows Тогда + Результат = """" + ПутьКлиентаАдминистрирования + """"; + Иначе + Результат = ПутьКлиентаАдминистрирования; + КонецЕсли; + + Возврат Результат + " "; + +КонецФункции + +Функция ЗапуститьПроцесс(Знач СтрокаВыполнения) + Перем ПаузаОжиданияЧтенияБуфера; + + ПаузаОжиданияЧтенияБуфера = 20; + + Лог.Отладка(СтрокаВыполнения); + Процесс = СоздатьПроцесс(СтрокаВыполнения, ,Истина); + Процесс.Запустить(); + + Текст = Новый ТекстовыйДокумент; + + Пока Истина Цикл + + ВывестиДанныеПроцесса(Процесс, Текст); + + Если Процесс.Завершен Тогда + Процесс.ОжидатьЗавершения(); // финальный сброс буферов + ВывестиДанныеПроцесса(Процесс, Текст); + Прервать; + КонецЕсли; + + Приостановить(ПаузаОжиданияЧтенияБуфера); + + КонецЦикла; + + Если Процесс.КодВозврата = 0 Тогда + Возврат Текст.ПолучитьТекст(); + Иначе + ВызватьИсключение "Сообщение от RAS/RAC + |" + Текст.ПолучитьТекст(); + КонецЕсли; + +КонецФункции + +Процедура ВывестиДанныеПроцесса(Знач Процесс, Знач Приемник) + Вывод = Процесс.ПотокВывода.Прочитать(); + Ошибки = Процесс.ПотокОшибок.Прочитать(); + Если СтрДлина(Строка(Вывод)) > 0 Тогда + Приемник.ДобавитьСтроку(Вывод); + КонецЕсли; + Если СтрДлина(Строка(Ошибки)) > 0 Тогда + Приемник.ДобавитьСтроку(Ошибки); + КонецЕсли; +КонецПроцедуры + +СистемнаяИнформация = Новый СистемнаяИнформация; +Лог = Логирование.ПолучитьЛог("vanessa.app.deployka"); +ЭтоWindows = Найти(НРег(СистемнаяИнформация.ВерсияОС), "windows") > 0; \ No newline at end of file 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..e2b74fc624a1f166a8cef0b066541e0c2c2f78cd 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,7 @@ ДобавитьКоманду("dbupdate", "КомандаОбновитьКонфигурациюБД", Парсер); ДобавитьКоманду("run", "КомандаЗапуститьВРежимеПредприятия", Парсер); ДобавитьКоманду("disablesupport", "КомандаСнятьСПоддержки", Парсер); + ДобавитьКоманду("sheduler", "КомандаУправлениеРегламентнымиЗаданиями",Парсер); КонецПроцедуры