diff --git a/easytier/src/common/config.rs b/easytier/src/common/config.rs index 92ea475..7201172 100644 --- a/easytier/src/common/config.rs +++ b/easytier/src/common/config.rs @@ -194,6 +194,7 @@ impl TomlConfigLoader { config_str, config_str ) })?; + Ok(TomlConfigLoader { config: Arc::new(Mutex::new(config)), }) @@ -221,12 +222,24 @@ impl ConfigLoader for TomlConfigLoader { } fn get_hostname(&self) -> String { - self.config - .lock() - .unwrap() - .hostname - .clone() - .unwrap_or(gethostname::gethostname().to_string_lossy().to_string()) + let hostname = self.config.lock().unwrap().hostname.clone(); + + match hostname { + Some(hostname) => { + let re = regex::Regex::new(r"[^\u4E00-\u9FA5a-zA-Z0-9\-]*").unwrap(); + let mut name = re.replace_all(&hostname, "").to_string(); + + if name.len() > 32 { + name = name.chars().take(32).collect::(); + } + + if hostname != name { + self.set_hostname(Some(name.clone())); + } + name + } + None => gethostname::gethostname().to_string_lossy().to_string(), + } } fn set_hostname(&self, name: Option) { diff --git a/easytier/src/common/global_ctx.rs b/easytier/src/common/global_ctx.rs index 969988c..d574311 100644 --- a/easytier/src/common/global_ctx.rs +++ b/easytier/src/common/global_ctx.rs @@ -54,7 +54,7 @@ pub struct GlobalCtx { ip_collector: Arc, - hostname: AtomicCell>, + hostname: String, stun_info_collection: Box, @@ -97,7 +97,7 @@ impl GlobalCtx { ip_collector: Arc::new(IPCollector::new(net_ns)), - hostname: AtomicCell::new(Some(hostname)), + hostname, stun_info_collection: Box::new(StunInfoCollector::new_with_default_servers()), @@ -166,29 +166,8 @@ impl GlobalCtx { self.ip_collector.clone() } - pub fn get_hostname(&self) -> Option { - let hostname = gethostname::gethostname().to_string_lossy().to_string(); - - let hostname = match self.hostname.take() { - Some(name) => { - // when allowing custom hostname, there may be empty - if name.is_empty() { - hostname - } else { - name - } - }, - None => hostname, - }; - - let re = regex::Regex::new(r"[^\u4E00-\u9FA5a-zA-Z0-9\-]*").unwrap(); - let mut hostname = re.replace_all(&hostname, "").to_string(); - if hostname.len() > 32 { - hostname = hostname.chars().take(32).collect::(); - } - - self.hostname.store(Some(hostname.clone())); - return Some(hostname); + pub fn get_hostname(&self) -> String { + return self.hostname.clone(); } pub fn get_stun_info_collector(&self) -> impl StunInfoCollectorTrait + '_ { diff --git a/easytier/src/easytier-core.rs b/easytier/src/easytier-core.rs index ec67338..3860664 100644 --- a/easytier/src/easytier-core.rs +++ b/easytier/src/easytier-core.rs @@ -181,24 +181,7 @@ impl From for TomlConfigLoader { cfg.set_inst_name(cli.instance_name.clone()); - let hostname = gethostname::gethostname().to_string_lossy().to_string(); - let hostname = match cli.hostname { - Some(name) => { - // when allowing custom hostname, there may be empty - if name.is_empty() { - hostname - } else { - name - } - } - None => hostname, - }; - let re = regex::Regex::new(r"[^\u4E00-\u9FA5a-zA-Z0-9\-]*").unwrap(); - let mut hostname = re.replace_all(&hostname, "").to_string(); - if hostname.len() > 32 { - hostname = hostname.chars().take(32).collect::(); - } - cfg.set_hostname(Some(hostname)); + cfg.set_hostname(cli.hostname.clone()); cfg.set_network_identity(NetworkIdentity::new( cli.network_name.clone(), diff --git a/easytier/src/peers/peer_ospf_route.rs b/easytier/src/peers/peer_ospf_route.rs index b7b9624..1ea5152 100644 --- a/easytier/src/peers/peer_ospf_route.rs +++ b/easytier/src/peers/peer_ospf_route.rs @@ -68,7 +68,7 @@ struct RoutePeerInfo { cost: u8, ipv4_addr: Option, proxy_cidrs: Vec, - hostname: Option, + hostname: String, udp_stun_info: i8, last_update: SystemTime, version: Version, @@ -82,7 +82,7 @@ impl RoutePeerInfo { cost: 0, ipv4_addr: None, proxy_cidrs: Vec::new(), - hostname: None, + hostname: String::new(), udp_stun_info: 0, last_update: SystemTime::now(), version: 0, @@ -138,11 +138,7 @@ impl Into for RoutePeerInfo { next_hop_peer_id: 0, cost: self.cost as i32, proxy_cidrs: self.proxy_cidrs.clone(), - hostname: if let Some(hostname) = &self.hostname { - hostname.clone() - } else { - "".to_string() - }, + hostname: self.hostname, stun_info: { let mut stun_info = StunInfo::default(); if let Ok(udp_nat_type) = NatType::try_from(self.udp_stun_info as i32) { diff --git a/easytier/src/peers/peer_rip_route.rs b/easytier/src/peers/peer_rip_route.rs index fda9e5a..3137e01 100644 --- a/easytier/src/peers/peer_rip_route.rs +++ b/easytier/src/peers/peer_rip_route.rs @@ -36,7 +36,7 @@ pub struct SyncPeerInfo { pub cost: u32, pub ipv4_addr: Option, pub proxy_cidrs: Vec, - pub hostname: Option, + pub hostname: String, pub udp_stun_info: i8, } @@ -585,11 +585,7 @@ impl Route for BasicRoute { route.next_hop_peer_id = route_info.peer_id; route.cost = route_info.cost as i32; route.proxy_cidrs = route_info.proxy_cidrs.clone(); - route.hostname = if let Some(hostname) = &route_info.hostname { - hostname.clone() - } else { - "".to_string() - }; + route.hostname = route_info.hostname.clone(); let mut stun_info = StunInfo::default(); if let Ok(udp_nat_type) = NatType::try_from(route_info.udp_stun_info as i32) {