mirror of
https://github.com/EasyTier/EasyTier.git
synced 2025-10-07 09:40:55 +08:00

Some checks failed
EasyTier Core / pre_job (push) Has been cancelled
EasyTier GUI / pre_job (push) Has been cancelled
EasyTier Mobile / pre_job (push) Has been cancelled
EasyTier Test / pre_job (push) Has been cancelled
EasyTier Core / build (freebsd-13.2-x86_64, 13.2, ubuntu-22.04, x86_64-unknown-freebsd) (push) Has been cancelled
EasyTier Core / build (linux-aarch64, ubuntu-22.04, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-arm, ubuntu-22.04, arm-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armhf, ubuntu-22.04, arm-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-armv7, ubuntu-22.04, armv7-unknown-linux-musleabi) (push) Has been cancelled
EasyTier Core / build (linux-armv7hf, ubuntu-22.04, armv7-unknown-linux-musleabihf) (push) Has been cancelled
EasyTier Core / build (linux-mips, ubuntu-22.04, mips-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-mipsel, ubuntu-22.04, mipsel-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (linux-x86_64, ubuntu-22.04, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier Core / build (macos-aarch64, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (macos-x86_64, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier Core / build (windows-arm64, windows-latest, aarch64-pc-windows-msvc) (push) Has been cancelled
EasyTier Core / build (windows-x86_64, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier Core / core-result (push) Has been cancelled
EasyTier GUI / build-gui (linux-aarch64, aarch64-unknown-linux-gnu, ubuntu-22.04, aarch64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (linux-x86_64, x86_64-unknown-linux-gnu, ubuntu-22.04, x86_64-unknown-linux-musl) (push) Has been cancelled
EasyTier GUI / build-gui (macos-aarch64, aarch64-apple-darwin, macos-latest, aarch64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (macos-x86_64, x86_64-apple-darwin, macos-latest, x86_64-apple-darwin) (push) Has been cancelled
EasyTier GUI / build-gui (windows-arm64, aarch64-pc-windows-msvc, windows-latest, aarch64-pc-windows-msvc) (push) Has been cancelled
EasyTier GUI / build-gui (windows-x86_64, x86_64-pc-windows-msvc, windows-latest, x86_64-pc-windows-msvc) (push) Has been cancelled
EasyTier GUI / gui-result (push) Has been cancelled
EasyTier Mobile / build-mobile (android, ubuntu-22.04, android) (push) Has been cancelled
EasyTier Mobile / mobile-result (push) Has been cancelled
EasyTier Test / test (push) Has been cancelled
* tcp accept should retry when encoutering some kinds of error bump version to v2.1.2 * persistent temporary machine id
172 lines
4.7 KiB
Rust
172 lines
4.7 KiB
Rust
use std::{
|
|
fmt::Debug,
|
|
future,
|
|
io::Write as _,
|
|
sync::{Arc, Mutex},
|
|
};
|
|
use tokio::task::JoinSet;
|
|
use tracing::Instrument;
|
|
|
|
pub mod compressor;
|
|
pub mod config;
|
|
pub mod constants;
|
|
pub mod defer;
|
|
pub mod error;
|
|
pub mod global_ctx;
|
|
pub mod ifcfg;
|
|
pub mod netns;
|
|
pub mod network;
|
|
pub mod scoped_task;
|
|
pub mod stun;
|
|
pub mod stun_codec_ext;
|
|
|
|
pub fn get_logger_timer<F: time::formatting::Formattable>(
|
|
format: F,
|
|
) -> tracing_subscriber::fmt::time::OffsetTime<F> {
|
|
unsafe {
|
|
time::util::local_offset::set_soundness(time::util::local_offset::Soundness::Unsound)
|
|
};
|
|
let local_offset = time::UtcOffset::current_local_offset()
|
|
.unwrap_or(time::UtcOffset::from_whole_seconds(0).unwrap());
|
|
tracing_subscriber::fmt::time::OffsetTime::new(local_offset, format)
|
|
}
|
|
|
|
pub fn get_logger_timer_rfc3339(
|
|
) -> tracing_subscriber::fmt::time::OffsetTime<time::format_description::well_known::Rfc3339> {
|
|
get_logger_timer(time::format_description::well_known::Rfc3339)
|
|
}
|
|
|
|
pub type PeerId = u32;
|
|
|
|
pub fn new_peer_id() -> PeerId {
|
|
rand::random()
|
|
}
|
|
|
|
pub fn join_joinset_background<T: Debug + Send + Sync + 'static>(
|
|
js: Arc<Mutex<JoinSet<T>>>,
|
|
origin: String,
|
|
) {
|
|
let js = Arc::downgrade(&js);
|
|
tokio::spawn(
|
|
async move {
|
|
loop {
|
|
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
|
if js.weak_count() == 0 {
|
|
tracing::info!("joinset task exit");
|
|
break;
|
|
}
|
|
|
|
future::poll_fn(|cx| {
|
|
let Some(js) = js.upgrade() else {
|
|
return std::task::Poll::Ready(());
|
|
};
|
|
|
|
let mut js = js.lock().unwrap();
|
|
while !js.is_empty() {
|
|
let ret = js.poll_join_next(cx);
|
|
if ret.is_pending() {
|
|
return std::task::Poll::Pending;
|
|
}
|
|
}
|
|
|
|
std::task::Poll::Ready(())
|
|
})
|
|
.await;
|
|
}
|
|
}
|
|
.instrument(tracing::info_span!(
|
|
"join_joinset_background",
|
|
origin = origin
|
|
)),
|
|
);
|
|
}
|
|
|
|
pub fn get_machine_id() -> uuid::Uuid {
|
|
// a path same as the binary
|
|
let machine_id_file = std::env::current_exe()
|
|
.map(|x| x.with_file_name("et_machine_id"))
|
|
.unwrap_or_else(|_| std::path::PathBuf::from("et_machine_id"));
|
|
|
|
// try load from local file
|
|
if let Ok(mid) = std::fs::read_to_string(&machine_id_file) {
|
|
if let Ok(mid) = uuid::Uuid::parse_str(mid.trim()) {
|
|
return mid;
|
|
}
|
|
}
|
|
|
|
#[cfg(any(
|
|
target_os = "linux",
|
|
target_os = "macos",
|
|
target_os = "windows",
|
|
target_os = "freebsd"
|
|
))]
|
|
let gen_mid = machine_uid::get()
|
|
.map(|x| {
|
|
let mut b = [0u8; 16];
|
|
crate::tunnel::generate_digest_from_str("", x.as_str(), &mut b);
|
|
uuid::Uuid::from_bytes(b)
|
|
})
|
|
.ok();
|
|
|
|
#[cfg(not(any(
|
|
target_os = "linux",
|
|
target_os = "macos",
|
|
target_os = "windows",
|
|
target_os = "freebsd"
|
|
)))]
|
|
let gen_mid = None;
|
|
|
|
if gen_mid.is_some() {
|
|
return gen_mid.unwrap();
|
|
}
|
|
|
|
let gen_mid = uuid::Uuid::new_v4();
|
|
|
|
// try save to local file
|
|
if let Ok(mut file) = std::fs::File::create(machine_id_file) {
|
|
let _ = file.write_all(gen_mid.to_string().as_bytes());
|
|
}
|
|
|
|
gen_mid
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[tokio::test]
|
|
async fn test_join_joinset_backgroud() {
|
|
let js = Arc::new(Mutex::new(JoinSet::<()>::new()));
|
|
join_joinset_background(js.clone(), "TEST".to_owned());
|
|
js.try_lock().unwrap().spawn(async {
|
|
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
|
});
|
|
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
|
|
assert!(js.try_lock().unwrap().is_empty());
|
|
|
|
for _ in 0..5 {
|
|
js.try_lock().unwrap().spawn(async {
|
|
tokio::time::sleep(std::time::Duration::from_secs(3)).await;
|
|
});
|
|
tokio::task::yield_now().await;
|
|
}
|
|
|
|
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
|
|
|
|
for _ in 0..5 {
|
|
js.try_lock().unwrap().spawn(async {
|
|
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
|
|
});
|
|
tokio::task::yield_now().await;
|
|
}
|
|
|
|
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
|
|
assert!(js.try_lock().unwrap().is_empty());
|
|
|
|
let weak_js = Arc::downgrade(&js);
|
|
drop(js);
|
|
tokio::time::sleep(std::time::Duration::from_secs(2)).await;
|
|
assert_eq!(weak_js.weak_count(), 0);
|
|
}
|
|
}
|