refactor: find the vpnc_script from predefined locations

This commit is contained in:
Kevin Yue 2023-06-26 09:23:26 +08:00
parent 4191e9a19f
commit 5603157679
5 changed files with 46 additions and 1 deletions

View File

@ -18,6 +18,7 @@
"tauri", "tauri",
"unlisten", "unlisten",
"userauthcookie", "userauthcookie",
"vpnc",
"vpninfo" "vpninfo"
], ],
"files.associations": { "files.associations": {

10
Cargo.lock generated
View File

@ -1122,6 +1122,7 @@ dependencies = [
"bytes", "bytes",
"cc", "cc",
"data-encoding", "data-encoding",
"is_executable",
"log", "log",
"ring", "ring",
"serde", "serde",
@ -1416,6 +1417,15 @@ dependencies = [
"windows-sys 0.48.0", "windows-sys 0.48.0",
] ]
[[package]]
name = "is_executable"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8"
dependencies = [
"winapi",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "0.4.8" version = "0.4.8"

View File

@ -16,6 +16,7 @@ async-trait = "0.1"
ring = "0.16" ring = "0.16"
data-encoding = "2.3" data-encoding = "2.3"
log = "0.4" log = "0.4"
is_executable = "1.0"
[build-dependencies] [build-dependencies]
cc = "1.0" cc = "1.0"

View File

@ -1,3 +1,4 @@
use crate::vpn::vpnc_script::find_default_vpnc_script;
use log::{debug, info, warn}; use log::{debug, info, warn};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::ffi::{c_void, CString}; use std::ffi::{c_void, CString};
@ -7,6 +8,7 @@ use tokio::sync::watch;
use tokio::sync::{mpsc, Mutex}; use tokio::sync::{mpsc, Mutex};
mod ffi; mod ffi;
mod vpnc_script;
#[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)] #[derive(Debug, PartialEq, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")] #[serde(rename_all = "lowercase")]
@ -87,11 +89,21 @@ impl Vpn {
server: &str, server: &str,
cookie: &str, cookie: &str,
) -> Result<(), Box<dyn std::error::Error>> { ) -> Result<(), Box<dyn std::error::Error>> {
let script = match find_default_vpnc_script() {
Some(script) => {
debug!("Using default vpnc-script: {}", script);
script
}
None => {
return Err("Failed to find default vpnc-script".into());
}
};
// Save the VPN options so we can use them later, e.g. reconnect // Save the VPN options so we can use them later, e.g. reconnect
*self.vpn_options.lock().await = Some(VpnOptions { *self.vpn_options.lock().await = Some(VpnOptions {
server: VpnOptions::to_cstr(server), server: VpnOptions::to_cstr(server),
cookie: VpnOptions::to_cstr(cookie), cookie: VpnOptions::to_cstr(cookie),
script: VpnOptions::to_cstr("/usr/share/vpnc-scripts/vpnc-script"), script: VpnOptions::to_cstr(script),
}); });
let vpn_options = self.vpn_options.clone(); let vpn_options = self.vpn_options.clone();

View File

@ -0,0 +1,21 @@
use std::path::Path;
use is_executable::IsExecutable;
const VPNC_SCRIPT_LOCATIONS: [&str; 4] = [
"/usr/local/share/vpnc-scripts/vpnc-script",
"/usr/local/sbin/vpnc-script",
"/usr/share/vpnc-scripts/vpnc-script",
"/usr/sbin/vpnc-script /etc/vpnc/vpnc-script",
];
pub(crate) fn find_default_vpnc_script() -> Option<&'static str> {
for location in VPNC_SCRIPT_LOCATIONS.iter() {
let path = Path::new(location);
if path.is_executable() {
return Some(location);
}
}
None
}