123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- #!/bin/bash
- set -eu -o pipefail
- declare -a urls
- usage() {
- echo "Usage: download --url https://example.org/test --url https://mirror.example/blah --output test.tar --sha256 1234..abc"
- exit "${1:-0}"
- }
- while [ $# -gt 0 ]; do
- case "$1" in
- --url)
- urls+=("$2")
- shift
- ;;
- --output)
- output="$2"
- shift
- ;;
- --sha256)
- sha256="$2"
- shift
- ;;
- --help|-h)
- usage
- ;;
- *)
- usage 1
- ;;
- esac
- shift
- done
- if [ -z "${output:-}" ] || [ -z "${sha256:-}" ] || [ -z "${urls[*]}" ]; then
- usage 1
- fi
- if [ -n "${DL_CACHE:-}" ]; then
- if [ -f "$DL_CACHE/$sha256" ]; then
- echo "download: Found '$output' (${sha256:0:8}...) in cache."
- cp "$DL_CACHE/$sha256" "$output"
- exit 0
- fi
- fi
- if [ "${DL_OFFLINE:-}" == "true" ]; then
- echo "download: ERROR: File '$output' (${sha256:0:8}...) not found in cache and offline mode is active!"
- exit 1
- fi
- tmpd="$(mktemp -d -p "${DL_CACHE:-.}")"
- cleanup() {
- rm -rf "$tmpd"
- }
- trap cleanup EXIT
- for url in "${urls[@]}"; do
- echo "download: Trying to fetch $url"
- wget --timeout=10 -O "$tmpd/unverified" "$url" || true
- sha256_received="$(sha256sum "$tmpd/unverified" | cut -d ' ' -f 1)"
- if [ "$sha256" != "$sha256_received" ]; then
- echo "download: WARNING: Hash mismatch: Expected $sha256 but received $sha256_received"
- continue
- fi
- echo "download: Fetched '$output' (${sha256:0:8}...) successfully."
- if [ -n "${DL_CACHE:-}" ]; then
- mv "$tmpd/unverified" "$DL_CACHE/$sha256"
- cp "$DL_CACHE/$sha256" "$output"
- exit 0
- fi
- mv "$tmpd/unverified" "$output"
- exit 0
- done
- echo "download: ERROR: Failed to download '$output' (${sha256:0:8}...)! No URLs left to try."
- exit 1
|