diff --git a/packagedef b/packagedef index 706c709..a527947 100644 --- a/packagedef +++ b/packagedef @@ -22,7 +22,7 @@ КонецПроцедуры -ПутьКСценариюКонстант = ОбъединитьПути(ТекущийСценарий().Каталог, "src", "Модули", "КонстантыOpm.os"); +ПутьКСценариюКонстант = ОбъединитьПути(ТекущийСценарий().Каталог, "src/core", "Модули", "КонстантыOpm.os"); Константы_ЛокальнаяВерсия = ЗагрузитьСценарий(ПутьКСценариюКонстант); Описание.Имя("opm") diff --git a/src/opm.os b/src/cmd/opm.os similarity index 99% rename from src/opm.os rename to src/cmd/opm.os index 426420c..a4758ce 100644 --- a/src/opm.os +++ b/src/cmd/opm.os @@ -13,6 +13,7 @@ /////////////////////////////////////////////////////////////////////// #Использовать cmdline +#Использовать "../core" #Использовать "." Перем Лог; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" similarity index 98% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" rename to "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" index 00df28a..eb683a8 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" +++ "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\227\320\260\320\264\320\260\321\207.os" @@ -1,4 +1,5 @@ #Использовать logos +#Использовать "../../core" Перем Лог; 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\260Opm_App.os" "b/src/cmd/\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\260Opm_App.os" similarity index 100% rename from "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\260Opm_App.os" rename to "src/cmd/\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\260Opm_App.os" 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\260Opm_Build.os" "b/src/cmd/\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\260Opm_Build.os" similarity index 100% rename from "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\260Opm_Build.os" rename to "src/cmd/\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\260Opm_Build.os" 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\260Opm_Config.os" "b/src/cmd/\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\260Opm_Config.os" similarity index 89% rename from "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\260Opm_Config.os" rename to "src/cmd/\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\260Opm_Config.os" index faf38b3..4fdbd2f 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\260Opm_Config.os" +++ "b/src/cmd/\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\260Opm_Config.os" @@ -20,6 +20,10 @@ // ПараметрыКоманды - Соответствие ключей командной строки и их значений // Функция ВыполнитьКоманду(Знач ПараметрыКоманды) Экспорт - НастройкиПриложенияOpm.СохранитьНастройки(ПараметрыКоманды); + + ПараметрыПриложенияOpm.ЗаполнитьНастройкиИзПараметров(ПараметрыКоманды); + ПараметрыПриложенияOpm.СохранитьТекущиеНастройки(); + Возврат 0; + КонецФункции \ No newline at end of file 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\260Opm_Install.os" "b/src/cmd/\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\260Opm_Install.os" similarity index 64% rename from "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\260Opm_Install.os" rename to "src/cmd/\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\260Opm_Install.os" index bc15678..de374a7 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\260Opm_Install.os" +++ "b/src/cmd/\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\260Opm_Install.os" @@ -25,31 +25,32 @@ Процедура УстановитьПакет(Знач ЗначенияПараметров) Экспорт - Установщик = Новый УстановкаПакета; + РежимУстановки = РежимУстановкиПакетов.Глобально; + + Если ЗначенияПараметров["-l"] = Истина Тогда + РежимУстановки = РежимУстановкиПакетов.Локально; + КонецЕсли; - Если ЗначенияПараметров["-l"] Тогда - Если ЗначениеЗаполнено(ЗначенияПараметров["-dest"]) Тогда - Лог = Логирование.ПолучитьЛог(ПараметрыСистемыOpm.ИмяЛогаСистемы()); - Лог.Предупреждение("При локальной установке параметр -dest игнорируется"); - КонецЕсли; - Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); - Иначе - Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Глобально); + ЦелевойКаталог = Неопределено; - Если ЗначениеЗаполнено(ЗначенияПараметров["-dest"]) Тогда - Установщик.УстановитьЦелевойКаталог(ЗначенияПараметров["-dest"]); - КонецЕсли; + Если ЗначениеЗаполнено(ЗначенияПараметров["-dest"]) Тогда + ЦелевойКаталог = ЗначенияПараметров["-dest"]; + КонецЕсли; + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + Лог = Логирование.ПолучитьЛог(ПараметрыСистемыOpm.ИмяЛогаСистемы()); + Лог.Предупреждение("При локальной установке параметр -dest игнорируется"); + ЦелевойКаталог = Неопределено; КонецЕсли; - + Если ЗначенияПараметров["-all"] Тогда - Установщик.УстановитьВсеПакетыИзОблака(); + РаботаСПакетами.УстановитьВсеПакетыИзОблака(РежимУстановки, ЦелевойКаталог); ИначеЕсли ЗначенияПараметров["-f"] = Неопределено И ЗначенияПараметров["ИмяПакета"] = Неопределено Тогда - Установщик.УстановитьПакетыПоОписаниюПакета(); + РаботаСПакетами.УстановитьПакетыПоОписаниюПакета(РежимУстановки, ЦелевойКаталог); ИначеЕсли ЗначенияПараметров["-f"] <> Неопределено Тогда - Установщик.УстановитьПакетИзАрхива(ЗначенияПараметров["-f"]); + РаботаСПакетами.УстановитьПакетИзФайла(ЗначенияПараметров["-f"], РежимУстановки, ЦелевойКаталог); Иначе - Установщик.УстановитьПакетИзОблака(ЗначенияПараметров["ИмяПакета"]); + РаботаСПакетами.УстановитьПакетИзОблака(ЗначенияПараметров["ИмяПакета"], РежимУстановки, ЦелевойКаталог); КонецЕсли; КонецПроцедуры 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\260Opm_List.os" "b/src/cmd/\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\260Opm_List.os" similarity index 93% rename from "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\260Opm_List.os" rename to "src/cmd/\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\260Opm_List.os" index 05f071c..ae04365 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\260Opm_List.os" +++ "b/src/cmd/\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\260Opm_List.os" @@ -29,8 +29,8 @@ Если ЗначенияПараметров["-remote"] Тогда ТекстСообщения = СтрШаблон("Пакеты в хабе:"); - КэшПакетовВХабе = Новый КэшПакетовХаба(); - УстановленныеПакеты = КэшПакетовВХабе.ПолучитьПакетыХаба(); + МенеджерПолучения = Новый МенеджерПолученияПакетов(); + УстановленныеПакеты = МенеджерПолучения.ПолучитьДоступныеПакеты(); Иначе ПутьККаталогуПакетов = ПолучитьЗначениеСистемнойНастройки("lib.system"); 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\260Opm_Prepare.os" "b/src/cmd/\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\260Opm_Prepare.os" similarity index 100% rename from "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\260Opm_Prepare.os" rename to "src/cmd/\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\260Opm_Prepare.os" 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\260Opm_Push.os" "b/src/cmd/\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\260Opm_Push.os" similarity index 100% rename from "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\260Opm_Push.os" rename to "src/cmd/\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\260Opm_Push.os" 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\260Opm_Run.os" "b/src/cmd/\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\260Opm_Run.os" similarity index 100% rename from "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\260Opm_Run.os" rename to "src/cmd/\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\260Opm_Run.os" 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\260Opm_Test.os" "b/src/cmd/\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\260Opm_Test.os" similarity index 100% rename from "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\260Opm_Test.os" rename to "src/cmd/\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\260Opm_Test.os" 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\260Opm_Update.os" "b/src/cmd/\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\260Opm_Update.os" similarity index 68% rename from "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\260Opm_Update.os" rename to "src/cmd/\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\260Opm_Update.os" index 3053bd0..8625aa6 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\260Opm_Update.os" +++ "b/src/cmd/\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\260Opm_Update.os" @@ -7,6 +7,7 @@ Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-all", "Обновить все установленные пакеты"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "-f", "Указать файл из которого нужно установить пакет"); Парсер.ДобавитьПозиционныйПараметрКоманды(ОписаниеКоманды, "ИмяПакета", "Имя пакета в хабе. Чтобы установить конкретную версию, используйте ИмяПакета@ВерсияПакета"); + Парсер.ДобавитьПараметрФлагКоманды(ОписаниеКоманды, "-l", "Обновление пакета в локальном каталоге oscript_modules"); Парсер.ДобавитьКоманду(ОписаниеКоманды); КонецПроцедуры @@ -25,13 +26,18 @@ Процедура ОбновитьПакет(Знач ЗначенияПараметров) Экспорт - Установщик = Новый УстановкаПакета; + РежимУстановки = РежимУстановкиПакетов.Глобально; + + Если ЗначенияПараметров["-l"] = Истина Тогда + РежимУстановки = РежимУстановкиПакетов.Локально; + КонецЕсли; + Если ЗначенияПараметров["-all"] Тогда - Установщик.ОбновитьУстановленныеПакеты(); + РаботаСПакетами.ОбновитьУстановленныеПакеты(РежимУстановки); ИначеЕсли ЗначенияПараметров["-f"] <> Неопределено Тогда - Установщик.УстановитьПакетИзАрхива(ЗначенияПараметров["-f"]); + РаботаСПакетами.УстановитьПакетИзФайла(ЗначенияПараметров["-f"], РежимУстановки); Иначе - Установщик.ОбновитьПакетИзОблака(ЗначенияПараметров["ИмяПакета"]); + РаботаСПакетами.ОбновитьПакетИзОблака(ЗначенияПараметров["ИмяПакета"], РежимУстановки); КонецЕсли; КонецПроцедуры \ No newline at end of file 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\260Opm_Version.os" "b/src/cmd/\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\260Opm_Version.os" similarity index 100% rename from "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\260Opm_Version.os" rename to "src/cmd/\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\260Opm_Version.os" 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\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" "b/src/cmd/\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\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" similarity index 100% rename from "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\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" rename to "src/cmd/\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\241\320\277\321\200\320\260\320\262\320\272\320\260\320\237\320\276\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\320\260\320\274.os" diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os-template" "b/src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os-template" similarity index 100% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os-template" rename to "src/cmd/\320\232\320\273\320\260\321\201\321\201\321\213/\320\250\320\260\320\261\320\273\320\276\320\275\320\232\320\276\320\274\320\260\320\275\320\264\321\213.os-template" diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" "b/src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" rename to "src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\232\320\276\320\274\320\260\320\275\320\264\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" diff --git "a/src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" "b/src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" new file mode 100644 index 0000000..84571db --- /dev/null +++ "b/src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" @@ -0,0 +1,300 @@ + +Перем Лог; + +Процедура НастроитьOpm() Экспорт + + НастройкиOpmИзФайлов = СобратьНастройкиИзФайлов(); + + Если НастройкиOpmИзФайлов.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + НастройкиПроксиЕсть = ПолучитьЗначение(НастройкиOpmИзФайлов,"Прокси", Неопределено); + + Если Не НастройкиПроксиЕсть = Неопределено Тогда + + НастройкиПрокси = НастройкиOpmИзФайлов.Прокси; + + Сервер = ПолучитьЗначение(НастройкиПрокси, "Сервер", ""); + Порт = Число(ПолучитьЗначение(НастройкиПрокси, "Порт", 80)); + Пользователь = ПолучитьЗначение(НастройкиПрокси, "Пользователь", ""); + Пароль = ПолучитьЗначение(НастройкиПрокси, "Пароль", ""); + + НастройкиOpm.УстановитьНастройкиПроксиСервера(Сервер, Порт, Пользователь, Пароль); + + ПроксиПоУмолчанию = ПолучитьЗначение(НастройкиПрокси,"ПроксиПоУмолчанию", Неопределено); + + Если Не ПроксиПоУмолчанию = Неопределено Тогда + + НастройкиOpm.УстановитьСистемныеНастройкиПроксиСервера(ПроксиПоУмолчанию); + + КонецЕсли; + + ИспользованиеПрокси = ПолучитьЗначение(НастройкиПрокси,"ИспользованиеПрокси", Неопределено); + + Если Не ИспользованиеПрокси = Неопределено Тогда + + НастройкиOpm.УстановитьИспользованиеПрокси(ИспользованиеПрокси); + + КонецЕсли; + + КонецЕсли; + + СоздаватьShСкриптЗапуска = ПолучитьЗначение(НастройкиOpmИзФайлов,"СоздаватьShСкриптЗапуска", Неопределено); + + Если Не СоздаватьShСкриптЗапуска = Неопределено Тогда + + НастройкиOpm.УстановитьСозданиеShСкриптЗапуска(СоздаватьShСкриптЗапуска); + + КонецЕсли; + + СервераПакетов = ПолучитьЗначение(НастройкиOpmИзФайлов,"СервераПакетов", Неопределено); + + Если Не СервераПакетов = Неопределено Тогда + Индекс = 1; + + Для каждого ДополнительныйСервер Из СервераПакетов Цикл + + Сервер = ПолучитьЗначение(ДополнительныйСервер, "Сервер", ""); + Порт = Число(ПолучитьЗначение(ДополнительныйСервер, "Порт", 80)); + ПутьНаСервере = ПолучитьЗначение(ДополнительныйСервер, "ПутьНаСервере", "/"); + Имя = ПолучитьЗначение(ДополнительныйСервер, "Имя", СтрШаблон("ДопСервер_%1",Индекс)); + Приоритет = Число(ПолучитьЗначение(ДополнительныйСервер, "Приоритет", 0)); + + Если ПустаяСтрока(Сервер) Тогда + Лог.Отладка("Для дополнительного сервера <%1> не задан адрес", Индекс); + Продолжить; + КонецЕсли; + + НастройкиOpm.ДобавитьСерверПакетов(Имя, Сервер, ПутьНаСервере, Порт, Приоритет); + Индекс = Индекс +1; + + КонецЦикла; + + КонецЕсли; + +КонецПроцедуры + +Функция ПолучитьЗначение(ВходящаяСтруктура, Ключ, ЗначениеПоУмолчанию) + + Перем ЗначениеКлюча; + + Если Не ВходящаяСтруктура.Свойство(Ключ, ЗначениеКлюча) Тогда + + Возврат ЗначениеПоУмолчанию; + + КонецЕсли; + + Если НЕ ЗначениеЗаполнено(ЗначениеКлюча) Тогда + Возврат ЗначениеПоУмолчанию; + КонецЕсли; + + Возврат ЗначениеКлюча; + +КонецФункции + +Процедура ЗаполнитьНастройкиИзПараметров(Знач ПараметрКоманды) Экспорт + + Если НЕ ПараметрКоманды["-proxyusedefault"] = Неопределено Тогда + + НастройкиOpm.УстановитьСистемныеНастройкиПроксиСервера(ПараметрКоманды["-proxyusedefault"]); + + КонецЕсли; + + Если Не ПараметрКоманды["-winCreateBashLauncher"] = Неопределено Тогда + + ЗначениеОпции = Булево(ПараметрКоманды["-winCreateBashLauncher"]); + НастройкиOpm.УстановитьСозданиеShСкриптЗапуска(ЗначениеОпции); + + КонецЕсли; + + ТекущиеНастройки = НастройкиOpm.ПолучитьНастройки(); + НастройкиПрокси = ТекущиеНастройки.НастройкиПрокси; + ПроксиСервер = ?(ПараметрКоманды["-proxyserver"] = Неопределено, НастройкиПрокси.Сервер, ПараметрКоманды["-proxyserver"]); + ПроксиПорт = ?(ПараметрКоманды["-proxyport"] = Неопределено, НастройкиПрокси.Порт, ПараметрКоманды["-proxyport"]); + ПроксиПользователь = ?(ПараметрКоманды["-proxyuser"] = Неопределено, НастройкиПрокси.Пользователь, ПараметрКоманды["-proxyuser"]); + ПроксиПароль = ?(ПараметрКоманды["-proxypass"] = Неопределено, НастройкиПрокси.Пароль, ПараметрКоманды["-proxypass"]); + + НастройкиOpm.УстановитьНастройкиПроксиСервера(ПроксиСервер, ПроксиПорт, ПроксиПользователь, ПроксиПароль); + + ИспользованиеПрокси = ЗначениеЗаполнено(ПроксиСервер) ИЛИ ЗначениеЗаполнено(ПараметрКоманды["-proxyusedefault"]); + НастройкиOpm.УстановитьИспользованиеПрокси(ИспользованиеПрокси); + +КонецПроцедуры + +Процедура СохранитьТекущиеНастройки() Экспорт + + МассивФайлов = СписокФайловНастроек(); + + ТекущиеНастройки = НормализоватьНастройкиДляЗаписи(); + СохранитьНастройки(ТекущиеНастройки, МассивФайлов[0]); + +КонецПроцедуры + + +Функция НормализоватьНастройкиДляЗаписи() + + НастройкиДляЗаписи = Новый Структура; + + ТекущиеНастройки = НастройкиOpm.ПолучитьНастройки(); + + НастройкиДляЗаписи.Вставить("СоздаватьShСкриптЗапуска", ТекущиеНастройки.СоздаватьShСкриптЗапуска); + НастройкиДляЗаписи.Вставить("Прокси", ПолучитьНастройкуПроксиДляЗаписи(ТекущиеНастройки)); + НастройкиДляЗаписи.Вставить("СервераПакетов", ПолучитьСписокСерверовПакетовДляЗаписи(ТекущиеНастройки)); + + Возврат НастройкиДляЗаписи; + +КонецФункции + +Функция ПолучитьНастройкуПроксиДляЗаписи(ТекущиеНастройки) + + СтруктураПрокси = Новый Структура(); + + НастройкиПрокси = ТекущиеНастройки.НастройкиПрокси; + + Для каждого КлючЗначение Из НастройкиПрокси Цикл + СтруктураПрокси.Вставить(КлючЗначение.Ключ, КлючЗначение.Значение); + КонецЦикла; + + СтруктураПрокси.Вставить("ИспользоватьПрокси", ТекущиеНастройки.ИспользоватьПрокси); + СтруктураПрокси.Вставить("ПроксиПоУмолчанию", ТекущиеНастройки.ИспользоватьСистемныйПрокси); + + + Возврат СтруктураПрокси; + +КонецФункции + +Функция ПолучитьСписокСерверовПакетовДляЗаписи(ТекущиеНастройки) + + МассивСерверовПакетов = Новый Массив; + + Для каждого НастройкаСервера Из ТекущиеНастройки.СервераПакетов Цикл + + Если НастройкаСервера.Имя = "ОсновнойСерверПакетов" + Или НастройкаСервера.Имя = "ЗапаснойСерверПакетов" Тогда + Продолжить; + КонецЕсли; + + МассивСерверовПакетов.Добавить(НастройкаСервера); + + КонецЦикла; + + Возврат МассивСерверовПакетов; + +КонецФункции + +Функция СобратьНастройкиИзФайлов() Экспорт + + НастройкиФайла = Новый Структура; + + МассивПутейНастроек = СписокФайловНастроек(); + + Для каждого Элемент из МассивПутейНастроек Цикл + + Лог.Отладка("Чтение файла настроек %1", Элемент); + + Если НЕ Новый Файл(Элемент).Существует() Тогда + Продолжить; + КонецЕсли; + + Попытка + НастройкиФайла = ПрочитатьФайлНастроек(Элемент); + Прервать; + Исключение + Лог.Отладка("Чтение файла настроек %1. Ошибка: %2", Элемент, ОписаниеОшибки()); + + КонецПопытки; + + КонецЦикла; + + Возврат НастройкиФайла; + +КонецФункции + +Функция ПрочитатьФайлНастроек(Знач ПутьФайлаНастроек) + + Если НЕ Новый Файл(ПутьФайлаНастроек).Существует() Тогда + ВызватьИсключение "Файл настроек не найдет"; + КонецЕсли; + + Текст = ПрочитатьФайл(ПутьФайлаНастроек); + + Чтение = Новый ПарсерJSON; + Настройки = Чтение.ПрочитатьJSON(Текст,,,Истина); + + Возврат Настройки; + +КонецФункции + +Функция ПрочитатьФайл(Знач Путь) + + Чтение = Новый ЧтениеТекста(Путь); + Текст = Чтение.Прочитать(); + Чтение.Закрыть(); + + Возврат Текст; + +КонецФункции + +Процедура СохранитьФайл(Знач Текст,Знач Путь) + + Запись = Новый ЗаписьТекста(Путь); + Запись.ЗаписатьСтроку(Текст); + Запись.Закрыть(); + +КонецПроцедуры + +Процедура СохранитьНастройки(Знач Параметры, Знач ПутьФайлаНастроек) Экспорт + + Текст = СформироватьТекстНастроек(Параметры); + СохранитьФайл(Текст, ПутьФайлаНастроек); + +КонецПроцедуры + +Функция СформироватьТекстНастроек(Знач Настройки) + + Json = Новый ПарсерJSON; + ТекстНастроек = Json.ЗаписатьJSON(Настройки); + + Возврат ТекстНастроек; + +КонецФункции + +// Возвращает массив путей, где может находиться файла настроек opm +// Текущий каталог запуска, домашний каталог пользователя, системная настройка, каталог opm (для совместимости). +Функция СписокФайловНастроек() + + ИмяФайл = КонстантыOpm.ИмяФайлаНастроек; + МассивФайлов = Новый Массив; + //Текущий каталог + МассивФайлов.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайл)); + //Настройки в профиле пользователя. + ПутьКНастройкам = ""; + СИ = Новый СистемнаяИнформация(); + Если Найти(Нрег(СИ.ВерсияОС), Нрег("Windows")) > 0 Тогда + ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("USERPROFILE")), ИмяФайл); + ПутьКНастройкамСистемный = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("ALLUSERSPROFILE")), ИмяФайл); + Иначе + ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("HOME")), "."+ИмяФайл); + ПутьКНастройкамСистемный = ОбъединитьПути("/etc", ИмяФайл); + КонецЕсли; + + МассивФайлов.Добавить(ПутьКНастройкам); + МассивФайлов.Добавить(ПутьКНастройкамСистемный); + + //Совместимость со старым поведением + МассивФайлов.Добавить(ОбъединитьПути(СтартовыйСценарий().Каталог, ИмяФайл)); + + Возврат МассивФайлов; + +КонецФункции + +Процедура Инициализация() + + НастроитьOpm(); + +КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); + +Инициализация(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213Opm.os" "b/src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213Opm.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213Opm.os" rename to "src/cmd/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213Opm.os" diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" similarity index 100% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" rename to "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\273\320\265\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\321\217\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\321\217\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..eb5bcd8 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\237\320\276\320\273\321\203\321\207\320\265\320\275\320\270\321\217\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,200 @@ +Перем Лог; + +Перем ИндексДоступныхПакетов; +Перем ИндексКешаПакетов; +Перем ИндексСерверовПакетов; + +Процедура ПриСозданииОбъекта() + + Инициализировать(); + +КонецПроцедуры + +Функция ПолучитьПакет(Знач ИмяПакета, Знач ВерсияПакета, ПутьКФайлуПакета = "") Экспорт + + Если Не ПакетДоступен(ИмяПакета) Тогда + + ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Пакет не найден", ИмяПакета); + ВызватьИсключение ТекстИсключения; + + КонецЕсли; + + ИмяПакета = НРег(ИмяПакета); + + Если ВерсияПакета <> Неопределено Тогда + ФайлПакета = ИмяПакета + "-" + ВерсияПакета + ".ospx"; + Иначе + ФайлПакета = ИмяПакета + ".ospx"; + КонецЕсли; + + Лог.Информация("Скачиваю файл: " + ФайлПакета); + + Если ПустаяСтрока(ПутьКФайлуПакета) Тогда + ПутьКФайлуПакета = ВременныеФайлы.НовоеИмяФайла("ospx"); + КонецЕсли; + + ИмяРесурса = ИмяПакета + "/" + ФайлПакета; + + ПереченьСерверов = ИндексКешаПакетов[ИмяПакета]; + + Ответ = ЗапроситьПакет(ПереченьСерверов, ИмяРесурса); + + Если Не Ответ = Неопределено Тогда + Лог.Отладка("Файл получен"); + Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьКФайлуПакета); + Ответ.Закрыть(); + Лог.Отладка("Соединение закрыто"); + Иначе + ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Нет соединения", ИмяПакета); + ВызватьИсключение ТекстИсключения; + КонецЕсли; + + Возврат ПутьКФайлуПакета; + +КонецФункции + +Функция ЗапроситьПакет(Знач ПереченьСерверов, Знач ИмяРесурса) + + ПакетУспешноПолучен = Ложь; + + Для каждого ДоступныйСервер Из ПереченьСерверов Цикл + + Сервер = ИндексСерверовПакетов[ДоступныйСервер.Ключ]; + + Если Сервер.СерверДоступен() Тогда + + Ответ = Сервер.ПолучитьРесурс(ИмяРесурса); + Если Ответ = Неопределено Тогда + Продолжить; + КонецЕсли; + + Если Ответ.КодСостояния = 200 Тогда + + ПакетУспешноПолучен = Истина; + Прервать; + + КонецЕсли; + + Ответ.Закрыть(); + + Лог.Информация("Ошибка подключения к хабу %1 <%2>", + Сервер.ПолучитьИмя(), + Ответ.КодСостояния); + + КонецЕсли; + + КонецЦикла; + + Если ПакетУспешноПолучен Тогда + + Лог.Отладка("Ресурс %1 успешно получен с %2", ИмяРесурса, Сервер.ПолучитьИмя()); + + Возврат Ответ; + + КонецЕсли; + + Возврат Неопределено; + +КонецФункции + +Процедура Инициализировать() + + Лог.Отладка("Менеджер получения пакетов инициализация - НАЧАЛО"); + ОбновитьИндексСерверовПакетов(); + ОбновитьИндексКешаПакетов(); + ОбновитьИндексДоступныхПакетов(); + Лог.Отладка("Менеджер получения пакетов инициализация - ЗАВЕРШЕНО"); + +КонецПроцедуры + +Функция ПолучитьДоступныеПакеты() Экспорт + + Возврат ИндексДоступныхПакетов; // По хорошему надо копировать соответствие + +КонецФункции + +Функция ПакетДоступен(Знач ИмяПакета) Экспорт + + Лог.Отладка("Ищю пакет <%1> в кеше доступных пакетов", ИмяПакета); + + Возврат ИндексДоступныхПакетов[нрег(ИмяПакета)] = Истина; + +КонецФункции + +Процедура ОбновитьИндексСерверовПакетов() Экспорт + + ИндексСерверовПакетов = Новый Соответствие; + + Настройки = НастройкиOpm.ПолучитьНастройки(); + СервераПакетов = Настройки.СервераПакетов; + + Для каждого НастройкаСервера Из СервераПакетов Цикл + + СерверПакетов = СоздатьСерверПакетовПоНастройке(НастройкаСервера); + ИндексСерверовПакетов.Вставить(НастройкаСервера.Имя, СерверПакетов); + + КонецЦикла; + +КонецПроцедуры + +Функция СоздатьСерверПакетовПоНастройке(Знач НастройкаСервера) + + Возврат Новый СерверПакетов(НастройкаСервера.Имя, НастройкаСервера.Сервер, НастройкаСервера.ПутьНаСервере, НастройкаСервера.Порт, НастройкаСервера.Приоритет) + +КонецФункции + +Процедура ОбновитьИндексДоступныхПакетов() Экспорт + + // Учесть версии пакетов + ИндексДоступныхПакетов = Новый Соответствие; + + Лог.Отладка("Обновляю кеш доступных пакетов"); + + Для каждого ПакетКеша Из ИндексКешаПакетов Цикл + + ИндексДоступныхПакетов.Вставить(ПакетКеша.Ключ, Истина); + + КонецЦикла; + + Лог.Отладка("Кеш доступных пакетов - ОБНОВЛЕН"); + +КонецПроцедуры + +Процедура ОбновитьИндексКешаПакетов() Экспорт + + ИндексКешаПакетов = Новый Соответствие; + + Для каждого СерверПакетов Из ИндексСерверовПакетов Цикл + + ИмяСервера = СерверПакетов.Ключ; + КлассСервера = СерверПакетов.Значение; + + Пакеты = КлассСервера.ПолучитьПакеты(); + + Лог.Отладка("Добавляю в кеш пакеты <%2> сервера: %1", ИмяСервера, Пакеты.Количество()); + + ДобавитьПакетыВИндексКеша(Пакеты, ИмяСервера); + + КонецЦикла; + +КонецПроцедуры + +Процедура ДобавитьПакетыВИндексКеша(Знач ПакетыСервера, Знач ИмяСервера) + + Для каждого Пакет Из ПакетыСервера Цикл + + КлючПакета = Пакет.Ключ; + ВерсииПакета = Пакет.Значение; + + Лог.Отладка("Добавляю пакет: %1 в кеш для сервера %2", КлючПакета, ИмяСервера); + Если ИндексКешаПакетов[КлючПакета] = Неопределено Тогда + ИндексКешаПакетов.Вставить(КлючПакета, Новый Соответствие); + КонецЕсли; + + ИндексКешаПакетов[КлючПакета].Вставить(ИмяСервера, ВерсииПакета) + + КонецЦикла; + +КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); \ No newline at end of file diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..f516683 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,181 @@ +#Использовать fluent +#Использовать fs +#Использовать logos +#Использовать tempfiles + +Перем Лог; +Перем мВременныйКаталогУстановки; + + +Перем ТекущийРежимУстановкиПакетов; +Перем КэшУстановленныхПакетов; +Перем ЦелевойКаталогУстановки; +Перем КаталогУстановкиЗависимостей; +Перем КаталогСистемныхБиблиотек; +Перем КешУстановленныхПакетов; + +Процедура ПриСозданииОбъекта(Знач ВходящийРежимУстановкиПакетов = Неопределено, Знач ВходящийКаталогУстановки = Неопределено, Знач ВходящийКаталогУстановкиЗависимостей = Неопределено) + + КаталогСистемныхБиблиотек = ПолучитьКаталогСистемныхБиблиотек(); + + Если Не ВходящийКаталогУстановки = Неопределено Тогда + УстановитьЦелевойКаталог(ВходящийКаталогУстановки); + Иначе + УстановитьЦелевойКаталог(КаталогСистемныхБиблиотек); + КонецЕсли; + + Если Не ВходящийРежимУстановкиПакетов = Неопределено Тогда + УстановитьРежимУстановкиПакетов(ВходящийРежимУстановкиПакетов); + Иначе + УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Глобально); + КонецЕсли; + + Если Не ВходящийКаталогУстановкиЗависимостей = Неопределено Тогда + УстановитьКаталогЗависимостей(ВходящийКаталогУстановкиЗависимостей); + Иначе + Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда + ПутьККаталогуЛокальнойУстановки = ОбъединитьПути( + ТекущийКаталог(), + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов + ); + УстановитьКаталогЗависимостей(ПутьККаталогуЛокальнойУстановки); + Иначе + УстановитьКаталогЗависимостей(КаталогСистемныхБиблиотек); + КонецЕсли; + КонецЕсли; + + КешУстановленныхПакетов = Новый Соответствие; + + + +КонецПроцедуры + +Процедура УстановитьРежимУстановкиПакетов(Знач ЗначениеРежимУстановкиПакетов) Экспорт + + ТекущийРежимУстановкиПакетов = ЗначениеРежимУстановкиПакетов; + + Если ТекущийРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда + ПутьККаталогуЛокальнойУстановки = ОбъединитьПути( + ТекущийКаталог(), + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов + ); + Если КаталогУстановкиЗависимостей = КаталогСистемныхБиблиотек Тогда + УстановитьКаталогЗависимостей(ПутьККаталогуЛокальнойУстановки); + КонецЕсли; + + Иначе + УстановитьКаталогЗависимостей(КаталогСистемныхБиблиотек); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьЦелевойКаталог(Знач ЗначениеЦелевойКаталогУстановки) Экспорт + Лог.Отладка("Каталог установки пакета '%1'", ЗначениеЦелевойКаталогУстановки); + ФС.ОбеспечитьКаталог(ЗначениеЦелевойКаталогУстановки); + ЦелевойКаталогУстановки = ЗначениеЦелевойКаталогУстановки; +КонецПроцедуры + +Процедура УстановитьКаталогЗависимостей(Знач ВыходящийКаталог) Экспорт + + КаталогУстановкиЗависимостей = ВыходящийКаталог; + +КонецПроцедуры + +Процедура УстановитьПакет(Знач ИмяПакета) Экспорт + + ИмяВерсияПакета = РаботаСВерсиями.РазобратьИмяПакета(ИмяПакета); + + УстановитьПакетПоИмениИВерсии(ИмяВерсияПакета.ИмяПакета, ИмяВерсияПакета.Версия); + +КонецПроцедуры + +Процедура УстановитьПакетПоОписанию(Знач ОписаниеПакета) Экспорт + + УстановитьПакетПоИмениИВерсии(ОписаниеПакета.ИмяПакета, ОписаниеПакета.МинимальнаяВерсия, Истина); + +КонецПроцедуры + +Процедура УстановитьПакетИзАрхива(Знач ФайлПакета, Знач ЭтоЗависимыйПакет = Ложь) Экспорт + + КаталогУстановки = ?(ЭтоЗависимыйПакет, КаталогУстановкиЗависимостей, ЦелевойКаталогУстановки); + + УстановкаПакета = Новый УстановкаПакета(); + УстановкаПакета.УстановитьЦелевойКаталог(КаталогУстановки); + Лог.Отладка("КаталогУстановки: %1", КаталогУстановки); + Если ЭтоЗависимыйПакет Тогда + УстановкаПакета.УстановитьКешПакетов(КешУстановленныхПакетов); + КонецЕсли; + Лог.Отладка("ТекущийРежимУстановкиПакетов: %1", ТекущийРежимУстановкиПакетов); + УстановкаПакета.УстановитьРежимУстановкиПакета(ТекущийРежимУстановкиПакетов); + + Попытка + УстановкаПакета.УстановитьПакетИзАрхива(ФайлПакета); + Исключение + ВызватьИсключение ОписаниеОшибки(); + КонецПопытки; + + МанифестПакета = УстановкаПакета.ПолучитьМанифестПакета(); + + // Тут надо корректно найти имя пакета в пути + Если НЕ ФС.КаталогСуществует(ОбъединитьПути(Новый Файл(КаталогУстановки).ПолноеИмя, КонстантыOpm.ЛокальныйКаталогУстановкиПакетов)) Тогда + РазрешитьЗависимостиПакета(МанифестПакета); + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьПакетПоИмениИВерсии(Знач ИмяПакета, Знач ВерсияПакета, ЗНач ЭтоЗависимыйПакет = Ложь) Экспорт + + ФайлПакета = РаботаСПакетами.ПолучитьПакет(ИмяПакета, ВерсияПакета); + + УстановитьПакетИзАрхива(ФайлПакета, ЭтоЗависимыйПакет); + +КонецПроцедуры + +Процедура РазрешитьЗависимостиПакета(Знач Манифест) Экспорт + + Зависимости = Манифест.Зависимости(); + Если Зависимости.Количество() = 0 Тогда + Возврат; + КонецЕсли; + + УстановленныеПакеты = ПолучитьУстановленныеПакеты(); + + Для Каждого Зависимость Из Зависимости Цикл + Лог.Информация("Устанавливаю зависимость: " + Зависимость.ИмяПакета); + + Если Не УстановленныеПакеты.ПакетУстановлен(Зависимость, КаталогУстановкиЗависимостей) Тогда + // скачать + // определить зависимости и так по кругу + УстановитьПакетПоОписанию(Зависимость); + УстановленныеПакеты.Обновить(); + Иначе + Лог.Информация("" + Зависимость.ИмяПакета + " уже установлен. Пропускаем."); + // считаем, что версия всегда подходит + КонецЕсли; + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьУстановленныеПакеты() + + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); + + Возврат КэшУстановленныхПакетов; + +КонецФункции + +Функция ПолучитьКаталогСистемныхБиблиотек() + + СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + Лог.Отладка("СистемныеБиблиотеки %1", СистемныеБиблиотеки); + Если СистемныеБиблиотеки = Неопределено Тогда + ВызватьИсключение "Не определен каталог системных библиотек"; + КонецЕсли; + + Возврат СистемныеБиблиотеки; + +КонецФункции + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); +//Лог.УстановитьУровень(УровниЛога.Отладка); \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os" similarity index 100% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os" rename to "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\237\320\260\320\272\320\265\321\202\320\260.os" diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" similarity index 100% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" rename to "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\261\320\276\321\200\321\211\320\270\320\272\320\237\320\260\320\272\320\265\321\202\320\260.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" new file mode 100644 index 0000000..efe7ef5 --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\262\320\265\321\200\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -0,0 +1,126 @@ +Перем Лог; + +Перем Имя; +Перем Сервер; +Перем ПутьНаСервере; +Перем Порт; +Перем Приоритет; +Перем Соединение; + +Перем ПакетыХаба; + +Процедура ПриСозданииОбъекта(Знач ИмяСервера, Знач АдресСервер, Знач ВходящийПутьНаСервере = "", Знач ВходящийПорт = 80, Знач ВходящийПриоритет = 0 ) + + Имя = ИмяСервера; + Сервер = АдресСервер; + ПутьНаСервере = ВходящийПутьНаСервере; + Порт = ВходящийПорт; + Приоритет = ВходящийПриоритет; + +КонецПроцедуры + +Функция ПолучитьИмя() Экспорт + Возврат Имя; +КонецФункции + +Функция СерверДоступен() Экспорт + Возврат Не Соединение = Неопределено; +КонецФункции + +Функция ИнициализироватьСоединение() + + Если Не Соединение = Неопределено Тогда + Возврат Соединение; + КонецЕсли; + + Порт = ?(Порт = Неопределено, 80, Порт); + Настройки = НастройкиOpm.ПолучитьНастройки(); + Если Настройки.ИспользоватьПрокси Тогда + Соединение = Новый HTTPСоединение(Сервер, Порт,,, НастройкиOpm.ПолучитьИнтернетПрокси()); + Иначе + Соединение = Новый HTTPСоединение(Сервер, Порт); + КонецЕсли; + + Возврат Соединение; + +КонецФункции + +// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище" +// Возвращает HttpОтвет или Неопределено, если запрос вернул исключение. +Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт + + Соединение = ИнициализироватьСоединение(); + Ресурс = ПутьНаСервере + ИмяРесурса; + Запрос = Новый HTTPЗапрос(Ресурс); + + Попытка + + Возврат Соединение.Получить(Запрос); + + Исключение + + Возврат Неопределено; + + КонецПопытки; + +КонецФункции + +Функция ПрочитатьФайлСпискаПакетов(Текст) + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.УстановитьТекст(Текст); + КоличествоПакетовВХабе = ТекстовыйДокумент.КоличествоСтрок(); + Для НомерСтроки = 1 По КоличествоПакетовВХабе Цикл + ИмяПакета = СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки)); + + Если ПустаяСтрока(ИмяПакета) Тогда + Продолжить; + КонецЕсли; + + Если ПакетыХаба[ИмяПакета] = Неопределено Тогда + ПакетыХаба.Вставить(ИмяПакета, Новый Массив); + КонецЕсли; + ПакетыХаба[ИмяПакета] = ""; // Тут должна быть строка версий + КонецЦикла; + +КонецФункции + +Функция ПолучитьСписокПакетов(Ресурс) + + Ответ = ПолучитьРесурс(Ресурс); + + Если Ответ = Неопределено Или Ответ.КодСостояния <> 200 Тогда + ТекстИсключения = СтрШаблон("Ошибка подключения к зеркалу "); + ВызватьИсключение ТекстИсключения; + КонецЕсли; + + ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); + Ответ.Закрыть(); + + Возврат ТекстОтвета; + +КонецФункции + +Функция ПолучитьПакеты() Экспорт + + ПакетыХаба = Новый Соответствие; + + ТекстОтвета = ""; + + Попытка + ТекстОтвета = ПолучитьСписокПакетов("list.txt"); + Исключение + Лог.Предупреждение( + СтрШаблон("Ошбика получения списка пакетов с хаба %1 по причине %2", + Имя, ОписаниеОшибки() + ) + ); + КонецПопытки; + + ПрочитатьФайлСпискаПакетов(ТекстОтвета); + + Возврат ПакетыХаба; + +КонецФункции + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\260.os" similarity index 100% rename from "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\260.os" rename to "src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\241\320\265\321\200\320\270\320\260\320\273\320\270\320\267\320\260\321\206\320\270\321\217\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205\320\237\320\260\320\272\320\265\321\202\320\260.os" diff --git "a/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" new file mode 100644 index 0000000..f2bf13b --- /dev/null +++ "b/src/core/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" @@ -0,0 +1,318 @@ +#Использовать fluent +#Использовать fs +#Использовать logos +#Использовать tempfiles + +Перем Лог; +Перем мВременныйКаталогУстановки; +Перем мЗависимостиВРаботе; +Перем ЭтоWindows; +Перем мРежимУстановкиПакетов; + +Перем мЦелевойКаталог; +Перем Метаданные; + +Процедура УстановитьПакетИзАрхива(Знач ФайлАрхива) Экспорт + + Лог.Отладка("Устанавливаю пакет из архива: " + ФайлАрхива); + Если мЗависимостиВРаботе = Неопределено Тогда + мЗависимостиВРаботе = Новый Соответствие; + КонецЕсли; + + мВременныйКаталогУстановки = ВременныеФайлы.СоздатьКаталог(); + Лог.Отладка("Временный каталог установки: " + мВременныйКаталогУстановки); + + Попытка + + Лог.Отладка("Открываем архив пакета"); + ЧтениеПакета = Новый ЧтениеZipФайла; + ЧтениеПакета.Открыть(ФайлАрхива); + + ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета); + ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета); + + Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); + ИмяПакета = Метаданные.Свойства().Имя; + + ПутьУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); + + Лог.Информация("Устанавливаю пакет " + ИмяПакета); + ПроверитьВерсиюСреды(Метаданные); + Если мЗависимостиВРаботе[ИмяПакета] = "ВРаботе" Тогда + ВызватьИсключение "Циклическая зависимость по пакету " + ИмяПакета; + КонецЕсли; + + мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе"); + + СтандартнаяОбработка = Истина; + УстановитьФайлыПакета(ПутьУстановки, ФайлСодержимого, СтандартнаяОбработка); + Если СтандартнаяОбработка Тогда + СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки.ПолноеИмя, Метаданные); + РаботаСПакетами.СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки.ПолноеИмя, Метаданные, мРежимУстановкиПакетов); + КонецЕсли; + СохранитьФайлМетаданныхПакета(ПутьУстановки.ПолноеИмя, ФайлМетаданных); + + ЧтениеПакета.Закрыть(); + + ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); + + мЗависимостиВРаботе.Вставить(ИмяПакета, "Установлен"); + + Исключение + УдалитьКаталогУстановкиПриОшибке(ПутьУстановки); + ЧтениеПакета.Закрыть(); + ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); + ВызватьИсключение; + КонецПопытки; + + Лог.Информация("Установка завершена"); + +КонецПроцедуры + +Процедура УстановитьКешПакетов(КэшПакетовВУстановке) Экспорт + мЗависимостиВРаботе = КэшПакетовВУстановке; +КонецПроцедуры + +Функция ПолучитьМанифестПакета() Экспорт + Возврат Метаданные; +КонецФункции + +Процедура УстановитьРежимУстановкиПакета(Знач ЗначениеРежимУстановкиПакетов) Экспорт + мРежимУстановкиПакетов = ЗначениеРежимУстановкиПакетов; +КонецПроцедуры + +Процедура ПроверитьВерсиюСреды(Манифест) + + Свойства = Манифест.Свойства(); + Если НЕ Свойства.Свойство("ВерсияСреды") Тогда + Возврат; + КонецЕсли; + + ИмяПакета = Свойства.Имя; + ТребуемаяВерсияСреды = Свойства.ВерсияСреды; + СистемнаяИнформация = Новый СистемнаяИнформация; + ВерсияСреды = СистемнаяИнформация.Версия; + Лог.Отладка("ПроверитьВерсиюСреды: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", ТребуемаяВерсияСреды, ВерсияСреды); + Если РаботаСВерсиями.СравнитьВерсии(ТребуемаяВерсияСреды, ВерсияСреды) > 0 Тогда + ТекстСообщения = СтрШаблон( + "Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript. + |Требуемая версия: %2 + |Текущая версия: %3 + |Обновите OneScript перед установкой пакета", + ИмяПакета, + ТребуемаяВерсияСреды, + ВерсияСреды + ); + + ВызватьИсключение ТекстСообщения; + КонецЕсли; + +КонецПроцедуры + +Процедура УстановитьЦелевойКаталог(Знач ЦелевойКаталогУстановки) Экспорт + Лог.Отладка("Каталог установки пакета '%1'", ЦелевойКаталогУстановки); + ФС.ОбеспечитьКаталог(ЦелевойКаталогУстановки); + мЦелевойКаталог = ЦелевойКаталогУстановки; +КонецПроцедуры + +Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета) + + ПутьУстановки = Новый Файл(ОбъединитьПути(мЦелевойКаталог, ИдентификаторПакета)); + Лог.Отладка("Путь установки пакета: " + ПутьУстановки.ПолноеИмя); + + Если Не ПутьУстановки.Существует() Тогда + СоздатьКаталог(ПутьУстановки.ПолноеИмя); + ИначеЕсли ПутьУстановки.ЭтоФайл() Тогда + ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки.ПолноеИмя; + КонецЕсли; + + Возврат ПутьУстановки; + +КонецФункции + +Процедура УстановитьФайлыПакета(Знач ПутьУстановки, Знач ФайлСодержимого, СтандартнаяОбработка) + + ЧтениеСодержимого = Новый ЧтениеZipФайла(ФайлСодержимого); + Попытка + + Лог.Отладка("Устанавливаю файлы пакета из архива"); + УдалитьУстаревшиеФайлы(ПутьУстановки); + ЧтениеСодержимого.ИзвлечьВсе(ПутьУстановки.ПолноеИмя); + + ОбработчикСобытий = ПолучитьОбработчикСобытий(ПутьУстановки.ПолноеИмя); + ВызватьСобытиеПриУстановке(ОбработчикСобытий, ПутьУстановки.ПолноеИмя, СтандартнаяОбработка); + + Исключение + ЧтениеСодержимого.Закрыть(); + ВызватьИсключение; + КонецПопытки; + + ЧтениеСодержимого.Закрыть(); + +КонецПроцедуры + +Процедура УдалитьУстаревшиеФайлы(Знач ПутьУстановки) + УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.os", Истина); + УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.dll", Истина); +КонецПроцедуры + +Процедура УдалитьФайлыВКаталоге(Знач ПутьКаталога, Знач МаскаФайлов, Знач ИскатьВПодкаталогах = Истина) + ФайлыДляУдаления = НайтиФайлы(ПутьКаталога, МаскаФайлов, ИскатьВПодкаталогах); + Для Каждого Файл из ФайлыДляУдаления Цикл + УдалитьФайлы(Файл.ПолноеИмя); + КонецЦикла; +КонецПроцедуры + +Функция ПолучитьОбработчикСобытий(Знач ПутьУстановки) + ОбработчикСобытий = Неопределено; + ИмяФайлаСпецификацииПакета = КонстантыOpm.ИмяФайлаСпецификацииПакета; + ПутьКФайлуСпецификации = ОбъединитьПути(ПутьУстановки, ИмяФайлаСпецификацииПакета); + Если ФС.ФайлСуществует(ПутьКФайлуСпецификации) Тогда + Лог.Отладка("Найден файл спецификации пакета"); + Лог.Отладка("Компиляция файла спецификации пакета"); + + ОписаниеПакета = Новый ОписаниеПакета(); + ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета); + ОбработчикСобытий = ЗагрузитьСценарий(ПутьКФайлуСпецификации, ВнешнийКонтекст); + КонецЕсли; + + Возврат ОбработчикСобытий; +КонецФункции + +Процедура ВызватьСобытиеПриУстановке(Знач ОбработчикСобытий, Знач Каталог, СтандартнаяОбработка) + + Если ОбработчикСобытий = Неопределено Тогда + Возврат; + КонецЕсли; + + Рефлектор = Новый Рефлектор; + Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПриУстановке") Тогда + Лог.Отладка("Вызываю событие ПриУстановке"); + ОбработчикСобытий.ПриУстановке(Каталог, СтандартнаяОбработка); + КонецЕсли; + +КонецПроцедуры + +Процедура СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(Знач КаталогУстановки, Знач ОписаниеПакета) + + ИмяПакета = ОписаниеПакета.Свойства().Имя; + + Для Каждого ФайлПриложения Из ОписаниеПакета.ИсполняемыеФайлы() Цикл + + ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); + Лог.Информация("Регистрация приложения: " + ИмяСкриптаЗапуска); + + ОбъектФайл = Новый Файл(ОбъединитьПути(КаталогУстановки, ФайлПриложения.Путь)); + + Если Не ОбъектФайл.Существует() Тогда + Лог.Ошибка("Файл приложения " + ОбъектФайл.ПолноеИмя + " не существует"); + ВызватьИсключение "Некорректные данные в метаданных пакета"; + КонецЕсли; + + Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда + КаталогУстановкиСкриптовЗапускаПриложений = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); + ФС.ОбеспечитьКаталог(КаталогУстановкиСкриптовЗапускаПриложений); + КаталогУстановкиСкриптовЗапускаПриложений = Новый Файл(КаталогУстановкиСкриптовЗапускаПриложений).ПолноеИмя; + ИначеЕсли мРежимУстановкиПакетов = РежимУстановкиПакетов.Глобально Тогда + КаталогУстановкиСкриптовЗапускаПриложений = ?(ЭтоWindows, КаталогПрограммы(), "/usr/bin"); + Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда + КаталогУстановкиСкриптовЗапускаПриложений = ПолучитьПеременнуюСреды("OSCRIPTBIN"); + КонецЕсли; + Иначе + ВызватьИсключение "Неизвестный режим установки пакетов <" + мРежимУстановкиПакетов + ">"; + КонецЕсли; + + СоздатьСкриптЗапуска(ИмяСкриптаЗапуска, ОбъектФайл.ПолноеИмя, КаталогУстановкиСкриптовЗапускаПриложений); + + КонецЦикла; + +КонецПроцедуры + +Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт + + Если ЭтоWindows Тогда + ФайлЗапуска = Новый ЗаписьТекста(ОбъединитьПути(Каталог, ИмяСкриптаЗапуска + ".bat"), "cp866"); + ФайлЗапуска.ЗаписатьСтроку("@oscript.exe """ + ПутьФайлаПриложения + """ %*"); + ФайлЗапуска.ЗаписатьСтроку("@exit /b %ERRORLEVEL%"); + ФайлЗапуска.Закрыть(); + КонецЕсли; + + Если (ЭтоWindows И НастройкиOpm.ПолучитьНастройки().СоздаватьShСкриптЗапуска) ИЛИ НЕ ЭтоWindows Тогда + ПолныйПутьКСкриптуЗапуска = ОбъединитьПути(Каталог, ИмяСкриптаЗапуска); + ФайлЗапуска = Новый ЗаписьТекста(ПолныйПутьКСкриптуЗапуска, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); + ФайлЗапуска.ЗаписатьСтроку("#!/bin/bash"); + СтрокаЗапуска = "oscript"; + Если ЭтоWindows Тогда + СтрокаЗапуска = СтрокаЗапуска + " -encoding=utf-8"; + КонецЕсли; + СтрокаЗапуска = СтрокаЗапуска + " """ + ПутьФайлаПриложения + """ ""$@"""; + ФайлЗапуска.ЗаписатьСтроку(СтрокаЗапуска); + ФайлЗапуска.Закрыть(); + + Если НЕ ЭтоWindows Тогда + ЗапуститьПриложение("chmod +x """ + ПолныйПутьКСкриптуЗапуска + """"); + КонецЕсли; + КонецЕсли; + +КонецПроцедуры + +Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) + + Перем Метаданные; + Лог.Отладка("Чтение метаданных пакета"); + Попытка + Чтение = Новый ЧтениеXML; + Чтение.ОткрытьФайл(ФайлМетаданных); + Лог.Отладка("XML загружен"); + Сериализатор = Новый СериализацияМетаданныхПакета; + Метаданные = Сериализатор.ПрочитатьXML(Чтение); + + Чтение.Закрыть(); + Исключение + Чтение.Закрыть(); + ВызватьИсключение; + КонецПопытки; + Лог.Отладка("Метаданные прочитаны"); + + Возврат Метаданные; + +КонецФункции + +Процедура СохранитьФайлМетаданныхПакета(Знач КаталогУстановки, Знач ПутьКФайлуМетаданных) + + ПутьСохранения = ОбъединитьПути(КаталогУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); + ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуМетаданных); + ДанныеФайла.Записать(ПутьСохранения); + +КонецПроцедуры + +Процедура УдалитьКаталогУстановкиПриОшибке(Знач Каталог) + Лог.Отладка("Удаляю каталог " + Каталог); + Попытка + УдалитьФайлы(Каталог); + Исключение + Лог.Отладка("Не удалось удалить каталог " + Каталог + " + | - " + ОписаниеОшибки()); + КонецПопытки +КонецПроцедуры + +////////////////////////////////////////////////////////////////////////////////// +// + +Функция ИзвлечьОбязательныйФайл(Знач Чтение, Знач ИмяФайла) + Лог.Отладка("Извлечение: " + ИмяФайла); + Элемент = Чтение.Элементы.Найти(ИмяФайла); + Если Элемент = Неопределено Тогда + ВызватьИсключение "Неверная структура пакета. Не найден файл " + ИмяФайла; + КонецЕсли; + + Чтение.Извлечь(Элемент, мВременныйКаталогУстановки); + + Возврат ОбъединитьПути(мВременныйКаталогУстановки, ИмяФайла); + +КонецФункции + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); +СИ = Новый СистемнаяИнформация(); +ЭтоWindows = Найти(СИ.ВерсияОС, "Windows") > 0; +мРежимУстановкиПакетов = РежимУстановкиПакетов.Глобально; \ No newline at end of file diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" rename to "src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\232\320\276\320\275\321\201\321\202\320\260\320\275\321\202\321\213Opm.os" diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270Opm.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270Opm.os" new file mode 100644 index 0000000..895dec8 --- /dev/null +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270Opm.os" @@ -0,0 +1,115 @@ +#Использовать json +#Использовать logos + +Перем мНастройки; +Перем мПутьФайлаНастроек; +Перем Лог; +Перем КешИнтернетПрокси; + +Функция ПолучитьНастройки() Экспорт + Возврат мНастройки; +КонецФункции + +Процедура УстановитьНастройкиПроксиСервера(Знач Сервер, Знач Порт = 0 , Знач Пользователь = "", Знач Пароль = "", Знач ИспользоватьАутентификациюОС = Ложь) Экспорт + + НастройкиПрокси = Новый Структура(); + + НастройкиПрокси.Вставить("Сервер", Сервер); + НастройкиПрокси.Вставить("Порт", Порт); + НастройкиПрокси.Вставить("Пользователь",Пользователь); + НастройкиПрокси.Вставить("Пароль", Пароль); + НастройкиПрокси.Вставить("ИспользоватьАутентификациюОС", ИспользоватьАутентификациюОС); + + мНастройки.НастройкиПрокси = НастройкиПрокси; + + мНастройки.ИспользоватьПрокси = ЗначениеЗаполнено(Сервер); + мНастройки.ИспользоватьСистемныйПрокси = Ложь; + +КонецПроцедуры + +Функция ПолучитьИнтернетПрокси() Экспорт + + Если КешИнтернетПрокси = Неопределено + И мНастройки.ИспользоватьПрокси Тогда + + Если мНастройки.ИспользоватьСистемныйПрокси Тогда + + КешИнтернетПрокси = Новый ИнтернетПрокси(Истина); + КешИнтернетПрокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; + + Иначе + + НастройкиПрокси = мНастройки.НастройкиПрокси; + + КешИнтернетПрокси = Новый ИнтернетПрокси(); + + КешИнтернетПрокси.Установить("http", НастройкиПрокси.Сервер, НастройкиПрокси.Порт, НастройкиПрокси.Пользователь, НастройкиПрокси.Пароль, НастройкиПрокси.ИспользоватьАутентификациюОС); + + КешИнтернетПрокси.НеИспользоватьПроксиДляЛокальныхАдресов = Истина; + + КонецЕсли; + + КонецЕсли; + + Возврат КешИнтернетПрокси; + +КонецФункции + +Процедура УстановитьИспользованиеПрокси(Знач ЗначениеНастройки) Экспорт + + мНастройки.ИспользоватьПрокси = ЗначениеНастройки; + +КонецПроцедуры + +Процедура УстановитьСозданиеShСкриптЗапуска(Знач ЗначениеНастройки) Экспорт + + мНастройки.СоздаватьShСкриптЗапуска = ЗначениеНастройки; + +КонецПроцедуры + +Процедура УстановитьСистемныеНастройкиПроксиСервера(Знач ЗначениеНастройки) Экспорт + + мНастройки.ИспользоватьПрокси = ЗначениеНастройки; + мНастройки.ИспользоватьСистемныйПрокси = ЗначениеНастройки; + +КонецПроцедуры + +Функция НастройкиСервераПакетов(Знач Имя, Знач Сервер, Знач ПутьНаСервере, Знач Порт, Знач Приоритет) + + Результат = Новый Структура; + Результат.Вставить("Имя", Имя); + Результат.Вставить("Сервер", Сервер); + Результат.Вставить("ПутьНаСервере", ПутьНаСервере); + Результат.Вставить("Порт", Порт); + Результат.Вставить("Приоритет", Приоритет); + + Возврат Результат; + +КонецФункции // + +Процедура ДобавитьСерверПакетов(Знач Имя, Знач Сервер, Знач ПутьНаСервере = "", Знач Порт = 80, Знач Приоритет = Неопределено) Экспорт + + мНастройки.СервераПакетов.Добавить(НастройкиСервераПакетов(Имя, Сервер, ПутьНаСервере, Порт, Приоритет)); + Лог.Отладка("Добавлен дополнительный сервер <%1>, Адрес <%2>, ПутьНаСервере <%3>, Порт <%4>, Приоритет <%5>", Имя, Сервер, ПутьНаСервере, Порт, Приоритет); + +КонецПроцедуры + +Процедура Инициализация() + + мНастройки = Новый Структура(); + мНастройки.Вставить("ИспользоватьПрокси", Ложь); + мНастройки.Вставить("ИспользоватьСистемныйПрокси", Ложь); + + мНастройки.Вставить("НастройкиПрокси", Новый Структура("Сервер, Порт, Пользователь, Пароль, ИспользоватьАутентификациюОС", "","","","", Ложь)); + мНастройки.Вставить("СоздаватьShСкриптЗапуска", Ложь); + мНастройки.Вставить("СервераПакетов", Новый Массив); + + // Сервера пакетов по умолчанию + ДобавитьСерверПакетов("ОсновнойСерверПакетов", КонстантыOpm.СерверУдаленногоХранилища, КонстантыOpm.ПутьВХранилище, 80, 0); + ДобавитьСерверПакетов("ЗапаснойСерверПакетов", КонстантыOpm.СерверЗапасногоХранилища, КонстантыOpm.ПутьВЗапасномХранилище, 80, 1); + +КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); + +Инициализация(); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\222\320\265\321\200\321\201\320\270\321\217\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\222\320\265\321\200\321\201\320\270\321\217\320\274\320\270.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\222\320\265\321\200\321\201\320\270\321\217\320\274\320\270.os" rename to "src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\222\320\265\321\200\321\201\320\270\321\217\320\274\320\270.os" diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\274\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\274\320\237\320\260\320\272\320\265\321\202\320\260.os" similarity index 100% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\274\320\237\320\260\320\272\320\265\321\202\320\260.os" rename to "src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\274\320\237\320\260\320\272\320\265\321\202\320\260.os" diff --git "a/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" new file mode 100644 index 0000000..2267a25 --- /dev/null +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\260\320\261\320\276\321\202\320\260\320\241\320\237\320\260\320\272\320\265\321\202\320\260\320\274\320\270.os" @@ -0,0 +1,226 @@ +#Использовать fluent +#Использовать fs +#Использовать logos +#Использовать tempfiles + +Перем Лог; +Перем ВнутреннийМенеджерПолученияПакетов; + +Процедура ОбновитьУстановленныеПакеты(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено) Экспорт + + КэшУстановленныхПакетов = ПолучитьУстановленныеПакеты(РежимУстановки); + УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты(); + Для Каждого КлючИЗначение Из УстановленныеПакеты Цикл + ИмяПакета = КлючИЗначение.Ключ; + + МенеджерПолучения = ПолучитьМенеджерПолученияПакетов(); + + Если МенеджерПолучения.ПакетДоступен(ИмяПакета) Тогда + Лог.Предупреждение("Ошибка обновления пакета %1: Пакет не найден в хабе", ИмяПакета); + Продолжить; + КонецЕсли; + + ОбновитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог); + + КонецЦикла; + +КонецПроцедуры + +Функция ПолучитьМенеджерПолученияПакетов() + + Если ВнутреннийМенеджерПолученияПакетов = Неопределено Тогда + ВнутреннийМенеджерПолученияПакетов = Новый МенеджерПолученияПакетов; + КонецЕсли; + + Возврат ВнутреннийМенеджерПолученияПакетов; + +КонецФункции + +Функция ПолучитьУстановленныеПакеты(РежимУстановки) + + КаталогУстановкиЗависимостей = ПолучитьКаталогСистемныхБиблиотек(); + + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + КаталогУстановкиЗависимостей = ОбъединитьПути( + ТекущийКаталог(), + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов + ); + КонецЕсли; + + КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогУстановкиЗависимостей); + + Возврат КэшУстановленныхПакетов; + +КонецФункции + +Процедура УстановитьПакетИзОблака(Знач ИмяПакета, Знач РежимУстановки, Знач ЦелевойКаталог) Экспорт + + Лог.Отладка("Устанавливаю пакет <%1> из доступного хаба", ИмяПакета); + ИмяВерсияПакета = РаботаСВерсиями.РазобратьИмяПакета(ИмяПакета); + ЭтоЗависимость = Ложь; + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + ЭтоЗависимость = Истина; + КонеЦесли; + УстановкаПакета = Новый МенеджерУстановкиПакетов(РежимУстановки, ЦелевойКаталог); + + УстановкаПакета.УстановитьПакетПоИмениИВерсии(ИмяВерсияПакета.ИмяПакета, ИмяВерсияПакета.Версия, ЭтоЗависимость); + +КонецПроцедуры + +Процедура УстановитьПакетИзФайла(Знач ИмяФайлаПакета, Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено) Экспорт + + УстановкаПакета = Новый МенеджерУстановкиПакетов(РежимУстановки, ЦелевойКаталог); + + УстановкаПакета.УстановитьПакетИзАрхива(ИмяФайлаПакета); + +КонецПроцедуры + +Процедура ПроверитьВерсиюСреды(Манифест) + + Свойства = Манифест.Свойства(); + Если НЕ Свойства.Свойство("ВерсияСреды") Тогда + Возврат; + КонецЕсли; + + ИмяПакета = Свойства.Имя; + ТребуемаяВерсияСреды = Свойства.ВерсияСреды; + СистемнаяИнформация = Новый СистемнаяИнформация; + ВерсияСреды = СистемнаяИнформация.Версия; + Лог.Отладка("ПроверитьВерсиюСреды: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", ТребуемаяВерсияСреды, ВерсияСреды); + Если РаботаСВерсиями.СравнитьВерсии(ТребуемаяВерсияСреды, ВерсияСреды) > 0 Тогда + ТекстСообщения = СтрШаблон( + "Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript. + |Требуемая версия: %2 + |Текущая версия: %3 + |Обновите OneScript перед установкой пакета", + ИмяПакета, + ТребуемаяВерсияСреды, + ВерсияСреды + ); + + ВызватьИсключение ТекстСообщения; + КонецЕсли; + +КонецПроцедуры + + +Процедура УстановитьВсеПакетыИзОблака(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено) Экспорт + + МенеджерПолучения = ПолучитьМенеджерПолученияПакетов(); + КешПакетов = МенеджерПолучения.ПолучитьДоступныеПакеты(); + + Для Каждого КлючИЗначение Из КешПакетов Цикл + УстановитьПакетИзОблака(КлючИЗначение.Ключ, РежимУстановки, ЦелевойКаталог); + КонецЦикла; + +КонецПроцедуры + +Процедура ОбновитьПакетИзОблака(Знач ИмяПакета, Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено) Экспорт + + УстановитьПакетИзОблака(ИмяПакета, РежимУстановки, ЦелевойКаталог); + +КонецПроцедуры + + +Процедура УстановитьПакетыПоОписаниюПакета(Знач РежимУстановки, Знач ЦелевойКаталог = Неопределено) Экспорт + + ОписаниеПакета = РаботаСОписаниемПакета.ПрочитатьОписаниеПакета(); + + ПроверитьВерсиюСреды(ОписаниеПакета); + + УстановкаПакета = Новый МенеджерУстановкиПакетов(РежимУстановки); + + УстановкаПакета.РазрешитьЗависимостиПакета(ОписаниеПакета); + + Если РежимУстановки = РежимУстановкиПакетов.Локально Тогда + ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(ОписаниеПакета, РежимУстановки); + КонецЕсли; + +КонецПроцедуры + +Процедура СоздатьКонфигурационныеФайлыОСкрипт(Знач КаталогУстановки, Знач ОписаниеПакета, Знач РежимУстановки) Экспорт + + Если РежимУстановки <> РежимУстановкиПакетов.Локально Тогда + Возврат; + КонецЕсли; + + ИмяПакета = ОписаниеПакета.Свойства().Имя; + + КаталогиИсполняемыхФайлов = ПроцессорыКоллекций.ИзКоллекции(ОписаниеПакета.ИсполняемыеФайлы()) + .Обработать("Результат = Новый Файл(ОбъединитьПути(ДополнительныеПараметры.КаталогУстановки, Элемент.Путь)).Путь", Новый Структура("КаталогУстановки", КаталогУстановки)) + .Различные() + .ВМассив(); + + ШаблонТекстаКонфигурационногоФайла = "lib.additional=%1"; + + Для Каждого КаталогИсполняемогоФайла Из КаталогиИсполняемыхФайлов Цикл + + РазделительПути = "/"; + РазницаВКаталогах = ФС.ОтносительныйПуть(КаталогУстановки, КаталогИсполняемогоФайла, РазделительПути); + Директории = СтрРазделить(РазницаВКаталогах, РазделительПути); + + ПутьКЛокальнымБиблиотекам = ПроцессорыКоллекций.ИзКоллекции(Директории) + .Обработать("Результат = ""../""") + .Сократить("Результат = Результат + Элемент", ""); + + ПутьКЛокальнымБиблиотекам = ПутьКЛокальнымБиблиотекам + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; + + ТекстКонфигурационногоФайла = СтрШаблон(ШаблонТекстаКонфигурационногоФайла, ПутьКЛокальнымБиблиотекам); + ПутьККонфигурационномуФайлу = ОбъединитьПути(КаталогИсполняемогоФайла, "oscript.cfg"); + + ТекстовыйДокумент = Новый ТекстовыйДокумент; + ТекстовыйДокумент.УстановитьТекст(ТекстКонфигурационногоФайла); + ТекстовыйДокумент.Записать(ПутьККонфигурационномуФайлу, КодировкаТекста.UTF8NoBOM); + + КонецЦикла; + +КонецПроцедуры + +Процедура ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(Знач ОписаниеПакета, Знач РежимУстановки) + + КаталогНазначения = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; + КаталогЗагрузчика = ПолучитьКаталогСистемныхБиблиотек(); + + ФС.ОбеспечитьКаталог(КаталогНазначения); + СоздатьКонфигурационныеФайлыОСкрипт(ТекущийКаталог(), ОписаниеПакета, РежимУстановки); + + ИмяЗагрузчика = "package-loader.os"; + ФайлЗагрузчика = ОбъединитьПути(КаталогЗагрузчика, ИмяЗагрузчика); + Если Не ФС.ФайлСуществует(ФайлЗагрузчика) Тогда + Лог.Предупреждение("Не удалось скопировать системный загрузчик в локальный каталог пакетов"); + Возврат; + КонецЕсли; + + ПутьКНовомуЗагрузчику = ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика); + Если ФС.ФайлСуществует(ПутьКНовомуЗагрузчику) Тогда + Лог.Отладка("Файл загрузчика уже существует."); + Возврат; + КонецЕсли; + + КопироватьФайл(ФайлЗагрузчика, ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика)); + +КонецПроцедуры + +Функция ПолучитьПакет(Знач ИмяПакета, Знач ВерсияПакета, ПутьКФайлуПакета = "") Экспорт + + МенеджерПолучения = ПолучитьМенеджерПолученияПакетов(); + + ПутьКФайлуПакета = МенеджерПолучения.ПолучитьПакет(ИмяПакета, ВерсияПакета, ПутьКФайлуПакета); + + Возврат ПутьКФайлуПакета; + +КонецФункции + +Функция ПолучитьКаталогСистемныхБиблиотек() + + СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); + Лог.Отладка("СистемныеБиблиотеки " + СистемныеБиблиотеки); + Если СистемныеБиблиотеки = Неопределено Тогда + ВызватьИсключение "Не определен каталог системных библиотек"; + КонецЕсли; + + Возврат СистемныеБиблиотеки; + +КонецФункции + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" similarity index 96% rename from "src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" rename to "src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" index 2db5d52..a385d84 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" +++ "b/src/core/\320\234\320\276\320\264\321\203\320\273\320\270/\320\240\320\265\320\266\320\270\320\274\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\270\320\237\320\260\320\272\320\265\321\202\320\276\320\262.os" @@ -1,8 +1,8 @@ - -Перем Локально Экспорт; -Перем Глобально Экспорт; - -/////////////////////////////////////////////////////////////// - -Локально = "Локально"; -Глобально = "Глобально"; + +Перем Локально Экспорт; +Перем Глобально Экспорт; + +/////////////////////////////////////////////////////////////// + +Локально = "Локально"; +Глобально = "Глобально"; diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\265\321\200\320\272\320\260\320\273\320\276.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\265\321\200\320\272\320\260\320\273\320\276.os" deleted file mode 100644 index 42ee466..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\227\320\265\321\200\320\272\320\260\320\273\320\276.os" +++ /dev/null @@ -1,47 +0,0 @@ -Перем СерверУдаленногоХранилища Экспорт; -Перем ПутьВХранилище Экспорт; -Перем Порт Экспорт; - -Перем Соединение; - -Функция ИнициализироватьСоединение() Экспорт - - Если Не Соединение = Неопределено Тогда - Возврат Соединение; - КонецЕсли; - - Порт = ?(Порт = Неопределено, 80, Порт); - НастройкиПрокси = НастройкиПриложенияOpm.Получить().Прокси; - Если НастройкиПрокси.ИспользоватьПрокси Тогда - Прокси = Новый ИнтернетПрокси(НастройкиПрокси.ПроксиПоУмолчанию); - Если Не НастройкиПрокси.ПроксиПоУмолчанию Тогда - Прокси.Установить("http",НастройкиПрокси.Сервер,НастройкиПрокси.Порт,НастройкиПрокси.Пользователь,НастройкиПрокси.Пароль,НастройкиПрокси.ИспользоватьАутентификациюОС); - КонецЕсли; - Соединение = Новый HTTPСоединение(СерверУдаленногоХранилища, Порт,,,Прокси); - Иначе - Соединение = Новый HTTPСоединение(СерверУдаленногоХранилища, Порт); - КонецЕсли; - - Возврат Соединение; - -КонецФункции - -// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище" -// Возвращает HttpОтвет или Неопределено, если запрос вернул исключение. -Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт - - Соединение = ИнициализироватьСоединение(); - Ресурс = ПутьВХранилище + ИмяРесурса; - Запрос = Новый HTTPЗапрос(Ресурс); - - Попытка - - Возврат Соединение.Получить(Запрос); - - Исключение - - Возврат Неопределено; - - КонецПопытки; - -КонецФункции diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\237\320\260\320\272\320\265\321\202\320\276\320\262\320\245\320\260\320\261\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\237\320\260\320\272\320\265\321\202\320\276\320\262\320\245\320\260\320\261\320\260.os" deleted file mode 100644 index 8d21ffe..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\321\215\321\210\320\237\320\260\320\272\320\265\321\202\320\276\320\262\320\245\320\260\320\261\320\260.os" +++ /dev/null @@ -1,40 +0,0 @@ - -#Использовать logos - -Перем Лог; - -Перем ПакетыХаба; - -Процедура Обновить() Экспорт - - ПакетыХаба = Новый Соответствие; - УстановкаПакета = Новый Установкапакета(); - Репо = Новый Репо(); - СоответствиеПакетов = Репо.ПолучитьПакеты(); - Для каждого КлючЗначение из СоответствиеПакетов Цикл - ПакетыХаба.Вставить(КлючЗначение.Ключ, Истина); - КонецЦикла; - -КонецПроцедуры - -Функция ЭтоПакетХаба(Знач ИмяПакета) Экспорт - - Возврат ПакетыХаба[ИмяПакета] = Истина; - -КонецФункции - -Функция ПолучитьПакетыХаба() Экспорт - - Возврат ПакетыХаба; - -КонецФункции - -Процедура Инициализация() - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - - Обновить(); - -КонецПроцедуры - -Инициализация(); diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276.os" deleted file mode 100644 index 479698f..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\240\320\265\320\277\320\276.os" +++ /dev/null @@ -1,152 +0,0 @@ -#Использовать logos - -Перем ДополнительныеРепо; -Перем Лог; -Перем ПакетыХаба; - -Функция ПрочитатьФайлСпискаПакетов(ПакетыХаба, Текст, Репо) - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.УстановитьТекст(Текст); - КоличествоПакетовВХабе = ТекстовыйДокумент.КоличествоСтрок(); - Для НомерСтроки = 1 По КоличествоПакетовВХабе Цикл - ИмяПакета = СокрЛП(ТекстовыйДокумент.ПолучитьСтроку(НомерСтроки)); - Если ПакетыХаба[ИмяПакета] = Неопределено Тогда - ПакетыХаба.Вставить(ИмяПакета, Новый Массив); - КонецЕсли; - ПакетыХаба[ИмяПакета].Добавить(Репо); - КонецЦикла; -КонецФункции - -Функция ПолучитьСписокПакетов(Репозиторий, Ресурс) - - Ответ = Репозиторий.ПолучитьРесурс(Ресурс); - - Если Ответ = Неопределено Или Ответ.КодСостояния <> 200 Тогда - ТекстИсключения = СтрШаблон("Ошибка подключения к зеркалу "); - ВызватьИсключение ТекстИсключения; - КонецЕсли; - - ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(); - Ответ.Закрыть(); - - Возврат ТекстОтвета; - -КонецФункции - -Функция ПолучитьПакеты() Экспорт - - ПакетыХаба = Новый Соответствие; - - ТекстОтвета = ""; - Попытка - ТекстОтвета = ПолучитьСписокПакетов(Зеркала, "list.txt"); - Исключение - Лог.Предупреждение( - СтрШаблон("Ошбика получения списка пакетов с хаба %1 по причине %2", - "default", ОписаниеОшибки() - ) - ); - КонецПопытки; - - ПрочитатьФайлСпискаПакетов(ПакетыХаба, ТекстОтвета, "default"); - Для Каждого Репо из ДополнительныеРепо Цикл - ТекстОтвета = ""; - Попытка - ТекстОтвета = ПолучитьСписокПакетов(Репо.Значение, "list.txt"); - Исключение - Лог.Предупреждение( - СтрШаблон("Ошбика получения списка пакетов с хаба %1 по причине %2", - Репо.Ключ, ОписаниеОшибки() - ) - ); - КонецПопытки; - ПрочитатьФайлСпискаПакетов(ПакетыХаба, ТекстОтвета, Репо.Ключ); - КонецЦикла; - - Возврат ПакетыХаба; - -КонецФункции - -// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище" -// Возвращает HttpОтвет или Неопределено, если ни один сервер не вернул ответ. -Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт - - РесурсУспешноПолучен = Ложь; - - Если ДополнительныеРепо = Неопределено Тогда - Инициализация(); - КонецЕсли; - - СерверУдаленногоХранилища = ""; - Ответ = Зеркала.ПолучитьРесурс(ИмяРесурса); - Если Ответ = Неопределено ИЛИ Ответ.КодСостояния <> 200 Тогда - Для каждого Репо из ДополнительныеРепо Цикл - Ответ = Репо.Значение.ПолучитьРесурс(ИмяРесурса); - - Если Ответ = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если Ответ.КодСостояния = 200 Тогда - РесурсУспешноПолучен = Истина; - СерверУдаленногоХранилища = Репо.Значение.СерверУдаленногоХранилища; - Прервать; - КонецЕсли; - КонецЦикла; - - Иначе - СерверУдаленногоХранилища = Зеркала.ПодключенноеЗеркало.СерверУдаленногоХранилища; - РесурсУспешноПолучен = Истина; - КонецЕсли; - - Если РесурсУспешноПолучен Тогда - - ТекстСообщения = СтрШаблон("Ресурс %1 успешно получен с %2", ИмяРесурса, СерверУдаленногоХранилища); - Лог.Отладка(ТекстСообщения); - - Возврат Ответ; - - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -Процедура Добавить(Знач Зеркало) Экспорт - Зеркала.Добавить(Зеркало); -КонецПроцедуры - -Процедура Инициализация() - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - ДополнительныеРепо = Новый Соответствие; - НастройкиПриложения = НастройкиПриложенияOpm.Получить(); - - Если НЕ НастройкиПриложения.Свойство("СервераПакетов") Тогда - Возврат; - КонецЕсли; - - ДополнительныеРепоНастройки = НастройкиПриложения["СервераПакетов"]; - Если ТипЗнч(ДополнительныеРепоНастройки) <> Тип("Массив") Тогда - Лог.Предупреждение( - "Установленна настройка СервераПакетов, но не массив, а " - +ТипЗнч(ДополнительныеРепоНастройки)); - Возврат; - КонецЕсли; - - Для каждого Репо из ДополнительныеРепоНастройки Цикл - - РепоЗеркало = Новый("Зеркало"); - Попытка - РепоЗеркало.СерверУдаленногоХранилища = Репо.Сервер; - РепоЗеркало.ПутьВХранилище = ?(Репо.Свойство("ПутьНаСервере"), Репо.ПутьНаСервере, "/"); - РепоЗеркало.Порт = ?(Репо.Свойство("Порт"), Репо.Порт, 80); - ДополнительныеРепо.Вставить(Репо.Имя, РепоЗеркало); - Исключение - Лог.Ошибка("Ошибка чтение настройки репо " + Репо.Ключ + ОписаниеОшибки()); - КонецПопытки; - КонецЦикла; - -КонецПроцедуры - -Инициализация(); \ No newline at end of file diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" deleted file mode 100644 index c8f8f23..0000000 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\243\321\201\321\202\320\260\320\275\320\276\320\262\320\272\320\260\320\237\320\260\320\272\320\265\321\202\320\260.os" +++ /dev/null @@ -1,644 +0,0 @@ -#Использовать fluent -#Использовать fs -#Использовать logos -#Использовать tempfiles - -Перем Лог; -Перем мВременныйКаталогУстановки; -Перем мЗависимостиВРаботе; -Перем ЭтоWindows; -Перем мРежимУстановкиПакетов; -Перем мРежимУстановкиПакетовСохраненный; -Перем КэшУстановленныхПакетов; -Перем мЦелевойКаталог; - -Процедура УстановитьПакетИзАрхива(Знач ФайлАрхива) Экспорт - - Лог.Отладка("Устанавливаю пакет из архива: " + ФайлАрхива); - Если мЗависимостиВРаботе = Неопределено Тогда - мЗависимостиВРаботе = Новый Соответствие; - КонецЕсли; - - мВременныйКаталогУстановки = ВременныеФайлы.СоздатьКаталог(); - Лог.Отладка("Временный каталог установки: " + мВременныйКаталогУстановки); - - Попытка - - Лог.Отладка("Открываем архив пакета"); - ЧтениеПакета = Новый ЧтениеZipФайла; - ЧтениеПакета.Открыть(ФайлАрхива); - - ФайлСодержимого = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаСодержимогоПакета); - ФайлМетаданных = ИзвлечьОбязательныйФайл(ЧтениеПакета, КонстантыOpm.ИмяФайлаМетаданныхПакета); - - Метаданные = ПрочитатьМетаданныеПакета(ФайлМетаданных); - ИмяПакета = Метаданные.Свойства().Имя; - - ПутьУстановки = НайтиСоздатьКаталогУстановки(ИмяПакета); - Лог.Информация("Устанавливаю пакет " + ИмяПакета); - ПроверитьВерсиюСреды(Метаданные); - Если мЗависимостиВРаботе[ИмяПакета] = "ВРаботе" Тогда - ВызватьИсключение "Циклическая зависимость по пакету " + ИмяПакета; - КонецЕсли; - - мЗависимостиВРаботе.Вставить(ИмяПакета, "ВРаботе"); - - СтандартнаяОбработка = Истина; - УстановитьФайлыПакета(ПутьУстановки, ФайлСодержимого, СтандартнаяОбработка); - Если СтандартнаяОбработка Тогда - СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(ПутьУстановки.ПолноеИмя, Метаданные); - СоздатьКонфигурационныеФайлыОСкрипт(ПутьУстановки.ПолноеИмя, Метаданные); - КонецЕсли; - СохранитьФайлМетаданныхПакета(ПутьУстановки.ПолноеИмя, ФайлМетаданных); - - ЧтениеПакета.Закрыть(); - - Если НЕ ФС.КаталогСуществует(ОбъединитьПути(ПутьУстановки.ПолноеИмя, КонстантыOpm.ЛокальныйКаталогУстановкиПакетов)) Тогда - РазрешитьЗависимостиПакета(Метаданные); - КонецЕсли; - - ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); - - мЗависимостиВРаботе.Вставить(ИмяПакета, "Установлен"); - - Исключение - ЧтениеПакета.Закрыть(); - ВременныеФайлы.УдалитьФайл(мВременныйКаталогУстановки); - ВызватьИсключение; - КонецПопытки; - - Лог.Информация("Установка завершена"); - -КонецПроцедуры - -Процедура ПроверитьВерсиюСреды(Манифест) - - Свойства = Манифест.Свойства(); - Если НЕ Свойства.Свойство("ВерсияСреды") Тогда - Возврат; - КонецЕсли; - - ИмяПакета = Свойства.Имя; - ТребуемаяВерсияСреды = Свойства.ВерсияСреды; - СистемнаяИнформация = Новый СистемнаяИнформация; - ВерсияСреды = СистемнаяИнформация.Версия; - Лог.Отладка("ПроверитьВерсиюСреды: Перед вызовом СравнитьВерсии(ЭтаВерсия = <%1>, БольшеЧемВерсия = <%2>)", ТребуемаяВерсияСреды, ВерсияСреды); - Если РаботаСВерсиями.СравнитьВерсии(ТребуемаяВерсияСреды, ВерсияСреды) > 0 Тогда - ТекстСообщения = СтрШаблон( - "Ошибка установки пакета <%1>: Обнаружена устаревшая версия движка OneScript. - |Требуемая версия: %2 - |Текущая версия: %3 - |Обновите OneScript перед установкой пакета", - ИмяПакета, - ТребуемаяВерсияСреды, - ВерсияСреды - ); - - ВызватьИсключение ТекстСообщения; -КонецЕсли; - -КонецПроцедуры - -Процедура УстановитьПакетыПоОписаниюПакета() Экспорт - - ОписаниеПакета = РаботаСОписаниемПакета.ПрочитатьОписаниеПакета(); - - ПроверитьВерсиюСреды(ОписаниеПакета); - - РазрешитьЗависимостиПакета(ОписаниеПакета); - - Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда - ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(ОписаниеПакета); - КонецЕсли; - -КонецПроцедуры - -Процедура ОбеспечитьФайлыИнфраструктурыЛокальнойУстановки(Знач ОписаниеПакета) - - КаталогНазначения = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; - КаталогЗагрузчика = КаталогСистемныхБиблиотек(); - - ФС.ОбеспечитьКаталог(КаталогНазначения); - СоздатьКонфигурационныеФайлыОСкрипт(ТекущийКаталог(), ОписаниеПакета); - - ИмяЗагрузчика = "package-loader.os"; - ФайлЗагрузчика = ОбъединитьПути(КаталогЗагрузчика, ИмяЗагрузчика); - Если Не ФС.ФайлСуществует(ФайлЗагрузчика) Тогда - Лог.Предупреждение("Не удалось скопировать системный загрузчик в локальный каталог пакетов"); - Возврат; - КонецЕсли; - - ПутьКНовомуЗагрузчику = ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика); - Если ФС.ФайлСуществует(ПутьКНовомуЗагрузчику) Тогда - Лог.Отладка("Файл загрузчика уже существует."); - Возврат; - КонецЕсли; - - КопироватьФайл(ФайлЗагрузчика, ОбъединитьПути(КаталогНазначения, ИмяЗагрузчика)); - -КонецПроцедуры - -Процедура УдалитьКаталогУстановкиПриОшибке(Знач Каталог) - Лог.Отладка("Удаляю каталог " + Каталог); - Попытка - УдалитьФайлы(Каталог); - Исключение - Лог.Отладка("Не удалось удалить каталог " + Каталог + " - | - " + ОписаниеОшибки()); - КонецПопытки -КонецПроцедуры - -Процедура УстановитьПакетИзОблака(Знач ИмяПакета) Экспорт - - ИмяВерсияПакета = РаботаСВерсиями.РазобратьИмяПакета(ИмяПакета); - СкачатьИУстановитьПакет(ИмяВерсияПакета.ИмяПакета, ИмяВерсияПакета.Версия); - -КонецПроцедуры - -Процедура УстановитьВсеПакетыИзОблака() Экспорт - - КэшПакетовХаба = Новый КэшПакетовХаба(); - ПакетыХаба = КэшПакетовХаба.ПолучитьПакетыХаба(); - Для Каждого КлючИЗначение Из ПакетыХаба Цикл - УстановитьПакетИзОблака(КлючИЗначение.Ключ); - КонецЦикла; - -КонецПроцедуры - -Процедура ОбновитьПакетИзОблака(Знач ИмяПакета) Экспорт - - ИмяВерсияПакета = РаботаСВерсиями.РазобратьИмяПакета(ИмяПакета); - СкачатьИУстановитьПакет(ИмяВерсияПакета.ИмяПакета, ИмяВерсияПакета.Версия); - -КонецПроцедуры - -Процедура ОбновитьУстановленныеПакеты() Экспорт - КэшУстановленныхПакетов = ПолучитьУстановленныеПакеты(); - УстановленныеПакеты = КэшУстановленныхПакетов.ПолучитьУстановленныеПакеты(); - Для Каждого КлючИЗначение Из УстановленныеПакеты Цикл - ИмяПакета = КлючИЗначение.Ключ; - ИмяАрхива = ОпределитьИмяАрхива(ИмяПакета); - Если ИмяАрхива = Неопределено Тогда - ТекстИсключения = СтрШаблон("Ошибка обновления пакета %1: Пакет не найден в хабе", ИмяПакета); - Лог.Предупреждение(ТекстИсключения); - Продолжить; - КонецЕсли; - - ОбновитьПакетИзОблака(ИмяПакета); - КонецЦикла; -КонецПроцедуры - -Процедура УстановитьРежимУстановкиПакетов(Знач ЗначениеРежимУстановкиПакетов) Экспорт - мРежимУстановкиПакетов = ЗначениеРежимУстановкиПакетов; -КонецПроцедуры - -Процедура УстановитьЦелевойКаталог(Знач ЦелевойКаталогУстановки) Экспорт - Лог.Отладка("Каталог установки пакета '%1'", ЦелевойКаталогУстановки); - ФС.ОбеспечитьКаталог(ЦелевойКаталогУстановки); - мЦелевойКаталог = ЦелевойКаталогУстановки; -КонецПроцедуры - -Функция НайтиСоздатьКаталогУстановки(Знач ИдентификаторПакета) - - Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда - КаталогБиблиотек = КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; - ИначеЕсли мРежимУстановкиПакетов = РежимУстановкиПакетов.Глобально Тогда - Если Не ЗначениеЗаполнено(мЦелевойКаталог) Тогда - УстановитьЦелевойКаталог(КаталогСистемныхБиблиотек()); - КонецЕсли; - КаталогБиблиотек = мЦелевойКаталог; - Иначе - ВызватьИсключение "Неизвестный режим установки пакетов <" + мРежимУстановкиПакетов + ">"; - КонецЕсли; - ПутьУстановки = Новый Файл(ОбъединитьПути(КаталогБиблиотек, ИдентификаторПакета)); - Лог.Отладка("Путь установки пакета: " + ПутьУстановки.ПолноеИмя); - - Если Не ПутьУстановки.Существует() Тогда - СоздатьКаталог(ПутьУстановки.ПолноеИмя); - ИначеЕсли ПутьУстановки.ЭтоФайл() Тогда - ВызватьИсключение "Не удалось создать каталог " + ПутьУстановки.ПолноеИмя; - КонецЕсли; - - Возврат ПутьУстановки; - -КонецФункции - -Процедура РазрешитьЗависимостиПакета(Знач Манифест) - - Зависимости = Манифест.Зависимости(); - Если Зависимости.Количество() = 0 Тогда - Возврат; - КонецЕсли; - - УстановленныеПакеты = ПолучитьУстановленныеПакеты(); - КаталогПоискаБиблиотек = ""; - Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда - КаталогПоискаБиблиотек = ОбъединитьПути( - ТекущийКаталог(), - КонстантыOpm.ЛокальныйКаталогУстановкиПакетов - ); - Иначе - КаталогПоискаБиблиотек = ОбъединитьПути( - КаталогПрограммы(), - ПолучитьЗначениеСистемнойНастройки("lib.system") - ); - КонецЕсли; - - Для Каждого Зависимость Из Зависимости Цикл - Лог.Информация("Устанавливаю зависимость: " + Зависимость.ИмяПакета); - - Если Не УстановленныеПакеты.ПакетУстановлен(Зависимость, КаталогПоискаБиблиотек) Тогда - // скачать - // определить зависимости и так по кругу - СкачатьИУстановитьПакетПоОписанию(Зависимость); - УстановленныеПакеты.Обновить(); - Иначе - Лог.Информация("" + Зависимость.ИмяПакета + " уже установлен. Пропускаем."); - // считаем, что версия всегда подходит - КонецЕсли; - - КонецЦикла; - -КонецПроцедуры - -Функция ПолучитьУстановленныеПакеты() - - Если мРежимУстановкиПакетов = мРежимУстановкиПакетовСохраненный И КэшУстановленныхПакетов <> Неопределено Тогда - Возврат КэшУстановленныхПакетов; - КонецЕсли; - - мРежимУстановкиПакетовСохраненный = мРежимУстановкиПакетов; - - Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда - - КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(); - ПутьККаталогуЛокальнойУстановки = ОбъединитьПути( - ТекущийКаталог(), - КонстантыOpm.ЛокальныйКаталогУстановкиПакетов - ); - - КэшУстановленныхПакетов.ДобавитьКаталогБиблиотек(ПутьККаталогуЛокальнойУстановки); - - Иначе - - КаталогСистемныхБиблиотек = ОбъединитьПути( - КаталогПрограммы(), - ПолучитьЗначениеСистемнойНастройки("lib.system") - ); - КэшУстановленныхПакетов = Новый КэшУстановленныхПакетов(КаталогСистемныхБиблиотек); - - КонецЕсли; - - Возврат КэшУстановленныхПакетов; - -КонецФункции - -Процедура СкачатьИУстановитьПакетПоОписанию(Знач ОписаниеПакета) - // TODO: Нужно скачивание конкретной версии по маркеру - СкачатьИУстановитьПакет(ОписаниеПакета.ИмяПакета, ОписаниеПакета.МинимальнаяВерсия); -КонецПроцедуры - -// Функция по имени пакета определяет имя архива в хабе -// https://github.com/oscript-library/opm/issues/50 -// Имена файлов в хабе регистрозависимы, однако имена пакетов по обыкновению регистронезависимы -Функция ОпределитьИмяАрхива(Знач ИмяПакета) - - КэшПакетовВХабе = Новый КэшПакетовХаба(); - ПакетыХаба = КэшПакетовВХабе.ПолучитьПакетыХаба(); - - Если ПакетыХаба.Получить(ИмяПакета) = Неопределено Тогда - - Для Каждого мПакет Из ПакетыХаба Цикл - - // Проводим регистронезависимое сравнение имён - Если нрег(мПакет.Ключ) = нрег(ИмяПакета) Тогда - - // и возвращаем ровно то имя, которое хранится в хабе (с учётом регистра) - Возврат мПакет.Ключ; - - КонецЕсли; - - КонецЦикла; - - Возврат Неопределено; - - КонецЕсли; - - Возврат ИмяПакета; - -КонецФункции - -Процедура СкачатьИУстановитьПакет(Знач ИмяПакета, Знач ВерсияПакета) - - ИмяАрхива = ОпределитьИмяАрхива(ИмяПакета); - Если ИмяАрхива = Неопределено Тогда - ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Пакет не найден", ИмяПакета); - ВызватьИсключение ТекстИсключения; - КонецЕсли; - - Если ВерсияПакета <> Неопределено Тогда - ФайлПакета = ИмяАрхива + "-" + ВерсияПакета + ".ospx"; - Иначе - ФайлПакета = ИмяАрхива + ".ospx"; - КонецЕсли; - - Лог.Информация("Скачиваю файл: " + ФайлПакета); - - Репо = Новый Репо(); - Ответ = Репо.ПолучитьРесурс(ИмяАрхива + "/" + ФайлПакета); - Если Не Ответ = Неопределено Тогда - Лог.Отладка("Файл получен"); - ВремФайл = ОбъединитьПути(КаталогВременныхФайлов(), ФайлПакета); - Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ВремФайл); - Ответ.Закрыть(); - Лог.Отладка("Соединение закрыто"); - Попытка - УстановитьПакетИзАрхива(ВремФайл); - УдалитьФайлы(ВремФайл); - Исключение - УдалитьФайлы(ВремФайл); - ВызватьИсключение; - КонецПопытки; - Иначе - ТекстИсключения = СтрШаблон("Ошибка установки пакета %1: Нет соединения", ИмяПакета); - ВызватьИсключение ТекстИсключения; - КонецЕсли; - -КонецПроцедуры - -Функция ИнициализироватьСоединение(Сервер) Экспорт - - НастройкиПрокси = НастройкиПриложенияOpm.Получить().Прокси; - Если НастройкиПрокси.ИспользоватьПрокси Тогда - Прокси = Новый ИнтернетПрокси(НастройкиПрокси.ПроксиПоУмолчанию); - Если Не НастройкиПрокси.ПроксиПоУмолчанию Тогда - Прокси.Установить("http",НастройкиПрокси.Сервер,НастройкиПрокси.Порт,НастройкиПрокси.Пользователь,НастройкиПрокси.Пароль,НастройкиПрокси.ИспользоватьАутентификациюОС); - КонецЕсли; - Соединение = Новый HTTPСоединение(Сервер,,,,Прокси); - Иначе - Соединение = Новый HTTPСоединение(Сервер); - КонецЕсли; - - Возврат Соединение; - -КонецФункции - -Функция РазобратьМаркерВерсии(Знач МаркерВерсии) - - Перем ИндексВерсии; - - Оператор = Лев(МаркерВерсии, 1); - Если Оператор = "<" или Оператор = ">" Тогда - ТестОператор = Сред(МаркерВерсии, 2, 1); - Если ТестОператор = "=" Тогда - ИндексВерсии = 3; - Иначе - ИндексВерсии = 2; - КонецЕсли; - ИначеЕсли Оператор = "=" Тогда - ИндексВерсии = 2; - ИначеЕсли Найти("0123456789", Оператор) > 0 Тогда - ИндексВерсии = 1; - Иначе - ВызватьИсключение "Некорректно задан маркер версии"; - КонецЕсли; - - Если ИндексВерсии > 1 Тогда - Оператор = Лев(МаркерВерсии, ИндексВерсии-1); - Иначе - Оператор = ""; - КонецЕсли; - - Версия = Сред(МаркерВерсии, ИндексВерсии); - - Возврат Новый Структура("Оператор,Версия", Оператор, Версия); - -КонецФункции - -Функция КаталогСистемныхБиблиотек() - - СистемныеБиблиотеки = ОбъединитьПути(КаталогПрограммы(), ПолучитьЗначениеСистемнойНастройки("lib.system")); - Лог.Отладка("СистемныеБиблиотеки " + СистемныеБиблиотеки); - Если СистемныеБиблиотеки = Неопределено Тогда - ВызватьИсключение "Не определен каталог системных библиотек"; - КонецЕсли; - - Возврат СистемныеБиблиотеки; - -КонецФункции - -Процедура УстановитьФайлыПакета(Знач ПутьУстановки, Знач ФайлСодержимого, СтандартнаяОбработка) - - ЧтениеСодержимого = Новый ЧтениеZipФайла(ФайлСодержимого); - Попытка - - Лог.Отладка("Устанавливаю файлы пакета из архива"); - УдалитьУстаревшиеФайлы(ПутьУстановки); - ЧтениеСодержимого.ИзвлечьВсе(ПутьУстановки.ПолноеИмя); - - ОбработчикСобытий = ПолучитьОбработчикСобытий(ПутьУстановки.ПолноеИмя); - ВызватьСобытиеПриУстановке(ОбработчикСобытий, ПутьУстановки.ПолноеИмя, СтандартнаяОбработка); - - Исключение - ЧтениеСодержимого.Закрыть(); - ВызватьИсключение; - КонецПопытки; - - ЧтениеСодержимого.Закрыть(); - -КонецПроцедуры - -Процедура УдалитьУстаревшиеФайлы(Знач ПутьУстановки) - УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.os", Истина); - УдалитьФайлыВКаталоге(ПутьУстановки.ПолноеИмя, "*.dll", Истина); -КонецПроцедуры - -Процедура УдалитьФайлыВКаталоге(Знач ПутьКаталога, Знач МаскаФайлов, Знач ИскатьВПодкаталогах = Истина) - ФайлыДляУдаления = НайтиФайлы(ПутьКаталога, МаскаФайлов, ИскатьВПодкаталогах); - Для Каждого Файл из ФайлыДляУдаления Цикл - УдалитьФайлы(Файл.ПолноеИмя); - КонецЦикла; -КонецПроцедуры - -Функция ПолучитьОбработчикСобытий(Знач ПутьУстановки) - ОбработчикСобытий = Неопределено; - ИмяФайлаСпецификацииПакета = КонстантыOpm.ИмяФайлаСпецификацииПакета; - ПутьКФайлуСпецификации = ОбъединитьПути(ПутьУстановки, ИмяФайлаСпецификацииПакета); - Если ФС.ФайлСуществует(ПутьКФайлуСпецификации) Тогда - Лог.Отладка("Найден файл спецификации пакета"); - Лог.Отладка("Компиляция файла спецификации пакета"); - - ОписаниеПакета = Новый ОписаниеПакета(); - ВнешнийКонтекст = Новый Структура("Описание", ОписаниеПакета); - ОбработчикСобытий = ЗагрузитьСценарий(ПутьКФайлуСпецификации, ВнешнийКонтекст); - КонецЕсли; - - Возврат ОбработчикСобытий; -КонецФункции - -Процедура ВызватьСобытиеПриУстановке(Знач ОбработчикСобытий, Знач Каталог, СтандартнаяОбработка) - - Если ОбработчикСобытий = Неопределено Тогда - Возврат; - КонецЕсли; - - Рефлектор = Новый Рефлектор; - Если Рефлектор.МетодСуществует(ОбработчикСобытий, "ПриУстановке") Тогда - Лог.Отладка("Вызываю событие ПриУстановке"); - ОбработчикСобытий.ПриУстановке(Каталог, СтандартнаяОбработка); - КонецЕсли; - -КонецПроцедуры - -Процедура СгенерироватьСкриптыЗапускаПриложенийПриНеобходимости(Знач КаталогУстановки, Знач ОписаниеПакета) - - ИмяПакета = ОписаниеПакета.Свойства().Имя; - - Для Каждого ФайлПриложения Из ОписаниеПакета.ИсполняемыеФайлы() Цикл - - ИмяСкриптаЗапуска = ?(ПустаяСтрока(ФайлПриложения.ИмяПриложения), ИмяПакета, ФайлПриложения.ИмяПриложения); - Лог.Информация("Регистрация приложения: " + ИмяСкриптаЗапуска); - - ОбъектФайл = Новый Файл(ОбъединитьПути(КаталогУстановки, ФайлПриложения.Путь)); - - Если Не ОбъектФайл.Существует() Тогда - Лог.Ошибка("Файл приложения " + ОбъектФайл.ПолноеИмя + " не существует"); - ВызватьИсключение "Некорректные данные в метаданных пакета"; - КонецЕсли; - - Если мРежимУстановкиПакетов = РежимУстановкиПакетов.Локально Тогда - КаталогУстановкиСкриптовЗапускаПриложений = ОбъединитьПути(КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "bin"); - ФС.ОбеспечитьКаталог(КаталогУстановкиСкриптовЗапускаПриложений); - КаталогУстановкиСкриптовЗапускаПриложений = Новый Файл(КаталогУстановкиСкриптовЗапускаПриложений).ПолноеИмя; - ИначеЕсли мРежимУстановкиПакетов = РежимУстановкиПакетов.Глобально Тогда - КаталогУстановкиСкриптовЗапускаПриложений = ?(ЭтоWindows, КаталогПрограммы(), "/usr/bin"); - Если НЕ ПустаяСтрока(ПолучитьПеременнуюСреды("OSCRIPTBIN")) Тогда - КаталогУстановкиСкриптовЗапускаПриложений = ПолучитьПеременнуюСреды("OSCRIPTBIN"); - КонецЕсли; - Иначе - ВызватьИсключение "Неизвестный режим установки пакетов <" + мРежимУстановкиПакетов + ">"; - КонецЕсли; - - СоздатьСкриптЗапуска(ИмяСкриптаЗапуска, ОбъектФайл.ПолноеИмя, КаталогУстановкиСкриптовЗапускаПриложений); - - КонецЦикла; - -КонецПроцедуры - -Процедура СоздатьКонфигурационныеФайлыОСкрипт(Знач КаталогУстановки, Знач ОписаниеПакета) - - Если мРежимУстановкиПакетов <> РежимУстановкиПакетов.Локально Тогда - Возврат; - КонецЕсли; - - ИмяПакета = ОписаниеПакета.Свойства().Имя; - - КаталогиИсполняемыхФайлов = ПроцессорыКоллекций.ИзКоллекции(ОписаниеПакета.ИсполняемыеФайлы()) - .Обработать("Результат = Новый Файл(ОбъединитьПути(ДополнительныеПараметры.КаталогУстановки, Элемент.Путь)).Путь", Новый Структура("КаталогУстановки", КаталогУстановки)) - .Различные() - .ВМассив(); - - ШаблонТекстаКонфигурационногоФайла = "lib.additional=%1"; - - Для Каждого КаталогИсполняемогоФайла Из КаталогиИсполняемыхФайлов Цикл - - РазделительПути = "/"; - РазницаВКаталогах = ФС.ОтносительныйПуть(КаталогУстановки, КаталогИсполняемогоФайла, РазделительПути); - Директории = СтрРазделить(РазницаВКаталогах, РазделительПути); - - ПутьКЛокальнымБиблиотекам = ПроцессорыКоллекций.ИзКоллекции(Директории) - .Обработать("Результат = ""../""") - .Сократить("Результат = Результат + Элемент", ""); - - ПутьКЛокальнымБиблиотекам = ПутьКЛокальнымБиблиотекам + КонстантыOpm.ЛокальныйКаталогУстановкиПакетов; - - ТекстКонфигурационногоФайла = СтрШаблон(ШаблонТекстаКонфигурационногоФайла, ПутьКЛокальнымБиблиотекам); - ПутьККонфигурационномуФайлу = ОбъединитьПути(КаталогИсполняемогоФайла, "oscript.cfg"); - - ТекстовыйДокумент = Новый ТекстовыйДокумент; - ТекстовыйДокумент.УстановитьТекст(ТекстКонфигурационногоФайла); - ТекстовыйДокумент.Записать(ПутьККонфигурационномуФайлу, КодировкаТекста.UTF8NoBOM); - - КонецЦикла; - -КонецПроцедуры - -Процедура СоздатьСкриптЗапуска(Знач ИмяСкриптаЗапуска, Знач ПутьФайлаПриложения, Знач Каталог) Экспорт - - Если ЭтоWindows Тогда - ФайлЗапуска = Новый ЗаписьТекста(ОбъединитьПути(Каталог, ИмяСкриптаЗапуска + ".bat"), "cp866"); - ФайлЗапуска.ЗаписатьСтроку("@oscript.exe """ + ПутьФайлаПриложения + """ %*"); - ФайлЗапуска.ЗаписатьСтроку("@exit /b %ERRORLEVEL%"); - ФайлЗапуска.Закрыть(); - КонецЕсли; - - Если (ЭтоWindows И НастройкиПриложенияOpm.Получить().СоздаватьShСкриптЗапуска) ИЛИ НЕ ЭтоWindows Тогда - ПолныйПутьКСкриптуЗапуска = ОбъединитьПути(Каталог, ИмяСкриптаЗапуска); - ФайлЗапуска = Новый ЗаписьТекста(ПолныйПутьКСкриптуЗапуска, КодировкаТекста.UTF8NoBOM,,, Символы.ПС); - ФайлЗапуска.ЗаписатьСтроку("#!/bin/bash"); - СтрокаЗапуска = "oscript"; - Если ЭтоWindows Тогда - СтрокаЗапуска = СтрокаЗапуска + " -encoding=utf-8"; - КонецЕсли; - СтрокаЗапуска = СтрокаЗапуска + " """ + ПутьФайлаПриложения + """ ""$@"""; - ФайлЗапуска.ЗаписатьСтроку(СтрокаЗапуска); - ФайлЗапуска.Закрыть(); - - Если НЕ ЭтоWindows Тогда - ЗапуститьПриложение("chmod +x """ + ПолныйПутьКСкриптуЗапуска + """"); - КонецЕсли; - КонецЕсли; - -КонецПроцедуры - -Функция ПрочитатьМетаданныеПакета(Знач ФайлМетаданных) - - Перем Метаданные; - Лог.Отладка("Чтение метаданных пакета"); - Попытка - Чтение = Новый ЧтениеXML; - Чтение.ОткрытьФайл(ФайлМетаданных); - Лог.Отладка("XML загружен"); - Сериализатор = Новый СериализацияМетаданныхПакета; - Метаданные = Сериализатор.ПрочитатьXML(Чтение); - - Чтение.Закрыть(); - Исключение - Чтение.Закрыть(); - ВызватьИсключение; - КонецПопытки; - Лог.Отладка("Метаданные прочитаны"); - - Возврат Метаданные; - -КонецФункции - -Процедура СохранитьФайлМетаданныхПакета(Знач КаталогУстановки, Знач ПутьКФайлуМетаданных) - - ПутьСохранения = ОбъединитьПути(КаталогУстановки, КонстантыOpm.ИмяФайлаМетаданныхПакета); - ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлуМетаданных); - ДанныеФайла.Записать(ПутьСохранения); - -КонецПроцедуры - -////////////////////////////////////////////////////////////////////////////////// -// - -Функция ИзвлечьОбязательныйФайл(Знач Чтение, Знач ИмяФайла) - Лог.Отладка("Извлечение: " + ИмяФайла); - Элемент = Чтение.Элементы.Найти(ИмяФайла); - Если Элемент = Неопределено Тогда - ВызватьИсключение "Неверная структура пакета. Не найден файл " + ИмяФайла; - КонецЕсли; - - Чтение.Извлечь(Элемент, мВременныйКаталогУстановки); - - Возврат ОбъединитьПути(мВременныйКаталогУстановки, ИмяФайла); - -КонецФункции - -Лог = Логирование.ПолучитьЛог("oscript.app.opm"); -СИ = Новый СистемнаяИнформация(); -ЭтоWindows = Найти(СИ.ВерсияОС, "Windows") > 0; -мРежимУстановкиПакетов = РежимУстановкиПакетов.Глобально; -мРежимУстановкиПакетовСохраненный = РежимУстановкиПакетов.Глобально; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\227\320\265\321\200\320\272\320\260\320\273\320\260.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\227\320\265\321\200\320\272\320\260\320\273\320\260.os" deleted file mode 100644 index b66bf4f..0000000 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\227\320\265\321\200\320\272\320\260\320\273\320\260.os" +++ /dev/null @@ -1,96 +0,0 @@ -#Использовать logos - -Перем ПодключенноеЗеркало Экспорт; -Перем Зеркала; -Перем Лог; - -// ИмяРесурса - имя файла относительно "Сервер/ПутьВХранилище" -// Возвращает HttpОтвет или Неопределено, если ни один сервер не вернул ответ. -Функция ПолучитьРесурс(Знач ИмяРесурса) Экспорт - - РесурсУспешноПолучен = Ложь; - - Если ПодключенноеЗеркало = Неопределено Тогда - - Если Зеркала = Неопределено Тогда - Инициализация(); - КонецЕсли; - - Для Каждого мЗеркало Из Зеркала Цикл - - Ответ = мЗеркало.ПолучитьРесурс(ИмяРесурса); - Если Ответ = Неопределено Тогда - Продолжить; - КонецЕсли; - - Если Ответ.КодСостояния = 200 Тогда - - РесурсУспешноПолучен = Истина; - ПодключенноеЗеркало = мЗеркало; - Прервать; - - КонецЕсли; - - ТекстОшибки = СтрШаблон("Ошибка подключения к хабу %1 <%2>", - мЗеркало.СерверУдаленногоХранилища, - Ответ.КодСостояния); - - Ответ.Закрыть(); - - Лог.Информация(ТекстОшибки); - - КонецЦикла; - - Иначе - - Ответ = ПодключенноеЗеркало.ПолучитьРесурс(ИмяРесурса); - Если Ответ.КодСостояния = 200 Тогда - РесурсУспешноПолучен = Истина; - Иначе - - ТекстОшибки = СтрШаблон("Ошибка подключения к хабу %1 <%2>", - ПодключенноеЗеркало.СерверУдаленногоХранилища, - Ответ.КодСостояния); - - Ответ.Закрыть(); - Лог.Информация(ТекстОшибки); - - КонецЕсли; - - КонецЕсли; - - Если РесурсУспешноПолучен Тогда - - ТекстСообщения = СтрШаблон("Ресурс %1 успешно получен с %2", ИмяРесурса, ПодключенноеЗеркало.СерверУдаленногоХранилища); - Лог.Отладка(ТекстСообщения); - - Возврат Ответ; - - КонецЕсли; - - Возврат Неопределено; - -КонецФункции - -Процедура Добавить(Знач Зеркало) Экспорт - Зеркала.Добавить(Зеркало); -КонецПроцедуры - -Процедура Инициализация() - - Лог = Логирование.ПолучитьЛог("oscript.app.opm"); - - Зеркала = Новый Массив; - - ОсновноеЗеркало = Новый("Зеркало"); - ОсновноеЗеркало.СерверУдаленногоХранилища = КонстантыOpm.СерверУдаленногоХранилища; - ОсновноеЗеркало.ПутьВХранилище = КонстантыOpm.ПутьВХранилище; - - ЗапасноеЗеркало = Новый("Зеркало"); - ЗапасноеЗеркало.СерверУдаленногоХранилища = КонстантыOpm.СерверЗапасногоХранилища; - ЗапасноеЗеркало.ПутьВХранилище = КонстантыOpm.ПутьВЗапасномХранилище; - - Зеркала.Добавить(ОсновноеЗеркало); - Зеркала.Добавить(ЗапасноеЗеркало); - -КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" deleted file mode 100644 index a6469cf..0000000 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\237\321\200\320\270\320\273\320\276\320\266\320\265\320\275\320\270\321\217Opm.os" +++ /dev/null @@ -1,239 +0,0 @@ - -#Использовать json -#Использовать logos - -Перем мНастройки; -Перем мПутьФайлаНастроек; -Перем Лог; - -Процедура УстановитьФайлНастроек(Знач Путь) Экспорт - - мПутьФайлаНастроек = Путь; - мНастройки = Неопределено; - -КонецПроцедуры - -Функция Получить() Экспорт - Перем МассивПутейНастроек; - - Если мНастройки = Неопределено Тогда - - МассивПутейНастроек = СписокФайловНастроек(); - Если Не ПустаяСтрока(мПутьФайлаНастроек) Тогда - МассивПутейНастроек.Очистить(); - МассивПутейНастроек.Добавить(мПутьФайлаНастроек); - КонецЕсли; - - НастройкиНайдены = Ложь; - Для каждого Элемент из МассивПутейНастроек Цикл - мСтарыйПуть = мПутьФайлаНастроек; - УстановитьФайлНастроек(Элемент); - Если НЕ Новый Файл(Элемент).Существует() Тогда - Продолжить; - КонецЕсли; - Попытка - ПрочитатьФайлНастроек(); - НастройкиНайдены = Истина; - Прервать; - Исключение - Лог.Отладка("Чтение файла настроек " + мПутьФайлаНастроек+": - |" + ОписаниеОшибки()); - - КонецПопытки; - КонецЦикла; - - Если НЕ НастройкиНайдены Тогда - УстановитьНастройкиПоУмолчанию(); - КонецЕсли; - - КонецЕсли; - - Возврат мНастройки; - -КонецФункции - -Процедура ПрочитатьФайлНастроек() - - Если Не ЗначениеЗаполнено(мПутьФайлаНастроек) Тогда - ВызватьИсключение "Не установлен файл настроек"; - КонецЕсли; - - Текст = ПрочитатьФайл(мПутьФайлаНастроек); - - Чтение = Новый ПарсерJSON; - Настройки = Чтение.ПрочитатьJSON(Текст,,,Истина); - - // TODO сделать конвертацию терминов json в русские свойства настроек - - мНастройки = ЗаполнитьНесуществующиеНастройкиПоУмолчанию(Настройки); - - УстановитьЧисловоеЗначениеПортаСервера(мНастройки); -КонецПроцедуры - -Функция ПрочитатьФайл(Знач Путь) - - Чтение = Новый ЧтениеТекста(Путь); - Текст = Чтение.Прочитать(); - Чтение.Закрыть(); - - Возврат Текст; - -КонецФункции - -Процедура СохранитьФайл(Знач Текст,Знач Путь) - - Запись = Новый ЗаписьТекста(Путь); - Запись.ЗаписатьСтроку(Текст); - Запись.Закрыть(); - - КонецПроцедуры - -Процедура УстановитьНастройкиПоУмолчанию() - мНастройки = НастройкиПоУмолчанию(); -КонецПроцедуры - -Функция ЗаполнитьНесуществующиеНастройкиПоУмолчанию(Знач Настройки, НовыеНастройки = Неопределено) - Если НовыеНастройки = Неопределено Тогда - НовыеНастройки = НастройкиПоУмолчанию(); - КонецЕсли; - Для каждого Настройка Из Настройки Цикл - Значение = Настройка.Значение; - Если ТипЗнч(Значение) = Тип("Структура") Тогда - Значение = ЗаполнитьНесуществующиеНастройкиПоУмолчанию(Значение, НовыеНастройки[Настройка.Ключ]); - КонецЕсли; - НовыеНастройки.Вставить(Настройка.Ключ, Значение); - КонецЦикла; - Возврат НовыеНастройки; -КонецФункции - -Функция НастройкиПоУмолчанию() - Рез = Новый Структура; - НастройкиПроксиПоУмолчанию = НастройкиПроксиПроксиПоУмолчанию(); - Рез.Вставить("Прокси", НастройкиПроксиПоУмолчанию); - Рез.Вставить("СоздаватьShСкриптЗапуска", Ложь); - НастройкиПоУмолчаниюРепо = Новый Массив; - НастройкиПоУмолчаниюРепо.Добавить(НастройкиСервераПакетовПоУмолчанию()); - - Рез.Вставить("СервераПакетов", НастройкиПоУмолчаниюРепо); - Возврат Рез; -КонецФункции - -Функция НастройкиСервераПакетовПоУмолчанию() - - Результат = Новый Структура; - Результат.Вставить("Имя", "defaultrepo"); - Результат.Вставить("Сервер", КонстантыOpm.СерверУдаленногоХранилища); - Результат.Вставить("ПутьНаСервере", КонстантыOpm.ПутьВХранилище); - Результат.Вставить("Порт", 80); - - Возврат Результат; - -КонецФункции // - -Функция НастройкиПроксиПроксиПоУмолчанию() - - СтруктураПрокси = Новый Структура(); - СтруктураПрокси.Вставить("ИспользоватьПрокси", Ложь); - СтруктураПрокси.Вставить("ПроксиПоУмолчанию", Истина); - СтруктураПрокси.Вставить("Сервер"); - СтруктураПрокси.Вставить("Порт", 0); - СтруктураПрокси.Вставить("Пользователь"); - СтруктураПрокси.Вставить("Пароль"); - СтруктураПрокси.Вставить("ИспользоватьАутентификациюОС",Ложь); - - Возврат СтруктураПрокси; -КонецФункции - -Процедура УстановитьЧисловоеЗначениеПортаСервера(Настройки) - Для каждого Настройка Из Настройки Цикл - Значение = Настройка.Значение; - Если НРег(Настройка.Ключ) = "порт" Тогда - Если Не ЗначениеЗаполнено(Значение) Тогда - Значение = 0; - Иначе - Значение = Число(Значение); - КонецЕсли; - Иначе - - Если ТипЗнч(Значение) = Тип("Структура") Тогда - УстановитьЧисловоеЗначениеПортаСервера(Значение); - КонецЕсли; - - КонецЕсли; - - Настройки.Вставить(Настройка.Ключ, Значение); - КонецЦикла; -КонецПроцедуры - -Процедура СохранитьНастройки(Знач Параметры) Экспорт - Получить(); - ЗаполнитьНастройкиИзПараметров(Параметры); - Текст = СформироватьТекстНастроек(мНастройки); - СохранитьФайл(Текст,мПутьФайлаНастроек); - //Сообщить(мПутьФайлаНастроек); -КонецПроцедуры - -Функция СформироватьТекстНастроек(Знач Настройки) - ТекстНастроек = ""; - Json = Новый ПарсерJSON; - ТекстНастроек = Json.ЗаписатьJSON(Настройки); - - Возврат ТекстНастроек; -КонецФункции - -Процедура ЗаполнитьНастройкиИзПараметров(знач ЗначенияПараметров) - - мНастройки.Прокси.ПроксиПоУмолчанию = НЕ ЗначенияПараметров["-proxyusedefault"] = Неопределено; - мНастройки.Прокси.Сервер = ?(ЗначенияПараметров["-proxyserver"] = Неопределено, мНастройки.Прокси.Сервер, ЗначенияПараметров["-proxyserver"]); - мНастройки.Прокси.Порт = ?(ЗначенияПараметров["-proxyport"] = Неопределено, мНастройки.Прокси.Порт, ЗначенияПараметров["-proxyport"]); - мНастройки.Прокси.Пользователь = ?(ЗначенияПараметров["-proxyuser"] = Неопределено, мНастройки.Прокси.Пользователь, ЗначенияПараметров["-proxyuser"]); - мНастройки.Прокси.Пароль = ?(ЗначенияПараметров["-proxypass"] = Неопределено, мНастройки.Прокси.Пароль, ЗначенияПараметров["-proxypass"]); - - Если мНастройки.Прокси.ПроксиПоУмолчанию Тогда - мНастройки.Прокси.Сервер = ""; - мНастройки.Прокси.Порт = 0; - мНастройки.Прокси.Пользователь = ""; - мНастройки.Прокси.Пароль = ""; - КонецЕсли; - - мНастройки.Прокси.ИспользоватьПрокси = мНастройки.Прокси.ПроксиПоУмолчанию ИЛИ ЗначениеЗаполнено(мНастройки.Прокси.Сервер); - - мНастройки.СоздаватьShСкриптЗапуска = ?( - ЗначенияПараметров["-winCreateBashLauncher"] = Неопределено, - мНастройки.СоздаватьShСкриптЗапуска, - Булево(ЗначенияПараметров["-winCreateBashLauncher"]) - ); - -КонецПроцедуры -//------------ - -// Возвращает массив путей, где может находиться файла настроек opm -// Текущий каталог запуска, домашний каталог пользователя, системная настройка, каталог opm (для совместимости). -Функция СписокФайловНастроек() - Перем ИмяФайл; - ИмяФайл = КонстантыOpm.ИмяФайлаНастроек; - МассивФайлов = Новый Массив; - //Текущий каталог - МассивФайлов.Добавить(ОбъединитьПути(ТекущийКаталог(), ИмяФайл)); - //Настройки в профиле пользователя. - ПутьКНастройкам = ""; - СИ = Новый СистемнаяИнформация(); - Если Найти(Нрег(СИ.ВерсияОС), Нрег("Windows")) > 0 Тогда - ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("USERPROFILE")), ИмяФайл); - ПутьКНастройкамСистемный = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("ALLUSERSPROFILE")), ИмяФайл); - Иначе - ПутьКНастройкам = ОбъединитьПути(ПолучитьПеременнуюСреды(Врег("HOME")), "."+ИмяФайл); - ПутьКНастройкамСистемный = ОбъединитьПути("/etc", ИмяФайл); - КонецЕсли; - - МассивФайлов.Добавить(ПутьКНастройкам); - МассивФайлов.Добавить(ПутьКНастройкамСистемный); - - //Совместимость со старым поведением - МассивФайлов.Добавить(ОбъединитьПути(СтартовыйСценарий().Каталог, ИмяФайл)); - - Возврат МассивФайлов; - -КонецФункции - -Лог = Логирование.ПолучитьЛог("oscript.app.opm"); \ No newline at end of file diff --git a/tasks/test.os b/tasks/test.os index 2881de7..a84e84d 100644 --- a/tasks/test.os +++ b/tasks/test.os @@ -1,5 +1,5 @@ #Использовать 1testrunner -#Использовать "../src" +#Использовать "../src/core" Процедура ПровестиТестирование() diff --git a/tests/build-install-test.os b/tests/build-install-test.os index 834d332..61f2ea6 100644 --- a/tests/build-install-test.os +++ b/tests/build-install-test.os @@ -1,7 +1,7 @@ #Использовать asserts #Использовать fs #Использовать tempfiles -//#Использовать "../src/Модули" +#Использовать "../src/core" Перем юТест; Перем мВременныеФайлы; @@ -87,10 +87,9 @@ ФайлПакетаВерсии2 = Новый Файл(ОбъединитьПути(КаталогСборкиВторойВерсии, "test-0.3.2.ospx")); - Установщик = Новый УстановкаПакета; + Установщик = Новый МенеджерУстановкиПакетов(); Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); - - Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии1.ПолноеИмя); + Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии1.ПолноеИмя, Истина); ПутьКФайлуOsТестовогоПакета = ОбъединитьПути( КонстантыOpm.ЛокальныйКаталогУстановкиПакетов, "test","folder","src.os"); @@ -103,7 +102,7 @@ Ожидаем.Что(ФайлOsИзСтарогоПакета.Существует(), "Файл src.os должен существовать").ЭтоИстина(); Ожидаем.Что(ФайлDllИзСтарогоПакета.Существует(), "Файл src.dll должен существовать").ЭтоИстина(); - Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии2.ПолноеИмя); + Установщик.УстановитьПакетИзАрхива(ФайлПакетаВерсии2.ПолноеИмя, Истина); Ожидаем.Что(ФайлOsИзСтарогоПакета.Существует(), "Файл src.os не должен существовать, потому что мы установили новую версию").ЭтоЛожь(); Ожидаем.Что(ФайлDllИзСтарогоПакета.Существует(), "Файл src.dll не должен существовать, потому что мы установили новую версию").ЭтоЛожь(); diff --git a/tests/download.os b/tests/download.os index 061edc5..d053881 100644 --- a/tests/download.os +++ b/tests/download.os @@ -2,8 +2,11 @@ #Использовать fs #Использовать tempfiles -#Использовать "../src" +#Использовать "../src/core" +#Использовать "../src/cmd" + +Перем Лог; Перем юТест; Перем мВременныеФайлы; @@ -43,15 +46,23 @@ Проц.Завершить(); Исключение КонецПопытки; + КонецПроцедуры Процедура ТестДолжен_СкачатьПакетыСЛокальногоХранилища() Экспорт - Файл = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "opm-servers.cfg")); - НастройкиПриложенияOpm.УстановитьФайлНастроек(Файл.ПолноеИмя); + ФайлНастройки = Новый Файл(ОбъединитьПути(ТекущийСценарий().Каталог, "fixtures", "opm-servers.cfg")); + Сборщик = Новый СборщикПакета; + КаталогПакета = ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"); + КопироватьФайл(ФайлНастройки.ПолноеИмя, ОбъединитьПути(КаталогПакета, КонстантыOpm.ИмяФайлаНастроек)); + + мТекущийКаталог = ТекущийКаталог(); + + УстановитьТекущийКаталог(КаталогПакета); + - Сборщик.СобратьПакет(ОбъединитьПути(ТекущийСценарий().Каталог, "testpackage", "testpackage-0.3.1"), Неопределено, КаталогСборки); + Сборщик.СобратьПакет(КаталогПакета, Неопределено, КаталогСборки); ФайлПакета = Новый Файл(ОбъединитьПути(КаталогСборки, "test-0.3.1.ospx")); Утверждения.ПроверитьИстину(ФайлПакета.Существует(), "Файл пакета должен существовать"); @@ -64,21 +75,30 @@ Запись.ЗаписатьСтроку("test"); Запись.Закрыть(); - Кэш = Новый КэшПакетовХаба; - Пакеты = Кэш.ПолучитьПакетыХаба(); + ПараметрыПриложенияOpm.НастроитьOpm(); - Утверждения.ПроверитьЗаполненность(Пакеты.Получить("test"), "Пакета test не существует на внутреннем хабе."); + МенеджерПолучения = Новый МенеджерПолученияПакетов(); - Установщик = Новый УстановкаПакета; - Установщик.УстановитьРежимУстановкиПакетов(РежимУстановкиПакетов.Локально); + Лог.Отладка("Количество доступных пакетов <%1>", МенеджерПолучения.ПолучитьДоступныеПакеты().Количество()); + + ПакетТестДоступен = МенеджерПолучения.ПакетДоступен("test"); + + Утверждения.ПроверитьИстину(ПакетТестДоступен, "Пакета test не существует на внутреннем хабе."); + + МенеджерПолучения = Неопределено; - Установщик.УстановитьПакетИзОблака("test"); + РаботаСПакетами.УстановитьПакетИзОблака("test", РежимУстановкиПакетов.Локально, Неопределено); КэшЛокальный = Новый КэшУстановленныхПакетов; Пакеты = КэшЛокальный.ПолучитьУстановленныеПакеты(); ПутьККаталогу = ОбъединитьПути(ТекущийКаталог(), "oscript_modules", "test"); Утверждения.ПроверитьИстину(Новый Файл(ПутьККаталогу).Существует(), "Пакет не существует на локальной машине."); + УдалитьФайлы(ОбъединитьПути(КаталогПакета, КонстантыOpm.ИмяФайлаНастроек)); + + УстановитьТекущийКаталог(мТекущийКаталог); - КонецПроцедуры + +Лог = Логирование.ПолучитьЛог("oscript.app.opm"); +//Лог.УстановитьУровень(УровниЛога.Отладка); \ No newline at end of file diff --git a/tests/packagelist.os b/tests/packagelist.os index 7480b9f..258569f 100644 --- a/tests/packagelist.os +++ b/tests/packagelist.os @@ -1,5 +1,5 @@ - -#Использовать asserts +#Использовать asserts +#Использовать "../src/core" Перем юТест; @@ -18,8 +18,8 @@ Функция ТестДолжен_ПолучитьПакетыХаба() Экспорт - ПакетыХаба = Новый КэшПакетовХаба; - СписокПакетовХаба = ПакетыХаба.ПолучитьПакетыХаба(); + МенеджерПолучения = Новый МенеджерПолученияПакетов(); + СписокПакетовХаба = МенеджерПолучения.ПолучитьДоступныеПакеты(); Ожидаем.Что(СписокПакетовХаба.Количество()).Больше(1); Ожидаем.Что(СписокПакетовХаба.Получить("gitsync")).Равно(Истина);