| #!/bin/sh |
| |
| ## Licensed under the terms of http://www.apache.org/licenses/LICENSE-2.0 |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # This is an ash/dash script (it uses "local"), not a bash script. |
| # It can run in an Alpine image durign a docker build. |
| # |
| # The advantage over using docker ADD is that it checks |
| # whether download file is already present and does not |
| # download each time. |
| # |
| # Shell script to download URL and check the checksum |
| |
| USAGE="Usage: $(basename "$0") --chksum [sha1|sha512] URL" |
| |
| if [ $# -eq 0 ] |
| then |
| echo "$USAGE" 2>&1 |
| exit 1 |
| fi |
| |
| CHKSUM_TYPE='unset' |
| |
| while [ $# -gt 0 ] ; do |
| case "$1" in |
| --chksum|-chksum|-sha|--sha) |
| if [ $# -lt 2 ] |
| then |
| echo "$USAGE" 1>&2 |
| exit 1 |
| fi |
| CHKSUM_TYPE=$2 |
| shift |
| shift |
| ;; |
| -h|--help) |
| echo "$USAGE" 1>&2 |
| exit 0 |
| ;; |
| -*) |
| echo "$USAGE" 1>&2 |
| exit 1 |
| ;; |
| *) |
| if [ $# -ne 1 ] |
| then |
| echo "$USAGE" 1>&2 |
| exit 1 |
| fi |
| URL="$1" |
| shift |
| ;; |
| esac |
| done |
| |
| case "${CHKSUM_TYPE}" in |
| unset) |
| echo "$USAGE" 1>&2 |
| exit 1 |
| ;; |
| sha*|md5) ;; |
| *) |
| echo "Bad checksum type: '$CHKSUM_TYPE' (must start 'sha' or be 'md5')" 2>&1 |
| exit 1 |
| ;; |
| esac |
| |
| ## ---- Script starts ---- |
| |
| ARTIFACT_URL="${URL}" |
| ARTIFACT_NAME="$(basename "$ARTIFACT_URL")" |
| |
| # -------- Checksum details |
| |
| CHKSUM_EXT=".${CHKSUM_TYPE}" |
| CHKSUM_URL="${ARTIFACT_URL}${CHKSUM_EXT}" |
| CHKSUM_FILE="${ARTIFACT_NAME}${CHKSUM_EXT}" |
| CHKSUMPROG="${CHKSUM_TYPE}sum" |
| # -------- |
| |
| CURL_FETCH_OPTS="-s -S --fail --location --max-redirs 3" |
| if false |
| then |
| echo "ARTIFACT_URL=$ARTIFACT_URL" |
| echo "CHKSUM_URL=$CHKSUM_URL" |
| fi |
| |
| download() { # URL |
| local URL="$1" |
| local FN="$(basename "$URL")" |
| if [ ! -e "$FN" ] |
| then |
| echo "Fetching $URL" |
| curl $CURL_FETCH_OPTS "$URL" --output "$FN" \ |
| || { echo "Bad download of $FN" 2>&1 ; return 1 ; } |
| else |
| echo "$FN already present" |
| fi |
| return 0 |
| } |
| |
| checkChksum() { # Filename checksum |
| local FN="$1" |
| local CHKSUM="$2" |
| if [ ! -e "$FN" ] |
| then |
| echo "No such file: '$FN'" 2>&1 |
| exit 1 |
| fi |
| # NB Two spaces required for busybox |
| echo "$CHKSUM $FN" | ${CHKSUMPROG} -c > /dev/null |
| } |
| |
| download "$ARTIFACT_URL" || exit 1 |
| |
| if [ -z "$CHKSUM" ] |
| then |
| # Checksum not previously set. |
| # Extract from file, copes with variations in content (filename or not) |
| download "$CHKSUM_URL" || exit 1 |
| CHKSUM="$(cut -d' ' -f1 "$CHKSUM_FILE")" |
| fi |
| |
| checkChksum "${ARTIFACT_NAME}" "$CHKSUM" |
| if [ $? = 0 ] |
| then |
| echo "Good download: $ARTIFACT_NAME" |
| else |
| echo "BAD download !!!! $ARTIFACT_NAME" |
| echo "To retry: delete downloaded files and try again" |
| exit 1 |
| fi |