gnu: cool-retro-term: Upgrade to 1.1.1.
[jackhill/guix/guix.git] / guix / download.scm
CommitLineData
233e7676 1;;; GNU Guix --- Functional package management for GNU
5e5d6613 2;;; Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018 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>
62cab99c 8;;;
233e7676 9;;; This file is part of GNU Guix.
62cab99c 10;;;
233e7676 11;;; GNU Guix is free software; you can redistribute it and/or modify it
62cab99c
LC
12;;; under the terms of the GNU General Public License as published by
13;;; the Free Software Foundation; either version 3 of the License, or (at
14;;; your option) any later version.
15;;;
233e7676 16;;; GNU Guix is distributed in the hope that it will be useful, but
62cab99c
LC
17;;; WITHOUT ANY WARRANTY; without even the implied warranty of
18;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19;;; GNU General Public License for more details.
20;;;
21;;; You should have received a copy of the GNU General Public License
233e7676 22;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
62cab99c
LC
23
24(define-module (guix download)
25 #:use-module (ice-9 match)
26 #:use-module (guix derivations)
27 #:use-module (guix packages)
e87f0591 28 #:use-module (guix store)
b5b73a82 29 #:use-module ((guix build download) #:prefix build:)
6f8f8ccb
LC
30 #:use-module (guix monads)
31 #:use-module (guix gexp)
62cab99c 32 #:use-module (guix utils)
d8907ac4 33 #:use-module (web uri)
483f1158 34 #:use-module (srfi srfi-1)
94d222ad 35 #:use-module (srfi srfi-26)
ec4d308a 36 #:export (%mirrors
861693f3 37 url-fetch
95001d4b 38 url-fetch/tarbomb
814b099a 39 url-fetch/zipbomb
861693f3 40 download-to-store))
62cab99c
LC
41
42;;; Commentary:
43;;;
44;;; Produce fixed-output derivations with data fetched over HTTP or FTP.
45;;;
46;;; Code:
47
94d222ad
LC
48(define %mirrors
49 ;; Mirror lists used when `mirror://' URLs are passed.
50 (let* ((gnu-mirrors
51 '(;; This one redirects to a (supposedly) nearby and (supposedly)
52 ;; up-to-date mirror.
4918e7fc 53 "https://ftpmirror.gnu.org/gnu/"
94d222ad
LC
54
55 "ftp://ftp.cs.tu-berlin.de/pub/gnu/"
94d222ad
LC
56 "ftp://ftp.funet.fi/pub/mirrors/ftp.gnu.org/gnu/"
57
58 ;; This one is the master repository, and thus it's always
59 ;; up-to-date.
60 "http://ftp.gnu.org/pub/gnu/")))
61 `((gnu ,@gnu-mirrors)
62 (gcc
63 "ftp://ftp.nluug.nl/mirror/languages/gcc/"
64 "ftp://ftp.fu-berlin.de/unix/languages/gcc/"
65 "ftp://ftp.irisa.fr/pub/mirrors/gcc.gnu.org/gcc/"
66 "ftp://gcc.gnu.org/pub/gcc/"
67 ,@(map (cut string-append <> "/gcc") gnu-mirrors))
68 (gnupg
df851f5a
LF
69 "http://artfiles.org/gnupg.org"
70 "http://www.crysys.hu/"
71 "https://gnupg.org/ftp/gcrypt/"
d57b88be 72 "ftp://mirrors.dotsrc.org/gcrypt/"
94d222ad 73 "ftp://mirror.cict.fr/gnupg/"
d57b88be
AE
74 "ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/"
75 "ftp://ftp.freenet.de/pub/ftp.gnupg.org/gcrypt/"
d57b88be
AE
76 "ftp://ftp.hi.is/pub/mirrors/gnupg/"
77 "ftp://ftp.heanet.ie/mirrors/ftp.gnupg.org/gcrypt/"
78 "ftp://ftp.bit.nl/mirror/gnupg/"
79 "ftp://ftp.surfnet.nl/pub/security/gnupg/"
80 "ftp://ftp.iasi.roedu.net/pub/mirrors/ftp.gnupg.org/"
81 "ftp://ftp.sunet.se/pub/security/gnupg/"
82 "ftp://mirror.switch.ch/mirror/gnupg/"
83 "ftp://mirror.tje.me.uk/pub/mirrors/ftp.gnupg.org/"
84 "ftp://ftp.mirrorservice.org/sites/ftp.gnupg.org/gcrypt/"
85 "ftp://ftp.ring.gr.jp/pub/net/gnupg/"
86 "ftp://ftp.gnupg.org/gcrypt/")
71eb5c10
LC
87 (gnome
88 "http://ftp.belnet.be/ftp.gnome.org/"
89 "http://ftp.linux.org.uk/mirrors/ftp.gnome.org/"
90 "http://ftp.gnome.org/pub/GNOME/"
93897a45 91 "https://download.gnome.org/"
71eb5c10 92 "http://mirror.yandex.ru/mirrors/ftp.gnome.org/")
442c2c99 93 (hackage
4c13aad0 94 "http://hackage.haskell.org/")
94d222ad 95 (savannah
a4eabecd 96 "http://download.savannah.gnu.org/releases/"
94d222ad
LC
97 "http://ftp.cc.uoc.gr/mirrors/nongnu.org/"
98 "http://ftp.twaren.net/Unix/NonGNU/"
99 "http://mirror.csclub.uwaterloo.ca/nongnu/"
100 "http://nongnu.askapache.com/"
101 "http://savannah.c3sl.ufpr.br/"
3f6d5b8a 102 "http://download.savannah.gnu.org/releases-noredirect/"
ecc58571
LF
103 "http://download-mirror.savannah.gnu.org/releases/"
104 "ftp://ftp.twaren.net/Unix/NonGNU/"
105 "ftp://mirror.csclub.uwaterloo.ca/nongnu/"
106 "ftp://mirror.publicns.net/pub/nongnu/"
107 "ftp://savannah.c3sl.ufpr.br/")
321dc4df 108 (sourceforge ; https://sourceforge.net/p/forge/documentation/Mirrors/
fe224d20 109 "http://downloads.sourceforge.net/project/"
cd4c41fd
LC
110 "http://ufpr.dl.sourceforge.net/project/"
111 "http://heanet.dl.sourceforge.net/project/"
112 "http://freefr.dl.sourceforge.net/project/"
113 "http://internode.dl.sourceforge.net/project/"
114 "http://jaist.dl.sourceforge.net/project/"
115 "http://kent.dl.sourceforge.net/project/"
116 "http://liquidtelecom.dl.sourceforge.net/project/"
05e172ca 117 ;; "http://nbtelecom.dl.sourceforge.net/project/" ;never returns 404s
cd4c41fd
LC
118 "http://nchc.dl.sourceforge.net/project/"
119 "http://ncu.dl.sourceforge.net/project/"
120 "http://netcologne.dl.sourceforge.net/project/"
121 "http://netix.dl.sourceforge.net/project/"
122 "http://pilotfiber.dl.sourceforge.net/project/"
123 "http://superb-sea2.dl.sourceforge.net/project/"
124 "http://tenet.dl.sourceforge.net/project/"
125 "http://vorboss.dl.sourceforge.net/project/"
126 "http://netassist.dl.sourceforge.net/project/")
7c7b802c
MB
127 (netfilter.org ; https://www.netfilter.org/mirrors.html
128 "http://ftp.netfilter.org/pub/"
129 "ftp://ftp.es.netfilter.org/mirrors/netfilter/"
130 "ftp://ftp.hu.netfilter.org/"
131 "ftp://www.lt.netfilter.org/pub/")
b40b259f 132 (kernel.org
b40b259f
LC
133 "http://ramses.wh2.tu-dresden.de/pub/mirrors/kernel.org/"
134 "http://linux-kernel.uio.no/pub/"
135 "http://kernel.osuosl.org/pub/"
5d9cd707 136 "http://ftp.be.debian.org/pub/"
ecc58571
LF
137 "http://mirror.linux.org.au/"
138 "ftp://ftp.funet.fi/pub/mirrors/ftp.kernel.org/pub/")
47f9db41
LC
139 (apache ; from http://www.apache.org/mirrors/dist.html
140 "http://www.eu.apache.org/dist/"
141 "http://www.us.apache.org/dist/"
47f9db41
LC
142 "http://apache.belnet.be/"
143 "http://mirrors.ircam.fr/pub/apache/"
f06afd4d
LC
144 "http://apache-mirror.rbc.ru/pub/apache/"
145
146 ;; As a last resort, try the archive.
147 "http://archive.apache.org/dist/")
149acc29 148 (xorg ; from http://www.x.org/wiki/Releases/Download
0820a58b 149 "http://www.x.org/releases/" ; main mirrors
ecc58571 150 "http://mirror.csclub.uwaterloo.ca/x.org/" ; North America
149acc29
AE
151 "http://xorg.mirrors.pair.com/"
152 "http://mirror.us.leaseweb.net/xorg/"
ecc58571
LF
153 "ftp://mirror.csclub.uwaterloo.ca/x.org/"
154 "ftp://xorg.mirrors.pair.com/"
149acc29
AE
155 "ftp://artfiles.org/x.org/" ; Europe
156 "ftp://ftp.chg.ru/pub/X11/x.org/"
157 "ftp://ftp.fu-berlin.de/unix/X11/FTP.X.ORG/"
158 "ftp://ftp.gwdg.de/pub/x11/x.org/"
159 "ftp://ftp.mirrorservice.org/sites/ftp.x.org/"
160 "ftp://ftp.ntua.gr/pub/X11/"
161 "ftp://ftp.piotrkosoft.net/pub/mirrors/ftp.x.org/"
162 "ftp://ftp.portal-to-web.de/pub/mirrors/x.org/"
163 "ftp://ftp.solnet.ch/mirror/x.org/"
149acc29
AE
164 "ftp://mi.mirror.garr.it/mirrors/x.org/"
165 "ftp://mirror.cict.fr/x.org/"
166 "ftp://mirror.switch.ch/mirror/X11/"
167 "ftp://mirrors.ircam.fr/pub/x.org/"
168 "ftp://x.mirrors.skynet.be/pub/ftp.x.org/"
ecc58571
LF
169 "http://x.cs.pu.edu.tw/" ; East Asia
170 "ftp://ftp.cs.cuhk.edu.hk/pub/X11"
149acc29
AE
171 "ftp://ftp.u-aizu.ac.jp/pub/x11/x.org/"
172 "ftp://ftp.yz.yamagata-u.ac.jp/pub/X11/x.org/"
173 "ftp://ftp.kaist.ac.kr/x.org/"
174 "ftp://mirrors.go-part.com/xorg/"
6af31019 175 "ftp://ftp.is.co.za/pub/x.org") ; South Africa
63ae4800 176 (cpan
6af31019 177 "http://www.cpan.org/"
63ae4800
TGR
178 "http://cpan.metacpan.org/"
179 ;; A selection of HTTP mirrors from http://www.cpan.org/SITES.html.
180 ;; Europe.
181 "http://ftp.belnet.be/mirror/ftp.cpan.org/"
182 "http://mirrors.nic.cz/CPAN/"
183 "http://mirror.ibcp.fr/pub/CPAN/"
184 "http://ftp.ntua.gr/pub/lang/perl/"
185 "http://kvin.lv/pub/CPAN/"
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/"
363 "https://mirror.esc7.net/pub/OpenBSD/"))))
94d222ad 364
53216419
LC
365(define %mirror-file
366 ;; Copy of the list of mirrors to a file. This allows us to keep a single
367 ;; copy in the store, and computing it here avoids repeated calls to
368 ;; 'object->string'.
369 (plain-file "mirrors" (object->string %mirrors)))
370
cd436bf0
LC
371(define %content-addressed-mirrors
372 ;; List of content-addressed mirrors. Each mirror is represented as a
ab84b927
LC
373 ;; procedure that takes a file name, an algorithm (symbol) and a hash
374 ;; (bytevector), and returns a URL or #f.
ee2cfdfe 375 '(begin
a52ae1b6
LC
376 (use-modules (guix base32))
377
13bcc6b4
LC
378 (define (guix-publish host)
379 (lambda (file algo hash)
380 ;; Files served by 'guix publish' are accessible under a single
381 ;; hash algorithm.
382 (string-append "https://" host "/file/"
383 file "/" (symbol->string algo) "/"
384 (bytevector->nix-base32-string hash))))
385
a52ae1b6
LC
386 ;; XXX: (guix base16) appeared in March 2017 (and thus 0.13.0) so old
387 ;; installations of the daemon might lack it. Thus, load it lazily to
388 ;; avoid gratuitous errors. See <https://bugs.gnu.org/33542>.
389 (module-autoload! (current-module)
390 '(guix base16) '(bytevector->base16-string))
ee2cfdfe 391
13bcc6b4
LC
392 (list (guix-publish "mirror.hydra.gnu.org")
393 (guix-publish "berlin.guixsd.org")
ee2cfdfe
LC
394 (lambda (file algo hash)
395 ;; 'tarballs.nixos.org' supports several algorithms.
89f1fee8 396 (string-append "https://tarballs.nixos.org/"
ee2cfdfe
LC
397 (symbol->string algo) "/"
398 (bytevector->nix-base32-string hash)))
399 (lambda (file algo hash)
400 ;; Software Heritage usually archives VCS history rather than
401 ;; tarballs, but tarballs are sometimes available (and can be
402 ;; explicitly stored there.) For example, see
403 ;; <https://archive.softwareheritage.org/api/1/content/sha256:92d0fa1c311cacefa89853bdb53c62f4110cdfda3820346b59cbd098f40f955e/>.
89f1fee8 404 (string-append "https://archive.softwareheritage.org/api/1/content/"
ee2cfdfe
LC
405 (symbol->string algo) ":"
406 (bytevector->base16-string hash) "/raw/")))))
cd436bf0
LC
407
408(define %content-addressed-mirror-file
409 ;; Content-addressed mirrors stored in a file.
410 (plain-file "content-addressed-mirrors"
411 (object->string %content-addressed-mirrors)))
412
05ceb8dc 413(define built-in-builders*
40cc850a 414 (let ((proc (store-lift built-in-builders)))
05ceb8dc
LC
415 (lambda ()
416 "Return, as a monadic value, the list of built-in builders supported by
40cc850a
LC
417the daemon; cache the return value."
418 (mcached (proc) 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
423 (guile 'unused))
424 "Download FILE-NAME from URL using the built-in 'download' builder.
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
436 #:inputs `((,mirrors)
437 (,content-addressed-mirrors))
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"
4c80d4c4
LC
447 . ,content-addressed-mirrors))
448
449 ;; Do not offload this derivation because we cannot be
450 ;; sure that the remote daemon supports the 'download'
451 ;; built-in. We may remove this limitation when support
452 ;; for that built-in is widespread.
453 #:local-build? #t)))
05ceb8dc 454
05ceb8dc
LC
455(define* (url-fetch url hash-algo hash
456 #:optional name
457 #:key (system (%current-system))
458 (guile (default-guile)))
459 "Return a fixed-output derivation that fetches URL (a string, or a list of
460strings denoting alternate URLs), which is expected to have hash HASH of type
461HASH-ALGO (a symbol). By default, the file name is the base name of URL;
462optionally, NAME can specify a different file name.
463
464When one of the URL starts with mirror://, then its host part is
465interpreted as the name of a mirror scheme, taken from %MIRROR-FILE.
466
467Alternately, when URL starts with file://, return the corresponding file name
468in the store."
469 (define file-name
470 (match url
471 ((head _ ...)
472 (basename head))
473 (_
474 (basename url))))
475
882383a9
LC
476 (let ((uri (and (string? url) (string->uri url))))
477 (if (or (and (string? url) (not uri))
478 (and uri (memq (uri-scheme uri) '(#f file))))
f220a838
LC
479 (interned-file (if uri (uri-path uri) url)
480 (or name file-name))
2e86c264
LC
481 (mlet %store-monad ((builtins (built-in-builders*)))
482 ;; The "download" built-in builder was added in guix-daemon in
483 ;; Nov. 2016 and made it in the 0.12.0 release of Dec. 2016. We now
484 ;; require it.
485 (unless (member "download" builtins)
486 (error "'guix-daemon' is too old, please upgrade" builtins))
487
488 (built-in-download (or name file-name) url
489 #:guile guile
490 #:system system
491 #:hash-algo hash-algo
492 #:hash hash
493 #:mirrors %mirror-file
494 #:content-addressed-mirrors
495 %content-addressed-mirror-file)))))
62cab99c 496
95001d4b
LC
497(define* (url-fetch/tarbomb url hash-algo hash
498 #:optional name
499 #:key (system (%current-system))
500 (guile (default-guile)))
501 "Similar to 'url-fetch' but unpack the file from URL in a directory of its
502own. This helper makes it easier to deal with \"tar bombs\"."
58f91e4d
TGR
503 (define file-name
504 (match url
505 ((head _ ...)
506 (basename head))
507 (_
508 (basename url))))
95001d4b
LC
509 (define gzip
510 (module-ref (resolve-interface '(gnu packages compression)) 'gzip))
511 (define tar
512 (module-ref (resolve-interface '(gnu packages base)) 'tar))
513
514 (mlet %store-monad ((drv (url-fetch url hash-algo hash
58f91e4d
TGR
515 (string-append "tarbomb-"
516 (or name file-name))
95001d4b
LC
517 #:system system
518 #:guile guile)))
519 ;; Take the tar bomb, and simply unpack it as a directory.
5e5d6613
LC
520 ;; Use ungrafted tar/gzip so that the resulting tarball doesn't depend on
521 ;; whether grafts are enabled.
58f91e4d 522 (gexp->derivation (or name file-name)
6c293a80
MW
523 (with-imported-modules '((guix build utils))
524 #~(begin
525 (use-modules (guix build utils))
526 (mkdir #$output)
527 (setenv "PATH" (string-append #$gzip "/bin"))
528 (chdir #$output)
529 (invoke (string-append #$tar "/bin/tar")
530 "xf" #$drv)))
5e5d6613 531 #:graft? #f
95001d4b
LC
532 #:local-build? #t)))
533
814b099a
TGR
534(define* (url-fetch/zipbomb url hash-algo hash
535 #:optional name
536 #:key (system (%current-system))
537 (guile (default-guile)))
538 "Similar to 'url-fetch' but unpack the zip file at URL in a directory of its
539own. This helper makes it easier to deal with \"zip bombs\"."
540 (define file-name
541 (match url
542 ((head _ ...)
543 (basename head))
544 (_
545 (basename url))))
546 (define unzip
148585c2 547 (module-ref (resolve-interface '(gnu packages compression)) 'unzip))
814b099a
TGR
548
549 (mlet %store-monad ((drv (url-fetch url hash-algo hash
550 (string-append "zipbomb-"
551 (or name file-name))
552 #:system system
553 #:guile guile)))
554 ;; Take the zip bomb, and simply unpack it as a directory.
5e5d6613
LC
555 ;; Use ungrafted unzip so that the resulting tarball doesn't depend on
556 ;; whether grafts are enabled.
814b099a 557 (gexp->derivation (or name file-name)
6c293a80
MW
558 (with-imported-modules '((guix build utils))
559 #~(begin
560 (use-modules (guix build utils))
561 (mkdir #$output)
562 (chdir #$output)
563 (invoke (string-append #$unzip "/bin/unzip")
564 #$drv)))
5e5d6613 565 #:graft? #f
814b099a
TGR
566 #:local-build? #t)))
567
861693f3 568(define* (download-to-store store url #:optional (name (basename url))
64b8695c
LC
569 #:key (log (current-error-port)) recursive?
570 (verify-certificate? #t))
861693f3 571 "Download from URL to STORE, either under NAME or URL's basename if
a43b55f1 572omitted. Write progress reports to LOG. RECURSIVE? has the same effect as
64b8695c
LC
573the same-named parameter of 'add-to-store'. VERIFY-CERTIFICATE? determines
574whether or not to validate HTTPS server certificates."
d8907ac4
LC
575 (define uri
576 (string->uri url))
577
d91a8791 578 (if (or (not uri) (memq (uri-scheme uri) '(file #f)))
a43b55f1 579 (add-to-store store name recursive? "sha256"
d91a8791 580 (if uri (uri-path uri) url))
d8907ac4
LC
581 (call-with-temporary-output-file
582 (lambda (temp port)
583 (let ((result
584 (parameterize ((current-output-port log))
64b8695c
LC
585 (build:url-fetch url temp
586 #:mirrors %mirrors
587 #:verify-certificate?
588 verify-certificate?))))
d8907ac4
LC
589 (close port)
590 (and result
a43b55f1 591 (add-to-store store name recursive? "sha256" temp)))))))
861693f3 592
62cab99c 593;;; download.scm ends here