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 ef290065b5420cd9533b85f0c23eb3a0a59c2cb3..055b63201b620c0519f7d5905bc88fae2d239926 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" @@ -10,91 +10,91 @@ Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт - ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); - - Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-db-user", - "Пользователь информационной базы"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-db-pwd", - "Пароль пользователя информационной базы"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-cluster-admin", - "Администратор кластера"); - - Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-cluster-pwd", - "Пароль администратора кластера"); + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы"); + Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock|kill"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-user", + "Пользователь информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-db-pwd", + "Пароль пользователя информационной базы"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-cluster-admin", + "Администратор кластера"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-v8version", - "Маска версии платформы 1С"); + "-cluster-pwd", + "Пароль администратора кластера"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockmessage", - "Сообщение блокировки"); + "-v8version", + "Маска версии платформы 1С"); + + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, + "-lockmessage", + "Сообщение блокировки"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockuccode", - "Ключ разрешения запуска"); + "-lockuccode", + "Ключ разрешения запуска"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockstart", - "Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'"); + "-lockstart", + "Время старта блокировки пользователей, время указываем как '2040-12-31T23:59:59'"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, - "-lockstartat", - "Время старта блокировки через n сек"); - - Парсер.ДобавитьКоманду(ОписаниеКоманды); - + "-lockstartat", + "Время старта блокировки через n сек"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + КонецПроцедуры Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт - ПрочитатьПараметры(ПараметрыКоманды); - - Если Не ПараметрыВведеныКорректно() Тогда - Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; - КонецЕсли; - - Если мНастройки.Действие = "lock" Тогда - УстановитьСтатусБлокировкиСеансов(Истина); - ИначеЕсли мНастройки.Действие = "unlock" Тогда - УстановитьСтатусБлокировкиСеансов(Ложь); - ИначеЕсли мНастройки.Действие = "kill" Тогда - УстановитьСтатусБлокировкиСеансов(Истина); - ОтключитьСуществующиеСеансы(); - Иначе - Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие); - Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; - КонецЕсли; - - Возврат МенеджерКомандПриложения.РезультатыКоманд().НеРеализовано; - + ПрочитатьПараметры(ПараметрыКоманды); + + Если Не ПараметрыВведеныКорректно() Тогда + Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; + КонецЕсли; + + Если мНастройки.Действие = "lock" Тогда + УстановитьСтатусБлокировкиСеансов(Истина); + ИначеЕсли мНастройки.Действие = "unlock" Тогда + УстановитьСтатусБлокировкиСеансов(Ложь); + ИначеЕсли мНастройки.Действие = "kill" Тогда + УстановитьСтатусБлокировкиСеансов(Истина); + ОтключитьСуществующиеСеансы(); + Иначе + Лог.Ошибка("Неизвестное действие: " + мНастройки.Действие); + Возврат МенеджерКомандПриложения.РезультатыКоманд().НеверныеПараметры; + КонецЕсли; + + Возврат МенеджерКомандПриложения.РезультатыКоманд().НеРеализовано; + КонецФункции Процедура ПрочитатьПараметры(Знач ПараметрыКоманды) - мНастройки = Новый Структура; - - Для Каждого КЗ Из ПараметрыКоманды Цикл - Лог.Отладка(КЗ.Ключ + " = " + КЗ.Значение); - КонецЦикла; - - мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]); - мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-rac"]); - мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]); - мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]); - мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]); - мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]); - мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-pwd"]); + мНастройки = Новый Структура; + + Для Каждого КЗ Из ПараметрыКоманды Цикл + Лог.Отладка(КЗ.Ключ + " = " + КЗ.Значение); + КонецЦикла; + + мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]); + мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-rac"]); + мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]); + мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]); + мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]); + мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]); + мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-pwd"]); мНастройки.Вставить("ИспользуемаяВерсияПлатформы", ПараметрыКоманды["-v8version"]); мНастройки.Вставить("КлючРазрешенияЗапуска", ПараметрыКоманды["-lockuccode"]); мНастройки.Вставить("СообщениеОблокировке", ПараметрыКоманды["-lockmessage"]); @@ -102,57 +102,57 @@ мНастройки.Вставить("ВремяСтратаБлокировкиЧерез", ПараметрыКоманды["-lockstartat"]); - мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); + мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); //Получим путь к платформе если вдруг не установленна мНастройки.ПутьКлиентаАдминистрирования = ПолучитьПутьКRAC(мНастройки.ПутьКлиентаАдминистрирования, мНастройки.ИспользуемаяВерсияПлатформы); Если ПустаяСтрока(мНастройки.АдресСервераАдминистрирования) Тогда мНастройки.АдресСервераАдминистрирования = "localhost:1545"; КонецЕсли; - + КонецПроцедуры Функция ПараметрыВведеныКорректно() - - Успех = Истина; - - Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда - Лог.Ошибка("Не указан сервер администрирования"); - Успех = Ложь; - КонецЕсли; - - Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда - Лог.Ошибка("Не указан клиент администрирования"); - Успех = Ложь; - КонецЕсли; - - Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда - Лог.Ошибка("Не указано имя базы данных"); - Успех = Ложь; - КонецЕсли; - - Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда - Лог.Ошибка("Не указано действие lock/unlock"); - Успех = Ложь; - КонецЕсли; - - Возврат Успех; - + + Успех = Истина; + + Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда + Лог.Ошибка("Не указан сервер администрирования"); + Успех = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда + Лог.Ошибка("Не указан клиент администрирования"); + Успех = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда + Лог.Ошибка("Не указано имя базы данных"); + Успех = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда + Лог.Ошибка("Не указано действие lock/unlock"); + Успех = Ложь; + КонецЕсли; + + Возврат Успех; + КонецФункции ///////////////////////////////////////////////////////////////////////////////// // Взаимодействие с кластером Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать) - - КлючиАвторизацииВБазе = ""; - Если ЗначениеЗаполнено(мНастройки.АдминистраторИБ) Тогда - КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-user=""%1""", мНастройки.АдминистраторИБ); - КонецЕсли; - - Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораИБ) Тогда - КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-pwd=""%1""", мНастройки.ПарольАдминистратораИБ); - КонецЕсли; + + КлючиАвторизацииВБазе = ""; + Если ЗначениеЗаполнено(мНастройки.АдминистраторИБ) Тогда + КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-user=""%1""", мНастройки.АдминистраторИБ); + КонецЕсли; + + Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораИБ) Тогда + КлючиАвторизацииВБазе = КлючиАвторизацииВБазе + СтрШаблон(" --infobase-pwd=""%1""", мНастройки.ПарольАдминистратораИБ); + КонецЕсли; ИдентификаторКластера = ИдентификаторКластера(); ИдентификаторБазы = ИдентификаторБазы(); @@ -168,65 +168,65 @@ ВремяБлокировки = Формат(ТекущаяДата()+Секунды,"ДФ='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"), + ИдентификаторКластера, + КлючиАвторизацииВКластере(), + ИдентификаторБазы, + КлючиАвторизацииВБазе, + ?(Блокировать, "on", "off"), мНастройки.СообщениеОблокировке, КлючРазрешенияЗапуска, ВремяБлокировки); - - ЗапуститьПроцесс(КомандаВыполнения); - - Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); - + + ЗапуститьПроцесс(КомандаВыполнения); + + Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); + КонецПроцедуры Функция ИдентификаторКластера() - Если мИдентификаторКластера = Неопределено Тогда - Лог.Информация("Получаю список кластеров"); - - КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list"; - - СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); - - УИДКластера = Сред(СписокКластеров,(Найти(СписокКластеров,":")+1),Найти(СписокКластеров,"host")-Найти(СписокКластеров,":")-1); + Если мИдентификаторКластера = Неопределено Тогда + Лог.Информация("Получаю список кластеров"); + + КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list"; + + СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения); + + УИДКластера = Сред(СписокКластеров,(Найти(СписокКластеров,":")+1),Найти(СписокКластеров,"host")-Найти(СписокКластеров,":")-1); мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера,Символы.ПС,"")); - - КонецЕсли; - - Если ПустаяСтрока(мИдентификаторКластера) Тогда - ВызватьИсключение "Кластер серверов отсутствует"; - КонецЕсли; - - Возврат мИдентификаторКластера; + + КонецЕсли; + + Если ПустаяСтрока(мИдентификаторКластера) Тогда + ВызватьИсключение "Кластер серверов отсутствует"; + КонецЕсли; + + Возврат мИдентификаторКластера; КонецФункции Функция ИдентификаторБазы() - Если мИдентификаторБазы = Неопределено Тогда - мИдентификаторБазы = НайтиБазуВКластере(); - КонецЕсли; - - Возврат мИдентификаторБазы; + Если мИдентификаторБазы = Неопределено Тогда + мИдентификаторБазы = НайтиБазуВКластере(); + КонецЕсли; + + Возврат мИдентификаторБазы; КонецФункции Функция НайтиБазуВКластере() - - КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase summary list --cluster=""%1""%2", - ИдентификаторКластера(), - КлючиАвторизацииВКластере()); - - Лог.Информация("Получаю список баз кластера"); - - СписокБазВКластере = ЗапуститьПроцесс(КомандаВыполнения); + + КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase summary list --cluster=""%1""%2", + ИдентификаторКластера(), + КлючиАвторизацииВКластере()); + + Лог.Информация("Получаю список баз кластера"); + + СписокБазВКластере = ЗапуститьПроцесс(КомандаВыполнения); ЧислоСтрок = СтрЧислоСтрок(СписокБазВКластере); - НайденаБазаВКластере = Ложь; - Для К = 1 По ЧислоСтрок Цикл + НайденаБазаВКластере = Ложь; + Для К = 1 По ЧислоСтрок Цикл СтрокаРазбора = СтрПолучитьСтроку(СписокБазВКластере,К); ПозицияРазделителя = Найти(СтрокаРазбора,":"); @@ -235,31 +235,31 @@ ИначеЕсли Найти(СтрокаРазбора,"name")>0 Тогда ИмяБазы = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1)); Если Нрег(ИмяБазы) = НРег(мНастройки.ИмяБазыДанных) Тогда - Сообщить("Получен УИД базы"); - НайденаБазаВКластере = Истина; - Прервать; + Сообщить("Получен УИД базы"); + НайденаБазаВКластере = Истина; + Прервать; КонецЕсли; КонецЕсли; КонецЦикла; Если Не НайденаБазаВКластере Тогда - ВызватьИсключение "База "+мНастройки.ИмяБазыДанных +" не найдена в кластере"; + ВызватьИсключение "База "+мНастройки.ИмяБазыДанных +" не найдена в кластере"; КонецЕсли; - - Возврат УИДИБ; - + + Возврат УИДИБ; + КонецФункции Функция КлючиАвторизацииВКластере() - КомандаВыполнения = ""; - Если ЗначениеЗаполнено(мНастройки.АдминистраторКластера) Тогда - КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-user=""%1""", мНастройки.АдминистраторКластера); - КонецЕсли; - - Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораКластера) Тогда - КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-pwd=""%1""", мНастройки.ПарольАдминистратораКластера); - КонецЕсли; - Возврат КомандаВыполнения; + КомандаВыполнения = ""; + Если ЗначениеЗаполнено(мНастройки.АдминистраторКластера) Тогда + КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-user=""%1""", мНастройки.АдминистраторКластера); + КонецЕсли; + + Если ЗначениеЗаполнено(мНастройки.ПарольАдминистратораКластера) Тогда + КомандаВыполнения = КомандаВыполнения + СтрШаблон(" --cluster-pwd=""%1""", мНастройки.ПарольАдминистратораКластера); + КонецЕсли; + Возврат КомандаВыполнения; КонецФункции Функция СтрокаЗапускаКлиента() @@ -270,8 +270,8 @@ ПутьКлиентаАдминистрирования = мНастройки.ПутьКлиентаАдминистрирования; КонецЕсли; - Возврат ПутьКлиентаАдминистрирования + " " + - мНастройки.АдресСервераАдминистрирования + " "; + Возврат ПутьКлиентаАдминистрирования + " " + + мНастройки.АдресСервераАдминистрирования + " "; КонецФункции Функция ЗапуститьПроцесс(Знач СтрокаВыполнения) @@ -279,9 +279,9 @@ ПаузаОжиданияЧтенияБуфера = 10; - Лог.Отладка(СтрокаВыполнения); + Лог.Отладка(СтрокаВыполнения); Процесс = СоздатьПроцесс(СтрокаВыполнения,,Истина); - Процесс.Запустить(); + Процесс.Запустить(); ТекстБазовый = ""; Счетчик = 0; МаксСчетчикЦикла = 100000; @@ -303,85 +303,132 @@ КонецЦикла; Процесс.ОжидатьЗавершения(); - - Если Процесс.КодВозврата = 0 Тогда - Текст = Процесс.ПотокВывода.Прочитать(); + + Если Процесс.КодВозврата = 0 Тогда + Текст = Процесс.ПотокВывода.Прочитать(); ТекстБазовый = ТекстБазовый + Текст; - Лог.Отладка(ТекстБазовый); - Возврат ТекстБазовый; - Иначе - ВызватьИсключение "Сообщение от RAS/RAC - |" + Процесс.ПотокОшибок.Прочитать(); - КонецЕсли; + Лог.Отладка(ТекстБазовый); + Возврат ТекстБазовый; + Иначе + ВызватьИсключение "Сообщение от RAS/RAC + |" + Процесс.ПотокОшибок.Прочитать(); + КонецЕсли; КонецФункции Процедура ОтключитьСуществующиеСеансы() - Лог.Информация("Отключаю существующие сеансы"); - - СеансыБазы = ПолучитьСписокСеансов(); - Для Каждого Сеанс Из СеансыБазы Цикл + Лог.Информация("Отключаю существующие сеансы"); + + СеансыБазы = ПолучитьСписокСеансов(); + Для Каждого Сеанс Из СеансыБазы Цикл Попытка ОтключитьСеанс(Сеанс); Исключение Лог.Ошибка(ОписаниеОшибки()); КонецПопытки; - КонецЦикла; - + КонецЦикла; + КонецПроцедуры Функция ПолучитьСписокСеансов() - - ТаблицаСеансов = Новый ТаблицаЗначений; - ТаблицаСеансов.Колонки.Добавить("Идентификатор"); - ТаблицаСеансов.Колонки.Добавить("Приложение"); - ТаблицаСеансов.Колонки.Добавить("Пользователь"); - ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); - - КомандаЗапуска = СтрокаЗапускаКлиента() + СтрШаблон("session list --cluster=""%1""%2 --infobase=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - ИдентификаторБазы()); - - СписокСеансовИБ = ЗапуститьПроцесс(КомандаЗапуска); - - ЧислоСтрок = СтрЧислоСтрок(СписокСеансовИБ); - ТекСтрока = Неопределено; - Для К = 1 По ЧислоСтрок Цикл - СтрокаРазбора = СтрПолучитьСтроку(СписокСеансовИБ,К); - ПозицияРазделителя = Найти(СтрокаРазбора,":"); - СтрокаРазбораИмя = СокрЛП(Лев(СтрокаРазбора,ПозицияРазделителя-1)); - СтрокаРазбораЗначение = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1)); - Если СтрокаРазбораИмя = "session" Тогда - ТекСтрока = ТаблицаСеансов.Добавить(); - ТекСтрока.Идентификатор = СтрокаРазбораЗначение; - ИначеЕсли СтрокаРазбораИмя = "user-name" Тогда - ТекСтрока.Пользователь = СтрокаРазбораЗначение; - ИначеЕсли СтрокаРазбораИмя = "app-id" Тогда - ТекСтрока.Приложение = СтрокаРазбораЗначение; - ИначеЕсли СтрокаРазбораИмя = "session-id" Тогда - ТекСтрока.НомерСеанса = СтрокаРазбораЗначение; - КонецЕсли; + + ТаблицаСеансов = Новый ТаблицаЗначений; + ТаблицаСеансов.Колонки.Добавить("Идентификатор"); + ТаблицаСеансов.Колонки.Добавить("Приложение"); + ТаблицаСеансов.Колонки.Добавить("Пользователь"); + ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); + + КомандаЗапуска = СтрокаЗапускаКлиента() + СтрШаблон("session list --cluster=""%1""%2 --infobase=""%3""", + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + ИдентификаторБазы()); + + СписокСеансовИБ = ЗапуститьПроцесс(КомандаЗапуска); + + Данные = РазобратьПоток(СписокСеансовИБ); + + Для Каждого Элемент Из Данные Цикл + + ТекСтрока = ТаблицаСеансов.Добавить(); + ТекСтрока.Идентификатор = Элемент["session"]; + ТекСтрока.Пользователь = Элемент["user-name"]; + ТекСтрока.Приложение = Элемент["app-id"]; + ТекСтрока.НомерСеанса = Элемент["session-id"]; + КонецЦикла; - - Возврат ТаблицаСеансов; - + + Возврат ТаблицаСеансов; + КонецФункции Процедура ОтключитьСеанс(Знач Сеанс) - СтрокаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("session terminate --cluster=""%1""%2 --session=""%3""", - ИдентификаторКластера(), - КлючиАвторизацииВКластере(), - Сеанс.Идентификатор); - - Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); - + СтрокаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("session terminate --cluster=""%1""%2 --session=""%3""", + ИдентификаторКластера(), + КлючиАвторизацииВКластере(), + Сеанс.Идентификатор); + + Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); + ЗапуститьПроцесс(СтрокаВыполнения); КонецПроцедуры +Функция ПолучитьСписокСоединений() + + СтрокаВыполнения = "%RacClient% %ХостСервера% connection %УидКластера% %АдминКластера% %ПарольАдминаКластера% list %Процесс% %УИДИБ% %АдминБазы% %ПарольАдминаБазы% > %ФайлПотока% 2> %ФайлОшибки%"; + + КомандаЗапускаПроцессы = СтрокаЗапускаКлиента() + СтрШаблон("process list --cluster=""%1""%2", + ИдентификаторКластера(), + КлючиАвторизацииВКластере()); + + Лог.Информация("Получаю список рабочих процессов"); + СписокПроцессов = ВыполнитьКоманду(КомандаЗапускаПроцессы); + ЧислоСтрок = СтрЧислоСтрок(СписокПроцессов); + +КонецФункции + +Функция РазобратьПоток(Знач Поток) Экспорт + + ТД = Новый ТекстовыйДокумент; + ТД.УстановитьТекст(Поток); + + СписокОбъектов = Новый Массив; + ТекущийОбъект = Неопределено; + + Для Сч = 1 По ТД.КоличествоСтрок() Цикл + + Текст = ТД.ПолучитьСтроку(Сч); + Если ПустаяСтрока(Текст) или ТекущийОбъект = Неопределено Тогда + Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда + Продолжить; // очередная пустая строка подряд + КонецЕсли; + + ТекущийОбъект = Новый Соответствие; + СписокОбъектов.Добавить(ТекущийОбъект); + КонецЕсли; + + ПозицияРазделителя = Найти(Текст,":"); + Если ПозицияРазделителя = 0 Тогда + Продолжить; + КонецЕсли; + + СтрокаРазбораИмя = СокрЛП(Лев(Текст,ПозицияРазделителя-1)); + СтрокаРазбораЗначение = СокрЛП(Сред(Текст,ПозицияРазделителя+1)); + + ТекущийОбъект[СтрокаРазбораИмя] = СтрокаРазбораЗначение; + + КонецЦикла; + + Если ТекущийОбъект <> Неопределено и ТекущийОбъект.Количество() = 0 Тогда + СписокОбъектов.Удалить(СписокОбъектов.ВГраница()); + КонецЕсли; + + Возврат СписокОбъектов; + +КонецФункции + Функция ПолучитьПутьКRAC(ТекущийПуть, Знач ВерсияПлатформы="") Если НЕ ПустаяСтрока(ТекущийПуть) Тогда diff --git "a/tests/\320\242\320\265\321\201\321\202\320\237\320\260\321\200\321\201\320\265\321\200\320\260\320\222\321\213\320\262\320\276\320\264\320\260RAC.os" "b/tests/\320\242\320\265\321\201\321\202\320\237\320\260\321\200\321\201\320\265\321\200\320\260\320\222\321\213\320\262\320\276\320\264\320\260RAC.os" new file mode 100644 index 0000000000000000000000000000000000000000..0dc938493a6223605cc08c56911d2c02b59fba11 --- /dev/null +++ "b/tests/\320\242\320\265\321\201\321\202\320\237\320\260\321\200\321\201\320\265\321\200\320\260\320\222\321\213\320\262\320\276\320\264\320\260RAC.os" @@ -0,0 +1,52 @@ + +#Использовать asserts + +#Использовать "../src" + +Функция ПолучитьСписокТестов(МенеджерТестирования) Экспорт + + МассивТестов = Новый Массив; + МассивТестов.Добавить("Тест_ДолженПрочитатьСписокОбъектов"); + + Возврат МассивТестов; + +КонецФункции + +Процедура Тест_ДолженПрочитатьСписокОбъектов() Экспорт + + КомандаУправления = Новый КомандаУправлениеСеансами; + + Поток = + "id : 123 + |name : somename + |value : somevalue + | + |id : 125 + |name : somename1 + |value : somevalue1 + | + | + |"; + + Результат = КомандаУправления.РазобратьПоток(Поток); + + Ожидаем.Что(Результат).ИмеетТип("Массив"); + Ожидаем.Что(Результат.Количество()).Равно(2); + + Объект = Результат[0]; + Ожидаем.Что(Объект).ИмеетТип("Соответствие"); + Ожидаем.Что(Объект.Количество(), "Первый объект").Равно(3); + + Ожидаем.Что(Объект["id"]).Равно("123"); + Ожидаем.Что(Объект["name"]).Равно("somename"); + Ожидаем.Что(Объект["value"]).Равно("somevalue"); + + Объект = Результат[1]; + Ожидаем.Что(Объект).ИмеетТип("Соответствие"); + Ожидаем.Что(Объект.Количество(), "Второй объект").Равно(3); + + Ожидаем.Что(Объект["id"]).Равно("125"); + Ожидаем.Что(Объект["name"]).Равно("somename1"); + Ожидаем.Что(Объект["value"]).Равно("somevalue1"); + +КонецПроцедуры