Compare commits

..

1 Commits

Author SHA1 Message Date
Kevin Yue
3ca72d3cbd fix: disconnect VPN when sleep 2025-01-20 11:59:40 +08:00
8 changed files with 22 additions and 41 deletions

16
Cargo.lock generated
View File

@@ -176,7 +176,7 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]] [[package]]
name = "auth" name = "auth"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"block2", "block2",
@@ -642,7 +642,7 @@ dependencies = [
[[package]] [[package]]
name = "common" name = "common"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"is_executable", "is_executable",
] ]
@@ -1590,7 +1590,7 @@ dependencies = [
[[package]] [[package]]
name = "gpapi" name = "gpapi"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"base64 0.22.1", "base64 0.22.1",
@@ -1626,7 +1626,7 @@ dependencies = [
[[package]] [[package]]
name = "gpauth" name = "gpauth"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"auth", "auth",
@@ -1645,7 +1645,7 @@ dependencies = [
[[package]] [[package]]
name = "gpclient" name = "gpclient"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
@@ -1667,7 +1667,7 @@ dependencies = [
[[package]] [[package]]
name = "gpgui-helper" name = "gpgui-helper"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"clap", "clap",
@@ -1685,7 +1685,7 @@ dependencies = [
[[package]] [[package]]
name = "gpservice" name = "gpservice"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"anyhow", "anyhow",
"axum", "axum",
@@ -2951,7 +2951,7 @@ dependencies = [
[[package]] [[package]]
name = "openconnect" name = "openconnect"
version = "2.4.3" version = "2.4.1"
dependencies = [ dependencies = [
"cc", "cc",
"common", "common",

View File

@@ -11,7 +11,7 @@ members = [
[workspace.package] [workspace.package]
rust-version = "1.80" rust-version = "1.80"
version = "2.4.3" version = "2.4.1"
authors = ["Kevin Yue <k3vinyue@gmail.com>"] authors = ["Kevin Yue <k3vinyue@gmail.com>"]
homepage = "https://github.com/yuezk/GlobalProtect-openconnect" homepage = "https://github.com/yuezk/GlobalProtect-openconnect"
edition = "2021" edition = "2021"

View File

@@ -22,7 +22,7 @@ serde_json.workspace = true
whoami.workspace = true whoami.workspace = true
tempfile.workspace = true tempfile.workspace = true
reqwest.workspace = true reqwest.workspace = true
directories.workspace = true directories = "5.0"
compile-time.workspace = true compile-time.workspace = true
[features] [features]

View File

@@ -87,8 +87,8 @@ pub(crate) struct ConnectArgs {
#[arg(long, value_enum, default_value_t = ConnectArgs::default_os())] #[arg(long, value_enum, default_value_t = ConnectArgs::default_os())]
os: Os, os: Os,
#[arg(long, help = "If not specified, it will be computed based on the --os option")] #[arg(long, default_value_t = ConnectArgs::default_os_version())]
os_version: Option<String>, os_version: String,
#[arg(long, help = "Disable DTLS and ESP")] #[arg(long, help = "Disable DTLS and ESP")]
no_dtls: bool, no_dtls: bool,
@@ -121,12 +121,8 @@ impl ConnectArgs {
} }
} }
fn os_version(&self) -> String { fn default_os_version() -> String {
if let Some(os_version) = self.os_version.as_deref() { match ConnectArgs::default_os() {
return os_version.to_string();
}
match self.os {
Os::Linux => format!("Linux {}", whoami::distro()), Os::Linux => format!("Linux {}", whoami::distro()),
Os::Windows => String::from("Microsoft Windows 11 Pro , 64-bit"), Os::Windows => String::from("Microsoft Windows 11 Pro , 64-bit"),
Os::Mac => String::from("Apple Mac OS X 13.4.0"), Os::Mac => String::from("Apple Mac OS X 13.4.0"),
@@ -153,7 +149,7 @@ impl<'a> ConnectHandler<'a> {
GpParams::builder() GpParams::builder()
.user_agent(&self.args.user_agent) .user_agent(&self.args.user_agent)
.client_os(ClientOs::from(&self.args.os)) .client_os(ClientOs::from(&self.args.os))
.os_version(self.args.os_version()) .os_version(self.args.os_version.clone())
.ignore_tls_errors(self.shared_args.ignore_tls_errors) .ignore_tls_errors(self.shared_args.ignore_tls_errors)
.certificate(self.args.certificate.clone()) .certificate(self.args.certificate.clone())
.sslkey(self.args.sslkey.clone()) .sslkey(self.args.sslkey.clone())
@@ -363,7 +359,7 @@ impl<'a> ConnectHandler<'a> {
None None
}; };
let os_version = self.args.os_version(); let os_version = self.args.os_version.clone();
let verbose = self.shared_args.verbose.to_verbose_arg(); let verbose = self.shared_args.verbose.to_verbose_arg();
let auth_launcher = SamlAuthLauncher::new(&self.args.server) let auth_launcher = SamlAuthLauncher::new(&self.args.server)
.gateway(is_gateway) .gateway(is_gateway)

View File

@@ -177,14 +177,13 @@ mod signals {
tokio::select! { tokio::select! {
_ = user_sig1.recv() => { _ = user_sig1.recv() => {
info!("Received SIGUSR1 signal"); info!("Received SIGUSR1 signal");
if vpn_ctx.disconnect().await { vpn_ctx.disconnect().await;
// Write the PID to a dedicated file to indicate that the VPN task is disconnected via SIGUSR1 // Write the PID to a dedicated file to indicate that the VPN task is disconnected via SIGUSR1
let pid = std::process::id(); let pid = std::process::id();
if let Err(err) = tokio::fs::write(DISCONNECTED_PID_FILE, pid.to_string()).await { if let Err(err) = tokio::fs::write(DISCONNECTED_PID_FILE, pid.to_string()).await {
warn!("Failed to write PID to file: {}", err); warn!("Failed to write PID to file: {}", err);
} }
} }
}
_ = user_sig2.recv() => { _ = user_sig2.recv() => {
info!("Received SIGUSR2 signal"); info!("Received SIGUSR2 signal");
ws_ctx.send_event(WsEvent::ResumeConnection).await; ws_ctx.send_event(WsEvent::ResumeConnection).await;

View File

@@ -90,7 +90,7 @@ impl VpnTaskContext {
}); });
} }
pub async fn disconnect(&self) -> bool { pub async fn disconnect(&self) {
if let Some(disconnect_rx) = self.disconnect_rx.write().await.take() { if let Some(disconnect_rx) = self.disconnect_rx.write().await.take() {
info!("Disconnecting VPN..."); info!("Disconnecting VPN...");
if let Some(vpn) = self.vpn_handle.read().await.as_ref() { if let Some(vpn) = self.vpn_handle.read().await.as_ref() {
@@ -101,13 +101,9 @@ impl VpnTaskContext {
// Wait for the VPN to be disconnected // Wait for the VPN to be disconnected
disconnect_rx.await.ok(); disconnect_rx.await.ok();
info!("VPN disconnected"); info!("VPN disconnected");
true
} else { } else {
info!("VPN is not connected, skip disconnect"); info!("VPN is not connected, skip disconnect");
self.vpn_state_tx.send(VpnState::Disconnected).ok(); self.vpn_state_tx.send(VpnState::Disconnected).ok();
false
} }
} }
} }

View File

@@ -1,13 +1,5 @@
# Changelog # Changelog
## 2.4.3 - 2025-01-21
- Do not use static default value for `--os-version` option.
## 2.4.2 - 2025-01-20
- Disconnect the VPN when sleep (fix [#166](https://github.com/yuezk/GlobalProtect-openconnect/issues/166), [#267](https://github.com/yuezk/GlobalProtect-openconnect/issues/267))
## 2.4.1 - 2025-01-09 ## 2.4.1 - 2025-01-09
- Fix the network issue with OpenSSL < 3.0.4 - Fix the network issue with OpenSSL < 3.0.4

View File

@@ -1,2 +0,0 @@
[toolchain]
channel = "1.80.1"