blob: bf4e2ae669606e568b0b6bf4e4de3f98b44f03d7 [file] [log] [blame]
#!/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