diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fb95b70..d2894ba 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ on: version: description: 'Version for this release' type: string - default: 'v2.1.0' + default: 'v2.1.1' required: true make_latest: description: 'Mark this release as latest' diff --git a/Cargo.lock b/Cargo.lock index c16d418..88fbcdf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1830,7 +1830,7 @@ checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "easytier" -version = "2.1.0" +version = "2.1.1" dependencies = [ "aes-gcm", "anyhow", @@ -1926,7 +1926,7 @@ dependencies = [ [[package]] name = "easytier-gui" -version = "2.1.0" +version = "2.1.1" dependencies = [ "anyhow", "chrono", diff --git a/easytier-gui/package.json b/easytier-gui/package.json index fc2c0b4..1910aa9 100644 --- a/easytier-gui/package.json +++ b/easytier-gui/package.json @@ -1,7 +1,7 @@ { "name": "easytier-gui", "type": "module", - "version": "2.1.0", + "version": "2.1.1", "private": true, "packageManager": "pnpm@9.12.1+sha512.e5a7e52a4183a02d5931057f7a0dbff9d5e9ce3161e33fa68ae392125b79282a8a8a470a51dfc8a0ed86221442eb2fb57019b0990ed24fab519bf0e1bc5ccfc4", "scripts": { diff --git a/easytier-gui/src-tauri/Cargo.toml b/easytier-gui/src-tauri/Cargo.toml index d1b1fa7..5db3f32 100644 --- a/easytier-gui/src-tauri/Cargo.toml +++ b/easytier-gui/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "easytier-gui" -version = "2.1.0" +version = "2.1.1" description = "EasyTier GUI" authors = ["you"] edition = "2021" diff --git a/easytier-gui/src-tauri/tauri.conf.json b/easytier-gui/src-tauri/tauri.conf.json index 0c88438..2ddf9a8 100644 --- a/easytier-gui/src-tauri/tauri.conf.json +++ b/easytier-gui/src-tauri/tauri.conf.json @@ -17,7 +17,7 @@ "createUpdaterArtifacts": false }, "productName": "easytier-gui", - "version": "2.1.0", + "version": "2.1.1", "identifier": "com.kkrainbow.easytier", "plugins": {}, "app": { diff --git a/easytier-web/src/client_manager/mod.rs b/easytier-web/src/client_manager/mod.rs index b9a2a7b..9dfaa96 100644 --- a/easytier-web/src/client_manager/mod.rs +++ b/easytier-web/src/client_manager/mod.rs @@ -1,14 +1,13 @@ pub mod session; pub mod storage; -use std::{collections::BTreeMap, str::FromStr, sync::Arc}; +use std::sync::Arc; use dashmap::DashMap; use easytier::{ common::scoped_task::ScopedTask, proto::web::HeartbeatRequest, tunnel::TunnelListener, }; use session::Session; -use sqlx::types::chrono; use storage::{Storage, StorageToken}; use crate::db::Db; diff --git a/easytier-web/src/db/mod.rs b/easytier-web/src/db/mod.rs index 46f63d7..bd286a2 100644 --- a/easytier-web/src/db/mod.rs +++ b/easytier-web/src/db/mod.rs @@ -4,8 +4,8 @@ pub mod entity; use entity::user_running_network_configs; use sea_orm::{ - prelude::Expr, sea_query::OnConflict, ActiveModelTrait, ColumnTrait as _, DatabaseConnection, - DbErr, EntityTrait, QueryFilter as _, SqlxSqliteConnector, TransactionTrait as _, + prelude::Expr, sea_query::OnConflict, ColumnTrait as _, DatabaseConnection, DbErr, EntityTrait, + QueryFilter as _, SqlxSqliteConnector, TransactionTrait as _, }; use sea_orm_migration::MigratorTrait as _; use sqlx::{migrate::MigrateDatabase as _, types::chrono, Sqlite, SqlitePool}; diff --git a/easytier-web/src/restful/network.rs b/easytier-web/src/restful/network.rs index 551110c..6636b49 100644 --- a/easytier-web/src/restful/network.rs +++ b/easytier-web/src/restful/network.rs @@ -1,6 +1,6 @@ use std::sync::Arc; -use axum::extract::{Path, Query}; +use axum::extract::Path; use axum::http::StatusCode; use axum::routing::{delete, post}; use axum::{extract::State, routing::get, Json, Router}; diff --git a/easytier/Cargo.toml b/easytier/Cargo.toml index c710cc4..0072d09 100644 --- a/easytier/Cargo.toml +++ b/easytier/Cargo.toml @@ -3,7 +3,7 @@ name = "easytier" description = "A full meshed p2p VPN, connecting all your devices in one network with one command." homepage = "https://github.com/EasyTier/EasyTier" repository = "https://github.com/EasyTier/EasyTier" -version = "2.1.0" +version = "2.1.1" edition = "2021" authors = ["kkrainbow"] keywords = ["vpn", "p2p", "network", "easytier"] diff --git a/easytier/src/proto/rpc_impl/standalone.rs b/easytier/src/proto/rpc_impl/standalone.rs index e191a3c..c86c5b0 100644 --- a/easytier/src/proto/rpc_impl/standalone.rs +++ b/easytier/src/proto/rpc_impl/standalone.rs @@ -38,6 +38,33 @@ impl StandAloneServer { &self.registry } + async fn serve_loop( + listener: &mut L, + inflight: Arc, + registry: Arc, + tasks: Arc>>, + ) -> Result<(), Error> { + listener + .listen() + .await + .with_context(|| "failed to listen")?; + + loop { + let tunnel = listener.accept().await?; + let registry = registry.clone(); + let inflight_server = inflight.clone(); + inflight_server.fetch_add(1, std::sync::atomic::Ordering::Relaxed); + tasks.lock().unwrap().spawn(async move { + let server = + BidirectRpcManager::new().set_rx_timeout(Some(Duration::from_secs(60))); + server.rpc_server().registry().replace_registry(®istry); + server.run_with_tunnel(tunnel); + server.wait().await; + inflight_server.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); + }); + } + } + pub async fn serve(&mut self) -> Result<(), Error> { let tasks = self.tasks.clone(); let mut listener = self.listener.take().unwrap(); @@ -45,28 +72,24 @@ impl StandAloneServer { join_joinset_background(tasks.clone(), "standalone server tasks".to_string()); - listener - .listen() - .await - .with_context(|| "failed to listen")?; - let inflight_server = self.inflight_server.clone(); self.tasks.lock().unwrap().spawn(async move { - while let Ok(tunnel) = listener.accept().await { - let registry = registry.clone(); - let inflight_server = inflight_server.clone(); - inflight_server.fetch_add(1, std::sync::atomic::Ordering::Relaxed); - tasks.lock().unwrap().spawn(async move { - let server = - BidirectRpcManager::new().set_rx_timeout(Some(Duration::from_secs(60))); - server.rpc_server().registry().replace_registry(®istry); - server.run_with_tunnel(tunnel); - server.wait().await; - inflight_server.fetch_sub(1, std::sync::atomic::Ordering::Relaxed); - }); + loop { + let ret = Self::serve_loop( + &mut listener, + inflight_server.clone(), + registry.clone(), + tasks.clone(), + ) + .await; + if let Err(e) = ret { + tracing::error!(?e, url = ?listener.local_url(), "serve_loop exit unexpectedly"); + println!("standalone serve_loop exit unexpectedly: {:?}", e); + } + + tokio::time::sleep(Duration::from_secs(1)).await; } - panic!("standalone server listener exit"); }); Ok(()) diff --git a/easytier/src/proto/tests.rs b/easytier/src/proto/tests.rs index ae04e2b..eff4bdd 100644 --- a/easytier/src/proto/tests.rs +++ b/easytier/src/proto/tests.rs @@ -287,6 +287,8 @@ async fn standalone_rpc_test() { server.registry().register(service, "test"); server.serve().await.unwrap(); + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + let mut client = StandAloneClient::new(TcpTunnelConnector::new( "tcp://127.0.0.1:33455".parse().unwrap(), )); diff --git a/easytier/src/tunnel/tcp.rs b/easytier/src/tunnel/tcp.rs index 0bac410..005e26c 100644 --- a/easytier/src/tunnel/tcp.rs +++ b/easytier/src/tunnel/tcp.rs @@ -33,6 +33,7 @@ impl TcpTunnelListener { #[async_trait] impl TunnelListener for TcpTunnelListener { async fn listen(&mut self) -> Result<(), TunnelError> { + self.listener = None; let addr = check_scheme_and_get_socket_addr::(&self.addr, "tcp")?; let socket2_socket = socket2::Socket::new(