-
Notifications
You must be signed in to change notification settings - Fork 34
Expand file tree
/
Copy pathРаботаСПакетами.os
More file actions
330 lines (230 loc) · 20.7 KB
/
Copy pathРаботаСПакетами.os
File metadata and controls
330 lines (230 loc) · 20.7 KB
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
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
#Использовать fluent
#Использовать fs
#Использовать logos
#Использовать tempfiles
Перем Лог;
Перем ВнутреннийМенеджерПолученияПакетов;
Процедура ОбновитьУстановленныеПакеты(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено, Знач НастройкаУстановки = Неопределено) Экспорт
КэшУстановленныхПакетов = ПолучитьУстановленныеПакеты(РежимУстановки);
УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты();
Для Каждого КлючИЗначение Из УстановленныеПакеты Цикл
ИмяПакета = КлючИЗначение.Ключ;
МенеджерПолучения = ПолучитьМенеджерПолученияПакетов();
Если Не МенеджерПолучения.ПакетДоступен(ИмяПакета) Тогда
Лог.Предупреждение("Ошибка обновления пакета %1: Пакет не найден в хабе", ИмяПакета);
Продолжить;
КонецЕсли;
ОбновитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
КонецЦикла;
КонецПроцедуры
Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) Экспорт
Перем Метаданные;
Лог.Отладка("Чтение метаданных пакета");
Попытка
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(ФайлМетаданных);
Лог.Отладка("XML загружен");
Сериализатор = Новый СериализацияМетаданныхПакета;
Метаданные = Сериализатор.ПрочитатьXML(Чтение);
Чтение.Закрыть();
Исключение
Чтение.Закрыть();
ВызватьИсключение;
КонецПопытки;
Лог.Отладка("Метаданные прочитаны");
Возврат Метаданные;
КонецФункции
Функция ПолучитьМенеджерПолученияПакетов()
Если ВнутреннийМенеджерПолученияПакетов = Неопределено Тогда
ВнутреннийМенеджерПолученияПакетов = Новый МенеджерПолученияПакетов;
КонецЕсли;
Возврат ВнутреннийМенеджерПолученияПакетов;
КонецФункции
Функция ПолучитьУстановленныеПакеты(РежимУстановки)
КаталогУстановкиЗависимостей = ПолучитьКаталогСистемныхБиблиотек();
Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
КаталогУстановкиЗависимостей = ОбъединитьПути(
ТекущийКаталог(),
КонстантыOpm.ЛокальныйКаталогУстановкиПакетов
);
КонецЕсли;
КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей);
Возврат КэшУстановленныхПакетов;
КонецФункции
Функция ПолучитьНастройкуУстановки() Экспорт
Настройка = Новый Структура();
Настройка.Вставить("УстанавливатьЗависимости", Истина);
Настройка.Вставить("УстанавливатьЗависимостиРазработчика", Ложь);
Настройка.Вставить("СоздаватьФайлыЗапуска", Истина);
Настройка.Вставить("ИмяСервера", "");
Возврат Настройка;
КонецФункции
Процедура УстановитьПакетИзОблака(Знач ИмяПакета, Знач РежимУстановки, Знач ЦелевойКаталог, Знач НастройкаУстановки = Неопределено) Экспорт
Лог.Отладка("Устанавливаю пакет <%1> из доступного хаба", ИмяПакета);
ИмяВерсияПакета = РаботаСВерсиями.РазобратьИмяПакета(ИмяПакета);
ЭтоЗависимость = Ложь;
Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
ЭтоЗависимость = Истина;
КонеЦесли;
Если НастройкаУстановки = Неопределено Тогда
НастройкаУстановки = ПолучитьНастройкуУстановки();
КонецЕсли;
МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановки, ЦелевойКаталог, , НастройкаУстановки.ИмяСервера);
МенеджерУстановки.УстанавливатьЗависимости(НастройкаУстановки.УстанавливатьЗависимости);
МенеджерУстановки.СоздаватьФайлыЗапуска(НастройкаУстановки.СоздаватьФайлыЗапуска);
МенеджерУстановки.УстанавливатьЗависимостиРазработчика(НастройкаУстановки.УстанавливатьЗависимостиРазработчика);
МенеджерУстановки.УстановитьПакетПоИмениИВерсии(ИмяВерсияПакета.ИмяПакета, ИмяВерсияПакета.Версия, ЭтоЗависимость);
КонецПроцедуры
Процедура УстановитьПакетИзФайла(Знач ИмяФайлаПакета,
Знач РежимУстановки,
Знач ЦелевойКаталог = Неопределено,
Знач НастройкаУстановки = Неопределено) Экспорт
Если НастройкаУстановки = Неопределено Тогда
НастройкаУстановки = ПолучитьНастройкуУстановки();
КонецЕсли;
МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановки, ЦелевойКаталог, , НастройкаУстановки.ИмяСервера);
МенеджерУстановки.УстанавливатьЗависимости(НастройкаУстановки.УстанавливатьЗависимости);
МенеджерУстановки.УстанавливатьЗависимостиРазработчика(НастройкаУстановки.УстанавливатьЗависимостиРазработчика);
МенеджерУстановки.СоздаватьФайлыЗапуска(НастройкаУстановки.СоздаватьФайлыЗапуска);
МенеджерУстановки.УстановитьПакетИзАрхива(ИмяФайлаПакета);
КонецПроцедуры
Процедура УстановитьВсеПакетыИзОблака(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено,
Знач НастройкаУстановки = Неопределено) Экспорт
МенеджерПолучения = ПолучитьМенеджерПолученияПакетов();
КешПакетов = МенеджерПолучения.ПолучитьДоступныеПакеты();
Для Каждого КлючИЗначение Из КешПакетов Цикл
УстановитьПакетИзОблака(КлючИЗначение.Ключ, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
КонецЦикла;
КонецПроцедуры
Процедура ОбновитьПакетИзОблака(Знач ИмяПакета, Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено, Знач НастройкаУстановки = Неопределено) Экспорт
УстановитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог, НастройкаУстановки);
КонецПроцедуры
Процедура УстановитьПакетыПоОписаниюПакета(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено, Знач НастройкаУстановки = Неопределено) Экспорт
ОписаниеПакета = РаботаСОписаниемПакета.ПрочитатьОписаниеПакета();
РаботаСОписаниемПакета.ПроверитьВерсиюСреды(ОписаниеПакета);
Если НастройкаУстановки = Неопределено Тогда
НастройкаУстановки = ПолучитьНастройкуУстановки();
КонецЕсли;
МенеджерУстановки = Новый МенеджерУстановкиПакетов(РежимУстановки, , , НастройкаУстановки.ИмяСервера);
МенеджерУстановки.УстанавливатьЗависимостиРазработчика(НастройкаУстановки.УстанавливатьЗависимостиРазработчика);
МенеджерУстановки.СоздаватьФайлыЗапуска(НастройкаУстановки.СоздаватьФайлыЗапуска);
МенеджерУстановки.РазрешитьЗависимостиПакета(ОписаниеПакета);
Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(ОписаниеПакета, РежимУстановки);
КонецЕсли;
КонецПроцедуры
Процедура СоздатьКонфигурационныеФайлыОСкрипт(Знач КаталогУстановки, Знач ОписаниеПакета, Знач РежимУстановки) Экспорт
Если РежимУстановки <> РежимУстановкиПакетов.Локально Тогда
Возврат;
КонецЕсли;
КаталогиИсполняемыхФайлов = ПроцессорыКоллекций.ИзКоллекции(ОписаниеПакета.ИсполняемыеФайлы())
.Обработать("Элемент -> Новый Файл(ОбъединитьПути(КаталогУстановки, Элемент.Путь)).Путь", Новый Структура("КаталогУстановки", КаталогУстановки))
.Различные()
.ВМассив();
ШаблонТекстаКонфигурационногоФайла = "lib.additional=%1";
Для Каждого КаталогИсполняемогоФайла Из КаталогиИсполняемыхФайлов Цикл
РазделительПути = "/";
РазницаВКаталогах = ФС.ОтносительныйПуть(КаталогУстановки, КаталогИсполняемогоФайла, РазделительПути);
Директории = СтрРазделить(РазницаВКаталогах, РазделительПути);
ПутьКЛокальнымБиблиотекам = ПроцессорыКоллекций.ИзКоллекции(Директории)
.Обработать("Директория -> ""../""")
.Сократить("Результат, Элемент -> Результат + Элемент", "");
ПутьКЛокальнымБиблиотекам = ПутьКЛокальнымБиблиотекам + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов;
ТекстКонфигурационногоФайла = СтрШаблон(ШаблонТекстаКонфигурационногоФайла, ПутьКЛокальнымБиблиотекам);
ПутьККонфигурационномуФайлу = ОбъединитьПути(КаталогИсполняемогоФайла, "oscript.cfg");
ТекстовыйДокумент = Новый ТекстовыйДокумент;
ТекстовыйДокумент.УстановитьТекст(ТекстКонфигурационногоФайла);
ТекстовыйДокумент.Записать(ПутьККонфигурационномуФайлу, КодировкаТекста.UTF8NoBOM);
КонецЦикла;
КонецПроцедуры
Процедура ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(Знач ОписаниеПакета, Знач РежимУстановки)
КаталогНазначения = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов;
КаталогЗагрузчика = ПолучитьКаталогСистемныхБиблиотек();
ФС.ОбеспечитьКаталог(КаталогНазначения);
СоздатьКонфигурационныеФайлыОСкрипт(ТекущийКаталог(), ОписаниеПакета, РежимУстановки);
ИмяЗагрузчика = "package-loader.os";
ФайлЗагрузчика = ОбъединитьПути(КаталогЗагрузчика, ИмяЗагрузчика);
Если Не ФС.ФайлСуществует(ФайлЗагрузчика) Тогда
Лог.Предупреждение("Не удалось скопировать системный загрузчик в локальный каталог пакетов");
Возврат;
КонецЕсли;
ПутьКНовомуЗагрузчику = ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика);
Если ФС.ФайлСуществует(ПутьКНовомуЗагрузчику) Тогда
Лог.Отладка("Файл загрузчика уже существует.");
Возврат;
КонецЕсли;
КопироватьФайл(ФайлЗагрузчика, ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика));
КонецПроцедуры
Функция ПолучитьПакет(Знач ИмяПакета, Знач ВерсияПакета, ПутьКФайлуПакета = "", ИмяСервера = "") Экспорт
МенеджерПолучения = ПолучитьМенеджерПолученияПакетов();
ПутьКФайлуПакета = МенеджерПолучения.ПолучитьПакет(ИмяПакета, ВерсияПакета, ПутьКФайлуПакета, ИмяСервера);
Возврат ПутьКФайлуПакета;
КонецФункции
Процедура УдалитьПакет(Знач ИмяПакета, Знач РежимУстановки) Экспорт
КэшПакетов = ПолучитьУстановленныеПакеты(РежимУстановки);
УстановленныеПакеты = КэшПакетов.ПолучитьУстановленныеПакеты();
ДанныеПакета = УстановленныеПакеты.Получить(ИмяПакета);
Если ДанныеПакета = Неопределено Тогда
ВызватьИсключение СтрШаблон("Пакет '%1' не установлен", ИмяПакета);
КонецЕсли;
КаталогПакета = ДанныеПакета.КаталогПакета;
// Удалить скрипты запуска, если есть метаданные с исполняемыми файлами
МетаданныеПакета = ДанныеПакета.МетаданныеПакета;
Если ТипЗнч(МетаданныеПакета) <> Тип("Булево") Тогда
УдалитьСкриптыЗапуска(МетаданныеПакета, ИмяПакета, РежимУстановки);
КонецЕсли;
// Удалить каталог пакета
Лог.Отладка("Удаляю каталог пакета: %1", КаталогПакета);
УдалитьФайлы(КаталогПакета);
ОбщегоНазначенияOpm.СообщениеПользователю(Лог, "Пакет удалён: %1", ИмяПакета);
КонецПроцедуры
Процедура УдалитьСкриптыЗапуска(Знач МетаданныеПакета, Знач ИмяПакета, Знач РежимУстановки)
СИ = Новый СистемнаяИнформация();
ЭтоWindows = Найти(НРег(СИ.ВерсияОС), "windows") > 0;
ИсполняемыеФайлы = МетаданныеПакета.ИсполняемыеФайлы();
Если ИсполняемыеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда
КаталогСкриптов = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin");
Иначе
КаталогСкриптов = ?(ЭтоWindows, КаталогПрограммы(), ПолучитьКаталогСкриптовLinux());
Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда
КаталогСкриптов = ПолучитьПеременнуюСреды("OSCRIPTBIN");
КонецЕсли;
КонецЕсли;
Для Каждого ФайлПриложения Из ИсполняемыеФайлы Цикл
ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения);
Если ЭтоWindows Тогда
ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска + ".bat");
Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда
Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту);
УдалитьФайлы(ПутьКСкрипту);
КонецЕсли;
КонецЕсли;
ПутьКСкрипту = ОбъединитьПути(КаталогСкриптов, ИмяСкриптаЗапуска);
Если ФС.ФайлСуществует(ПутьКСкрипту) Тогда
Лог.Отладка("Удаляю скрипт запуска: %1", ПутьКСкрипту);
УдалитьФайлы(ПутьКСкрипту);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьКаталогСкриптовLinux()
ТекстовыйДокумент = Новый ТекстовыйДокумент();
Попытка
ТекстовыйДокумент.Записать("/usr/bin/opm-check-temp.txt");
УдалитьФайлы("/usr/bin/opm-check-temp.txt");
Возврат "/usr/bin";
Исключение
Возврат "/usr/local/bin";
КонецПопытки;
КонецФункции
Функция ПолучитьКаталогСистемныхБиблиотек()
СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system"));
Лог.Отладка("СистемныеБиблиотеки " + СистемныеБиблиотеки);
Если СистемныеБиблиотеки = Неопределено Тогда
ВызватьИсключение "Не определен каталог системных библиотек";
КонецЕсли;
Возврат СистемныеБиблиотеки;
КонецФункции
Лог = Логирование.ПолучитьЛог("oscript.app.opm");