Hex Artifact Content

Artifact 18dd990a6c2e968c21101df6fb0f4b2fb2d0890d:


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 66 69 6e 61 6c 55 52  l..local finalUR
0350: 4c 0a 0a 09 66 69 6c 65 3d 22 24 31 22 0a 09 73  L...file="$1"..s
0360: 68 69 66 74 0a 0a 09 75 72 6c 73 3d 28 22 24 40  hift...urls=("$@
0370: 22 29 0a 0a 09 66 69 6e 61 6c 55 52 4c 3d 22 24  ")...finalURL="$
0380: 7b 75 72 6c 73 5b 2d 31 5d 7d 22 0a 0a 09 63 61  {urls[-1]}"...ca
0390: 73 65 20 22 24 7b 64 6f 77 6e 6c 6f 61 64 50 72  se "${downloadPr
03a0: 6f 67 72 61 6d 7d 22 20 69 6e 0a 09 09 63 75 72  ogram}" in...cur
03b0: 6c 29 0a 09 09 09 64 6f 77 6e 6c 6f 61 64 50 72  l)....downloadPr
03c0: 6f 67 72 61 6d 41 72 67 73 3d 28 2d 2d 68 65 61  ogramArgs=(--hea
03d0: 64 65 72 20 22 58 2d 43 61 63 68 65 2d 55 52 4c  der "X-Cache-URL
03e0: 3a 20 24 7b 66 69 6e 61 6c 55 52 4c 7d 22 20 2d  : ${finalURL}" -
03f0: 2d 6c 6f 63 61 74 69 6f 6e 20 2d 2d 69 6e 73 65  -location --inse
0400: 63 75 72 65 20 2d 2d 66 61 69 6c 20 2d 2d 6f 75  cure --fail --ou
0410: 74 70 75 74 20 22 24 7b 66 69 6c 65 7d 22 29 0a  tput "${file}").
0420: 09 09 09 3b 3b 0a 09 09 77 67 65 74 29 0a 09 09  ...;;...wget)...
0430: 09 64 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 61 6d  .downloadProgram
0440: 41 72 67 73 3d 28 2d 2d 68 65 61 64 65 72 3d 22  Args=(--header="
0450: 58 2d 43 61 63 68 65 2d 55 52 4c 3a 20 24 7b 66  X-Cache-URL: ${f
0460: 69 6e 61 6c 55 52 4c 7d 22 20 2d 2d 6e 6f 2d 63  inalURL}" --no-c
0470: 68 65 63 6b 2d 63 65 72 74 69 66 69 63 61 74 65  heck-certificate
0480: 20 2d 2d 6f 75 74 70 75 74 2d 64 6f 63 75 6d 65   --output-docume
0490: 6e 74 3d 22 24 7b 66 69 6c 65 7d 22 29 0a 09 09  nt="${file}")...
04a0: 09 3b 3b 0a 09 65 73 61 63 0a 0a 09 66 6f 72 20  .;;..esac...for 
04b0: 75 72 6c 20 69 6e 20 22 24 7b 75 72 6c 73 5b 40  url in "${urls[@
04c0: 5d 7d 22 20 5f 5f 66 61 69 6c 5f 5f 3b 20 64 6f  ]}" __fail__; do
04d0: 0a 09 09 72 6d 20 2d 66 20 22 24 7b 66 69 6c 65  ...rm -f "${file
04e0: 7d 22 0a 0a 09 09 69 66 20 5b 20 22 24 7b 75 72  }"....if [ "${ur
04f0: 6c 7d 22 20 3d 20 27 5f 5f 66 61 69 6c 5f 5f 27  l}" = '__fail__'
0500: 20 5d 3b 20 74 68 65 6e 0a 09 09 09 72 65 74 75   ]; then....retu
0510: 72 6e 20 31 0a 09 09 66 69 0a 0a 09 09 22 24 7b  rn 1...fi...."${
0520: 64 6f 77 6e 6c 6f 61 64 50 72 6f 67 72 61 6d 7d  downloadProgram}
0530: 22 20 22 24 7b 64 6f 77 6e 6c 6f 61 64 50 72 6f  " "${downloadPro
0540: 67 72 61 6d 41 72 67 73 5b 40 5d 7d 22 20 22 24  gramArgs[@]}" "$
0550: 7b 75 72 6c 7d 22 20 26 26 20 62 72 65 61 6b 0a  {url}" && break.
0560: 09 64 6f 6e 65 0a 0a 09 72 65 74 75 72 6e 20 30  .done...return 0
0570: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 76 65 72  .}..function ver
0580: 69 66 79 48 61 73 68 28 29 20 7b 0a 09 6c 6f 63  ifyHash() {..loc
0590: 61 6c 20 66 69 6c 65 20 68 61 73 68 20 68 61 73  al file hash has
05a0: 68 4d 65 74 68 6f 64 0a 09 6c 6f 63 61 6c 20 63  hMethod..local c
05b0: 68 65 63 6b 48 61 73 68 0a 0a 09 66 69 6c 65 3d  heckHash...file=
05c0: 22 24 31 22 0a 09 68 61 73 68 3d 22 24 32 22 0a  "$1"..hash="$2".
05d0: 09 68 61 73 68 4d 65 74 68 6f 64 3d 22 24 33 22  .hashMethod="$3"
05e0: 0a 0a 09 69 66 20 5b 20 22 24 7b 68 61 73 68 4d  ...if [ "${hashM
05f0: 65 74 68 6f 64 7d 22 20 3d 20 27 6e 75 6c 6c 27  ethod}" = 'null'
0600: 20 5d 3b 20 74 68 65 6e 0a 09 09 72 65 74 75 72   ]; then...retur
0610: 6e 20 30 0a 09 66 69 0a 0a 09 63 68 65 63 6b 48  n 0..fi...checkH
0620: 61 73 68 3d 22 24 28 6f 70 65 6e 73 73 6c 20 22  ash="$(openssl "
0630: 24 7b 68 61 73 68 4d 65 74 68 6f 64 7d 22 20 22  ${hashMethod}" "
0640: 24 7b 66 69 6c 65 7d 22 20 7c 20 73 65 64 20 27  ${file}" | sed '
0650: 73 40 2e 2a 3d 20 2a 40 40 27 29 22 0a 0a 09 69  s@.*= *@@')"...i
0660: 66 20 5b 20 22 24 7b 63 68 65 63 6b 48 61 73 68  f [ "${checkHash
0670: 7d 22 20 3d 20 22 24 7b 68 61 73 68 7d 22 20 5d  }" = "${hash}" ]
0680: 3b 20 74 68 65 6e 0a 09 09 72 65 74 75 72 6e 20  ; then...return 
0690: 30 0a 09 66 69 0a 0a 09 65 63 68 6f 20 22 48 61  0..fi...echo "Ha
06a0: 73 68 20 28 24 7b 68 61 73 68 4d 65 74 68 6f 64  sh (${hashMethod
06b0: 7d 29 20 6d 69 73 6d 61 74 63 68 3a 20 47 6f 74  }) mismatch: Got
06c0: 3a 20 24 7b 63 68 65 63 6b 48 61 73 68 7d 3b 20  : ${checkHash}; 
06d0: 45 78 70 65 63 74 65 64 3a 20 24 7b 68 61 73 68  Expected: ${hash
06e0: 7d 22 20 3e 26 32 0a 0a 09 72 65 74 75 72 6e 20  }" >&2...return 
06f0: 31 0a 7d 0a 0a 72 6d 20 2d 66 20 22 24 7b 66 69  1.}..rm -f "${fi
0700: 6c 65 7d 2e 6e 65 77 22 20 7c 7c 20 65 78 69 74  le}.new" || exit
0710: 20 31 0a 0a 75 72 6c 73 3d 28 22 24 7b 75 72 6c   1..urls=("${url
0720: 7d 22 29 0a 0a 69 66 20 5b 20 22 24 7b 68 61 73  }")..if [ "${has
0730: 68 4d 65 74 68 6f 64 7d 22 20 21 3d 20 27 6e 75  hMethod}" != 'nu
0740: 6c 6c 27 20 5d 3b 20 74 68 65 6e 0a 09 75 72 6c  ll' ]; then..url
0750: 73 3d 28 0a 09 09 22 68 74 74 70 3a 2f 2f 68 61  s=(..."http://ha
0760: 73 68 63 61 63 68 65 2e 72 6b 65 65 6e 65 2e 6f  shcache.rkeene.o
0770: 72 67 2f 24 7b 68 61 73 68 4d 65 74 68 6f 64 7d  rg/${hashMethod}
0780: 2f 24 7b 68 61 73 68 7d 22 0a 09 09 22 24 7b 75  /${hash}"..."${u
0790: 72 6c 73 5b 40 5d 7d 22 0a 09 29 0a 66 69 0a 0a  rls[@]}"..).fi..
07a0: 64 6f 77 6e 6c 6f 61 64 46 69 6c 65 20 22 24 7b  downloadFile "${
07b0: 66 69 6c 65 7d 2e 6e 65 77 22 20 22 24 7b 75 72  file}.new" "${ur
07c0: 6c 73 5b 40 5d 7d 22 20 7c 7c 20 65 78 69 74 20  ls[@]}" || exit 
07d0: 31 0a 0a 76 65 72 69 66 79 48 61 73 68 20 22 24  1..verifyHash "$
07e0: 7b 66 69 6c 65 7d 2e 6e 65 77 22 20 22 24 7b 68  {file}.new" "${h
07f0: 61 73 68 7d 22 20 22 24 7b 68 61 73 68 4d 65 74  ash}" "${hashMet
0800: 68 6f 64 7d 22 20 7c 7c 20 65 78 69 74 20 31 0a  hod}" || exit 1.
0810: 0a 6d 76 20 22 24 7b 66 69 6c 65 7d 2e 6e 65 77  .mv "${file}.new
0820: 22 20 22 24 7b 66 69 6c 65 7d 22 20 7c 7c 20 65  " "${file}" || e
0830: 78 69 74 20 31 0a 0a 65 78 69 74 20 30 0a        xit 1..exit 0.