123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231 |
- #!/usr/bin/env bash
- url="$1"
- archive="$2"
- [[ -n "$url" ]] || rvm_fail "BUG: no url given for fetch"
- shift || rvm_fail "BUG: $0 called without an argument :/"
- rvm_base_except="selector"
- source "$rvm_scripts_path/base"
- # handled by teardown - scripts/functions/environment:314
- __rvm_cleanup_download()
- {
- [[ -f "$archive" ]] && __rvm_rm_rf "$archive"
- }
- __rvm_cd "$rvm_archives_path"
- [[ -n "$archive" ]] || archive=$(basename "$url")
- fetch_command=( __rvm_curl --create-dirs -C - -o "${archive}.part" )
- download=1
- try_ftp=0
- result=0
- retry=0
- __rvm_checksum_read "$url" "$archive"
- __rvm_checksum_any || (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}} > 0 )) ||
- rvm_fail "There is no checksum for '$url' or '$archive', it's not possible to validate it.
- This could be because your RVM install's list of versions is out of date. You may want to
- update your list of rubies by running 'rvm get stable' and try again.
- If that does not resolve the issue and you wish to continue with unverified download
- add '--verify-downloads 1' after the command.
- "
- function verification_check()
- {
- if
- (( ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>=$1 ))
- then
- rvm_debug "Archive ${archive} checksum $2, continuing anyway."
- else
- rvm_warn "Archive ${archive} checksum $2, downloading again."
- download=1
- fi
- }
- rvm_debug "Fetch $url => $archive"
- download=0
- if
- [[ -e "$archive" ]]
- then
- # Check first if we have the correct archive
- if
- __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
- then
- rvm_debug " ...archive checksum matched, not downloading"
- else
- case $? in
- (1) verification_check 1 "not found" ;;
- (*) verification_check 2 "did not match" ;;
- esac
- fi
- else
- rvm_debug " ...no archive, downloading"
- download=1
- fi
- function download_the_url()
- {
- \typeset counter=${1:-0}
- if
- (( counter >3 ))
- then
- rvm_error "ERROR: Retried 3 times and failed!"
- return 200
- fi
- "${fetch_command[@]}" "$url" &&
- \command \mv "${archive}.part" "${archive}" ||
- {
- result=$?
- case "$result" in
- (22|78)
- rvm_error "The requested url does not exist($result): '$url'"
- ;;
- (18)
- rvm_error "Partial file($result). Only a part of the file was transferred. Removing partial and re-trying."
- \command \rm -f "${archive}.part"
- download_the_url $counter
- ;;
- (33)
- rvm_debug "Server does not support 'range' command($result), removing '${archive}.part'"
- \command \rm -f "${archive}.part"
- download_the_url $counter
- ;;
- # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
- (60)
- log "
- Could not download '${_url}', you can read more about it here:
- https://rvm.io/support/fixing-broken-ssl-certificates/
- To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
- "
- ;;
- # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
- (77)
- log "
- It looks like you have old certificates, you can read more about it here:
- https://rvm.io/support/fixing-broken-ssl-certificates/
- "
- ;;
- # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
- (141)
- rvm_warn "Curl returned 141 - it is result of a segfault which means it's Curls fault.
- Try again and if it crashes more than a couple of times you either need to
- reinstall Curl or consult with your distribution manual and contact support."
- ;;
- (*)
- rvm_error "There was an error($result)."
- ;;
- esac
- return $result
- }
- }
- if
- (( download > 0 ))
- then
- download_the_url ||
- {
- \typeset __fallback __default_url __default __iterator result=$?
- \typeset -a __fallbacks
- __fallbacks=()
- for __default in ruby rubygems
- do
- __default_url="$(__rvm_db ${__default}_url)"
- if
- [[ "${url}" == "${__default_url}"* ]]
- then
- __iterator=1
- while
- __fallback="$(__rvm_db ${__default}_url_fallback_${__iterator})" &&
- [[ -n "${__fallback}" ]]
- do
- __fallback_patern="$(__rvm_db ${__default}_url_fallback_${__iterator}_pattern)"
- if
- [[ -n "${__fallback_patern}" ]]
- then
- __fallbacks+=( "$(__rvm_sed -E "s#${__fallback_patern}#${__fallback}#" <<<"${url}")" )
- else
- __fallbacks+=( "${url/${__default_url}/${__fallback}}" )
- fi
- : $(( __iterator+=1 ))
- done
- fi
- done
- if
- [[ -n "${__fallbacks[*]}" ]] # already detected something
- then
- true
- elif
- [[ "${url}" == "http://"* ]]
- then
- __fallbacks+=( "${url/http:/ftp:}" "${url/http:\/\//https://www.mirrorservice.org/sites/}" )
- elif
- [[ "${url}" == "https://"* ]]
- then
- __fallbacks+=( "${url/https:/ftp:}" "${url/https:\/\//https://www.mirrorservice.org/sites/}" )
- else
- rvm_fail "
- No fallback URL can be calculated for ${url}, open a ticket with full output here:
- https://github.com/rvm/rvm/issues
- " $result
- fi
- for __fallback in "${__fallbacks[@]}"
- do
- rvm_warn "Checking fallback: ${__fallback}"
- if
- file_exists_at_url "${__fallback}"
- then
- url="${__fallback}"
- download_the_url 1 || rvm_fail "Failed download" $?
- result=0
- break
- fi
- done
- if
- (( result ))
- then
- rvm_fail "\
- No fallback URL could be found, try increasing timeout with:
- echo \"export rvm_max_time_flag=20\" >> ~/.rvmrc
- " $result
- fi
- }
- fi
- # Check if we have downloaded the correct archive
- if
- __rvm_checksum_validate_file "$rvm_archives_path/${archive}"
- then
- rvm_debug "Downloaded archive checksum matched."
- else
- result=$?
- if
- (( result==1 && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>0 ))
- then
- rvm_warn "No checksum for downloaded archive, recording checksum in user configuration."
- __rvm_checksum_calculate_file "$archive"
- __rvm_checksum_write "$url"
- elif
- (( result>1 && ${rvm_verify_downloads_flag_cli:-${rvm_verify_downloads_flag:-1}}>1 ))
- then
- rvm_warn "Downloaded archive checksum did not match!"
- elif
- (( result == 1 ))
- then
- rvm_fail "Downloaded archive checksum could not be verified!
- If you wish to continue with unverified download add '--verify-downloads 1' after the command.
- "
- else
- \command \rm -f $archive
- rvm_fail "Downloaded archive checksum did not match, archive was removed!
- If you wish to continue with not matching download add '--verify-downloads 2' after the command.
- "
- fi
- fi
|