diff --git a/Cargo.lock b/Cargo.lock index 77182b8..1c990ff 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2200,7 +2200,7 @@ dependencies = [ [[package]] name = "peach-config" -version = "0.1.26" +version = "0.1.27" dependencies = [ "async-std", "clap", diff --git a/peach-config/Cargo.toml b/peach-config/Cargo.toml index a81b605..f81ed62 100644 --- a/peach-config/Cargo.toml +++ b/peach-config/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "peach-config" -version = "0.1.26" +version = "0.1.27" authors = ["Andrew Reid ", "Max Fowler "] edition = "2018" description = "Command line tool for installing, updating and configuring PeachCloud" diff --git a/peach-config/src/error.rs b/peach-config/src/error.rs index 862a866..9b47e6a 100644 --- a/peach-config/src/error.rs +++ b/peach-config/src/error.rs @@ -42,6 +42,8 @@ pub enum PeachConfigError { Golgi { source: GolgiError }, #[snafu(display("{}", message))] CmdInputError { message: String }, + #[snafu(display("{}", message))] + WaitForSbotError { message: String }, } impl From for PeachConfigError { diff --git a/peach-config/src/main.rs b/peach-config/src/main.rs index 2fd7624..754083e 100644 --- a/peach-config/src/main.rs +++ b/peach-config/src/main.rs @@ -10,6 +10,7 @@ mod setup_peach_deb; mod status; mod update; mod utils; +mod wait_for_sbot; use clap::arg_enum; use log::error; @@ -61,6 +62,10 @@ enum PeachConfig { /// It takes an address argument of the form host:port #[structopt(name = "publish-address")] PublishAddress(PublishAddressOpts), + + /// Wait for a successful connection to sbot + #[structopt(name = "wait-for-sbot")] + WaitForSbot, } #[derive(StructOpt, Debug)] @@ -193,6 +198,14 @@ async fn run() { } } } + PeachConfig::WaitForSbot => match wait_for_sbot::wait_for_sbot().await { + Ok(sbot_id) => { + println!("connected with sbot and found sbot_id: {:?}", sbot_id) + } + Err(err) => { + error!("peach-config did not successfully connect to sbot: {}", err) + } + }, } } } diff --git a/peach-config/src/wait_for_sbot.rs b/peach-config/src/wait_for_sbot.rs new file mode 100644 index 0000000..9564261 --- /dev/null +++ b/peach-config/src/wait_for_sbot.rs @@ -0,0 +1,52 @@ +use std::{thread, time}; + +use crate::error::PeachConfigError; +use peach_lib::sbot::init_sbot; + +static MAX_NUM_ATTEMPTS: u8 = 10; + +/// Utility function to wait for a successful whoami call with sbot +/// After each attempt to call whoami it waits 2 seconds, +/// and if after MAX_NUM_ATTEMPTS (10) there is no successful whoami call +/// it returns an Error. Otherwise it returns Ok(sbot_id). +pub async fn wait_for_sbot() -> Result { + let mut num_attempts = 0; + let mut whoami = None; + + while num_attempts < MAX_NUM_ATTEMPTS { + let mut sbot = None; + + let sbot_res = init_sbot().await; + match sbot_res { + Ok(sbot_instance) => { + sbot = Some(sbot_instance); + } + Err(err) => { + eprintln!("failed to connect to sbot: {:?}", err); + } + } + + if sbot.is_some() { + let sbot_id_res = sbot.unwrap().whoami().await; + match sbot_id_res { + Ok(sbot_id) => { + whoami = Some(sbot_id); + break; + } + Err(err) => { + eprintln!("whoami failed: {:?}", err); + } + } + } + + println!("trying to connect to sbot again {:?}", num_attempts); + num_attempts += 1; + + let sleep_duration = time::Duration::from_secs(2); + thread::sleep(sleep_duration); + } + + whoami.ok_or(PeachConfigError::WaitForSbotError { + message: "Failed to find sbot_id after 10 attempts".to_string(), + }) +}