blob: c1c27cbb8cca87f5975b767166bd14239bbd73db (
plain)
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
89
90
91
92
93
94
95
96
97
98
|
#!/bin/bash
# Copyright (C) 2019 The Qt Company Ltd.
# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
# A helper script used for downloading a file from a URL or an alternative
# URL. Also the SHA is checked for the file (SHA algorithm is autodetected
# based on the SHA length). Target filename should also be given.
############################ BOILERPLATE ###############################
command -v sha1sum >/dev/null || sha1sum () { shasum -a 1 "$@" ; }
command -v sha256sum >/dev/null || sha256sum () { shasum -a 256 "$@" ; }
command -v sha384sum >/dev/null || sha384sum () { shasum -a 384 "$@" ; }
command -v sha512sum >/dev/null || sha512sum () { shasum -a 512 "$@" ; }
########################################################################
Download () {
url="$1"
targetFile="$2"
if command -v curl >/dev/null
then
curl --fail -L --retry 5 --retry-delay 5 -o "$targetFile" "$url"
else
wget --tries 5 -O "$targetFile" "$url"
fi
}
VerifyHash () {
file=$1
expectedHash=$2
if [ ! -f "$file" ]
then return 2 # file does not exist
fi
hashLength="$(echo "$expectedHash" | wc -c | sed 's/ *//g')"
# Use backticks because of bug with bash-3 (default on macOS),
# caused when there are unbalanced parentheses inside $()
# shellcheck disable=SC2006
hash=`case "$hashLength" in
41) sha1sum "$file" ;;
65) sha256sum "$file" ;;
97) sha384sum "$file" ;;
129) sha512sum "$file" ;;
*) echo "FATAL! Unknown hash length: $hashLength" 1>&2 ;;
esac | cut -d ' ' -f 1`
if [ -z $hash ] || [ ! "$expectedHash" = "$hash" ]
then
echo "FAIL! wrong file hash: $file $hash" 1>&2
return 1
fi
echo "OK verified integrity of: $file"
}
# Check if file already exists and is good, otherwise download it
DownloadURL () {
url=$1
url2=$2
expectedHash=$3
# Optional argument $4: destination filename
if [ -z "$4" ]
then
# defaults to the last component of $url
targetFile="${url/*\//}"
else
targetFile=$4
fi
# If a non-empty file already exists
if [ -s "$targetFile" ]
then
if VerifyHash "$targetFile" "$expectedHash"
then
echo "Skipping download, found and validated existing file: $targetFile"
return
else
echo "WARNING: Non-empty but different file found at destination; will re-download and overwrite file: $targetFile"
fi
fi
echo "Downloading from primary URL: $url"
if ! Download "$url" "$targetFile"
then
echo "FAIL! to download, trying alternative URL: $url2" 1>&2
if ! Download "$url2" "$targetFile"
then
echo 'FAIL! to download even from alternative URL' 1>&2
return 1
fi
fi
VerifyHash "$targetFile" "$expectedHash"
}
|