From 0595109f98fcfe7d0b6227c6c28e3e5d83e685b3 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Sat, 8 Jun 2019 19:01:22 -0700 Subject: [PATCH] Add solana-install-init binary (#4613) * Add solana-install-init binary * Add Enter prompt on solana-install-init exit for Windows users --- README.md | 12 ++--- book/src/installer.md | 16 +++--- install/Cargo.toml | 8 +++ install/solana-install-init.sh | 18 +++---- install/src/{main.rs => lib.rs} | 85 +++++++++++++++++++++++++++++++- install/src/main-install-init.rs | 27 ++++++++++ install/src/main-install.rs | 3 ++ scripts/cargo-install-all.sh | 1 + 8 files changed, 146 insertions(+), 24 deletions(-) rename install/src/{main.rs => lib.rs} (76%) create mode 100644 install/src/main-install-init.rs create mode 100644 install/src/main-install.rs diff --git a/README.md b/README.md index 665c7af1f..36e71728b 100644 --- a/README.md +++ b/README.md @@ -41,25 +41,25 @@ official release. ### Edge channel #### Linux (x86_64-unknown-linux-gnu) * [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-unknown-linux-gnu.tar.bz2) -* [solana-install](http://release.solana.com/edge/solana-install-x86_64-unknown-linux-gnu) as a stand-alone executable +* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable #### mac OS (x86_64-apple-darwin) * [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-apple-darwin.tar.bz2) -* [solana-install](http://release.solana.com/edge/solana-install-x86_64-apple-darwin) as a stand-alone executable +* [solana-install-init](http://release.solana.com/edge/solana-install-init-x86_64-apple-darwin) as a stand-alone executable #### Windows (x86_64-pc-windows-msvc) * [solana.tar.bz2](http://release.solana.com/edge/solana-release-x86_64-pc-windows-msvc.tar.bz2) -* [solana-install.exe](http://release.solana.com/edge/solana-install-x86_64-pc-windows-msvc.exe) as a stand-alone executable +* [solana-install-init.exe](http://release.solana.com/edge/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable ### Beta channel #### Linux (x86_64-unknown-linux-gnu) * [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-unknown-linux-gnu.tar.bz2) -* [solana-install](http://release.solana.com/beta/solana-install-x86_64-unknown-linux-gnu) as a stand-alone executable +* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-unknown-linux-gnu) as a stand-alone executable #### mac OS (x86_64-apple-darwin) * [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-apple-darwin.tar.bz2) -* [solana-install](http://release.solana.com/beta/solana-install-x86_64-apple-darwin) as a stand-alone executable +* [solana-install-init](http://release.solana.com/beta/solana-install-init-x86_64-apple-darwin) as a stand-alone executable #### Windows (x86_64-pc-windows-msvc) * [solana.tar.bz2](http://release.solana.com/beta/solana-release-x86_64-pc-windows-msvc.tar.bz2) -* [solana-install.exe](http://release.solana.com/beta/solana-install-x86_64-pc-windows-msvc.exe) as a stand-alone executable +* [solana-install-init.exe](http://release.solana.com/beta/solana-install-init-x86_64-pc-windows-msvc.exe) as a stand-alone executable Developing === diff --git a/book/src/installer.md b/book/src/installer.md index ead1f2813..926750238 100644 --- a/book/src/installer.md +++ b/book/src/installer.md @@ -12,18 +12,18 @@ updates is managed using an on-chain update manifest program. #### Fetch and run a pre-built installer using a bootstrap curl/shell script The easiest install method for supported platforms: ```bash -$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | sh +$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.0/install/solana-install-init.sh | sh ``` This script will check github for the latest tagged release and download and run the -`solana-install` binary from there. +`solana-install-init` binary from there. If additional arguments need to be specified during the installation, the following shell syntax is used: ```bash -$ init_args=.... # arguments for `solana-installer init ...` -$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.13.0/install/solana-install-init.sh | sh -s - ${init_args} +$ init_args=.... # arguments for `solana-install-init ...` +$ curl -sSf https://raw.githubusercontent.com/solana-labs/solana/v0.16.0/install/solana-install-init.sh | sh -s - ${init_args} ``` #### Fetch and run a pre-built installer from a Github release @@ -31,9 +31,9 @@ With a well-known release URL, a pre-built binary can be obtained for supported platforms: ```bash -$ curl -o solana-install https://github.com/solana-labs/solana/releases/download/v0.13.0/solana-install-x86_64-apple-darwin -$ chmod +x ./solana-install -$ ./solana-install --help +$ curl -o solana-install-init https://github.com/solana-labs/solana/releases/download/v0.16.0/solana-install-init-x86_64-apple-darwin +$ chmod +x ./solana-install-init +$ ./solana-install-init --help ``` #### Build and run the installer from source @@ -119,7 +119,7 @@ It manages the following files and directories in the user's home directory: #### Command-line Interface ```manpage -solana-install 0.13.0 +solana-install 0.16.0 The solana cluster software installer USAGE: diff --git a/install/Cargo.toml b/install/Cargo.toml index f5e45e3eb..899aa896a 100644 --- a/install/Cargo.toml +++ b/install/Cargo.toml @@ -35,3 +35,11 @@ solana-sdk = { path = "../sdk", version = "0.16.0" } tar = "0.4.26" tempdir = "0.3.7" url = "1.7.2" + +[[bin]] +name = "solana-install" +path = "src/main-install.rs" + +[[bin]] +name = "solana-install-init" +path = "src/main-install-init.rs" diff --git a/install/solana-install-init.sh b/install/solana-install-init.sh index 55ded136a..3c9d7e63b 100644 --- a/install/solana-install-init.sh +++ b/install/solana-install-init.sh @@ -74,7 +74,7 @@ main() { ;; esac - temp_dir="$(mktemp -d 2>/dev/null || ensure mktemp -d -t solana-install)" + 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 @@ -94,24 +94,24 @@ main() { fi fi - download_url="$SOLANA_DOWNLOAD_ROOT/$release/solana-install-$TARGET" - solana_install="$temp_dir/solana-install-init" + 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" - ensure chmod u+x "$solana_install" - if [ ! -x "$solana_install" ]; then - printf '%s\n' "Cannot execute $solana_install (likely because of mounting /tmp as noexec)." 1>&2 + 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 - ignore "$solana_install" init "$@" + ignore "$solana_install_init" "$@" retval=$? - ignore rm "$solana_install" + ignore rm "$solana_install_init" ignore rm -rf "$temp_dir" return "$retval" diff --git a/install/src/main.rs b/install/src/lib.rs similarity index 76% rename from install/src/main.rs rename to install/src/lib.rs index 79fabedb8..0fc688248 100644 --- a/install/src/main.rs +++ b/install/src/lib.rs @@ -32,7 +32,7 @@ fn is_pubkey(string: String) -> Result<(), String> { } } -fn main() -> Result<(), String> { +pub fn main() -> Result<(), String> { solana_logger::setup(); let matches = App::new(crate_name!()) @@ -229,3 +229,86 @@ fn main() -> Result<(), String> { _ => unreachable!(), } } + +pub fn main_init() -> Result<(), String> { + solana_logger::setup(); + + let matches = App::new("solana-install-init") + .about("initializes a new installation") + .version(crate_version!()) + .arg({ + let arg = Arg::with_name("config_file") + .short("c") + .long("config") + .value_name("PATH") + .takes_value(true) + .help("Configuration file to use"); + match *defaults::CONFIG_FILE { + Some(ref config_file) => arg.default_value(&config_file), + None => arg.required(true), + } + }) + .arg({ + let arg = Arg::with_name("data_dir") + .short("d") + .long("data-dir") + .value_name("PATH") + .takes_value(true) + .required(true) + .help("Directory to store install data"); + match *defaults::DATA_DIR { + Some(ref data_dir) => arg.default_value(&data_dir), + None => arg, + } + }) + .arg( + Arg::with_name("json_rpc_url") + .short("u") + .long("url") + .value_name("URL") + .takes_value(true) + .default_value(defaults::JSON_RPC_URL) + .validator(is_url) + .help("JSON RPC URL for the solana cluster"), + ) + .arg( + Arg::with_name("no_modify_path") + .long("no-modify-path") + .help("Don't configure the PATH environment variable"), + ) + .arg({ + let arg = Arg::with_name("update_manifest_pubkey") + .short("p") + .long("pubkey") + .value_name("PUBKEY") + .takes_value(true) + .required(true) + .validator(is_pubkey) + .help("Public key of the update manifest"); + + match defaults::update_manifest_pubkey(build_env::TARGET) { + Some(default_value) => arg.default_value(default_value), + None => arg, + } + }) + .get_matches(); + + let config_file = matches.value_of("config_file").unwrap(); + + let json_rpc_url = matches.value_of("json_rpc_url").unwrap(); + let update_manifest_pubkey = matches + .value_of("update_manifest_pubkey") + .unwrap() + .parse::() + .unwrap(); + let data_dir = matches.value_of("data_dir").unwrap(); + let no_modify_path = matches.is_present("no_modify_path"); + + command::init( + config_file, + data_dir, + json_rpc_url, + &update_manifest_pubkey, + no_modify_path, + ) +} diff --git a/install/src/main-install-init.rs b/install/src/main-install-init.rs new file mode 100644 index 000000000..53b8b1880 --- /dev/null +++ b/install/src/main-install-init.rs @@ -0,0 +1,27 @@ +use std::process::exit; + +#[cfg(windows)] +fn press_enter() { + // On windows, where installation happens in a console that may have opened just for this + // purpose, give the user an opportunity to see the error before the window closes. + println!(); + println!("Press the Enter key to continue."); + + use std::io::BufRead; + let stdin = std::io::stdin(); + let stdin = stdin.lock(); + let mut lines = stdin.lines(); + lines.next(); +} + +#[cfg(not(windows))] +fn press_enter() {} + +fn main() { + solana_install::main_init().unwrap_or_else(|err| { + println!("Error: {}", err); + press_enter(); + exit(1); + }); + press_enter(); +} diff --git a/install/src/main-install.rs b/install/src/main-install.rs new file mode 100644 index 000000000..c7b15aa6a --- /dev/null +++ b/install/src/main-install.rs @@ -0,0 +1,3 @@ +fn main() -> Result<(), String> { + solana_install::main() +} diff --git a/scripts/cargo-install-all.sh b/scripts/cargo-install-all.sh index a2b24a411..52b4940dd 100755 --- a/scripts/cargo-install-all.sh +++ b/scripts/cargo-install-all.sh @@ -34,6 +34,7 @@ PROGRAMS=( solana-genesis solana-gossip solana-install + solana-install-init solana-keygen solana-ledger-tool solana-replicator