diff --git a/Cargo.lock b/Cargo.lock index 220f030568..7fa6d88e64 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6174,6 +6174,7 @@ dependencies = [ "cargo_metadata", "celes", "clap 4.4.7", + "colored", "cupid", "humantime-serde", "ipnetwork 0.16.0", diff --git a/nym-node/Cargo.toml b/nym-node/Cargo.toml index 380933feec..f23326967b 100644 --- a/nym-node/Cargo.toml +++ b/nym-node/Cargo.toml @@ -18,6 +18,7 @@ anyhow.workspace = true bip39 = { workspace = true, features = ["zeroize"] } bs58.workspace = true celes = "2.4.0" # country codes +colored = "2" clap = { workspace = true, features = ["cargo", "env"] } humantime-serde = { workspace = true } ipnetwork = "0.16.0" diff --git a/nym-node/build.rs b/nym-node/build.rs deleted file mode 100644 index f705ff54e1..0000000000 --- a/nym-node/build.rs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2024 - Nym Technologies SA -// SPDX-License-Identifier: GPL-3.0-only - -use cargo_metadata::MetadataCommand; -use std::fs; -use std::path::PathBuf; - -// that's disgusting, but it works, so it's good enough for now ¯\_(ツ)_/¯ -fn main() { - let out_dir: PathBuf = std::env::var("OUT_DIR").unwrap().into(); - - let path: PathBuf = std::env::var("CARGO_MANIFEST_DIR").unwrap().into(); - - let mix_path = path.parent().unwrap().join("mixnode"); - let gateway_path = path.parent().unwrap().join("gateway"); - - let mix_meta = MetadataCommand::new() - .manifest_path("./Cargo.toml") - .current_dir(&mix_path) - .exec() - .unwrap(); - let mix_version = &mix_meta.root_package().unwrap().version; - - let gateway_meta = MetadataCommand::new() - .manifest_path("./Cargo.toml") - .current_dir(&gateway_path) - .exec() - .unwrap(); - - let gateway_version = &gateway_meta.root_package().unwrap().version; - - fs::write(out_dir.join("mixnode_version"), mix_version.to_string()).unwrap(); - fs::write(out_dir.join("gateway_version"), gateway_version.to_string()).unwrap(); - - println!("cargo::rerun-if-changed=build.rs"); -} diff --git a/nym-node/src/cli/commands/migrate.rs b/nym-node/src/cli/commands/migrate.rs index 5625130148..b4ca40e429 100644 --- a/nym-node/src/cli/commands/migrate.rs +++ b/nym-node/src/cli/commands/migrate.rs @@ -5,8 +5,12 @@ use crate::cli::helpers::{ EntryGatewayArgs, ExitGatewayArgs, HostArgs, HttpArgs, MixnetArgs, MixnodeArgs, WireguardArgs, }; use crate::node::description::save_node_description; -use crate::node::helpers::{load_ed25519_identity_public_key, store_x25519_noise_keypair}; +use crate::node::helpers::{ + bonding_version, load_ed25519_identity_public_key, store_x25519_noise_keypair, +}; use clap::ValueEnum; +use colored::Color::TrueColor; +use colored::Colorize; use nym_crypto::asymmetric::x25519; use nym_gateway::helpers::{load_ip_packet_router_config, load_network_requester_config}; use nym_gateway::GatewayError; @@ -627,7 +631,28 @@ pub(crate) async fn execute(args: Args) -> Result<(), NymNodeError> { trace!("args: {args:#?}"); match args.node_type { - NodeType::Mixnode => migrate_mixnode(args).await, - NodeType::Gateway => migrate_gateway(args).await, + NodeType::Mixnode => migrate_mixnode(args).await?, + NodeType::Gateway => migrate_gateway(args).await?, } + + let orange = TrueColor { + r: 251, + g: 110, + b: 78, + }; + + println!("{}", "** Attention **".color(orange).bold()); + print!("Please consider updating the '"); + print!("{}", "version".color(orange)); + print!("' field of your "); + print!("{}", "existing".bold().underline()); + println!(" node to:"); + println!(); + println!("{}", bonding_version().bold().color(orange)); + println!(); + print!("in the settings section of the "); + println!("{}", "Nym Wallet".bold().color(orange)); + println!(); + + Ok(()) } diff --git a/nym-node/src/node/bonding_information.rs b/nym-node/src/node/bonding_information.rs index 1f405b4a06..5132d37762 100644 --- a/nym-node/src/node/bonding_information.rs +++ b/nym-node/src/node/bonding_information.rs @@ -1,10 +1,11 @@ // Copyright 2024 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only -use crate::node::helpers::{load_ed25519_identity_public_key, load_x25519_sphinx_public_key}; +use crate::node::helpers::{ + bonding_version, load_ed25519_identity_public_key, load_x25519_sphinx_public_key, +}; use nym_node::config::{Config, NodeMode}; use nym_node::error::NymNodeError; -use semver::{BuildMetadata, Version}; use serde::{Deserialize, Serialize}; use std::fmt::{Display, Formatter}; @@ -60,26 +61,12 @@ impl MixnodeBondingInformation { x25519_sphinx_key: String, ) -> MixnodeBondingInformation { MixnodeBondingInformation { - version: Self::get_version(), + version: bonding_version(), host: "YOU NEED TO FILL THIS FIELD MANUALLY".to_string(), identity_key: ed25519_identity_key, sphinx_key: x25519_sphinx_key, } } - - #[allow(clippy::unwrap_used)] - fn get_version() -> String { - // SAFETY: - // 1. the value has been put into the environment during build.rs, so it must exist, - // 2. and the obtained version has already been parsed into semver in build.rs, so it must be a valid semver - let raw = include_str!(concat!(env!("OUT_DIR"), "/mixnode_version")); - let mut semver: Version = raw.parse().unwrap(); - - // if it's not empty, then we messed up our own versioning - assert!(semver.build.is_empty()); - semver.build = BuildMetadata::new("nymnode").unwrap(); - semver.to_string() - } } impl Display for MixnodeBondingInformation { @@ -108,27 +95,13 @@ impl GatewayBondingInformation { x25519_sphinx_key: String, ) -> GatewayBondingInformation { GatewayBondingInformation { - version: Self::get_version(), + version: bonding_version(), host: "YOU NEED TO FILL THIS FIELD MANUALLY".to_string(), location: "YOU NEED TO FILL THIS FIELD MANUALLY".to_string(), identity_key: ed25519_identity_key, sphinx_key: x25519_sphinx_key, } } - - #[allow(clippy::unwrap_used)] - fn get_version() -> String { - // SAFETY: - // 1. the value has been put into the file during build.rs, so it must exist, - // 2. and the obtained version has already been parsed into semver in build.rs, so it must be a valid semver - let raw = include_str!(concat!(env!("OUT_DIR"), "/gateway_version")); - let mut semver: Version = raw.parse().unwrap(); - - // if it's not empty, then we messed up our own versioning - assert!(semver.build.is_empty()); - semver.build = BuildMetadata::new("nymnode").unwrap(); - semver.to_string() - } } impl Display for GatewayBondingInformation { diff --git a/nym-node/src/node/helpers.rs b/nym-node/src/node/helpers.rs index a5c23cfb17..385b82b62b 100644 --- a/nym-node/src/node/helpers.rs +++ b/nym-node/src/node/helpers.rs @@ -7,10 +7,24 @@ use nym_node::error::{KeyIOFailure, NymNodeError}; use nym_node_http_api::api::api_requests::v1::node::models::NodeDescription; use nym_pemstore::traits::{PemStorableKey, PemStorableKeyPair}; use nym_pemstore::KeyPairPath; +use semver::{BuildMetadata, Version}; use serde::Serialize; use std::fmt::{Display, Formatter}; use std::path::Path; +#[allow(clippy::unwrap_used)] +pub fn bonding_version() -> String { + // SAFETY: + // the value has been put there by cargo + let raw = env!("CARGO_PKG_VERSION"); + let mut semver: Version = raw.parse().unwrap(); + + // if it's not empty, then we messed up our own versioning + assert!(semver.build.is_empty()); + semver.build = BuildMetadata::new("nymnode").unwrap(); + semver.to_string() +} + #[derive(Debug, Serialize)] pub(crate) struct DisplayDetails { pub(crate) current_mode: NodeMode,