gnu: ikiwiki: Add missing input.
[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 533 #:system system
c1d81df9
DNB
534 #:guile guile))
535 (guile (package->derivation guile system)))
95001d4b 536 ;; Take the tar bomb, and simply unpack it as a directory.
5e5d6613
LC
537 ;; Use ungrafted tar/gzip so that the resulting tarball doesn't depend on
538 ;; whether grafts are enabled.
58f91e4d 539 (gexp->derivation (or name file-name)
6c293a80
MW
540 (with-imported-modules '((guix build utils))
541 #~(begin
542 (use-modules (guix build utils))
543 (mkdir #$output)
544 (setenv "PATH" (string-append #$gzip "/bin"))
545 (chdir #$output)
546 (invoke (string-append #$tar "/bin/tar")
547 "xf" #$drv)))
c1d81df9
DNB
548 #:system system
549 #:guile-for-build guile
5e5d6613 550 #:graft? #f
95001d4b
LC
551 #:local-build? #t)))
552
814b099a
TGR
553(define* (url-fetch/zipbomb url hash-algo hash
554 #:optional name
555 #:key (system (%current-system))
556 (guile (default-guile)))
557 "Similar to 'url-fetch' but unpack the zip file at URL in a directory of its
558own. This helper makes it easier to deal with \"zip bombs\"."
559 (define file-name
560 (match url
561 ((head _ ...)
562 (basename head))
563 (_
564 (basename url))))
565 (define unzip
148585c2 566 (module-ref (resolve-interface '(gnu packages compression)) 'unzip))
814b099a
TGR
567
568 (mlet %store-monad ((drv (url-fetch url hash-algo hash
569 (string-append "zipbomb-"
570 (or name file-name))
571 #:system system
c1d81df9
DNB
572 #:guile guile))
573 (guile (package->derivation guile system)))
814b099a 574 ;; Take the zip bomb, and simply unpack it as a directory.
5e5d6613
LC
575 ;; Use ungrafted unzip so that the resulting tarball doesn't depend on
576 ;; whether grafts are enabled.
814b099a 577 (gexp->derivation (or name file-name)
6c293a80
MW
578 (with-imported-modules '((guix build utils))
579 #~(begin
580 (use-modules (guix build utils))
581 (mkdir #$output)
582 (chdir #$output)
583 (invoke (string-append #$unzip "/bin/unzip")
584 #$drv)))
c1d81df9
DNB
585 #:system system
586 #:guile-for-build guile
5e5d6613 587 #:graft? #f
814b099a
TGR
588 #:local-build? #t)))
589
861693f3 590(define* (download-to-store store url #:optional (name (basename url))
64b8695c
LC
591 #:key (log (current-error-port)) recursive?
592 (verify-certificate? #t))
861693f3 593 "Download from URL to STORE, either under NAME or URL's basename if
a43b55f1 594omitted. Write progress reports to LOG. RECURSIVE? has the same effect as
64b8695c
LC
595the same-named parameter of 'add-to-store'. VERIFY-CERTIFICATE? determines
596whether or not to validate HTTPS server certificates."
d8907ac4
LC
597 (define uri
598 (string->uri url))
599
d91a8791 600 (if (or (not uri) (memq (uri-scheme uri) '(file #f)))
a43b55f1 601 (add-to-store store name recursive? "sha256"
d91a8791 602 (if uri (uri-path uri) url))
d8907ac4
LC
603 (call-with-temporary-output-file
604 (lambda (temp port)
605 (let ((result
606 (parameterize ((current-output-port log))
64b8695c
LC
607 (build:url-fetch url temp
608 #:mirrors %mirrors
609 #:verify-certificate?
610 verify-certificate?))))
d8907ac4
LC
611 (close port)
612 (and result
a43b55f1 613 (add-to-store store name recursive? "sha256" temp)))))))
861693f3 614
62cab99c 615;;; download.scm ends here