gnu: Add r-flowsom.
[jackhill/guix/guix.git] / guix / download.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
3961edf2 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
9884d7ec 3;;; Copyright © 2013, 2014, 2015 Andreas Enge <andreas@enge.fr>
95001d4b 4;;; Copyright © 2015 Federico Beffa <beffa@fbengineering.ch>
fe224d20 5;;; Copyright © 2016 Alex Griffin <a@ajgrf.com>
9c97afe8 6;;; Copyright © 2016 David Craven <david@craven.ch>
58f91e4d 7;;; Copyright © 2017 Tobias Geerinckx-Rice <me@tobias.gr>
bc4cea6f 8;;; Copyright © 2019 Guy Fleury Iteriteka <hoonandon@gmail.com>
62cab99c 9;;;
233e7676 10;;; This file is part of GNU Guix.
62cab99c 11;;;
233e7676 12;;; GNU Guix is free software; you can redistribute it and/or modify it
62cab99c
LC
13;;; under the terms of the GNU General Public License as published by
14;;; the Free Software Foundation; either version 3 of the License, or (at
15;;; your option) any later version.
16;;;
233e7676 17;;; GNU Guix is distributed in the hope that it will be useful, but
62cab99c
LC
18;;; WITHOUT ANY WARRANTY; without even the implied warranty of
19;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20;;; GNU General Public License for more details.
21;;;
22;;; You should have received a copy of the GNU General Public License
233e7676 23;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
62cab99c
LC
24
25(define-module (guix download)
26 #:use-module (ice-9 match)
27 #:use-module (guix derivations)
28 #:use-module (guix packages)
e87f0591 29 #:use-module (guix store)
b5b73a82 30 #:use-module ((guix build download) #:prefix build:)
6f8f8ccb
LC
31 #:use-module (guix monads)
32 #:use-module (guix gexp)
62cab99c 33 #:use-module (guix utils)
d8907ac4 34 #:use-module (web uri)
483f1158 35 #:use-module (srfi srfi-1)
94d222ad 36 #:use-module (srfi srfi-26)
ec4d308a 37 #:export (%mirrors
861693f3 38 url-fetch
95001d4b 39 url-fetch/tarbomb
814b099a 40 url-fetch/zipbomb
861693f3 41 download-to-store))
62cab99c
LC
42
43;;; Commentary:
44;;;
45;;; Produce fixed-output derivations with data fetched over HTTP or FTP.
46;;;
47;;; Code:
48
94d222ad
LC
49(define %mirrors
50 ;; Mirror lists used when `mirror://' URLs are passed.
51 (let* ((gnu-mirrors
52 '(;; This one redirects to a (supposedly) nearby and (supposedly)
53 ;; up-to-date mirror.
4918e7fc 54 "https://ftpmirror.gnu.org/gnu/"
94d222ad
LC
55
56 "ftp://ftp.cs.tu-berlin.de/pub/gnu/"
94d222ad
LC
57 "ftp://ftp.funet.fi/pub/mirrors/ftp.gnu.org/gnu/"
58
59 ;; This one is the master repository, and thus it's always
60 ;; up-to-date.
61 "http://ftp.gnu.org/pub/gnu/")))
62 `((gnu ,@gnu-mirrors)
63 (gcc
64 "ftp://ftp.nluug.nl/mirror/languages/gcc/"
65 "ftp://ftp.fu-berlin.de/unix/languages/gcc/"
66 "ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/"
67 "ftp://gcc.gnu.org/pub/gcc/"
68 ,@(map (cut string-append <> "/gcc") gnu-mirrors))
69 (gnupg
df851f5a
LF
70 "http://artfiles.org/gnupg.org"
71 "http://www.crysys.hu/"
72 "https://gnupg.org/ftp/gcrypt/"
d57b88be 73 "ftp://mirrors.dotsrc.org/gcrypt/"
94d222ad 74 "ftp://mirror.cict.fr/gnupg/"
d57b88be
AE
75 "ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/"
76 "ftp://ftp.freenet.de/pub/ftp.gnupg.org/gcrypt/"
d57b88be
AE
77 "ftp://ftp.hi.is/pub/mirrors/gnupg/"
78 "ftp://ftp.heanet.ie/mirrors/ftp.gnupg.org/gcrypt/"
79 "ftp://ftp.bit.nl/mirror/gnupg/"
80 "ftp://ftp.surfnet.nl/pub/security/gnupg/"
81 "ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.gnupg.org/"
82 "ftp://ftp.sunet.se/pub/security/gnupg/"
83 "ftp://mirror.switch.ch/mirror/gnupg/"
84 "ftp://mirror.tje.me.uk/pub/mirrors/ftp.gnupg.org/"
85 "ftp://ftp.mirrorservice.org/sites/ftp.gnupg.org/gcrypt/"
86 "ftp://ftp.ring.gr.jp/pub/net/gnupg/"
87 "ftp://ftp.gnupg.org/gcrypt/")
71eb5c10
LC
88 (gnome
89 "http://ftp.belnet.be/ftp.gnome.org/"
90 "http://ftp.linux.org.uk/mirrors/ftp.gnome.org/"
91 "http://ftp.gnome.org/pub/GNOME/"
93897a45 92 "https://download.gnome.org/"
71eb5c10 93 "http://mirror.yandex.ru/mirrors/ftp.gnome.org/")
442c2c99 94 (hackage
4c13aad0 95 "http://hackage.haskell.org/")
94d222ad 96 (savannah
a4eabecd 97 "http://download.savannah.gnu.org/releases/"
94d222ad
LC
98 "http://ftp.cc.uoc.gr/mirrors/nongnu.org/"
99 "http://ftp.twaren.net/Unix/NonGNU/"
100 "http://mirror.csclub.uwaterloo.ca/nongnu/"
101 "http://nongnu.askapache.com/"
102 "http://savannah.c3sl.ufpr.br/"
3f6d5b8a 103 "http://download.savannah.gnu.org/releases-noredirect/"
ecc58571
LF
104 "http://download-mirror.savannah.gnu.org/releases/"
105 "ftp://ftp.twaren.net/Unix/NonGNU/"
106 "ftp://mirror.csclub.uwaterloo.ca/nongnu/"
107 "ftp://mirror.publicns.net/pub/nongnu/"
108 "ftp://savannah.c3sl.ufpr.br/")
321dc4df 109 (sourceforge ; https://sourceforge.net/p/forge/documentation/Mirrors/
fe224d20 110 "http://downloads.sourceforge.net/project/"
cd4c41fd
LC
111 "http://ufpr.dl.sourceforge.net/project/"
112 "http://heanet.dl.sourceforge.net/project/"
113 "http://freefr.dl.sourceforge.net/project/"
114 "http://internode.dl.sourceforge.net/project/"
115 "http://jaist.dl.sourceforge.net/project/"
116 "http://kent.dl.sourceforge.net/project/"
117 "http://liquidtelecom.dl.sourceforge.net/project/"
05e172ca 118 ;; "http://nbtelecom.dl.sourceforge.net/project/" ;never returns 404s
cd4c41fd
LC
119 "http://nchc.dl.sourceforge.net/project/"
120 "http://ncu.dl.sourceforge.net/project/"
121 "http://netcologne.dl.sourceforge.net/project/"
122 "http://netix.dl.sourceforge.net/project/"
123 "http://pilotfiber.dl.sourceforge.net/project/"
124 "http://superb-sea2.dl.sourceforge.net/project/"
125 "http://tenet.dl.sourceforge.net/project/"
126 "http://vorboss.dl.sourceforge.net/project/"
127 "http://netassist.dl.sourceforge.net/project/")
7c7b802c
MB
128 (netfilter.org ; https://www.netfilter.org/mirrors.html
129 "http://ftp.netfilter.org/pub/"
130 "ftp://ftp.es.netfilter.org/mirrors/netfilter/"
131 "ftp://ftp.hu.netfilter.org/"
132 "ftp://www.lt.netfilter.org/pub/")
b40b259f 133 (kernel.org
b40b259f
LC
134 "http://ramses.wh2.tu-dresden.de/pub/mirrors/kernel.org/"
135 "http://linux-kernel.uio.no/pub/"
136 "http://kernel.osuosl.org/pub/"
5d9cd707 137 "http://ftp.be.debian.org/pub/"
ecc58571
LF
138 "http://mirror.linux.org.au/"
139 "ftp://ftp.funet.fi/pub/mirrors/ftp.kernel.org/pub/")
47f9db41
LC
140 (apache ; from http://www.apache.org/mirrors/dist.html
141 "http://www.eu.apache.org/dist/"
142 "http://www.us.apache.org/dist/"
47f9db41
LC
143 "http://apache.belnet.be/"
144 "http://mirrors.ircam.fr/pub/apache/"
f06afd4d
LC
145 "http://apache-mirror.rbc.ru/pub/apache/"
146
147 ;; As a last resort, try the archive.
148 "http://archive.apache.org/dist/")
149acc29 149 (xorg ; from http://www.x.org/wiki/Releases/Download
0820a58b 150 "http://www.x.org/releases/" ; main mirrors
ecc58571 151 "http://mirror.csclub.uwaterloo.ca/x.org/" ; North America
149acc29
AE
152 "http://xorg.mirrors.pair.com/"
153 "http://mirror.us.leaseweb.net/xorg/"
ecc58571
LF
154 "ftp://mirror.csclub.uwaterloo.ca/x.org/"
155 "ftp://xorg.mirrors.pair.com/"
149acc29
AE
156 "ftp://artfiles.org/x.org/" ; Europe
157 "ftp://ftp.chg.ru/pub/X11/x.org/"
158 "ftp://ftp.fu-berlin.de/unix/X11/FTP.X.ORG/"
159 "ftp://ftp.gwdg.de/pub/x11/x.org/"
160 "ftp://ftp.mirrorservice.org/sites/ftp.x.org/"
161 "ftp://ftp.ntua.gr/pub/X11/"
162 "ftp://ftp.piotrkosoft.net/pub/mirrors/ftp.x.org/"
163 "ftp://ftp.portal-to-web.de/pub/mirrors/x.org/"
164 "ftp://ftp.solnet.ch/mirror/x.org/"
149acc29
AE
165 "ftp://mi.mirror.garr.it/mirrors/x.org/"
166 "ftp://mirror.cict.fr/x.org/"
167 "ftp://mirror.switch.ch/mirror/X11/"
168 "ftp://mirrors.ircam.fr/pub/x.org/"
169 "ftp://x.mirrors.skynet.be/pub/ftp.x.org/"
ecc58571
LF
170 "http://x.cs.pu.edu.tw/" ; East Asia
171 "ftp://ftp.cs.cuhk.edu.hk/pub/X11"
149acc29
AE
172 "ftp://ftp.u-aizu.ac.jp/pub/x11/x.org/"
173 "ftp://ftp.yz.yamagata-u.ac.jp/pub/X11/x.org/"
174 "ftp://ftp.kaist.ac.kr/x.org/"
175 "ftp://mirrors.go-part.com/xorg/"
6af31019 176 "ftp://ftp.is.co.za/pub/x.org") ; South Africa
63ae4800 177 (cpan
6af31019 178 "http://www.cpan.org/"
63ae4800
TGR
179 "http://cpan.metacpan.org/"
180 ;; A selection of HTTP mirrors from http://www.cpan.org/SITES.html.
181 ;; Europe.
182 "http://ftp.belnet.be/mirror/ftp.cpan.org/"
183 "http://mirrors.nic.cz/CPAN/"
184 "http://mirror.ibcp.fr/pub/CPAN/"
185 "http://ftp.ntua.gr/pub/lang/perl/"
186 "http://kvin.lv/pub/CPAN/"
187 "http://mirror.as43289.net/pub/CPAN/"
188 "http://cpan.cs.uu.nl/"
189 "http://cpan.uib.no/"
190 "http://cpan-mirror.rbc.ru/pub/CPAN/"
191 "http://mirror.sbb.rs/CPAN/"
192 "http://cpan.lnx.sk/"
193 "http://ftp.rediris.es/mirror/CPAN/"
194 "http://mirror.ox.ac.uk/sites/www.cpan.org/"
195 ;; Africa.
196 "http://mirror.liquidtelecom.com/CPAN/"
197 "http://cpan.mirror.ac.za/"
198 "http://mirror.is.co.za/pub/cpan/"
199 "http://cpan.saix.net/"
200 "http://mirror.ucu.ac.ug/cpan/"
201 ;; North America.
202 "http://mirrors.gossamer-threads.com/CPAN/"
203 "http://mirror.csclub.uwaterloo.ca/CPAN/"
204 "http://mirrors.ucr.ac.cr/CPAN/"
205 "http://www.msg.com.mx/CPAN/"
206 "http://mirrors.namecheap.com/CPAN/"
207 "http://mirror.uic.edu/CPAN/"
208 "http://mirror.datapipe.net/CPAN/"
209 "http://mirror.cc.columbia.edu/pub/software/cpan/"
210 "http://mirror.uta.edu/CPAN/"
211 ;; South America.
212 "http://cpan.mmgdesigns.com.ar/"
213 "http://mirror.nbtelecom.com.br/CPAN/"
214 "http://linorg.usp.br/CPAN/"
215 "http://cpan.dcc.uchile.cl/"
216 "http://mirror.cedia.org.ec/CPAN/"
217 ;; Oceania.
218 "http://cpan.mirror.serversaustralia.com.au/"
219 "http://mirror.waia.asn.au/pub/cpan/"
220 "http://mirror.as24220.net/pub/cpan/"
221 "http://cpan.lagoon.nc/pub/CPAN/"
222 "http://cpan.inspire.net.nz/"
223 ;; Asia.
224 "http://mirror.dhakacom.com/CPAN/"
225 "http://mirrors.ustc.edu.cn/CPAN/"
226 "http://ftp.cuhk.edu.hk/pub/packages/perl/CPAN/"
227 "http://kambing.ui.ac.id/cpan/"
228 "http://cpan.hostiran.ir/"
229 "http://ftp.nara.wide.ad.jp/pub/CPAN/"
230 "http://mirror.neolabs.kz/CPAN/"
231 "http://cpan.nctu.edu.tw/"
232 "http://cpan.ulak.net.tr/"
233 "http://mirrors.vinahost.vn/CPAN/")
cb7e4867
RW
234 (cran
235 ;; Arbitrary mirrors from http://cran.r-project.org/mirrors.html
236 ;; This one automatically redirects to servers worldwide
c009bb5a 237 "http://cran.r-project.org/"
cb7e4867
RW
238 "http://cran.rstudio.com/"
239 "http://cran.univ-lyon1.fr/"
cb7e4867
RW
240 "http://cran.ism.ac.jp/"
241 "http://cran.stat.auckland.ac.nz/"
242 "http://cran.mirror.ac.za/"
243 "http://cran.csie.ntu.edu.tw/")
6d763bdd
AE
244 (imagemagick
245 ;; from http://www.imagemagick.org/script/download.php
246 ;; (without mirrors that are unavailable or not up to date)
247 ;; mirrors keeping old versions at the top level
d0b87779 248 "https://sunsite.icm.edu.pl/packages/ImageMagick/"
6d763bdd 249 ;; mirrors moving old versions to "legacy"
ecc58571 250 "http://mirrors-usa.go-parts.com/mirrors/ImageMagick/"
7fa37abc 251 "http://mirror.checkdomain.de/imagemagick/"
ecc58571
LF
252 "http://ftp.surfnet.nl/pub/ImageMagick/"
253 "http://mirror.searchdaimon.com/ImageMagick"
254 "http://mirror.is.co.za/pub/imagemagick/"
255 "http://www.imagemagick.org/download/"
256 "ftp://mirror.aarnet.edu.au/pub/imagemagick/"
6d763bdd
AE
257 "ftp://ftp.kddlabs.co.jp/graphics/ImageMagick/"
258 "ftp://ftp.u-aizu.ac.jp/pub/graphics/image/ImageMagick/imagemagick.org/"
259 "ftp://ftp.nluug.nl/pub/ImageMagick/"
6d763bdd 260 "ftp://ftp.tpnet.pl/pub/graphics/ImageMagick/"
6d763bdd 261 "ftp://ftp.fifi.org/pub/ImageMagick/"
6d763bdd
AE
262 ;; one legacy location as a last resort
263 "http://www.imagemagick.org/download/legacy/")
e0029b74
LC
264 (debian
265 "http://ftp.de.debian.org/debian/"
266 "http://ftp.fr.debian.org/debian/"
6b287c5c 267 "http://ftp.debian.org/debian/"
ff02b826
DC
268 "http://archive.debian.org/debian/")
269 (kde
112f089d 270 "http://download.kde.org"
8b4af828 271 "http://download.kde.org/Attic" ; for when it gets archived.
ff02b826
DC
272 ;; Mirrors from http://files.kde.org/extra/mirrors.html
273 ;; Europe
274 "http://mirror.easyname.at/kde"
275 "http://mirror.karneval.cz/pub/kde"
276 "http://ftp.fi.muni.cz/pub/kde/"
277 "http://mirror.oss.maxcdn.com/kde/"
278 "http://ftp5.gwdg.de/pub/linux/kde/"
279 "http://ftp-stud.fht-esslingen.de/Mirrors/ftp.kde.org/pub/kde/"
280 "http://mirror.klaus-uwe.me/kde/ftp/"
281 "http://kde.beta.mirror.ga/"
282 "http://kde.alpha.mirror.ga/"
283 "http://mirror.netcologne.de/kde"
284 "http://vesta.informatik.rwth-aachen.de/ftp/pub/mirror/kde/"
285 "http://ftp.rz.uni-wuerzburg.de/pub/unix/kde/"
286 "http://mirrors.dotsrc.org/kde/"
287 "http://ftp.funet.fi/pub/mirrors/ftp.kde.org/pub/kde/"
288 "http://kde-mirror.freenux.org/"
289 "http://mirrors.ircam.fr/pub/KDE/"
290 "http://www-ftp.lip6.fr/pub/X11/kde/"
291 "http://fr2.rpmfind.net/linux/KDE/"
292 "http://kde.mirror.anlx.net/"
293 "http://www.mirrorservice.org/sites/ftp.kde.org/pub/kde/"
294 "http://ftp.heanet.ie/mirrors/ftp.kde.org/"
295 "http://ftp.nluug.nl/pub/windowing/kde/"
296 "http://ftp.surfnet.nl/windowing/kde/"
297 "http://ftp.icm.edu.pl/pub/unix/kde/"
298 "http://ftp.pbone.net/pub/kde/"
299 "http://piotrkosoft.net/pub/mirrors/ftp.kde.org/"
300 "http://mirrors.fe.up.pt/pub/kde/"
301 "http://ftp.iasi.roedu.net/pub/mirrors/ftp.kde.org/"
302 "http://ftp.acc.umu.se/mirror/kde.org/ftp/"
303 "http://kde.ip-connect.vn.ua/"
304 ;; North America
305 "http://mirror.its.dal.ca/kde/"
306 "http://mirror.csclub.uwaterloo.ca/kde/"
307 "http://mirror.cc.columbia.edu/pub/software/kde/"
308 "http://mirrors-usa.go-parts.com/kde"
309 "http://kde.mirrors.hoobly.com/"
310 "http://ftp.ussg.iu.edu/kde/"
311 "http://mirrors.mit.edu/kde/"
312 "http://kde.mirrors.tds.net/pub/kde/"
313 ;; Oceania
314 "http://ftp.kddlabs.co.jp/pub/X11/kde/"
644e5f17
TGR
315 "http://kde.mirror.uber.com.au/")
316 (openbsd
317 "https://ftp.openbsd.org/pub/OpenBSD/"
318 ;; Anycast CDN redirecting to your friendly local mirror.
319 "https://mirrors.evowise.com/pub/OpenBSD/"
320 ;; Other HTTPS mirrors from https://www.openbsd.org/ftp.html
321 "https://mirror.aarnet.edu.au/pub/OpenBSD/"
322 "https://ftp2.eu.openbsd.org/pub/OpenBSD/"
323 "https://openbsd.c3sl.ufpr.br/pub/OpenBSD/"
324 "https://openbsd.ipacct.com/pub/OpenBSD/"
325 "https://ftp.OpenBSD.org/pub/OpenBSD/"
326 "https://openbsd.cs.toronto.edu/pub/OpenBSD/"
327 "https://openbsd.delfic.org/pub/OpenBSD/"
328 "https://openbsd.mirror.netelligent.ca/pub/OpenBSD/"
329 "https://mirrors.ucr.ac.cr/pub/OpenBSD/"
330 "https://mirrors.dotsrc.org/pub/OpenBSD/"
331 "https://mirror.one.com/pub/OpenBSD/"
332 "https://ftp.fr.openbsd.org/pub/OpenBSD/"
333 "https://ftp2.fr.openbsd.org/pub/OpenBSD/"
334 "https://mirrors.ircam.fr/pub/OpenBSD/"
335 "https://ftp.spline.de/pub/OpenBSD/"
336 "https://mirror.hs-esslingen.de/pub/OpenBSD/"
337 "https://ftp.halifax.rwth-aachen.de/openbsd/"
338 "https://ftp.hostserver.de/pub/OpenBSD/"
339 "https://ftp.fau.de/pub/OpenBSD/"
340 "https://ftp.cc.uoc.gr/pub/OpenBSD/"
341 "https://openbsd.hk/pub/OpenBSD/"
342 "https://ftp.heanet.ie/pub/OpenBSD/"
343 "https://openbsd.mirror.garr.it/pub/OpenBSD/"
344 "https://mirror.litnet.lt/pub/OpenBSD/"
345 "https://mirror.meerval.net/pub/OpenBSD/"
346 "https://ftp.nluug.nl/pub/OpenBSD/"
347 "https://ftp.bit.nl/pub/OpenBSD/"
348 "https://mirrors.dalenys.com/pub/OpenBSD/"
349 "https://ftp.icm.edu.pl/pub/OpenBSD/"
350 "https://ftp.rnl.tecnico.ulisboa.pt/pub/OpenBSD/"
351 "https://mirrors.pidginhost.com/pub/OpenBSD/"
352 "https://mirror.yandex.ru/pub/OpenBSD/"
353 "https://ftp.eu.openbsd.org/pub/OpenBSD/"
354 "https://ftp.yzu.edu.tw/pub/OpenBSD/"
355 "https://www.mirrorservice.org/pub/OpenBSD/"
356 "https://anorien.csc.warwick.ac.uk/pub/OpenBSD/"
357 "https://mirror.bytemark.co.uk/pub/OpenBSD/"
358 "https://mirrors.sonic.net/pub/OpenBSD/"
359 "https://ftp3.usa.openbsd.org/pub/OpenBSD/"
360 "https://mirrors.syringanetworks.net/pub/OpenBSD/"
361 "https://openbsd.mirror.constant.com/pub/OpenBSD/"
362 "https://ftp4.usa.openbsd.org/pub/OpenBSD/"
363 "https://ftp5.usa.openbsd.org/pub/OpenBSD/"
bc4cea6f
GFI
364 "https://mirror.esc7.net/pub/OpenBSD/")
365 (mate
366 "https://pub.mate-desktop.org/releases/"
367 "http://pub.mate-desktop.org/releases/"))))
94d222ad 368
53216419
LC
369(define %mirror-file
370 ;; Copy of the list of mirrors to a file. This allows us to keep a single
371 ;; copy in the store, and computing it here avoids repeated calls to
372 ;; 'object->string'.
373 (plain-file "mirrors" (object->string %mirrors)))
374
cd436bf0
LC
375(define %content-addressed-mirrors
376 ;; List of content-addressed mirrors. Each mirror is represented as a
ab84b927
LC
377 ;; procedure that takes a file name, an algorithm (symbol) and a hash
378 ;; (bytevector), and returns a URL or #f.
ee2cfdfe 379 '(begin
a52ae1b6
LC
380 (use-modules (guix base32))
381
13bcc6b4
LC
382 (define (guix-publish host)
383 (lambda (file algo hash)
384 ;; Files served by 'guix publish' are accessible under a single
385 ;; hash algorithm.
386 (string-append "https://" host "/file/"
387 file "/" (symbol->string algo) "/"
388 (bytevector->nix-base32-string hash))))
389
a52ae1b6
LC
390 ;; XXX: (guix base16) appeared in March 2017 (and thus 0.13.0) so old
391 ;; installations of the daemon might lack it. Thus, load it lazily to
392 ;; avoid gratuitous errors. See <https://bugs.gnu.org/33542>.
393 (module-autoload! (current-module)
394 '(guix base16) '(bytevector->base16-string))
ee2cfdfe 395
883dc11c 396 (list (guix-publish "ci.guix.gnu.org")
ee2cfdfe
LC
397 (lambda (file algo hash)
398 ;; 'tarballs.nixos.org' supports several algorithms.
89f1fee8 399 (string-append "https://tarballs.nixos.org/"
ee2cfdfe
LC
400 (symbol->string algo) "/"
401 (bytevector->nix-base32-string hash)))
402 (lambda (file algo hash)
403 ;; Software Heritage usually archives VCS history rather than
404 ;; tarballs, but tarballs are sometimes available (and can be
405 ;; explicitly stored there.) For example, see
406 ;; <https://archive.softwareheritage.org/api/1/content/sha256:92d0fa1c311cacefa89853bdb53c62f4110cdfda3820346b59cbd098f40f955e/>.
89f1fee8 407 (string-append "https://archive.softwareheritage.org/api/1/content/"
ee2cfdfe
LC
408 (symbol->string algo) ":"
409 (bytevector->base16-string hash) "/raw/")))))
cd436bf0
LC
410
411(define %content-addressed-mirror-file
412 ;; Content-addressed mirrors stored in a file.
413 (plain-file "content-addressed-mirrors"
414 (object->string %content-addressed-mirrors)))
415
05ceb8dc 416(define built-in-builders*
3961edf2 417 (store-lift built-in-builders))
94d222ad 418
05ceb8dc
LC
419(define* (built-in-download file-name url
420 #:key system hash-algo hash
421 mirrors content-addressed-mirrors
422 (guile 'unused))
423 "Download FILE-NAME from URL using the built-in 'download' builder.
62cab99c 424
05ceb8dc
LC
425This is an \"out-of-band\" download in that the returned derivation does not
426explicitly depend on Guile, GnuTLS, etc. Instead, the daemon performs the
427download by itself using its own dependencies."
428 (mlet %store-monad ((mirrors (lower-object mirrors))
429 (content-addressed-mirrors
430 (lower-object content-addressed-mirrors)))
431 (raw-derivation file-name "builtin:download" '()
432 #:system system
433 #:hash-algo hash-algo
434 #:hash hash
02237f13 435 #:sources (list mirrors content-addressed-mirrors)
05ceb8dc
LC
436
437 ;; Honor the user's proxy and locale settings.
438 #:leaked-env-vars '("http_proxy" "https_proxy"
439 "LC_ALL" "LC_MESSAGES" "LANG"
440 "COLUMNS")
441
442 #:env-vars `(("url" . ,(object->string url))
443 ("mirrors" . ,mirrors)
444 ("content-addressed-mirrors"
4c80d4c4
LC
445 . ,content-addressed-mirrors))
446
447 ;; Do not offload this derivation because we cannot be
448 ;; sure that the remote daemon supports the 'download'
449 ;; built-in. We may remove this limitation when support
450 ;; for that built-in is widespread.
451 #:local-build? #t)))
05ceb8dc 452
05ceb8dc
LC
453(define* (url-fetch url hash-algo hash
454 #:optional name
455 #:key (system (%current-system))
456 (guile (default-guile)))
457 "Return a fixed-output derivation that fetches URL (a string, or a list of
458strings denoting alternate URLs), which is expected to have hash HASH of type
459HASH-ALGO (a symbol). By default, the file name is the base name of URL;
460optionally, NAME can specify a different file name.
461
462When one of the URL starts with mirror://, then its host part is
463interpreted as the name of a mirror scheme, taken from %MIRROR-FILE.
464
465Alternately, when URL starts with file://, return the corresponding file name
466in the store."
467 (define file-name
468 (match url
469 ((head _ ...)
470 (basename head))
471 (_
472 (basename url))))
473
882383a9
LC
474 (let ((uri (and (string? url) (string->uri url))))
475 (if (or (and (string? url) (not uri))
476 (and uri (memq (uri-scheme uri) '(#f file))))
f220a838
LC
477 (interned-file (if uri (uri-path uri) url)
478 (or name file-name))
2e86c264
LC
479 (mlet %store-monad ((builtins (built-in-builders*)))
480 ;; The "download" built-in builder was added in guix-daemon in
481 ;; Nov. 2016 and made it in the 0.12.0 release of Dec. 2016. We now
482 ;; require it.
483 (unless (member "download" builtins)
484 (error "'guix-daemon' is too old, please upgrade" builtins))
485
486 (built-in-download (or name file-name) url
487 #:guile guile
488 #:system system
489 #:hash-algo hash-algo
490 #:hash hash
491 #:mirrors %mirror-file
492 #:content-addressed-mirrors
493 %content-addressed-mirror-file)))))
62cab99c 494
95001d4b
LC
495(define* (url-fetch/tarbomb url hash-algo hash
496 #:optional name
497 #:key (system (%current-system))
498 (guile (default-guile)))
499 "Similar to 'url-fetch' but unpack the file from URL in a directory of its
500own. This helper makes it easier to deal with \"tar bombs\"."
58f91e4d
TGR
501 (define file-name
502 (match url
503 ((head _ ...)
504 (basename head))
505 (_
506 (basename url))))
95001d4b
LC
507 (define gzip
508 (module-ref (resolve-interface '(gnu packages compression)) 'gzip))
509 (define tar
510 (module-ref (resolve-interface '(gnu packages base)) 'tar))
511
512 (mlet %store-monad ((drv (url-fetch url hash-algo hash
58f91e4d
TGR
513 (string-append "tarbomb-"
514 (or name file-name))
95001d4b
LC
515 #:system system
516 #:guile guile)))
517 ;; Take the tar bomb, and simply unpack it as a directory.
5e5d6613
LC
518 ;; Use ungrafted tar/gzip so that the resulting tarball doesn't depend on
519 ;; whether grafts are enabled.
58f91e4d 520 (gexp->derivation (or name file-name)
6c293a80
MW
521 (with-imported-modules '((guix build utils))
522 #~(begin
523 (use-modules (guix build utils))
524 (mkdir #$output)
525 (setenv "PATH" (string-append #$gzip "/bin"))
526 (chdir #$output)
527 (invoke (string-append #$tar "/bin/tar")
528 "xf" #$drv)))
5e5d6613 529 #:graft? #f
95001d4b
LC
530 #:local-build? #t)))
531
814b099a
TGR
532(define* (url-fetch/zipbomb url hash-algo hash
533 #:optional name
534 #:key (system (%current-system))
535 (guile (default-guile)))
536 "Similar to 'url-fetch' but unpack the zip file at URL in a directory of its
537own. This helper makes it easier to deal with \"zip bombs\"."
538 (define file-name
539 (match url
540 ((head _ ...)
541 (basename head))
542 (_
543 (basename url))))
544 (define unzip
148585c2 545 (module-ref (resolve-interface '(gnu packages compression)) 'unzip))
814b099a
TGR
546
547 (mlet %store-monad ((drv (url-fetch url hash-algo hash
548 (string-append "zipbomb-"
549 (or name file-name))
550 #:system system
551 #:guile guile)))
552 ;; Take the zip bomb, and simply unpack it as a directory.
5e5d6613
LC
553 ;; Use ungrafted unzip so that the resulting tarball doesn't depend on
554 ;; whether grafts are enabled.
814b099a 555 (gexp->derivation (or name file-name)
6c293a80
MW
556 (with-imported-modules '((guix build utils))
557 #~(begin
558 (use-modules (guix build utils))
559 (mkdir #$output)
560 (chdir #$output)
561 (invoke (string-append #$unzip "/bin/unzip")
562 #$drv)))
5e5d6613 563 #:graft? #f
814b099a
TGR
564 #:local-build? #t)))
565
861693f3 566(define* (download-to-store store url #:optional (name (basename url))
64b8695c
LC
567 #:key (log (current-error-port)) recursive?
568 (verify-certificate? #t))
861693f3 569 "Download from URL to STORE, either under NAME or URL's basename if
a43b55f1 570omitted. Write progress reports to LOG. RECURSIVE? has the same effect as
64b8695c
LC
571the same-named parameter of 'add-to-store'. VERIFY-CERTIFICATE? determines
572whether or not to validate HTTPS server certificates."
d8907ac4
LC
573 (define uri
574 (string->uri url))
575
d91a8791 576 (if (or (not uri) (memq (uri-scheme uri) '(file #f)))
a43b55f1 577 (add-to-store store name recursive? "sha256"
d91a8791 578 (if uri (uri-path uri) url))
d8907ac4
LC
579 (call-with-temporary-output-file
580 (lambda (temp port)
581 (let ((result
582 (parameterize ((current-output-port log))
64b8695c
LC
583 (build:url-fetch url temp
584 #:mirrors %mirrors
585 #:verify-certificate?
586 verify-certificate?))))
d8907ac4
LC
587 (close port)
588 (and result
a43b55f1 589 (add-to-store store name recursive? "sha256" temp)))))))
861693f3 590
62cab99c 591;;; download.scm ends here