Hex Artifact Content

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.