Как я могу изменить $ url пакета Chocolatey для установки
Версия TLDR: мне нужно иметь возможность добавить в конец URL, который шоколадный пакет указывает для источника загрузки.
Я пытаюсь использовать Chocolatey для установки пакета Android-SDK, и у меня возникла проблема с фильтрующим прокси-сервером (функциональность и предоставление которого я не могу контролировать). Прокси-сервер обнаружен правильно, но он заблокирует URL-адреса, содержащие определенные шаблоны, и выдаст возврат 403 (в данном случае это потому, что URL-адрес .exe
). Так работает choco install -y android-sdk
вызывает следующую ошибку.
2015-03-12 15:14:47,639 [INFO ] - ============================================================
2015-03-12 15:14:47,664 [INFO ] - Chocolatey v0.9.9.2
2015-03-12 15:14:47,730 [INFO ] - Installing the following packages:
2015-03-12 15:14:47,753 [INFO ] - android-sdk
2015-03-12 15:14:47,754 [INFO ] - By installing you accept licenses for the packages.
2015-03-12 15:14:49,221 [INFO ] -
android-sdk v24.0.2
2015-03-12 15:14:50,525 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,175 [INFO ] - Attempt to get headers for http://dl.google.com/android/installer_r24.0.2-windows.exe failed.
2015-03-12 15:14:52,175 [INFO ] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,180 [INFO ] - Downloading android-sdk 32 bit
2015-03-12 15:14:52,180 [INFO ] - from 'http://dl.google.com/android/installer_r24.0.2-windows.exe'
2015-03-12 15:14:52,213 [INFO ] - Using this proxyserver: xxx.xxx.xxx.xxx:xxxxx
2015-03-12 15:14:52,329 [ERROR] - Exception calling "GetResponse" with "0" argument(s): "The remote server returned an error: (403) Forbidden."
2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
2015-03-12 15:14:52,330 [ERROR] - + $res = $req.GetResponse();
2015-03-12 15:14:52,330 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:52,331 [ERROR] - + CategoryInfo : NotSpecified: (:) [], MethodInvocationException
2015-03-12 15:14:52,331 [ERROR] - + FullyQualifiedErrorId : WebException
2015-03-12 15:14:52,354 [ERROR] - You cannot call a method on a null-valued expression.
2015-03-12 15:14:52,354 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:138 char:3
2015-03-12 15:14:52,355 [ERROR] - + $res.Close();
2015-03-12 15:14:52,356 [ERROR] - + ~~~~~~~~~~~~
2015-03-12 15:14:52,356 [ERROR] - + CategoryInfo : InvalidOperation: (:) [], RuntimeException
2015-03-12 15:14:52,357 [ERROR] - + FullyQualifiedErrorId : InvokeMethodOnNull
2015-03-12 15:14:54,374 [ERROR] - Chocolatey expected a file to be downloaded to
2015-03-12 15:14:54,375 [ERROR] - 'X:\Users\xxx\AppData\Local\Temp\chocolatey\android-sdk\android-sdkInstall.exe' but nothing exists at that
2015-03-12 15:14:54,375 [ERROR] - location.
2015-03-12 15:14:54,376 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-ChocolateyWebFile.ps1:148 char:24
2015-03-12 15:14:54,376 [ERROR] - + if (!($fi.Exists)) {{ throw "Chocolatey expected a file to be downloaded to `'$ ...
2015-03-12 15:14:54,377 [ERROR] - + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2015-03-12 15:14:54,377 [ERROR] - + CategoryInfo : OperationStopped: (Chocolatey expe... that location.:String) [], RuntimeException
2015-03-12 15:14:54,378 [ERROR] - + FullyQualifiedErrorId : Chocolatey expected a file to be downloaded to 'X:\Users\xxx\AppData\Local\Temp\cho
2015-03-12 15:14:54,378 [ERROR] - colatey\android-sdk\android-sdkInstall.exe' but nothing exists at that location.
2015-03-12 15:14:54,618 [ERROR] - android-sdk install not successful.
2015-03-12 15:14:54,621 [ERROR] - Error while running 'C:\ProgramData\chocolatey\lib\android-sdk\tools\chocolateyInstall.ps1'.
See log for details.
2015-03-12 15:14:56,643 [WARN ] -
Chocolatey installed 0/1 package(s). 1 package(s) failed.
See the log for details.
2015-03-12 15:14:56,643 [ERROR] - Failures:
2015-03-12 15:14:56,645 [ERROR] - - android-sdk
Я мог бы создать свой собственный пакет с chocolateyInstall.ps1
а также chocolateyUninstall.ps1
перечислены на веб-странице пакета и измените URL, но это сводит на нет любые преимущества использования диспетчера пакетов для упрощения процесса управления программами и зависимостями.
Поэтому мне интересно, есть ли способ, которым я могу просто добавить строку, которая позволяет URL через прокси-сервер, независимо от расширения файла (чтобы быть понятным, я знаю, что это за строка, я просто не знаю, как добавить ее на URL, указанный в пакете).
1 ответ
Это не полный ответ, и я не уверен, насколько безопасен этот ответ (с точки зрения сохранившихся обновлений самого Chocolatey), но он решил мою непосредственную проблему с пакетом android-sdk. К сожалению, любой пакет, который реализует свой собственный код загрузки, обходит это "исправление".
Я заметил строку в журнале ошибок, которая выделяет одну из точек отказа как 2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3
и задавался вопросом, могу ли я изменить URL в этом скрипте powershell. После небольшого количества проб и ошибок с точным экранированием, которое было необходимо для добавленной строки, мне удалось загрузить файл, но проверка заголовка все еще не прошла.
Затем я проверил другие файлы в helpers/functions/
каталог и найден Get-ChocolateyWebFile.ps1
что кажется Get-WebFile.ps1
а также проверяет заголовок, нужен ли ему SSL.
Итак, я создал новый файл функции powershell для выполнения необходимых перезаписей URL в функции с именем Get-ProxyUrl
и добавил эту строку в Get-ChocolateyWebFile.ps1
после раздела, который проверяет 32-битный /64-битный URL, но перед заголовком, проверьте URL (строка 101 в моем файле версии 0.9.9.2).
$url = Get-ProxyUrl($url)
Затем я также добавил его в самом начале Get-WebFile
определение функции в Get-WebFile.ps1
захватывать любые прямые вызовы этой функции.
Итак, это позволит мне исправить любые пакеты, которые используют Install-ChocolateyPackage
, Get-ChocolateyWebFile
или же Get-WebFile
, но все еще оставляет некоторые пакеты - такие как JDK8 - которые указывают свой собственный код загрузки файла и все еще терпят неудачу.
Таким образом, лучшее решение будет захватывать любые URL-адреса из установки Chocolatey... возможно, единственный способ сделать это - установить локальный прокси-сервер, который может использовать Chocolatey, который преобразует URL-адрес перед передачей.