Artifact d546c4b48dfce80703e026590970cfac30222041:
0000: 23 21 20 2f 75 73 72 2f 62 69 6e 2f 65 6e 76 20 #! /usr/bin/env
0010: 62 61 73 68 0a 0a 75 72 6c 3d 22 24 31 22 0a 66 bash..url="$1".f
0020: 69 6c 65 3d 22 24 32 22 0a 68 61 73 68 3d 22 24 ile="$2".hash="$
0030: 33 22 0a 0a 69 66 20 5b 20 22 24 7b 23 7d 22 20 3"..if [ "${#}"
0040: 21 3d 20 27 33 27 20 5d 3b 20 74 68 65 6e 0a 09 != '3' ]; then..
0050: 65 63 68 6f 20 27 55 73 61 67 65 3a 20 64 6f 77 echo 'Usage: dow
0060: 6e 6c 6f 61 64 20 3c 75 72 6c 3e 20 3c 66 69 6c nload <url> <fil
0070: 65 3e 20 3c 68 61 73 68 3e 27 20 3e 26 32 0a 0a e> <hash>' >&2..
0080: 09 65 78 69 74 20 31 0a 66 69 0a 0a 66 6f 72 20 .exit 1.fi..for
0090: 74 72 79 44 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 tryDownloadProgr
00a0: 61 6d 20 69 6e 20 77 67 65 74 20 63 75 72 6c 3b am in wget curl;
00b0: 20 64 6f 0a 09 74 72 79 44 6f 77 6e 6c 6f 61 64 do..tryDownload
00c0: 50 72 6f 67 72 61 6d 50 61 74 68 3d 22 24 28 77 ProgramPath="$(w
00d0: 68 69 63 68 20 22 24 7b 74 72 79 44 6f 77 6e 6c hich "${tryDownl
00e0: 6f 61 64 50 72 6f 67 72 61 6d 7d 22 20 32 3e 2f oadProgram}" 2>/
00f0: 64 65 76 2f 6e 75 6c 6c 29 22 0a 0a 09 69 66 20 dev/null)"...if
0100: 5b 20 2d 7a 20 22 24 7b 74 72 79 44 6f 77 6e 6c [ -z "${tryDownl
0110: 6f 61 64 50 72 6f 67 72 61 6d 50 61 74 68 7d 22 oadProgramPath}"
0120: 20 5d 3b 20 74 68 65 6e 0a 09 09 63 6f 6e 74 69 ]; then...conti
0130: 6e 75 65 0a 09 66 69 0a 0a 09 69 66 20 5b 20 2d nue..fi...if [ -
0140: 78 20 22 24 7b 74 72 79 44 6f 77 6e 6c 6f 61 64 x "${tryDownload
0150: 50 72 6f 67 72 61 6d 50 61 74 68 7d 22 20 5d 3b ProgramPath}" ];
0160: 20 74 68 65 6e 0a 09 09 64 6f 77 6e 6c 6f 61 64 then...download
0170: 50 72 6f 67 72 61 6d 3d 22 24 7b 74 72 79 44 6f Program="${tryDo
0180: 77 6e 6c 6f 61 64 50 72 6f 67 72 61 6d 7d 22 0a wnloadProgram}".
0190: 09 09 64 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 61 ..downloadProgra
01a0: 6d 50 61 74 68 3d 22 24 7b 74 72 79 44 6f 77 6e mPath="${tryDown
01b0: 6c 6f 61 64 50 72 6f 67 72 61 6d 50 61 74 68 7d loadProgramPath}
01c0: 22 0a 0a 09 09 62 72 65 61 6b 0a 09 66 69 0a 64 "....break..fi.d
01d0: 6f 6e 65 0a 0a 63 61 73 65 20 22 24 7b 68 61 73 one..case "${has
01e0: 68 7d 22 20 69 6e 0a 09 3f 3f 3f 3f 3f 3f 3f 3f h}" in..????????
01f0: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f ????????????????
0200: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f ????????????????
0210: 29 0a 09 09 68 61 73 68 4d 65 74 68 6f 64 3d 27 )...hashMethod='
0220: 73 68 61 31 27 0a 09 09 3b 3b 0a 09 3f 3f 3f 3f sha1'...;;..????
0230: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f ????????????????
0240: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f ????????????????
0250: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f ????????????????
0260: 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 3f 29 0a 09 09 ????????????)...
0270: 68 61 73 68 4d 65 74 68 6f 64 3d 27 73 68 61 32 hashMethod='sha2
0280: 35 36 27 0a 09 09 3b 3b 0a 09 2d 29 0a 09 09 68 56'...;;..-)...h
0290: 61 73 68 4d 65 74 68 6f 64 3d 27 6e 75 6c 6c 27 ashMethod='null'
02a0: 0a 09 09 3b 3b 0a 09 2a 29 0a 09 09 65 63 68 6f ...;;..*)...echo
02b0: 20 22 55 6e 6b 6e 6f 77 6e 20 68 61 73 68 20 6d "Unknown hash m
02c0: 65 74 68 6f 64 20 66 6f 72 20 68 61 73 68 20 24 ethod for hash $
02d0: 7b 68 61 73 68 7d 22 20 3e 26 32 0a 0a 09 09 65 {hash}" >&2....e
02e0: 78 69 74 20 31 0a 09 09 3b 3b 0a 65 73 61 63 0a xit 1...;;.esac.
02f0: 0a 66 75 6e 63 74 69 6f 6e 20 64 6f 77 6e 6c 6f .function downlo
0300: 61 64 46 69 6c 65 28 29 20 7b 0a 09 6c 6f 63 61 adFile() {..loca
0310: 6c 20 66 69 6c 65 20 75 72 6c 73 0a 09 6c 6f 63 l file urls..loc
0320: 61 6c 20 64 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 al downloadProgr
0330: 61 6d 41 72 67 73 0a 09 6c 6f 63 61 6c 20 75 72 amArgs..local ur
0340: 6c 0a 09 6c 6f 63 61 6c 20 61 75 74 68 6f 72 69 l..local authori
0350: 74 61 74 69 76 65 55 52 4c 0a 0a 09 66 69 6c 65 tativeURL...file
0360: 3d 22 24 31 22 0a 09 73 68 69 66 74 0a 0a 09 75 ="$1"..shift...u
0370: 72 6c 73 3d 28 22 24 40 22 29 0a 0a 09 61 75 74 rls=("$@")...aut
0380: 68 6f 72 69 74 61 74 69 76 65 55 52 4c 3d 22 24 horitativeURL="$
0390: 7b 75 72 6c 73 5b 40 5d 3a 20 2d 31 7d 22 0a 0a {urls[@]: -1}"..
03a0: 09 63 61 73 65 20 22 24 7b 64 6f 77 6e 6c 6f 61 .case "${downloa
03b0: 64 50 72 6f 67 72 61 6d 7d 22 20 69 6e 0a 09 09 dProgram}" in...
03c0: 63 75 72 6c 29 0a 09 09 09 64 6f 77 6e 6c 6f 61 curl)....downloa
03d0: 64 50 72 6f 67 72 61 6d 41 72 67 73 3d 28 2d 2d dProgramArgs=(--
03e0: 68 65 61 64 65 72 20 22 58 2d 43 61 63 68 65 2d header "X-Cache-
03f0: 55 52 4c 3a 20 24 7b 61 75 74 68 6f 72 69 74 61 URL: ${authorita
0400: 74 69 76 65 55 52 4c 7d 22 20 2d 2d 6c 6f 63 61 tiveURL}" --loca
0410: 74 69 6f 6e 20 2d 2d 69 6e 73 65 63 75 72 65 20 tion --insecure
0420: 2d 2d 66 61 69 6c 20 2d 2d 6f 75 74 70 75 74 20 --fail --output
0430: 22 24 7b 66 69 6c 65 7d 22 29 0a 09 09 09 3b 3b "${file}")....;;
0440: 0a 09 09 77 67 65 74 29 0a 09 09 09 64 6f 77 6e ...wget)....down
0450: 6c 6f 61 64 50 72 6f 67 72 61 6d 41 72 67 73 3d loadProgramArgs=
0460: 28 2d 2d 68 65 61 64 65 72 3d 22 58 2d 43 61 63 (--header="X-Cac
0470: 68 65 2d 55 52 4c 3a 20 24 7b 61 75 74 68 6f 72 he-URL: ${author
0480: 69 74 61 74 69 76 65 55 52 4c 7d 22 20 2d 2d 6e itativeURL}" --n
0490: 6f 2d 63 68 65 63 6b 2d 63 65 72 74 69 66 69 63 o-check-certific
04a0: 61 74 65 20 2d 2d 6f 75 74 70 75 74 2d 64 6f 63 ate --output-doc
04b0: 75 6d 65 6e 74 3d 22 24 7b 66 69 6c 65 7d 22 29 ument="${file}")
04c0: 0a 09 09 09 3b 3b 0a 09 65 73 61 63 0a 0a 09 66 ....;;..esac...f
04d0: 6f 72 20 75 72 6c 20 69 6e 20 22 24 7b 75 72 6c or url in "${url
04e0: 73 5b 40 5d 7d 22 20 5f 5f 66 61 69 6c 5f 5f 3b s[@]}" __fail__;
04f0: 20 64 6f 0a 09 09 72 6d 20 2d 66 20 22 24 7b 66 do...rm -f "${f
0500: 69 6c 65 7d 22 0a 0a 09 09 69 66 20 5b 20 22 24 ile}"....if [ "$
0510: 7b 75 72 6c 7d 22 20 3d 20 27 5f 5f 66 61 69 6c {url}" = '__fail
0520: 5f 5f 27 20 5d 3b 20 74 68 65 6e 0a 09 09 09 72 __' ]; then....r
0530: 65 74 75 72 6e 20 31 0a 09 09 66 69 0a 0a 09 09 eturn 1...fi....
0540: 22 24 7b 64 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 "${downloadProgr
0550: 61 6d 7d 22 20 22 24 7b 64 6f 77 6e 6c 6f 61 64 am}" "${download
0560: 50 72 6f 67 72 61 6d 41 72 67 73 5b 40 5d 7d 22 ProgramArgs[@]}"
0570: 20 22 24 7b 75 72 6c 7d 22 20 26 26 20 62 72 65 "${url}" && bre
0580: 61 6b 0a 09 64 6f 6e 65 0a 0a 09 72 65 74 75 72 ak..done...retur
0590: 6e 20 30 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 n 0.}..function
05a0: 76 65 72 69 66 79 48 61 73 68 28 29 20 7b 0a 09 verifyHash() {..
05b0: 6c 6f 63 61 6c 20 66 69 6c 65 20 68 61 73 68 20 local file hash
05c0: 68 61 73 68 4d 65 74 68 6f 64 0a 09 6c 6f 63 61 hashMethod..loca
05d0: 6c 20 63 68 65 63 6b 48 61 73 68 0a 0a 09 66 69 l checkHash...fi
05e0: 6c 65 3d 22 24 31 22 0a 09 68 61 73 68 3d 22 24 le="$1"..hash="$
05f0: 32 22 0a 09 68 61 73 68 4d 65 74 68 6f 64 3d 22 2"..hashMethod="
0600: 24 33 22 0a 0a 09 69 66 20 5b 20 22 24 7b 68 61 $3"...if [ "${ha
0610: 73 68 4d 65 74 68 6f 64 7d 22 20 3d 20 27 6e 75 shMethod}" = 'nu
0620: 6c 6c 27 20 5d 3b 20 74 68 65 6e 0a 09 09 72 65 ll' ]; then...re
0630: 74 75 72 6e 20 30 0a 09 66 69 0a 0a 09 63 68 65 turn 0..fi...che
0640: 63 6b 48 61 73 68 3d 22 24 28 6f 70 65 6e 73 73 ckHash="$(openss
0650: 6c 20 64 67 73 74 20 22 2d 24 7b 68 61 73 68 4d l dgst "-${hashM
0660: 65 74 68 6f 64 7d 22 20 22 24 7b 66 69 6c 65 7d ethod}" "${file}
0670: 22 20 7c 20 73 65 64 20 27 73 40 2e 2a 3d 20 2a " | sed 's@.*= *
0680: 40 40 27 29 22 0a 0a 09 69 66 20 5b 20 22 24 7b @@')"...if [ "${
0690: 63 68 65 63 6b 48 61 73 68 7d 22 20 3d 20 22 24 checkHash}" = "$
06a0: 7b 68 61 73 68 7d 22 20 5d 3b 20 74 68 65 6e 0a {hash}" ]; then.
06b0: 09 09 72 65 74 75 72 6e 20 30 0a 09 66 69 0a 0a ..return 0..fi..
06c0: 09 65 63 68 6f 20 22 48 61 73 68 20 28 24 7b 68 .echo "Hash (${h
06d0: 61 73 68 4d 65 74 68 6f 64 7d 29 20 6d 69 73 6d ashMethod}) mism
06e0: 61 74 63 68 3a 20 47 6f 74 3a 20 24 7b 63 68 65 atch: Got: ${che
06f0: 63 6b 48 61 73 68 7d 3b 20 45 78 70 65 63 74 65 ckHash}; Expecte
0700: 64 3a 20 24 7b 68 61 73 68 7d 22 20 3e 26 32 0a d: ${hash}" >&2.
0710: 0a 09 72 65 74 75 72 6e 20 31 0a 7d 0a 0a 72 6d ..return 1.}..rm
0720: 20 2d 66 20 22 24 7b 66 69 6c 65 7d 2e 6e 65 77 -f "${file}.new
0730: 22 20 7c 7c 20 65 78 69 74 20 31 0a 0a 75 72 6c " || exit 1..url
0740: 73 3d 28 22 24 7b 75 72 6c 7d 22 29 0a 0a 69 66 s=("${url}")..if
0750: 20 5b 20 22 24 7b 68 61 73 68 4d 65 74 68 6f 64 [ "${hashMethod
0760: 7d 22 20 21 3d 20 27 6e 75 6c 6c 27 20 5d 3b 20 }" != 'null' ];
0770: 74 68 65 6e 0a 09 75 72 6c 73 3d 28 0a 09 09 22 then..urls=(..."
0780: 68 74 74 70 3a 2f 2f 68 61 73 68 63 61 63 68 65 http://hashcache
0790: 2e 72 6b 65 65 6e 65 2e 6f 72 67 2f 24 7b 68 61 .rkeene.org/${ha
07a0: 73 68 4d 65 74 68 6f 64 7d 2f 24 7b 68 61 73 68 shMethod}/${hash
07b0: 7d 22 0a 09 09 22 24 7b 75 72 6c 73 5b 40 5d 7d }"..."${urls[@]}
07c0: 22 0a 09 29 0a 66 69 0a 0a 64 6f 77 6e 6c 6f 61 "..).fi..downloa
07d0: 64 46 69 6c 65 20 22 24 7b 66 69 6c 65 7d 2e 6e dFile "${file}.n
07e0: 65 77 22 20 22 24 7b 75 72 6c 73 5b 40 5d 7d 22 ew" "${urls[@]}"
07f0: 20 7c 7c 20 65 78 69 74 20 31 0a 0a 76 65 72 69 || exit 1..veri
0800: 66 79 48 61 73 68 20 22 24 7b 66 69 6c 65 7d 2e fyHash "${file}.
0810: 6e 65 77 22 20 22 24 7b 68 61 73 68 7d 22 20 22 new" "${hash}" "
0820: 24 7b 68 61 73 68 4d 65 74 68 6f 64 7d 22 20 7c ${hashMethod}" |
0830: 7c 20 65 78 69 74 20 31 0a 0a 6d 76 20 22 24 7b | exit 1..mv "${
0840: 66 69 6c 65 7d 2e 6e 65 77 22 20 22 24 7b 66 69 file}.new" "${fi
0850: 6c 65 7d 22 20 7c 7c 20 65 78 69 74 20 31 0a 0a le}" || exit 1..
0860: 65 78 69 74 20 30 0a exit 0.