如何更改Chocolatey包的$ url进行安装

时间:2015-03-12 15:35:20

标签: powershell proxy http-proxy 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.ps1chocolateyUninstall.ps1创建我自己的软件包并更改网址,但这无法使用软件包管理器来简化管理程序和依赖项的过程。

所以我想知道是否有某种方式可以简单地附加一个字符串,允许URL通过代理而不管文件扩展名(要清楚,我知道这个字符串是什么,我只是不要&t知道如何将它附加到包指定的URL。

1 个答案:

答案 0 :(得分:1)

这不是完整答案,我不确定安全这个答案是怎样的(就巧克力本身的更新而言),但它解决了我的问题android-sdk包的直接问题。不幸的是,任何实现自己的下载代码的软件包都会绕过这个"修复"。

我注意到错误日志中的一行突出显示其中一个失败点2015-03-12 15:14:52,330 [ERROR] - At C:\ProgramData\chocolatey\helpers\functions\Get-WebFile.ps1:66 char:3,并想知道我是否可以更改该PowerShell脚本中的URL。经过一些试验和错误以及附加字符串所需的精确转义后,我设法让它下载文件,但是标题检查仍然失败。

然后我检查了helpers/functions/目录中的其他文件,找到Get-ChocolateyWebFile.ps1这似乎是Get-WebFile.ps1的内容,并检查标头是否需要SSL。

因此,我创建了一个新的powershell函数文件,在名为Get-ProxyUrl的函数中执行必要的URL重写,并在检查32位/ 64位URL但在之前的部分之后将此行添加到Get-ChocolateyWebFile.ps1标题检查URL(我的0.9.9.2文件中的第101行)。

$url = Get-ProxyUrl($url)

然后我还将其添加到Get-WebFileGet-WebFile.ps1函数定义的最开头,以捕获对该函数的任何直接调用。

因此,这将允许我修复使用Install-ChocolateyPackageGet-ChocolateyWebFileGet-WebFile的任何软件包,但仍留下一些指定自己的文件下载代码的软件包(如JDK8)但仍然失败。

因此,一个更好的解决方案将捕获来自Chocolatey安装的任何URL ...可能唯一的方法是安装一个本地代理服务器,巧克力可以使用它将在传递之前转换URL