181 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/bin/sh
 | |
| # Copyright 2016 The Rust Project Developers. See the COPYRIGHT
 | |
| # file at the top-level directory of this distribution and at
 | |
| # http://rust-lang.org/COPYRIGHT.
 | |
| #
 | |
| # Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
 | |
| # http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
 | |
| # <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
 | |
| # option. This file may not be copied, modified, or distributed
 | |
| # except according to those terms.
 | |
| 
 | |
| # This is just a little script that can be downloaded from the internet to
 | |
| # install solana-install. It just does platform detection, downloads the installer
 | |
| # and runs it.
 | |
| 
 | |
| { # this ensures the entire script is downloaded #
 | |
| 
 | |
| if [ -z "$SOLANA_DOWNLOAD_ROOT" ]; then
 | |
|     SOLANA_DOWNLOAD_ROOT="https://github.com/solana-labs/solana/releases/download/"
 | |
| fi
 | |
| GH_LATEST_RELEASE="https://api.github.com/repos/solana-labs/solana/releases/latest"
 | |
| 
 | |
| set -e
 | |
| 
 | |
| usage() {
 | |
|     cat 1>&2 <<EOF
 | |
| solana-install-init
 | |
| initializes a new installation
 | |
| 
 | |
| USAGE:
 | |
|     solana-install-init [FLAGS] [OPTIONS] --data_dir <PATH> --pubkey <PUBKEY>
 | |
| 
 | |
| FLAGS:
 | |
|     -h, --help              Prints help information
 | |
|         --no-modify-path    Don't configure the PATH environment variable
 | |
| 
 | |
| OPTIONS:
 | |
|     -d, --data_dir <PATH>    Directory to store install data
 | |
|     -u, --url <URL>          JSON RPC URL for the solana cluster
 | |
|     -p, --pubkey <PUBKEY>    Public key of the update manifest
 | |
| EOF
 | |
| }
 | |
| 
 | |
| main() {
 | |
|     downloader --check
 | |
|     need_cmd uname
 | |
|     need_cmd mktemp
 | |
|     need_cmd chmod
 | |
|     need_cmd mkdir
 | |
|     need_cmd rm
 | |
|     need_cmd sed
 | |
|     need_cmd grep
 | |
| 
 | |
|     for arg in "$@"; do
 | |
|       case "$arg" in
 | |
|         -h|--help)
 | |
|           usage
 | |
|           exit 0
 | |
|           ;;
 | |
|         *)
 | |
|           ;;
 | |
|       esac
 | |
|     done
 | |
| 
 | |
|     case "$(uname)" in
 | |
|     Linux)
 | |
|       TARGET=x86_64-unknown-linux-gnu
 | |
|       ;;
 | |
|     Darwin)
 | |
|       TARGET=x86_64-apple-darwin
 | |
|       ;;
 | |
|     *)
 | |
|       err "machine architecture is currently unsupported"
 | |
|       ;;
 | |
|     esac
 | |
| 
 | |
|     temp_dir="$(mktemp -d 2>/dev/null || ensure mktemp -d -t solana-install-init)"
 | |
|     ensure mkdir -p "$temp_dir"
 | |
| 
 | |
|     # Check for SOLANA_RELEASE environment variable override.  Otherwise fetch
 | |
|     # the latest release tag from github
 | |
|     if [ -n "$SOLANA_RELEASE" ]; then
 | |
|       release="$SOLANA_RELEASE"
 | |
|     else
 | |
|       release_file="$temp_dir/release"
 | |
|       printf 'looking for latest release\n' 1>&2
 | |
|       ensure downloader "$GH_LATEST_RELEASE" "$release_file"
 | |
|       release=$(\
 | |
|         grep -m 1 \"tag_name\": "$release_file" \
 | |
|         | sed -ne 's/^ *"tag_name": "\([^"]*\)",$/\1/p' \
 | |
|       )
 | |
|       if [ -z "$release" ]; then
 | |
|         err 'Unable to figure latest release'
 | |
|       fi
 | |
|     fi
 | |
| 
 | |
|     download_url="$SOLANA_DOWNLOAD_ROOT/$release/solana-install-init-$TARGET"
 | |
|     solana_install_init="$temp_dir/solana-install-init"
 | |
| 
 | |
|     printf 'downloading %s installer\n' "$release" 1>&2
 | |
| 
 | |
|     ensure mkdir -p "$temp_dir"
 | |
|     ensure downloader "$download_url" "$solana_install_init"
 | |
|     ensure chmod u+x "$solana_install_init"
 | |
|     if [ ! -x "$solana_install_init" ]; then
 | |
|         printf '%s\n' "Cannot execute $solana_install_init (likely because of mounting /tmp as noexec)." 1>&2
 | |
|         printf '%s\n' "Please copy the file to a location where you can execute binaries and run ./solana-install-init." 1>&2
 | |
|         exit 1
 | |
|     fi
 | |
| 
 | |
|     if [ -z "$1" ]; then
 | |
|       #shellcheck disable=SC2086
 | |
|       ignore "$solana_install_init" $SOLANA_INSTALL_INIT_ARGS
 | |
|     else
 | |
|       ignore "$solana_install_init" "$@"
 | |
|     fi
 | |
|     retval=$?
 | |
| 
 | |
|     ignore rm "$solana_install_init"
 | |
|     ignore rm -rf "$temp_dir"
 | |
| 
 | |
|     return "$retval"
 | |
| }
 | |
| 
 | |
| err() {
 | |
|     printf 'solana-install-init: %s\n' "$1" >&2
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| need_cmd() {
 | |
|     if ! check_cmd "$1"; then
 | |
|         err "need '$1' (command not found)"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| check_cmd() {
 | |
|     command -v "$1" > /dev/null 2>&1
 | |
| }
 | |
| 
 | |
| # Run a command that should never fail. If the command fails execution
 | |
| # will immediately terminate with an error showing the failing
 | |
| # command.
 | |
| ensure() {
 | |
|     if ! "$@"; then
 | |
|       err "command failed: $*"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # This is just for indicating that commands' results are being
 | |
| # intentionally ignored. Usually, because it's being executed
 | |
| # as part of error handling.
 | |
| ignore() {
 | |
|     "$@"
 | |
| }
 | |
| 
 | |
| # This wraps curl or wget. Try curl first, if not installed,
 | |
| # use wget instead.
 | |
| downloader() {
 | |
|     if check_cmd curl; then
 | |
|         program=curl
 | |
|     elif check_cmd wget; then
 | |
|         program=wget
 | |
|     else
 | |
|         program='curl or wget' # to be used in error message of need_cmd
 | |
|     fi
 | |
| 
 | |
|     if [ "$1" = --check ]; then
 | |
|         need_cmd "$program"
 | |
|     elif [ "$program" = curl ]; then
 | |
|         curl -sSfL "$1" -o "$2"
 | |
|     elif [ "$program" = wget ]; then
 | |
|         wget "$1" -O "$2"
 | |
|     else
 | |
|         err "Unknown downloader"   # should not reach here
 | |
|     fi
 | |
| }
 | |
| 
 | |
| main "$@"
 | |
| 
 | |
| } # this ensures the entire script is downloaded #
 |