diff --git a/Cargo.lock b/Cargo.lock index ed56dfab..41b2175c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1557,6 +1557,7 @@ dependencies = [ "futures", "futures-util", "gethostname 0.5.0", + "git-version", "globwalk", "http 1.1.0", "humansize", @@ -2299,6 +2300,26 @@ dependencies = [ "winapi", ] +[[package]] +name = "git-version" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad568aa3db0fcbc81f2f116137f263d7304f512a1209b35b85150d3ef88ad19" +dependencies = [ + "git-version-macro", +] + +[[package]] +name = "git-version-macro" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.74", +] + [[package]] name = "glib" version = "0.18.5" diff --git a/easytier/Cargo.toml b/easytier/Cargo.toml index 6cc1fd61..f29187e4 100644 --- a/easytier/Cargo.toml +++ b/easytier/Cargo.toml @@ -29,6 +29,8 @@ path = "src/lib.rs" test = false [dependencies] +git-version = "0.3.9" + tracing = { version = "0.1", features = ["log"] } tracing-subscriber = { version = "0.3", features = [ "env-filter", diff --git a/easytier/build.rs b/easytier/build.rs index 20805aa8..704f72bb 100644 --- a/easytier/build.rs +++ b/easytier/build.rs @@ -129,6 +129,18 @@ fn main() -> Result<(), Box> { #[cfg(target_os = "windows")] WindowsBuild::check_for_win(); + let proto_files = [ + "src/proto/peer_rpc.proto", + "src/proto/common.proto", + "src/proto/error.proto", + "src/proto/tests.proto", + "src/proto/cli.proto", + ]; + + for proto_file in &proto_files { + println!("cargo:rerun-if-changed={}", proto_file); + } + prost_build::Config::new() .type_attribute(".common", "#[derive(serde::Serialize, serde::Deserialize)]") .type_attribute(".error", "#[derive(serde::Serialize, serde::Deserialize)]") @@ -142,16 +154,7 @@ fn main() -> Result<(), Box> { .type_attribute("common.RpcDescriptor", "#[derive(Hash, Eq)]") .service_generator(Box::new(rpc_build::ServiceGenerator::new())) .btree_map(&["."]) - .compile_protos( - &[ - "src/proto/peer_rpc.proto", - "src/proto/common.proto", - "src/proto/error.proto", - "src/proto/tests.proto", - "src/proto/cli.proto", - ], - &["src/proto/"], - ) + .compile_protos(&proto_files, &["src/proto/"]) .unwrap(); check_locale(); diff --git a/easytier/src/common/constants.rs b/easytier/src/common/constants.rs index 955ec3d5..eff5e0e3 100644 --- a/easytier/src/common/constants.rs +++ b/easytier/src/common/constants.rs @@ -22,3 +22,9 @@ macro_rules! set_global_var { define_global_var!(MANUAL_CONNECTOR_RECONNECT_INTERVAL_MS, u64, 1000); pub const UDP_HOLE_PUNCH_CONNECTOR_SERVICE_ID: u32 = 2; + +pub const EASYTIER_VERSION: &str = git_version::git_version!( + args = ["--abbrev=8", "--always", "--dirty=~"], + prefix = concat!(env!("CARGO_PKG_VERSION"), "-"), + suffix = "" +); diff --git a/easytier/src/launcher.rs b/easytier/src/launcher.rs index 95f33f56..1a2c35f6 100644 --- a/easytier/src/launcher.rs +++ b/easytier/src/launcher.rs @@ -6,6 +6,7 @@ use std::{ use crate::{ common::{ config::{ConfigLoader, TomlConfigLoader}, + constants::EASYTIER_VERSION, global_ctx::GlobalCtxEvent, stun::StunInfoCollectorTrait, }, @@ -141,7 +142,7 @@ impl EasyTierLauncher { .map(|x| x.to_string()) .unwrap_or_default(), hostname: global_ctx_c.get_hostname(), - version: env!("CARGO_PKG_VERSION").to_string(), + version: EASYTIER_VERSION.to_string(), ips: global_ctx_c.get_ip_collector().collect_ip_addrs().await, stun_info: global_ctx_c.get_stun_info_collector().get_stun_info(), listeners: global_ctx_c diff --git a/easytier/src/lib.rs b/easytier/src/lib.rs index 0a471549..4501ff1e 100644 --- a/easytier/src/lib.rs +++ b/easytier/src/lib.rs @@ -14,4 +14,4 @@ pub mod launcher; pub mod tunnel; pub mod utils; -pub const VERSION: &str = env!("CARGO_PKG_VERSION"); +pub const VERSION: &str = common::constants::EASYTIER_VERSION; diff --git a/easytier/src/peers/peer_manager.rs b/easytier/src/peers/peer_manager.rs index 7bf5a08c..a1e38786 100644 --- a/easytier/src/peers/peer_manager.rs +++ b/easytier/src/peers/peer_manager.rs @@ -19,7 +19,10 @@ use tokio::{ use tokio_stream::wrappers::ReceiverStream; use crate::{ - common::{error::Error, global_ctx::ArcGlobalCtx, stun::StunInfoCollectorTrait, PeerId}, + common::{ + constants::EASYTIER_VERSION, error::Error, global_ctx::ArcGlobalCtx, + stun::StunInfoCollectorTrait, PeerId, + }, peers::{ peer_conn::PeerConn, peer_rpc::PeerRpcManagerTransport, @@ -746,7 +749,7 @@ impl PeerManager { .map(|x| x.to_string()) .collect(), config: self.global_ctx.config.dump(), - version: env!("CARGO_PKG_VERSION").to_string(), + version: EASYTIER_VERSION.to_string(), } } diff --git a/easytier/src/peers/peer_ospf_route.rs b/easytier/src/peers/peer_ospf_route.rs index 03023a0d..ed5f190c 100644 --- a/easytier/src/peers/peer_ospf_route.rs +++ b/easytier/src/peers/peer_ospf_route.rs @@ -23,10 +23,12 @@ use tokio::{ }; use crate::{ - common::{global_ctx::ArcGlobalCtx, stun::StunInfoCollectorTrait, PeerId}, + common::{ + constants::EASYTIER_VERSION, global_ctx::ArcGlobalCtx, stun::StunInfoCollectorTrait, PeerId, + }, peers::route_trait::{Route, RouteInterfaceBox}, - proto::common::{NatType, StunInfo}, proto::{ + common::{NatType, StunInfo}, peer_rpc::{ OspfRouteRpc, OspfRouteRpcClientFactory, OspfRouteRpcServer, PeerIdVersion, RoutePeerInfo, RoutePeerInfos, SyncRouteInfoError, SyncRouteInfoRequest, @@ -99,6 +101,7 @@ impl RoutePeerInfo { udp_stun_info: 0, last_update: Some(SystemTime::now().into()), version: 0, + easytier_version: EASYTIER_VERSION.to_string(), } } @@ -122,6 +125,8 @@ impl RoutePeerInfo { // following fields do not participate in comparison. last_update: self.last_update, version: self.version, + + easytier_version: EASYTIER_VERSION.to_string(), }; let need_update_periodically = if let Ok(Ok(d)) = @@ -162,7 +167,7 @@ impl Into for RoutePeerInfo { Some(stun_info) }, inst_id: self.inst_id.map(|x| x.to_string()).unwrap_or_default(), - version: env!("CARGO_PKG_VERSION").to_string(), + version: self.easytier_version, } } } diff --git a/easytier/src/proto/peer_rpc.proto b/easytier/src/proto/peer_rpc.proto index 55b7e875..7f8bf1d0 100644 --- a/easytier/src/proto/peer_rpc.proto +++ b/easytier/src/proto/peer_rpc.proto @@ -16,6 +16,8 @@ message RoutePeerInfo { common.NatType udp_stun_info = 7; google.protobuf.Timestamp last_update = 8; uint32 version = 9; + + string easytier_version = 10; } message PeerIdVersion {