Skip to content

Commit c187cb9

Browse files
author
Pompurin404
committed
fix networkservice for macos
1 parent a233c55 commit c187cb9

File tree

2 files changed

+44
-85
lines changed

2 files changed

+44
-85
lines changed

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ pub enum Error {
3232
#[error(transparent)]
3333
Io(#[from] std::io::Error),
3434

35-
#[error("failed to get default network interface")]
36-
NetworkInterface,
35+
#[error("failed to get network service")]
36+
NetworkService,
3737

3838
#[error("failed to set proxy for this environment")]
3939
NotSupport,

src/macos.rs

Lines changed: 42 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,19 @@ use std::{process::Command, str::from_utf8};
44

55
impl Sysproxy {
66
pub fn get_system_proxy() -> Result<Sysproxy> {
7-
let service = default_network_service();
8-
if let Err(e) = service {
9-
debug!("Failed to get network service by networksetup: {:?}", e);
10-
return Err(e);
11-
}
12-
let service = service.unwrap();
13-
let service = service.as_str();
7+
let services = listnetworkserviceorder()?;
8+
let service = services.first().ok_or(Error::NetworkService)?.0.clone();
149

15-
let mut socks = Sysproxy::get_socks(service)?;
10+
let mut socks = Sysproxy::get_socks(&service)?;
1611
debug!("Getting SOCKS proxy: {:?}", socks);
1712

18-
let http = Sysproxy::get_http(service)?;
13+
let http = Sysproxy::get_http(&service)?;
1914
debug!("Getting HTTP proxy: {:?}", http);
2015

21-
let https = Sysproxy::get_https(service)?;
16+
let https = Sysproxy::get_https(&service)?;
2217
debug!("Getting HTTPS proxy: {:?}", https);
2318

24-
let bypass = Sysproxy::get_bypass(service)?;
19+
let bypass = Sysproxy::get_bypass(&service)?;
2520
debug!("Getting bypass domains: {:?}", bypass);
2621

2722
socks.bypass = bypass;
@@ -43,27 +38,28 @@ impl Sysproxy {
4338
}
4439

4540
pub fn set_system_proxy(&self) -> Result<()> {
46-
let service = default_network_service();
47-
if let Err(e) = service {
48-
debug!("Failed to get network service by networksetup: {:?}", e);
49-
return Err(e);
50-
}
51-
let service = service.unwrap();
52-
let service = service.as_str();
41+
let services = listnetworkserviceorder()?;
5342

54-
debug!("Use network service: {}", service);
43+
for service in services {
44+
let service = service.0.clone();
45+
if service.is_empty() {
46+
continue;
47+
}
48+
debug!("Use network service: {}", service);
5549

56-
debug!("Setting SOCKS proxy");
57-
self.set_socks(service)?;
50+
debug!("Setting SOCKS proxy");
51+
self.set_socks(&service)?;
5852

59-
debug!("Setting HTTP proxy");
60-
self.set_https(service)?;
53+
debug!("Setting HTTP proxy");
54+
self.set_https(&service)?;
6155

62-
debug!("Setting HTTPS proxy");
63-
self.set_http(service)?;
56+
debug!("Setting HTTPS proxy");
57+
self.set_http(&service)?;
58+
59+
debug!("Setting bypass domains");
60+
self.set_bypass(&service)?;
61+
}
6462

65-
debug!("Setting bypass domains");
66-
self.set_bypass(service)?;
6763
Ok(())
6864
}
6965

@@ -117,16 +113,11 @@ impl Sysproxy {
117113

118114
impl Autoproxy {
119115
pub fn get_auto_proxy() -> Result<Autoproxy> {
120-
let service = default_network_service();
121-
if let Err(e) = service {
122-
debug!("Failed to get network service by networksetup: {:?}", e);
123-
return Err(e);
124-
}
125-
let service = service.unwrap();
126-
let service = service.as_str();
116+
let services = listnetworkserviceorder()?;
117+
let service = services.first().ok_or(Error::NetworkService)?.0.clone();
127118

128119
let auto_output = networksetup()
129-
.args(["-getautoproxyurl", service])
120+
.args(["-getautoproxyurl", &service])
130121
.output()?;
131122
let auto = from_utf8(&auto_output.stdout)
132123
.or(Err(Error::ParseStr("auto".into())))?
@@ -143,26 +134,29 @@ impl Autoproxy {
143134
}
144135

145136
pub fn set_auto_proxy(&self) -> Result<()> {
146-
let service = default_network_service();
147-
if let Err(e) = service {
148-
debug!("Failed to get network service by networksetup: {:?}", e);
149-
return Err(e);
150-
}
151-
let service = service.unwrap();
152-
let service = service.as_str();
137+
let services = listnetworkserviceorder()?;
153138

154139
let enable = if self.enable { "on" } else { "off" };
155140
let url = if self.url.is_empty() {
156141
"\"\""
157142
} else {
158143
&self.url
159144
};
160-
networksetup()
161-
.args(["-setautoproxyurl", service, url])
162-
.status()?;
163-
networksetup()
164-
.args(["-setautoproxystate", service, enable])
165-
.status()?;
145+
146+
for service in services {
147+
let service = service.0.clone();
148+
if service.is_empty() {
149+
continue;
150+
}
151+
debug!("Use network service: {}", service);
152+
153+
networksetup()
154+
.args(["-setautoproxyurl", &service, url])
155+
.status()?;
156+
networksetup()
157+
.args(["-setautoproxystate", &service, enable])
158+
.status()?;
159+
}
166160

167161
Ok(())
168162
}
@@ -257,41 +251,6 @@ fn strip_str<'a>(text: &'a str) -> &'a str {
257251
.unwrap_or(text)
258252
}
259253

260-
fn default_network_service() -> Result<String> {
261-
let output = Command::new("route")
262-
.args(["-n", "get", "default"])
263-
.output()?;
264-
let stdout = from_utf8(&output.stdout).or(Err(Error::ParseStr("output".into())))?;
265-
let device = stdout.split("\n").find_map(|s| {
266-
let line = s.trim();
267-
if line.starts_with("interface:") {
268-
Some(line.replace("interface: ", ""))
269-
} else {
270-
None
271-
}
272-
});
273-
274-
match device {
275-
Some(device) => {
276-
let service = get_server_by_order(device)?;
277-
Ok(service)
278-
}
279-
None => Err(Error::NetworkInterface),
280-
}
281-
}
282-
283-
fn get_server_by_order(device: String) -> Result<String> {
284-
let services = listnetworkserviceorder()?;
285-
let service = services
286-
.into_iter()
287-
.find(|(_, _, d)| d == &device)
288-
.map(|(s, _, _)| s);
289-
match service {
290-
Some(service) => Ok(service),
291-
None => Err(Error::NetworkInterface),
292-
}
293-
}
294-
295254
fn listnetworkserviceorder() -> Result<Vec<(String, String, String)>> {
296255
let output = networksetup().arg("-listnetworkserviceorder").output()?;
297256
let stdout = from_utf8(&output.stdout).or(Err(Error::ParseStr("output".into())))?;

0 commit comments

Comments
 (0)