#!/usr/bin/env bash __rvm_md5_calculate() { rvm_debug "Calculate md5 checksum for $@" \typeset _sum if builtin command -v md5 > /dev/null 2>&1 then _sum=$(md5 "$@") echo ${_sum##* } return 0 elif builtin command -v md5sum > /dev/null 2>&1 then _sum=$(md5sum "$@") echo ${_sum%% *} return 0 elif builtin command -v gmd5sum > /dev/null 2>&1 then _sum=$(gmd5sum "$@") echo ${_sum%% *} return 0 else for _path in /usr/gnu/bin /opt/csw/bin /sbin /bin /usr/bin /usr/sbin do if [[ -x "${_path}/md5" ]] then _sum=$(${_path}/md5 "$@") echo ${_sum##* } return 0 elif [[ -x "${_path}/md5sum" ]] then _sum=$(${_path}/md5sum "$@") echo ${_sum%% *} return 0 elif [[ -x "${_path}/gmd5sum" ]] then _sum=$(${_path}/gmd5sum "$@") echo ${_sum%% *} return 0 fi done fi rvm_error "Neither of md5sum, md5, gmd5sum found in the PATH" return 1 } __rvm_sha__calculate() { rvm_debug "Calculate sha512 checksum for $@" \typeset bits _sum bits=${1:-512} shift if builtin command -v sha${bits}sum >/dev/null then _sum=$(sha${bits}sum "$@") echo ${_sum% *} return 0 elif builtin command -v sha${bits} >/dev/null then _sum=$(sha${bits} "$@") if [[ "${_sum%% *}" == "SHA${bits}" ]] then echo ${_sum##* } # take last of: SHA512 (file) = .... else echo ${_sum% *} # take first of: ... file fi return 0 elif builtin command -v shasum >/dev/null then _sum=$(shasum -a${bits} "$@") echo ${_sum% *} return 0 elif # Drop-in for Solaris 10 builtin command -v /opt/csw/bin/shasum >/dev/null then _sum=$(/opt/csw/bin/shasum -a${bits} "$@") echo ${_sum% *} return 0 fi rvm_error "Neither sha512sum nor shasum found in the PATH" return 1 } # __rvm_checksum_calculate_file {file} # ENV out: _checksum_md5 _checksum_sha512 __rvm_checksum_calculate_file() { rvm_debug "Calculate checksums for file ${1}" _checksum_md5="$( __rvm_md5_calculate "${1:-}" )" _checksum_sha512="$( __rvm_sha__calculate 512 "${1:-}" )" } __rvm_checksum_none() { [[ -z "${_checksum_md5:-}" && -z "${_checksum_sha512:-}" ]] } __rvm_checksum_any() { [[ -n "${_checksum_md5:-}" || -n "${_checksum_sha512:-}" ]] } __rvm_checksum_all() { [[ -n "${_checksum_md5:-}" && -n "${_checksum_sha512:-}" ]] } # __rvm_checksum_validate_file {file} # ENV in: _checksum_md5 _checksum_sha512 __rvm_checksum_validate_file() { rvm_debug "Validating checksums for file ${1}" if __rvm_checksum_any then rvm_debug " ...checksums found in db" else rvm_debug " ...checksums not found in db" return 1 fi # Validate md5 checksum if [[ -n "${_checksum_md5:-}" ]] then rvm_debug "Validating md5 checksum" if [[ "$(__rvm_md5_calculate "${1:-}")" == "${_checksum_md5:-}" ]] then rvm_debug " ...md5 checksum is valid!" else rvm_debug " ...md5 checksum is not valid!!!" return 2 fi fi # Validate sha512 checksum if [[ -n "${_checksum_sha512:-}" ]] then rvm_debug "Validating sha15 checksum" if [[ "$(__rvm_sha__calculate 512 "${1:-}")" == "${_checksum_sha512:-}" ]] then rvm_debug " ...sha512 checksum is valid!" else rvm_debug " ...sha512 checksum is not valid!!!" return 3 fi fi return 0 } # __rvm_checksum_read {name...} # name - list of names to check, like: # # __rvm_checksum_read https://rvm.io/binaries/.../ruby-1.9.3-p194.tar.bz2 bin-ruby-1.9.3-p194.tar.bz2 # # ENV in/out: _checksum_md5 _checksum_sha512 __rvm_checksum_read() { rvm_debug "Load checksums for $1" __rvm_checksum_any && return 0 \typeset _type _value _name \typeset -a _list list=() for _name in "$@" do if [[ "$_name" == *"?"* ]] # try url without ?... like ?rvm={version} then list+=( "${_name%\?*}" ) else list+=( "$_name" ) fi done for _name in "${list[@]}" do rvm_debug "Searching checksum config files for $_name" # md5 _checksum_md5="$( __rvm_db_ "$rvm_path/config/md5" "$_name" | \command \head -n 1 )" [[ -n "${_checksum_md5:-}" ]] || _checksum_md5="$( __rvm_db_ "$rvm_user_path/md5" "$_name" | \command \head -n 1 )" # sha512 _checksum_sha512="$( __rvm_db_ "$rvm_path/config/sha512" "$_name" | \command \head -n 1 )" [[ -n "${_checksum_sha512:-}" ]] || _checksum_sha512="$( __rvm_db_ "$rvm_user_path/sha512" "$_name" | \command \head -n 1 )" __rvm_checksum_any && return 0 done # Try to get the Rubinius checksum from the network for _name in "${list[@]}" do if [[ $_name == http*rubinius* ]]; then if [[ -z "${_checksum_md5:-}" ]]; then _checksum_md5="$(__rvm_curl -s -L $_name.md5)" fi if [[ -z "${_checksum_sha512:-}" ]]; then _checksum_sha512="$(__rvm_curl -s -L $_name.sha512)" fi fi __rvm_checksum_any && return 0 done rvm_debug " ...checksums not found" return 1 # not found } # Record checksums in user settings # Usage: __rvm_checksum_write {name} # ENV in/out: _checksum_md5 _checksum_sha512 __rvm_checksum_write() { [[ -n "${1:-}" ]] || return 1 __rvm_checksum_any || return 1 [[ -z "${_checksum_md5:-}" ]] || __rvm_db_ "$rvm_user_path/md5" "${1:-}" "${_checksum_md5:-}" [[ -z "${_checksum_sha512:-}" ]] || __rvm_db_ "$rvm_user_path/sha512" "${1:-}" "${_checksum_sha512:-}" return 0 }