Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс
Перем мНастройки;
Перем Лог;
Перем мИдентификаторКластера;
Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт
ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Управление сеансами информационной базы");
Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "Действие", "lock|unlock");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-ras", "Сетевой адрес RAS");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-raс", "Команда запуска RAC");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-db", "Имя информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-db-user",
"Пользователь информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-db-pwd",
"Пароль пользователя информационной базы");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-cluster-admin",
"Администратор кластера");
Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды,
"-cluster-admin-pwd",
"Пароль администратора кластера");
Парсер.ДобавитьКоманду(ОписаниеКоманды);
КонецПроцедуры
Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт
ПрочитатьПараметры(ПараметрыКоманды);
Если Не ПараметрыВведеныКорректно() Тогда
Возврат МенеджерКомандПриложения.РезультатКоманды().НеверныеПараметры;
КонецЕсли;
Возврат МенеджерКомандПриложения.РезультатКоманды().НеРеализована;
КонецФункции
Процедура ПрочитатьПараметры(Знач ПараметрыКоманды)
мНастройки = Новый Структура;
мНастройки.Вставить("АдресСервераАдминистрирования", ПараметрыКоманды["-ras"]);
мНастройки.Вставить("ПутьКлиентаАдминистрирования", ПараметрыКоманды["-raс"]);
мНастройки.Вставить("ИмяБазыДанных", ПараметрыКоманды["-db"]);
мНастройки.Вставить("АдминистраторИБ", ПараметрыКоманды["-db-user"]);
мНастройки.Вставить("ПарольАдминистратораИБ", ПараметрыКоманды["-db-pwd"]);
мНастройки.Вставить("АдминистраторКластера", ПараметрыКоманды["-cluster-admin"]);
мНастройки.Вставить("ПарольАдминистратораКластера", ПараметрыКоманды["-cluster-admin-pwd"]);
мНастройки.Вставить("Действие", ПараметрыКоманды["Действие"]);
КонецПроцедуры
Функция ПараметрыВведеныКорректно()
Успех = Истина;
Если Не ЗначениеЗаполнено(мНастройки.АдресСервераАдминистрирования) Тогда
Лог.Ошибка("Не указан сервер администрирования");
Успех = Ложь;
КонецЕсли;
Если Не ЗначениеЗаполнено(мНастройки.ПутьКлиентаАдминистрирования) Тогда
Лог.Ошибка("Не указан клиент администрирования");
Успех = Ложь;
КонецЕсли;
Если Не ЗначениеЗаполнено(мНастройки.ИмяБазыДанных) Тогда
Лог.Ошибка("Не указано имя базы данных");
Успех = Ложь;
КонецЕсли;
Если Не ЗначениеЗаполнено(мНастройки.Действие) Тогда
Лог.Ошибка("Не указано действие lock/unlock");
Успех = Ложь;
КонецЕсли;
Возврат Успех;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////
// Взаимодействие с кластером
Процедура УстановитьСтатусБлокировкиСеансов(Знач Блокировать)
УИДИБ = НайтиБазуВКластере();
КомандаВыполнения = СтрокаЗапускаКлиента() + СтрШаблон("infobase --cluster=""%1"""
+ ?(мНастройки.АдминистраторКластера<>""," --cluster-user=""%2""", "")
+ ?(мНастройки.ПарольАдминистратораКластера<>""," --cluster-pwd=""%3""", ""),
ИдентификаторКластера(),
мНастройки.АдминистраторКластера,
мНастройки.ПарольАдминистратораКластера)
+ СтрШаблон(" update --infobase=%1"
+ ?(мНастройки.АдминистраторИБ<>""," --infobase-user=""%2""","")
+ ?(мНастройки.ПарольАдминистратораИБ<>""," --infobase-pwd=""%3""",""))
+ " sessions-deny=" + ?(Блокировать, "on", "off");
ЗапуститьПроцесс(КомандаВыполнения);
КонецПроцедуры
Функция ИдентификаторКластера()
Если мИдентификаторКластера = Неопределено Тогда
Лог.Информация("Получаю список кластеров");
КомандаВыполнения = СтрокаЗапускаКлиента() + "cluster list";
СписокКластеров = ЗапуститьПроцесс(КомандаВыполнения);
УИДКластера = Сред(СписокКластеров,(Найти(СписокКластеров,":")+1),Найти(СписокКластеров,"host")-Найти(СписокКластеров,":")-1);
мИдентификаторКластера = СокрЛП(СтрЗаменить(УИДКластера,Символы.ПС,""));
КонецЕсли;
Если ПустаяСтрока(мИдентификаторКластера) Тогда
ВызватьИсключение "Кластер серверов отсутствует";
КонецЕсли;
Возврат мИдентификаторКластера;
КонецФункции
Функция НайтиБазуВКластере()
КомандаВыполнения = СтрокаЗапускаКлиента() +
СтрШаблон("infobase summary --cluster=""%1"""
+ ?(мНастройки.АдминистраторКластера<>""," --cluster-user=""%2""", "")
+ ?(мНастройки.ПарольАдминистратораКластера<>""," --cluster-pwd=""%3""", "")
+ " list",
ИдентификаторКластера(),
мНастройки.АдминистраторКластера,
мНастройки.ПарольАдминистратораКластера);
Лог.Информация("Получаю список баз кластера");
СписокБазВКластере = ЗапуститьПроцесс(КомандаВыполнения);
ЧислоСтрок = СтрЧислоСтрок(СписокБазВКластере);
НайденаБазаВКластере = Ложь;
Для К = 1 По ЧислоСтрок Цикл
СтрокаРазбора = СтрПолучитьСтроку(СписокБазВКластере,К);
ПозицияРазделителя = Найти(СтрокаРазбора,":");
Если Найти(СтрокаРазбора,"infobase")>0 Тогда
УИДИБ = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1));
ИначеЕсли Найти(СтрокаРазбора,"name")>0 Тогда
ИмяБазы = СокрЛП(Сред(СтрокаРазбора,ПозицияРазделителя+1));
Если ИмяБазы = мНастройки.ИмяБазыДанных Тогда
Сообщить("Получен УИД базы");
НайденаБазаВКластере = Истина;
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Не НайденаБазаВКластере Тогда
ВызватьИсключение "База "+мНастройки.ИмяБазыДанных +" не найдена в кластере";
КонецЕсли;
Возврат УИДИБ;
КонецФункции
Функция СтрокаЗапускаКлиента()
Возврат ЗапускПриложений.ОбернутьВКавычки(мНастройки.ПутьКлиентаАдминистрирования) + " " +
мНастройки.АдресСервераАдминистрирования + " ";
КонецФункции
Функция ЗапуститьПроцесс(Знач СтрокаВыполнения)
Процесс = СоздатьПроцесс(СтрокаВыполнения,,Истина);
Процесс.Запустить();
Процесс.ОжидатьЗавершения();
Если Процесс.КодВозврата = 0 Тогда
Текст = Процесс.ПотокВывода.Прочитать();
Лог.Отладка(Текст);
Возврат Текст;
Иначе
ВызватьИсключение Процесс.ПотокОшибок.Прочитать();
КонецЕсли;
КонецФункции
/////////////////////////////////////////////////////////////////////////////////
Лог = Логирование.ПолучитьЛог("vanessa.app.deployka");