rbash_url() { local path="$1" printf '%s/%s/raw/%s/%s/%s\n' \ "$RBASH_REMOTE" "$RBASH_REPO" "$RBASH_REF" "$RBASH_PATH" "$path" } rbash_download() { local url="$1" if command -v curl >/dev/null 2>&1; then curl -fsSL "$url" || { local rc=$? echo "rbash: download failed: $url" >&2 echo "rbash: curl exit code: $rc" >&2 return "$rc" } elif command -v wget >/dev/null 2>&1; then wget -qO- "$url" || { local rc=$? echo "rbash: download failed: $url" >&2 echo "rbash: wget exit code: $rc" >&2 return "$rc" } else echo "rbash: curl or wget is required" >&2 return 127 fi } function rbash_download_sig { local _URL _LOC _SIG tmp _SIG="$1" _URL="$2" _LOC="$3" tmp=$( mktemp ) rbash_download "$_URL" > "$tmp" sha256sum "$tmp" | grep -q "$_SIG" if [ $? -eq 0 ]; then mv "$tmp" "$_LOC" else echo "Download $_LOC: Signature mismatch" >&2 return 1 fi } rbash_cache() { local sig="$1" local url="$2" local key file if [ -z "${RBASH_CACHE_DIR:-}" ]; then echo "rbash: RBASH_CACHE_DIR is not set" >&2 return 1 fi mkdir -p "$RBASH_CACHE_DIR" || { echo "rbash: failed to create cache dir: $RBASH_CACHE_DIR" >&2 return 1 } if command -v md5sum >/dev/null 2>&1; then key="$(printf '%s' "$url" | md5sum | cut -d' ' -f1)" else key="$(printf '%s' "$url" | md5 | cut -d' ' -f1)" fi file="$RBASH_CACHE_DIR/$key" if [ ! -f "$file" ]; then rbash_download_sig "$sig" "$url" "$file" || { local rc=$? rm -f "$file" echo "rbash: download failed: $url" >&2 return "$rc" } chmod 700 "$file" fi printf '%s\n' "$file" } _require_jq() { if ! command -v jq >/dev/null 2>&1; then echo "This command requires jq." >&2 return 1 fi }