From 3840c39f3f9bc76298c4d812d7d35e67c092b56c Mon Sep 17 00:00:00 2001 From: leonardo Date: Sun, 20 Mar 2022 21:49:27 +0100 Subject: [PATCH] Check if binary is latest version --- swap/src/bin/swap.rs | 107 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 106 insertions(+), 1 deletion(-) diff --git a/swap/src/bin/swap.rs b/swap/src/bin/swap.rs index 92010783..f3312f29 100644 --- a/swap/src/bin/swap.rs +++ b/swap/src/bin/swap.rs @@ -67,6 +67,12 @@ async fn main() -> Result<()> { let swap_id = Uuid::new_v4(); cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; @@ -149,6 +155,11 @@ async fn main() -> Result<()> { Command::History => { cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let swaps = db.all().await?; @@ -173,6 +184,11 @@ async fn main() -> Result<()> { Command::Config => { cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + tracing::info!(path=%data_dir.display(), "Data directory"); tracing::info!(path=%format!("{}/logs", data_dir.display()), "Log files directory"); tracing::info!(path=%format!("{}/sqlite", data_dir.display()), "Sqlite file location"); @@ -187,6 +203,12 @@ async fn main() -> Result<()> { address, } => { cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; let bitcoin_wallet = init_bitcoin_wallet( @@ -220,6 +242,12 @@ async fn main() -> Result<()> { bitcoin_target_block, } => { cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; let bitcoin_wallet = init_bitcoin_wallet( @@ -245,6 +273,12 @@ async fn main() -> Result<()> { tor_socks5_port, } => { cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; @@ -306,6 +340,12 @@ async fn main() -> Result<()> { bitcoin_target_block, } => { cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; @@ -328,6 +368,12 @@ async fn main() -> Result<()> { bitcoin_target_block, } => { cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; @@ -353,6 +399,11 @@ async fn main() -> Result<()> { .context("Rendezvous node address must contain peer ID")?; cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; let identity = seed.derive_libp2p_identity(); @@ -433,6 +484,11 @@ async fn main() -> Result<()> { } => { cli::tracing::init(debug, json, data_dir.join("logs"), None)?; + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let seed = Seed::from_file_or_generate(data_dir.as_path()) .context("Failed to read in seed file")?; let bitcoin_wallet = init_bitcoin_wallet( @@ -447,6 +503,13 @@ async fn main() -> Result<()> { tracing::info!(descriptor=%wallet_export.to_string(), "Exported bitcoin wallet"); } Command::MoneroRecovery { swap_id } => { + cli::tracing::init(debug, json, data_dir.join("logs"), Some(swap_id))?; + + match check_latest_version().await { + Ok(()) => (), + Err(error) => tracing::error!("{}", error), + }; + let db = open_db(data_dir.join("sqlite")).await?; let swap_state: BobState = db.get_state(swap_id).await?.try_into()?; @@ -629,10 +692,43 @@ where Ok((btc_swap_amount, fees)) } +pub async fn check_latest_version() -> Result<()> { + const GITHUB_LATEST_VERSION_URL: &str = + "https://github.com/comit-network/xmr-btc-swap/releases/latest"; + + let response = match reqwest::get(GITHUB_LATEST_VERSION_URL).await { + Ok(res) => res, + Err(_) => bail!( + "could not request the website {}", + GITHUB_LATEST_VERSION_URL + ), + }; + + let last_version_from_url: &str = match response.url().path_segments() { + Some(split_segments) => match split_segments.last() { + Some(seg) => seg, + None => bail!("could not check the latest version"), + }, + None => bail!("could not check the latest version"), + }; + + let version_from_binary: &str = env!("CARGO_PKG_VERSION"); + + if last_version_from_url != version_from_binary { + tracing::warn!( + "You are not on the lastest version {}, it's available on Github: {}", + last_version_from_url, + GITHUB_LATEST_VERSION_URL + ); + }; + + Ok(()) +} + #[cfg(test)] mod tests { use super::*; - use crate::determine_btc_to_swap; + use crate::{check_latest_version, determine_btc_to_swap}; use ::bitcoin::Amount; use std::sync::Mutex; use swap::tracing_ext::capture_logs; @@ -995,4 +1091,13 @@ mod tests { async fn get_dummy_address() -> Result { Ok("1PdfytjS7C8wwd9Lq5o4x9aXA2YRqaCpH6".parse()?) } + + #[tokio::test] + async fn check_correct_latest_version() { + let writer = capture_logs(LevelFilter::INFO); + + check_latest_version().await.unwrap(); + + assert_eq!(writer.captured(), r""); + } }