1
1
use crate :: { Autoproxy , Error , Result , Sysproxy } ;
2
2
use log:: debug;
3
- use std:: net:: { SocketAddr , UdpSocket } ;
4
3
use std:: { process:: Command , str:: from_utf8} ;
5
4
6
5
impl Sysproxy {
7
6
pub fn get_system_proxy ( ) -> Result < Sysproxy > {
8
- let service = default_network_service ( ) . or_else ( |e| {
9
- debug ! ( "Failed to get network service: {:?}" , e) ;
10
- default_network_service_by_device ( )
11
- } ) ;
7
+ let service = default_network_service ( ) ;
12
8
if let Err ( e) = service {
13
9
debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
14
10
return Err ( e) ;
@@ -47,10 +43,7 @@ impl Sysproxy {
47
43
}
48
44
49
45
pub fn set_system_proxy ( & self ) -> Result < ( ) > {
50
- let service = default_network_service ( ) . or_else ( |e| {
51
- debug ! ( "Failed to get network service: {:?}" , e) ;
52
- default_network_service_by_device ( )
53
- } ) ;
46
+ let service = default_network_service ( ) ;
54
47
if let Err ( e) = service {
55
48
debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
56
49
return Err ( e) ;
@@ -124,10 +117,7 @@ impl Sysproxy {
124
117
125
118
impl Autoproxy {
126
119
pub fn get_auto_proxy ( ) -> Result < Autoproxy > {
127
- let service = default_network_service ( ) . or_else ( |e| {
128
- debug ! ( "Failed to get network service: {:?}" , e) ;
129
- default_network_service_by_device ( )
130
- } ) ;
120
+ let service = default_network_service ( ) ;
131
121
if let Err ( e) = service {
132
122
debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
133
123
return Err ( e) ;
@@ -153,10 +143,7 @@ impl Autoproxy {
153
143
}
154
144
155
145
pub fn set_auto_proxy ( & self ) -> Result < ( ) > {
156
- let service = default_network_service ( ) . or_else ( |e| {
157
- debug ! ( "Failed to get network service: {:?}" , e) ;
158
- default_network_service_by_device ( )
159
- } ) ;
146
+ let service = default_network_service ( ) ;
160
147
if let Err ( e) = service {
161
148
debug ! ( "Failed to get network service by networksetup: {:?}" , e) ;
162
149
return Err ( e) ;
@@ -271,67 +258,24 @@ fn strip_str<'a>(text: &'a str) -> &'a str {
271
258
}
272
259
273
260
fn default_network_service ( ) -> Result < String > {
274
- let socket = UdpSocket :: bind ( "0.0.0.0:0" ) ?;
275
- socket. connect ( "1.1.1.1:80" ) ?;
276
- let ip = socket. local_addr ( ) ?. ip ( ) ;
277
- let addr = SocketAddr :: new ( ip, 0 ) ;
278
-
279
- let interfaces = interfaces:: Interface :: get_all ( ) . or ( Err ( Error :: NetworkInterface ) ) ?;
280
- let interface = interfaces
281
- . into_iter ( )
282
- . find ( |i| i. addresses . iter ( ) . find ( |a| a. addr == Some ( addr) ) . is_some ( ) )
283
- . map ( |i| i. name . to_owned ( ) ) ;
284
-
285
- match interface {
286
- Some ( interface) => {
287
- let service = get_server_by_order ( interface) ?;
288
- Ok ( service)
289
- }
290
- None => Err ( Error :: NetworkInterface ) ,
291
- }
292
- }
293
-
294
- fn default_network_service_by_device ( ) -> Result < String > {
295
261
let output = Command :: new ( "route" )
296
262
. args ( [ "-n" , "get" , "default" ] )
297
263
. output ( ) ?;
298
264
let stdout = from_utf8 ( & output. stdout ) . or ( Err ( Error :: ParseStr ( "output" . into ( ) ) ) ) ?;
299
265
let device = stdout. split ( "\n " ) . find_map ( |s| {
300
266
let line = s. trim ( ) ;
301
267
if line. starts_with ( "interface:" ) {
302
- let mut interface = line. split ( ' ' ) ;
303
- interface. next ( ) ;
304
- interface. next ( )
268
+ Some ( line. replace ( "interface: " , "" ) )
305
269
} else {
306
270
None
307
271
}
308
272
} ) ;
309
- let device = device. unwrap_or ( "" ) ;
310
- let output = networksetup ( ) . arg ( "-listallhardwareports" ) . output ( ) ?;
311
- let stdout = from_utf8 ( & output. stdout ) . or ( Err ( Error :: ParseStr ( "output" . into ( ) ) ) ) ?;
312
- let hardware = stdout. split ( "Ethernet Address:" ) . find_map ( |s| {
313
- let lines = s. split ( "\n " ) ;
314
- let mut hardware = None ;
315
- let mut device_ = None ;
316
-
317
- for line in lines {
318
- if line. starts_with ( "Hardware Port:" ) {
319
- hardware = Some ( & line[ 15 ..] ) ;
320
- }
321
- if line. starts_with ( "Device:" ) {
322
- device_ = Some ( & line[ 8 ..] )
323
- }
324
- }
325
273
326
- if device == device_? {
327
- hardware
328
- } else {
329
- None
274
+ match device {
275
+ Some ( device ) => {
276
+ let service = get_server_by_order ( device ) ? ;
277
+ Ok ( service )
330
278
}
331
- } ) ;
332
-
333
- match hardware {
334
- Some ( hardware) => Ok ( hardware. into ( ) ) ,
335
279
None => Err ( Error :: NetworkInterface ) ,
336
280
}
337
281
}
0 commit comments