summary refs log tree commit diff
path: root/pkgs/build-support/fetchipfs/builder.sh
blob: 1ddd111b151827cdea8de1e491fbc7ce48033f6e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
if [ -e "$NIX_ATTRS_SH_FILE" ]; then . "$NIX_ATTRS_SH_FILE"; elif [ -f .attrs.sh ]; then . .attrs.sh; fi
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