【问题标题】:R CMD check fails with ubuntu when trying to download file, but function works within R尝试下载文件时,R CMD检查在ubuntu中失败,但功能在R中有效
【发布时间】:2021-06-02 16:09:17
【问题描述】:

我正在编写一个 R 包,它的一个功能从链接下载并解压缩文件(但它不会导出给用户):

download_f <- function(download_dir) {
  utils::download.file(
    url = "https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php",
    destfile = file.path(download_dir, "fines.rar"),
    mode = 'wb',
    method = 'libcurl'
  )

  utils::unzip(
    zipfile = file.path(download_dir, "fines.rar"),
    exdir = file.path(download_dir)
  )
}

当我在其他函数中运行该函数以编译小插图中的示例时,该函数对我很有效。

但是,在 github 操作中使用 R CMD 检查,它在 ubuntu 16.04、发布和开发中始终失败。它[说][1]:

Error: Error: processing vignette 'IBAMA.Rmd' failed with diagnostics:
cannot open URL 'https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php'
--- failed re-building ‘IBAMA.Rmd’

SUMMARY: processing the following file failed:
  ‘IBAMA.Rmd’

Error: Error: Vignette re-building failed.
Execution halted
Error: Error in proc$get_built_file() : Build process failed
Calls: <Anonymous> ... build_package -> with_envvar -> force -> <Anonymous>
Execution halted
Error: Process completed with exit code 1.

当我运行devtools::check() 时,它永远不会完成运行,永远停留在“创建小插曲”中。我不知道这些问题是否相关,因为包装上还有其他小插曲。

我通过 mac os 和 windows 的 R CMD 检查。我尝试在utils::download.file 上切换“模式”和“方法”参数,但无济于事。

有什么建议吗? [1]:https://github.com/datazoompuc/datazoom.amazonia/pull/16/checks?check_run_id=2026865974

【问题讨论】:

  • 可能是firewall problem
  • 但是谁的防火墙?我不明白 github 操作是如何工作的,因为我的服务器是 Windows....
  • 我的理解是 github 操作在自己的服务器上运行检查,但我从未使用过它:希望有这方面经验的人可以提供帮助
  • 我可以在本地 Ubuntu 18.04 机器上重现此问题。这可能类似于我曾经遇到的一个问题:unix.stackexchange.com/questions/559526/… - 我得到了一个非常好的答案。在这种情况下,问题不会出在您的网站上,而是下载服务器的配置错误。
  • 如果这个问题确实和我的一样,那么你应该写信给servicos.ibama.gov.br的管理员并告知他们这个问题。如果您现在需要解决方案并且不能等待他们做出反应,那么您可以尝试按照我的问题的第二个答案中建议的方式进行破解。您必须在 github 操作中添加一些代码才能手动安装中间证书。这将使检查通过,但当然你的包的一些用户可能会遇到这个问题。

标签: r ssl testing github-actions devtools


【解决方案1】:

下载失败,因为 libcurl 尝试验证网络服务器证书,但无法验证。

我可以在我的系统上重现这个:

trying URL 'https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php'
Error in utils::download.file(url = "https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php",  : 
  cannot open URL 'https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php'
In addition: Warning message:
In utils::download.file(url = "https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php",  :
  URL 'https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php': status was 'SSL peer certificate or SSH remote key was not OK'

服务器不允许你从 http 下载,而是重定向到 https,所以现在唯一要做的就是告诉 libcurl 不要检查证书并接受它得到的。

您可以通过将参数-k 指定为curl 来做到这一点

download_f <- function(download_dir) {
  utils::download.file(
    url = "https://servicos.ibama.gov.br/ctf/publico/areasembargadas/downloadListaAreasEmbargadas.php",
    destfile = file.path(download_dir, "fines.rar"),
    mode = 'wb',
    method = 'curl',
    extra = '-k'
  ) 
  
  utils::unzip(
    zipfile = file.path(download_dir, "fines.rar"),
    exdir = file.path(download_dir)
  ) 
} 

这也会产生一些下载进度条,您可以通过将 extra 设置为 -k -s 来使其静音

现在这会让你看到一台处于中间攻击的机器。 (你可能已经被这种方式攻击了,如果不与对方认识的人验证当前证书,就无法检查) 所以你可以实施额外的检查,例如检查下载文件的 sha256sum,看看它是否与您期望收到的相符,然后再继续。

myfile <- system.file("fines.rar")
hash <- sha256(file(myfile))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多