@@ -37,6 +37,7 @@ use futures::{
37
37
StreamExt ,
38
38
} ;
39
39
use geoip:: GeoIpHandler ;
40
+ use management_interface:: ManagementInterfaceServer ;
40
41
use mullvad_relay_selector:: {
41
42
AdditionalRelayConstraints , AdditionalWireguardConstraints , RelaySelector , SelectorConfig ,
42
43
} ;
@@ -111,6 +112,9 @@ pub enum Error {
111
112
#[ error( "REST request failed" ) ]
112
113
RestError ( #[ source] mullvad_api:: rest:: Error ) ,
113
114
115
+ #[ error( "Management interface error" ) ]
116
+ ManagementInterfaceError ( #[ source] management_interface:: Error ) ,
117
+
114
118
#[ error( "API availability check failed" ) ]
115
119
ApiCheckError ( #[ source] mullvad_api:: availability:: Error ) ,
116
120
@@ -549,40 +553,15 @@ where
549
553
}
550
554
}
551
555
552
- /// Trait representing something that can broadcast daemon events.
553
- pub trait EventListener : Clone + Send + Sync + ' static {
554
- /// Notify that the tunnel state changed.
555
- fn notify_new_state ( & self , new_state : TunnelState ) ;
556
-
557
- /// Notify that the settings changed.
558
- fn notify_settings ( & self , settings : Settings ) ;
559
-
560
- /// Notify that the relay list changed.
561
- fn notify_relay_list ( & self , relay_list : RelayList ) ;
562
-
563
- /// Notify that info about the latest available app version changed.
564
- /// Or some flag about the currently running version is changed.
565
- fn notify_app_version ( & self , app_version_info : AppVersionInfo ) ;
566
-
567
- /// Notify that device changed (login, logout, or key rotation).
568
- fn notify_device_event ( & self , event : DeviceEvent ) ;
569
-
570
- /// Notify that a device was revoked using `RemoveDevice`.
571
- fn notify_remove_device_event ( & self , event : RemoveDeviceEvent ) ;
572
-
573
- /// Notify that the api access method changed.
574
- fn notify_new_access_method_event ( & self , new_access_method : AccessMethodSetting ) ;
575
- }
576
-
577
- pub struct Daemon < L : EventListener > {
556
+ pub struct Daemon {
578
557
tunnel_state : TunnelState ,
579
558
target_state : PersistentTargetState ,
580
559
#[ cfg( target_os = "linux" ) ]
581
560
exclude_pids : split_tunnel:: PidManager ,
582
561
rx : mpsc:: UnboundedReceiver < InternalDaemonEvent > ,
583
562
tx : DaemonEventSender ,
584
563
reconnection_job : Option < AbortHandle > ,
585
- event_listener : L ,
564
+ management_interface : ManagementInterfaceServer ,
586
565
migration_complete : migrations:: MigrationComplete ,
587
566
settings : SettingsPersister ,
588
567
account_history : account_history:: AccountHistory ,
@@ -602,26 +581,29 @@ pub struct Daemon<L: EventListener> {
602
581
location_handler : GeoIpHandler ,
603
582
}
604
583
605
- impl < L > Daemon < L >
606
- where
607
- L : EventListener ,
608
- {
584
+ impl Daemon {
585
+ #[ allow( clippy:: too_many_arguments) ]
609
586
pub async fn start (
610
587
log_dir : Option < PathBuf > ,
611
588
resource_dir : PathBuf ,
612
589
settings_dir : PathBuf ,
613
590
cache_dir : PathBuf ,
614
- event_listener : L ,
615
- command_channel : DaemonCommandChannel ,
591
+ rpc_socket_path : PathBuf ,
616
592
#[ cfg( target_os = "android" ) ] android_context : AndroidContext ,
617
593
) -> Result < Self , Error > {
618
594
#[ cfg( target_os = "macos" ) ]
619
595
macos:: bump_filehandle_limit ( ) ;
620
596
621
- mullvad_api:: proxy:: ApiConnectionMode :: try_delete_cache ( & cache_dir) . await ;
597
+ let command_channel = DaemonCommandChannel :: new ( ) ;
598
+ let command_sender = command_channel. sender ( ) ;
599
+
600
+ let management_interface =
601
+ ManagementInterfaceServer :: start ( command_sender, rpc_socket_path)
602
+ . map_err ( Error :: ManagementInterfaceError ) ?;
622
603
623
604
let ( internal_event_tx, internal_event_rx) = command_channel. destructure ( ) ;
624
605
606
+ mullvad_api:: proxy:: ApiConnectionMode :: try_delete_cache ( & cache_dir) . await ;
625
607
let api_runtime = mullvad_api:: Runtime :: with_cache (
626
608
& cache_dir,
627
609
true ,
@@ -644,7 +626,7 @@ where
644
626
None
645
627
} ) ;
646
628
647
- let settings_event_listener = event_listener . clone ( ) ;
629
+ let settings_event_listener = management_interface . notifier ( ) . clone ( ) ;
648
630
let mut settings = SettingsPersister :: load ( & settings_dir) . await ;
649
631
settings. register_change_listener ( move |settings| {
650
632
// Notify management interface server of changes to the settings
@@ -804,7 +786,7 @@ where
804
786
805
787
api:: forward_offline_state ( api_availability. clone ( ) , offline_state_rx) ;
806
788
807
- let relay_list_listener = event_listener . clone ( ) ;
789
+ let relay_list_listener = management_interface . notifier ( ) . clone ( ) ;
808
790
let on_relay_list_update = move |relay_list : & RelayList | {
809
791
relay_list_listener. notify_relay_list ( relay_list. clone ( ) ) ;
810
792
} ;
@@ -844,7 +826,7 @@ where
844
826
rx : internal_event_rx,
845
827
tx : internal_event_tx,
846
828
reconnection_job : None ,
847
- event_listener ,
829
+ management_interface ,
848
830
migration_complete,
849
831
settings,
850
832
account_history,
@@ -915,7 +897,7 @@ where
915
897
/// be destroyed, and executing shutdown tasks
916
898
async fn finalize ( self ) {
917
899
let Daemon {
918
- event_listener ,
900
+ management_interface ,
919
901
shutdown_tasks,
920
902
api_runtime,
921
903
tunnel_state_machine_handle,
@@ -932,8 +914,9 @@ where
932
914
account_manager. shutdown ( ) . await ;
933
915
934
916
tunnel_state_machine_handle. try_join ( ) . await ;
917
+ // Wait for the management interface server to shut down
918
+ management_interface. stop ( ) . await ;
935
919
936
- drop ( event_listener) ;
937
920
drop ( api_runtime) ;
938
921
}
939
922
@@ -1042,7 +1025,9 @@ where
1042
1025
}
1043
1026
1044
1027
self . tunnel_state = tunnel_state. clone ( ) ;
1045
- self . event_listener . notify_new_state ( tunnel_state) ;
1028
+ self . management_interface
1029
+ . notifier ( )
1030
+ . notify_new_state ( tunnel_state) ;
1046
1031
self . fetch_am_i_mullvad ( ) ;
1047
1032
}
1048
1033
@@ -1110,7 +1095,8 @@ where
1110
1095
_ => return ,
1111
1096
} ;
1112
1097
1113
- self . event_listener
1098
+ self . management_interface
1099
+ . notifier ( )
1114
1100
. notify_new_state ( self . tunnel_state . clone ( ) ) ;
1115
1101
}
1116
1102
@@ -1125,7 +1111,8 @@ where
1125
1111
// Make sure to update the daemon's actual tunnel state. Otherwise feature indicator changes won't be persisted.
1126
1112
self . tunnel_state
1127
1113
. set_feature_indicators ( new_feature_indicators) ;
1128
- self . event_listener
1114
+ self . management_interface
1115
+ . notifier ( )
1129
1116
. notify_new_state ( self . tunnel_state . clone ( ) ) ;
1130
1117
}
1131
1118
}
@@ -1287,7 +1274,9 @@ where
1287
1274
}
1288
1275
1289
1276
fn handle_new_app_version_info ( & mut self , app_version_info : AppVersionInfo ) {
1290
- self . event_listener . notify_app_version ( app_version_info) ;
1277
+ self . management_interface
1278
+ . notifier ( )
1279
+ . notify_app_version ( app_version_info) ;
1291
1280
}
1292
1281
1293
1282
async fn handle_device_event ( & mut self , event : AccountEvent ) {
@@ -1338,7 +1327,8 @@ where
1338
1327
_ => ( ) ,
1339
1328
}
1340
1329
if let AccountEvent :: Device ( event) = event {
1341
- self . event_listener
1330
+ self . management_interface
1331
+ . notifier ( )
1342
1332
. notify_device_event ( DeviceEvent :: from ( event) ) ;
1343
1333
}
1344
1334
}
@@ -1367,14 +1357,14 @@ where
1367
1357
// currently active access method. The announcement should be
1368
1358
// made after the firewall policy has been updated, since the
1369
1359
// new access method will be useless before then.
1370
- let event_listener = self . event_listener . clone ( ) ;
1360
+ let notifier = self . management_interface . notifier ( ) . clone ( ) ;
1371
1361
tokio:: spawn ( async move {
1372
1362
// Wait for the firewall policy to be updated.
1373
1363
let _ = completion_rx. await ;
1374
1364
// Let the emitter of this event know that the firewall has been updated.
1375
1365
let _ = endpoint_active_tx. send ( ( ) ) ;
1376
1366
// Notify clients about the change if necessary.
1377
- event_listener . notify_new_access_method_event ( setting) ;
1367
+ notifier . notify_new_access_method_event ( setting) ;
1378
1368
} ) ;
1379
1369
}
1380
1370
}
@@ -1385,7 +1375,7 @@ where
1385
1375
result : Result < PrivateAccountAndDevice , device:: Error > ,
1386
1376
) {
1387
1377
let account_manager = self . account_manager . clone ( ) ;
1388
- let event_listener = self . event_listener . clone ( ) ;
1378
+ let notifier = self . management_interface . notifier ( ) . clone ( ) ;
1389
1379
tokio:: spawn ( async move {
1390
1380
if let Ok ( Some ( _) ) = account_manager
1391
1381
. data_after_login ( )
@@ -1414,7 +1404,7 @@ where
1414
1404
new_state : DeviceState :: LoggedOut ,
1415
1405
} ,
1416
1406
} ;
1417
- event_listener . notify_device_event ( event) ;
1407
+ notifier . notify_device_event ( event) ;
1418
1408
}
1419
1409
} ) ;
1420
1410
}
@@ -1639,7 +1629,7 @@ where
1639
1629
device_id : DeviceId ,
1640
1630
) {
1641
1631
let device_service = self . account_manager . device_service . clone ( ) ;
1642
- let event_listener = self . event_listener . clone ( ) ;
1632
+ let notifier = self . management_interface . notifier ( ) . clone ( ) ;
1643
1633
1644
1634
tokio:: spawn ( async move {
1645
1635
let result = device_service
@@ -1648,7 +1638,7 @@ where
1648
1638
. map ( move |new_devices| {
1649
1639
// FIXME: We should be able to get away with only returning the removed ID,
1650
1640
// and not have to request the list from the API.
1651
- event_listener . notify_remove_device_event ( RemoveDeviceEvent {
1641
+ notifier . notify_remove_device_event ( RemoveDeviceEvent {
1652
1642
account_token,
1653
1643
new_devices,
1654
1644
} ) ;
0 commit comments