mirror of https://github.com/telemt/telemt.git
ME Probe + STUN Legacy
This commit is contained in:
parent
9d2ff25bf5
commit
1f255d0aa4
|
|
@ -131,6 +131,9 @@ impl ProxyConfig {
|
||||||
let general_table = parsed_toml
|
let general_table = parsed_toml
|
||||||
.get("general")
|
.get("general")
|
||||||
.and_then(|value| value.as_table());
|
.and_then(|value| value.as_table());
|
||||||
|
let network_table = parsed_toml
|
||||||
|
.get("network")
|
||||||
|
.and_then(|value| value.as_table());
|
||||||
let update_every_is_explicit = general_table
|
let update_every_is_explicit = general_table
|
||||||
.map(|table| table.contains_key("update_every"))
|
.map(|table| table.contains_key("update_every"))
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
|
@ -140,6 +143,9 @@ impl ProxyConfig {
|
||||||
let legacy_config_is_explicit = general_table
|
let legacy_config_is_explicit = general_table
|
||||||
.map(|table| table.contains_key("proxy_config_auto_reload_secs"))
|
.map(|table| table.contains_key("proxy_config_auto_reload_secs"))
|
||||||
.unwrap_or(false);
|
.unwrap_or(false);
|
||||||
|
let stun_servers_is_explicit = network_table
|
||||||
|
.map(|table| table.contains_key("stun_servers"))
|
||||||
|
.unwrap_or(false);
|
||||||
|
|
||||||
let mut config: ProxyConfig =
|
let mut config: ProxyConfig =
|
||||||
parsed_toml.try_into().map_err(|e| ProxyError::Config(e.to_string()))?;
|
parsed_toml.try_into().map_err(|e| ProxyError::Config(e.to_string()))?;
|
||||||
|
|
@ -151,11 +157,19 @@ impl ProxyConfig {
|
||||||
let legacy_nat_stun = config.general.middle_proxy_nat_stun.take();
|
let legacy_nat_stun = config.general.middle_proxy_nat_stun.take();
|
||||||
let legacy_nat_stun_servers = std::mem::take(&mut config.general.middle_proxy_nat_stun_servers);
|
let legacy_nat_stun_servers = std::mem::take(&mut config.general.middle_proxy_nat_stun_servers);
|
||||||
let legacy_nat_stun_used = legacy_nat_stun.is_some() || !legacy_nat_stun_servers.is_empty();
|
let legacy_nat_stun_used = legacy_nat_stun.is_some() || !legacy_nat_stun_servers.is_empty();
|
||||||
|
if stun_servers_is_explicit {
|
||||||
let mut unified_stun_servers = Vec::new();
|
let mut explicit_stun_servers = Vec::new();
|
||||||
for stun in std::mem::take(&mut config.network.stun_servers) {
|
for stun in std::mem::take(&mut config.network.stun_servers) {
|
||||||
push_unique_nonempty(&mut unified_stun_servers, stun);
|
push_unique_nonempty(&mut explicit_stun_servers, stun);
|
||||||
}
|
}
|
||||||
|
config.network.stun_servers = explicit_stun_servers;
|
||||||
|
|
||||||
|
if legacy_nat_stun_used {
|
||||||
|
warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are ignored because network.stun_servers is explicitly set");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Keep the default STUN pool unless network.stun_servers is explicitly overridden.
|
||||||
|
let mut unified_stun_servers = default_stun_servers();
|
||||||
if let Some(stun) = legacy_nat_stun {
|
if let Some(stun) = legacy_nat_stun {
|
||||||
push_unique_nonempty(&mut unified_stun_servers, stun);
|
push_unique_nonempty(&mut unified_stun_servers, stun);
|
||||||
}
|
}
|
||||||
|
|
@ -163,14 +177,12 @@ impl ProxyConfig {
|
||||||
push_unique_nonempty(&mut unified_stun_servers, stun);
|
push_unique_nonempty(&mut unified_stun_servers, stun);
|
||||||
}
|
}
|
||||||
|
|
||||||
if unified_stun_servers.is_empty() {
|
|
||||||
unified_stun_servers = default_stun_servers();
|
|
||||||
}
|
|
||||||
config.network.stun_servers = unified_stun_servers;
|
config.network.stun_servers = unified_stun_servers;
|
||||||
|
|
||||||
if legacy_nat_stun_used {
|
if legacy_nat_stun_used {
|
||||||
warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are deprecated; use network.stun_servers");
|
warn!("general.middle_proxy_nat_stun and general.middle_proxy_nat_stun_servers are deprecated; use network.stun_servers");
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(update_every) = config.general.update_every {
|
if let Some(update_every) = config.general.update_every {
|
||||||
if update_every == 0 {
|
if update_every == 0 {
|
||||||
|
|
|
||||||
|
|
@ -1200,15 +1200,23 @@ impl MePool {
|
||||||
}
|
}
|
||||||
addrs.shuffle(&mut rand::rng());
|
addrs.shuffle(&mut rand::rng());
|
||||||
if addrs.len() > 1 {
|
if addrs.len() > 1 {
|
||||||
|
let concurrency = 2usize;
|
||||||
let mut join = tokio::task::JoinSet::new();
|
let mut join = tokio::task::JoinSet::new();
|
||||||
for (ip, port) in addrs {
|
let mut next_idx = 0usize;
|
||||||
|
|
||||||
|
while next_idx < addrs.len() || !join.is_empty() {
|
||||||
|
while next_idx < addrs.len() && join.len() < concurrency {
|
||||||
|
let (ip, port) = addrs[next_idx];
|
||||||
|
next_idx += 1;
|
||||||
let addr = SocketAddr::new(ip, port);
|
let addr = SocketAddr::new(ip, port);
|
||||||
let pool = Arc::clone(&self);
|
let pool = Arc::clone(&self);
|
||||||
let rng_clone = Arc::clone(&rng);
|
let rng_clone = Arc::clone(&rng);
|
||||||
join.spawn(async move { (addr, pool.connect_one(addr, rng_clone.as_ref()).await) });
|
join.spawn(async move { (addr, pool.connect_one(addr, rng_clone.as_ref()).await) });
|
||||||
}
|
}
|
||||||
|
|
||||||
while let Some(res) = join.join_next().await {
|
let Some(res) = join.join_next().await else {
|
||||||
|
break;
|
||||||
|
};
|
||||||
match res {
|
match res {
|
||||||
Ok((addr, Ok(()))) => {
|
Ok((addr, Ok(()))) => {
|
||||||
info!(%addr, dc = %dc, "ME connected");
|
info!(%addr, dc = %dc, "ME connected");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue