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 413b489a55295433744b9c9a5fb409dc640dfd7e..b3743b02e3b4bc2f8f0d29d1befe16350bb25d77 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" @@ -18,6 +18,7 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS, по умолчанию localhost:1545"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-rac", "Команда запуска RAC, по умолчанию находим в каталоге установки 1с"); Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-usecom", "Использовать COM-соединение вместо ras/rac (отменяет ключ -ras)"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-server", "Сервер 1С:Предприятия в формате server[:port] (только для COM)"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы"); @@ -113,7 +114,7 @@ мНастройки.Вставить("СообщениеОблокировке", ПараметрыКоманды["-lockmessage"]); мНастройки.Вставить("ВремяСтратаБлокировки", ПараметрыКоманды["-lockstart"]); мНастройки.Вставить("ВремяСтратаБлокировкиЧерез", ПараметрыКоманды["-lockstartat"]); - + мНастройки.Вставить("ИмяСервера", ПараметрыКоманды["-server"]); мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]); @@ -131,7 +132,12 @@ Успех = Истина; - Если Не мНастройки.ИспользоватьCOMСоединение Тогда + Если мНастройки.ИспользоватьCOMСоединение Тогда + Если Не ЗначениеЗаполнено(мНастройки.ИмяСервера) Тогда + Лог.Ошибка("Не указан сервер 1С:Предприятия"); + Успех = Ложь; + КонецЕсли; + Иначе Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда Лог.Ошибка("Не указан сервер администрирования"); Успех = Ложь; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270COM.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270COM.os" new file mode 100644 index 0000000000000000000000000000000000000000..e4c176d3f169c3227a7242eb544aee0f1182974a --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270COM.os" @@ -0,0 +1,224 @@ +#Использовать logos + +Перем Лог; +Перем мНастройки; +Перем мСоединениеСКластером; + +Процедура УстановитьНастройки(НастройкиКоманды) Экспорт + мНастройки = НастройкиКоманды; +КонецПроцедуры + +Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать, Знач ВремяБлокировки) Экспорт + + Дескриптор = ПолучитьСоединениеСКластером(); + Попытка + Попытка + Если Блокировать Тогда + Дескриптор.InfoBase.ConnectDenied = Истина; + Дескриптор.InfoBase.DeniedMessage = мНастройки.СообщениеОблокировке; + Дескриптор.InfoBase.PermissionCode = мНастройки.КлючРазрешенияЗапуска; + Дескриптор.InfoBase.DeniedTo = '01000101'; + Дескриптор.InfoBase.DeniedFrom = '01000101'; + Иначе + Дескриптор.InfoBase.ConnectDenied = Ложь; + Дескриптор.InfoBase.DeniedMessage = ""; + Дескриптор.InfoBase.PermissionCode = ""; + Дескриптор.InfoBase.DeniedTo = '01000101'; + Дескриптор.InfoBase.DeniedFrom = '01000101'; + КонецЕсли; + + Исключение + ТекстОшибки = ИнформацияОбОшибке().Описание; + СообщениеСборки("Не удалось заблокировать подключения: Возможно, неверны логин/пароль администратора ИБ <" + ТекстОшибки + ">"); + + ВызватьИсключение; + КонецПопытки; + + Дескриптор.ConnectToWorkProcess.UpdateInfoBase(Дескриптор.InfoBase); + Исключение + ЗакрытьДескриптор(Дескриптор); + ВызватьИсключение; + КонецПопытки; + + Лог.Информация("Сеансы " + ?(Блокировать, "запрещены", "разрешены")); + +КонецПроцедуры + +Функция ПолучитьСписокСеансов() Экспорт + + ТаблицаСеансов = Новый ТаблицаЗначений; + ТаблицаСеансов.Колонки.Добавить("Идентификатор"); + ТаблицаСеансов.Колонки.Добавить("Приложение"); + ТаблицаСеансов.Колонки.Добавить("Пользователь"); + ТаблицаСеансов.Колонки.Добавить("НомерСеанса"); + + + + Возврат ТаблицаСеансов; + +КонецФункции + +Процедура ОтключитьСеанс(Знач Сеанс) Экспорт + + + + Лог.Информация(СтрШаблон("Отключаю сеанс: %1 [%2] (%3)", Сеанс.НомерСеанса, Сеанс.Пользователь, Сеанс.Приложение)); + + + +КонецПроцедуры + +Функция ПолучитьСписокРабочихПроцессов() Экспорт + + + Лог.Информация("Получаю список рабочих процессов..."); + + Возврат СписокПроцессов; + +КонецФункции + +Функция ПолучитьСоединенияРабочегоПроцесса(Знач РабочийПроцесс) Экспорт + + + + Лог.Информация("Получаю список соединений..."); + Возврат СписокСоединений; + +КонецФункции + +Функция РабочийПроцессВыполняется(Знач РабочийПроцесс) Экспорт + Возврат РабочийПроцесс["running"] = "yes"; +КонецФункции + +Процедура РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) Экспорт + + + Сообщение = СтрШаблон("Отключаю соединение %1 [%2] (%3)", + Соединение["conn-id"], + Соединение["app-id"], + Соединение["user-name"]); + + Лог.Информация(Сообщение); + + Возврат ЗапуститьПроцесс(КомандаРазрывСоединения); + +КонецПроцедуры + +///////////////////////////////////////////////////////////////////////////////// +// Служебные процедуры + +Функция ПолучитьСоединениеСКластером() + + ПрефиксВерсии = Лев(мНастройки.ИспользуемаяВерсияПлатформы, 3); + Если ПрефиксВерсии = "8.2" Тогда + Соединение = "V82.ComConnector"; + Иначе + Соединение = "V83.ComConnector"; + КонецЕсли; + + СообщениеСборки("Создание COM-коннектора <"+ Соединение + ">"); + + Возврат Новый COMОбъект(Соединение); + +КонецФункции + +Функция НайтиКластерСерверов(Знач Clusters, Знач ИмяСервера) + + НашлиКластер = Ложь; + Для i = 0 По Clusters.Количество()-1 Цикл + Cluster = Clusters[i]; + Если ВРег(Cluster.HostName) + ":" + Cluster.MainPort = ВРег(ИмяСервера) Тогда + НашлиКластер = Истина; + Прервать; + КонецЕсли; + + КонецЦикла; + + Если Не НашлиКластер Тогда + ОсвободитьОбъектКластера(Cluster); + ВызватьИсключение "Ошибка - не нашли кластер <"+ИмяСервера+">"; + КонецЕсли; + + Возврат Cluster; + +КонецФункции + +Процедура ОсвободитьОбъектКластера(Соединение) + + Если Соединение <> Неопределено Тогда + ОсвободитьОбъект(Соединение); + Соединение = Неопределено; + КонецЕсли; + +КонецПроцедуры + +Процедура ЗакрытьДескриптор(Знач Дескриптор) Экспорт + + ОсвободитьОбъектКластера(Дескриптор.ConnectToWorkProcess); + ОсвободитьОбъектКластера(Дескриптор.Cluster); + ОсвободитьОбъектКластера(Дескриптор.ServerAgent); + ОсвободитьОбъектКластера(Дескриптор.InfoBase); + +КонецПроцедуры + +Функция ПолучитьСоединениеСКластером() + Если мСоединениеСКластером = Неопределено Тогда + мСоединениеСКластером = ПолучитьСоединениеСКластером(); + КонецЕсли; + + Возврат мСоединениеСКластером; +КонецФункции // ПолучитьСоединениеСКластером() + +Функция УстановитьСоединениеСКластером() + + ComConnector = ПолучитьСоединениеСКластером(); + + Дескриптор = Новый Структура; + Дескриптор.Вставить("ServerAgent", Неопределено); + Дескриптор.Вставить("Cluster", Неопределено); + Дескриптор.Вставить("ConnectToWorkProcess", Неопределено); + Дескриптор.Вставить("InfoBase", Неопределено); + + Попытка + + Лог.Информация("Подключение к агенту сервера"); + ServerAgent = ComConnector.ConnectAgent(мНастройки.АдресАгентаСервера); + Дескриптор.ServerAgent = ServerAgent; + + Clusters = ServerAgent.GetClusters(); + Cluster = НайтиКластерСерверов(Clusters, мНастройки.ИмяСервера); + + Лог.Информация("Аутентификация к найденному кластеру: " + Cluster.HostName + ":" + Cluster.MainPort); + ServerAgent.Authenticate(Cluster, мНастройки.АдминистраторКластера, мНастройки.ПарольАдминистратораКластера); + + ConnectToWorkProcess = ПолучитьСоединениеСПроцессом(ComConnector, ServerAgent, Cluster); + + Дескриптор.Cluster = Cluster; + Дескриптор.ConnectToWorkProcess = ConnectToWorkProcess; + + Если ConnectToWorkProcess <> Неопределено Тогда + InfoBase = НайтиИнформационнуюБазуВРабочемПроцессе(ConnectToWorkProcess); + Если Infobase = Неопределено Тогда + ВызватьИсключение "Не нашли нужную ИБ"; + КонецЕсли; + Дескриптор.InfoBase = InfoBase + Иначе + ВызватьИсключение "Нет запущенных рабочих процессов"; + КонецЕсли; + + Исключение + + ЗакрытьДескриптор(Дескриптор); + ОсвободитьОбъектКластера(Clusters); + ОсвободитьОбъектКластера(ComConnector); + + ВызватьИсключение; + + КонецПопытки; + + Возврат Дескриптор; + +КонецФункции + +///////////////////////////////////////////////////////////////////////////////// +Лог = Логирование.ПолучитьЛог("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\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\270RAS.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270RAS.os" index 7e6f91412fb8a10ff6460d17f2cae6225cc74f2b..5168c9dcdb213e8876ba6bd3bf2ecd108b559eb1 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270RAS.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\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\270RAS.os" @@ -9,7 +9,7 @@ КонецПроцедуры -Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать) Экспорт +Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать, Знач ВремяБлокировки) Экспорт КлючиАвторизацииВБазе = КлючиАвторизацииВБазе(); @@ -17,16 +17,6 @@ ИдентификаторБазы = ИдентификаторБазы(); КлючРазрешенияЗапуска = ?(ПустаяСтрока(мНастройки.КлючРазрешенияЗапуска), ИдентификаторБазы, мНастройки.КлючРазрешенияЗапуска); - ВремяБлокировки = мНастройки.ВремяСтратаБлокировки; - Если ПустаяСтрока(ВремяБлокировки) И Не ПустаяСтрока(мНастройки.ВремяСтратаБлокировкиЧерез) Тогда - Секунды = 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""", ИдентификаторКластера, @@ -119,7 +109,7 @@ Возврат РабочийПроцесс["running"] = "yes"; КонецФункции -Функция РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) Экспорт +Процедура РазорватьСоединениеСПроцессом(Знач РабочийПроцесс, Знач Соединение) Экспорт КомандаРазрывСоединения = СтрокаЗапускаКлиента() + СтрШаблон("connection disconnect --cluster=""%1""%2 --infobase=%3%4 --process=%5 --connection=%6", ИдентификаторКластера(), @@ -138,7 +128,7 @@ Возврат ЗапуститьПроцесс(КомандаРазрывСоединения); -КонецФункции +КонецПроцедуры ///////////////////////////////////////////////////////////////////////////////// // Служебные процедуры