aboutsummaryrefslogtreecommitdiff
path: root/pkgs/build-support/fetchipfs
diff options
context:
space:
mode:
authorknupfer <fknupfer@gmail.com>2017-11-04 23:01:20 +0100
committerMichael Raskin <7c6f434c@mail.ru>2017-11-04 23:01:27 +0100
commitd71833ee36c707717821b7f833587817168b4684 (patch)
tree3cab9681f96419d34213d0d127107972f5d72575 /pkgs/build-support/fetchipfs
parent59c995ce06d19fe261b495f8b4c5747c899fdee8 (diff)
fetchipfs: init
Fixes #18296
Diffstat (limited to 'pkgs/build-support/fetchipfs')
-rw-r--r--pkgs/build-support/fetchipfs/builder.sh87
-rw-r--r--pkgs/build-support/fetchipfs/default.nix52
2 files changed, 139 insertions, 0 deletions
diff --git a/pkgs/build-support/fetchipfs/builder.sh b/pkgs/build-support/fetchipfs/builder.sh
new file mode 100644
index 000000000000..7a6a517566f5
--- /dev/null
+++ b/pkgs/build-support/fetchipfs/builder.sh
@@ -0,0 +1,87 @@
+source $stdenv/setup
+
+# Curl flags to handle redirects, not use EPSV, handle cookies for
+# servers to need them during redirects, and work on SSL without a
+# certificate (this isn't a security problem because we check the
+# cryptographic hash of the output anyway).
+
+set -o noglob
+
+curl="curl \
+ --location \
+ --max-redirs 20 \
+ --retry 2 \
+ --disable-epsv \
+ --cookie-jar cookies \
+ --insecure \
+ --speed-time 5 \
+ -# \
+ --fail \
+ $curlOpts \
+ $NIX_CURL_FLAGS"
+
+finish() {
+ runHook postFetch
+ set +o noglob
+ exit 0
+}
+
+ipfs_add() {
+ if curl --retry 0 --head --silent "localhost:5001" > /dev/null; then
+ echo "=IPFS= add $ipfs"
+ tar --owner=root --group=root -cWf "source.tar" $(echo *)
+ res=$(curl -# -F "file=@source.tar" "localhost:5001/api/v0/tar/add" | sed 's/.*"Hash":"\(.*\)".*/\1/')
+ if [ $ipfs != $res ]; then
+ echo "\`ipfs tar add' results in $res when $ipfs is expected"
+ exit 1
+ fi
+ rm "source.tar"
+ fi
+}
+
+echo
+
+mkdir download
+cd download
+
+if curl --retry 0 --head --silent "localhost:5001" > /dev/null; then
+ curlexit=18;
+ echo "=IPFS= get $ipfs"
+ # if we get error code 18, resume partial download
+ while [ $curlexit -eq 18 ]; do
+ # keep this inside an if statement, since on failure it doesn't abort the script
+ if $curl -C - "http://localhost:5001/api/v0/tar/cat?arg=$ipfs" --output "$ipfs.tar"; then
+ unpackFile "$ipfs.tar"
+ rm "$ipfs.tar"
+ set +o noglob
+ mv $(echo *) "$out"
+ finish
+ else
+ curlexit=$?;
+ fi
+ done
+fi
+
+if test -n "$url"; then
+ curlexit=18;
+ echo "Downloading $url"
+ while [ $curlexit -eq 18 ]; do
+ # keep this inside an if statement, since on failure it doesn't abort the script
+ if $curl "$url" -O; then
+ set +o noglob
+ tmpfile=$(echo *)
+ unpackFile $tmpfile
+ rm $tmpfile
+ ipfs_add
+ mv $(echo *) "$out"
+ finish
+ else
+ curlexit=$?;
+ fi
+ done
+fi
+
+echo "error: cannot download $ipfs from ipfs or the given url"
+echo
+set +o noglob
+exit 1
diff --git a/pkgs/build-support/fetchipfs/default.nix b/pkgs/build-support/fetchipfs/default.nix
new file mode 100644
index 000000000000..196b3bebc916
--- /dev/null
+++ b/pkgs/build-support/fetchipfs/default.nix
@@ -0,0 +1,52 @@
+{ stdenv
+, curl
+}:
+
+{ ipfs
+, url ? ""
+, curlOpts ? ""
+, outputHash ? ""
+, outputHashAlgo ? ""
+, md5 ? ""
+, sha1 ? ""
+, sha256 ? ""
+, sha512 ? ""
+, meta ? {}
+, port ? "8080"
+, postFetch ? ""
+}:
+
+assert sha512 != "" -> builtins.compareVersions "1.11" builtins.nixVersion <= 0;
+
+let
+
+ hasHash = (outputHash != "" && outputHashAlgo != "")
+ || md5 != "" || sha1 != "" || sha256 != "" || sha512 != "";
+
+in
+
+if (!hasHash) then throw "Specify sha for fetchipfs fixed-output derivation" else stdenv.mkDerivation {
+ name = ipfs;
+ builder = ./builder.sh;
+ buildInputs = [ curl ];
+
+ # New-style output content requirements.
+ outputHashAlgo = if outputHashAlgo != "" then outputHashAlgo else
+ if sha512 != "" then "sha512" else if sha256 != "" then "sha256" else if sha1 != "" then "sha1" else "md5";
+ outputHash = if outputHash != "" then outputHash else
+ if sha512 != "" then sha512 else if sha256 != "" then sha256 else if sha1 != "" then sha1 else md5;
+
+ outputHashMode = "recursive";
+
+ inherit curlOpts
+ postFetch
+ ipfs
+ url
+ port;
+
+ # Doing the download on a remote machine just duplicates network
+ # traffic, so don't do that.
+ preferLocalBuild = true;
+
+ inherit meta;
+}