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