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