Skip to content

Commit 1cb33bb

Browse files
authored
Merge pull request #59 from dmpas/feature/mirrors
Fixes #25: Работа с дополнительным хранилищем.
2 parents a34983d + 27a952e commit 1cb33bb

File tree

7 files changed

+159
-20
lines changed

7 files changed

+159
-20
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,7 @@ OneScript Package Manager
1919

2020
Справка из википедии: [Система управления пакетами](https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F_%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%B0%D0%BC%D0%B8)
2121

22+
# Сервера
23+
В настоящее время пакеты хранятся на двух серверах:
24+
- [hub.oscript.io](http://hub.oscript.io/download) - основной хаб пакетов
25+
- [hub.oscript.ru](http://hub.oscript.ru/download) - вторичный хаб пакетов. Используется, когда не удаётся получить данные с основного хаба

src/opm.os

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,11 @@
5151
Возврат Новый ДиспетчерКомандПриложения();
5252
КонецФункции
5353

54+
5455
/////////////////////////////////////////////////////////////////////////
5556
// Точка входа
5657

5758
Лог = Логирование.ПолучитьЛог(Константы.ИмяЛога);
58-
5959
НастройкиПриложения.УстановитьФайлНастроек(ОбъединитьПути(СтартовыйСценарий().Каталог, "opm.cfg"));
60-
ВыполнитьКоманду(АргументыКоманднойСтроки);
60+
61+
ВыполнитьКоманду(АргументыКоманднойСтроки);

src/Классы/Зеркало.os

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
Перем СерверУдаленногоХранилища Экспорт;
2+
Перем ПутьВХранилище Экспорт;
3+
4+
Перем Соединение;
5+
6+
Функция ИнициализироватьСоединение() Экспорт
7+
8+
Если Не Соединение = Неопределено Тогда
9+
Возврат Соединение;
10+
КонецЕсли;
11+
12+
НастройкиПрокси = НастройкиПриложения.Получить().Прокси;
13+
Если НастройкиПрокси.ИспользоватьПрокси Тогда
14+
Прокси = Новый ИнтернетПрокси(НастройкиПрокси.ПроксиПоУмолчанию);
15+
Если НастройкиПрокси.ПроксиПоУмолчанию Тогда
16+
Прокси.Установить("http",НастройкиПрокси.Сервер,НастройкиПрокси.Порт,НастройкиПрокси.Пользователь,НастройкиПрокси.Пароль,НастройкиПрокси.ИспользоватьАутентификациюОС);
17+
КонецЕсли;
18+
Соединение = Новый HTTPСоединение(СерверУдаленногоХранилища,,,,Прокси);
19+
Иначе
20+
Соединение = Новый HTTPСоединение(СерверУдаленногоХранилища);
21+
КонецЕсли;
22+
23+
Возврат Соединение;
24+
25+
КонецФункции
26+
27+
// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище"
28+
// Возвращает HttpОтвет или Неопределено, если запрос вернул исключение.
29+
Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт
30+
31+
Соединение = ИнициализироватьСоединение();
32+
Ресурс = ПутьВХранилище + ИмяРесурса;
33+
Запрос = Новый HTTPЗапрос(Ресурс);
34+
35+
Попытка
36+
37+
Возврат Соединение.Получить(Запрос);
38+
39+
Исключение
40+
41+
Возврат Неопределено;
42+
43+
КонецПопытки;
44+
45+
КонецФункции

src/Классы/КэшПакетовХаба.os

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,10 @@
88
Процедура Обновить() Экспорт
99

1010
УстановкаПакета = Новый Установкапакета();
11-
Сервер = Константы.СерверУдаленногоХранилища;
12-
Соединение = УстановкаПакета.ИнициализироватьСоединение(Сервер);
13-
Ресурс = Константы.ПутьВХранилище + "list.txt";
14-
Запрос = Новый HTTPЗапрос(Ресурс);
15-
Ответ = Соединение.Получить(Запрос);
16-
17-
Если НЕ Ответ.КодСостояния = 200 Тогда
18-
ТекстИсключения = СтрШаблон("Ошибка подключения к хабу <%1>", Ответ.КодСостояния);
19-
Ответ.Закрыть();
11+
Ответ = Зеркала.ПолучитьРесурс("list.txt");
12+
13+
Если Ответ = Неопределено Тогда
14+
ТекстИсключения = СтрШаблон("Ошибка подключения");
2015
ВызватьИсключение ТекстИсключения;
2116
КонецЕсли;
2217

src/Классы/УстановкаПакета.os

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,15 +213,10 @@
213213
ФайлПакета = ИмяПакета + ".ospx";
214214
КонецЕсли;
215215

216-
Сервер = Константы.СерверУдаленногоХранилища;
217-
Ресурс = Константы.ПутьВХранилище + ИмяПакета + "/" + ФайлПакета;
218-
Соединение = ИнициализироватьСоединение(Сервер);
219-
220-
Запрос = Новый HTTPЗапрос(Ресурс);
221216
Лог.Информация("Скачиваю файл: " + ФайлПакета);
222217

223-
Ответ = Соединение.Получить(Запрос);
224-
Если Ответ.КодСостояния = 200 Тогда
218+
Ответ = Зеркала.ПолучитьРесурс(ИмяПакета + "/" + ФайлПакета);
219+
Если Не Ответ = Неопределено Тогда
225220
Лог.Отладка("Файл получен");
226221
ВремФайл = ОбъединитьПути(КаталогВременныхФайлов(), ФайлПакета);
227222
Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ВремФайл);
@@ -235,8 +230,7 @@
235230
ВызватьИсключение;
236231
КонецПопытки;
237232
Иначе
238-
ТекстИсключения = СтрШаблон("Ошибка установки пакета %1 <%2>", ИмяПакета, Ответ.КодСостояния);
239-
Ответ.Закрыть();
233+
ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Нет соединения", ИмяПакета);
240234
ВызватьИсключение ТекстИсключения;
241235
КонецЕсли;
242236

src/Модули/Зеркала.os

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
#Использовать logos
2+
3+
Перем ПодключенноеЗеркало;
4+
Перем Зеркала;
5+
Перем Лог;
6+
7+
// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище"
8+
// Возвращает HttpОтвет или Неопределено, если ни один сервер не вернул ответ.
9+
Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт
10+
11+
РесурсУспешноПолучен = Ложь;
12+
13+
Если ПодключенноеЗеркало = Неопределено Тогда
14+
15+
Если Зеркала = Неопределено Тогда
16+
Инициализация();
17+
КонецЕсли;
18+
19+
Для Каждого мЗеркало Из Зеркала Цикл
20+
21+
Ответ = мЗеркало.ПолучитьРесурс(ИмяРесурса);
22+
Если Ответ = Неопределено Тогда
23+
Продолжить;
24+
КонецЕсли;
25+
26+
Если Ответ.КодСостояния = 200 Тогда
27+
28+
РесурсУспешноПолучен = Истина;
29+
ПодключенноеЗеркало = мЗеркало;
30+
Прервать;
31+
32+
КонецЕсли;
33+
34+
ТекстОшибки = СтрШаблон("Ошибка подключения к хабу %1 <%2>",
35+
мЗеркало.СерверУдаленногоХранилища,
36+
Ответ.КодСостояния);
37+
38+
Ответ.Закрыть();
39+
40+
Лог.Информация(ТекстОшибки);
41+
42+
КонецЦикла;
43+
44+
Иначе
45+
46+
Ответ = ПодключенноеЗеркало.ПолучитьРесурс(ИмяРесурса);
47+
Если Ответ.КодСостояния = 200 Тогда
48+
РесурсУспешноПолучен = Истина;
49+
Иначе
50+
51+
ТекстОшибки = СтрШаблон("Ошибка подключения к хабу %1 <%2>",
52+
ПодключенноеЗеркало.СерверУдаленногоХранилища,
53+
Ответ.КодСостояния);
54+
55+
Ответ.Закрыть();
56+
Лог.Информация(ТекстОшибки);
57+
58+
КонецЕсли;
59+
60+
КонецЕсли;
61+
62+
Если РесурсУспешноПолучен Тогда
63+
64+
ТекстСообщения = СтрШаблон("Ресурс %1 успешно получен с %2", ИмяРесурса, ПодключенноеЗеркало.СерверУдаленногоХранилища);
65+
Лог.Информация(ТекстСообщения);
66+
67+
Возврат Ответ;
68+
69+
КонецЕсли;
70+
71+
Возврат Неопределено;
72+
73+
КонецФункции
74+
75+
Процедура Добавить(Знач Зеркало) Экспорт
76+
Зеркала.Добавить(Зеркало);
77+
КонецПроцедуры
78+
79+
Процедура Инициализация()
80+
81+
Лог = Логирование.ПолучитьЛог("oscript.app.opm");
82+
83+
Зеркала = Новый Массив;
84+
85+
ОсновноеЗеркало = Новый("Зеркало");
86+
ОсновноеЗеркало.СерверУдаленногоХранилища = Константы.СерверУдаленногоХранилища;
87+
ОсновноеЗеркало.ПутьВХранилище = Константы.ПутьВХранилище;
88+
89+
ЗапасноеЗеркало = Новый("Зеркало");
90+
ЗапасноеЗеркало.СерверУдаленногоХранилища = Константы.СерверЗапасногоХранилища;
91+
ЗапасноеЗеркало.ПутьВХранилище = Константы.ПутьВЗапасномХранилище;
92+
93+
Зеркала.Добавить(ОсновноеЗеркало);
94+
Зеркала.Добавить(ЗапасноеЗеркало);
95+
96+
КонецПроцедуры

src/Модули/Константы.os

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
Перем ИмяФайлаМетаданныхПакета Экспорт;
66
Перем СерверУдаленногоХранилища Экспорт;
77
Перем ПутьВХранилище Экспорт;
8+
Перем СерверЗапасногоХранилища Экспорт;
9+
Перем ПутьВЗапасномХранилище Экспорт;
810
Перем ЛокальныйКаталогУстановкиПакетов Экспорт;
911
Перем ИмяЛога Экспорт;
1012
Перем ВерсияПродукта Экспорт;
@@ -17,6 +19,8 @@
1719
ИмяФайлаМетаданныхПакета = "opm-metadata.xml";
1820
СерверУдаленногоХранилища = "http://hub.oscript.io";
1921
ПутьВХранилище = "/download/";
22+
СерверЗапасногоХранилища = "http://hub.oscript.ru";
23+
ПутьВЗапасномХранилище = "/download/";
2024
ЛокальныйКаталогУстановкиПакетов = "oscript_modules";
2125
ИмяЛога = "oscript.app.opm";
2226
ВерсияПродукта = "0.9.4";

0 commit comments

Comments
 (0)