Skip to content

Commit 876101b

Browse files
committed
Change how daemon is started
1 parent 2701374 commit 876101b

File tree

3 files changed

+57
-70
lines changed

3 files changed

+57
-70
lines changed

mullvad-daemon/src/lib.rs

+32-28
Original file line numberDiff line numberDiff line change
@@ -588,30 +588,34 @@ pub struct Daemon {
588588
volume_update_tx: mpsc::UnboundedSender<()>,
589589
location_handler: GeoIpHandler,
590590
}
591+
pub struct DaemonConfig {
592+
pub log_dir: Option<PathBuf>,
593+
pub resource_dir: PathBuf,
594+
pub settings_dir: PathBuf,
595+
pub cache_dir: PathBuf,
596+
pub rpc_socket_path: PathBuf,
597+
pub endpoint: ApiEndpoint,
598+
#[cfg(target_os = "android")]
599+
pub android_context: AndroidContext,
600+
}
591601

592602
impl Daemon {
593603
pub async fn start(
594-
log_dir: Option<PathBuf>,
595-
resource_dir: PathBuf,
596-
settings_dir: PathBuf,
597-
cache_dir: PathBuf,
598-
rpc_socket_path: PathBuf,
604+
config: DaemonConfig,
599605
daemon_command_channel: DaemonCommandChannel,
600-
endpoint: ApiEndpoint,
601-
#[cfg(target_os = "android")] android_context: AndroidContext,
602606
) -> Result<Self, Error> {
603607
#[cfg(target_os = "macos")]
604608
macos::bump_filehandle_limit();
605609

606610
let command_sender = daemon_command_channel.sender();
607611
let management_interface =
608-
ManagementInterfaceServer::start(command_sender, rpc_socket_path)
612+
ManagementInterfaceServer::start(command_sender, config.rpc_socket_path)
609613
.map_err(Error::ManagementInterfaceError)?;
610614

611615
let (internal_event_tx, internal_event_rx) = daemon_command_channel.destructure();
612616

613617
#[cfg(target_os = "android")]
614-
let connectivity_listener = ConnectivityListener::new(android_context.clone())
618+
let connectivity_listener = ConnectivityListener::new(config.android_context.clone())
615619
.inspect_err(|error| {
616620
log::error!(
617621
"{}",
@@ -620,10 +624,10 @@ impl Daemon {
620624
})
621625
.map_err(|_| Error::DaemonUnavailable)?;
622626

623-
mullvad_api::proxy::ApiConnectionMode::try_delete_cache(&cache_dir).await;
627+
mullvad_api::proxy::ApiConnectionMode::try_delete_cache(&config.cache_dir).await;
624628
let api_runtime = mullvad_api::Runtime::with_cache(
625-
&endpoint,
626-
&cache_dir,
629+
&config.endpoint,
630+
&config.cache_dir,
627631
true,
628632
#[cfg(target_os = "android")]
629633
api::create_bypass_tx(&internal_event_tx),
@@ -634,7 +638,7 @@ impl Daemon {
634638
let api_availability = api_runtime.availability_handle();
635639
api_availability.suspend();
636640

637-
let migration_data = migrations::migrate_all(&cache_dir, &settings_dir)
641+
let migration_data = migrations::migrate_all(&config.cache_dir, &config.settings_dir)
638642
.await
639643
.unwrap_or_else(|error| {
640644
log::error!(
@@ -645,7 +649,7 @@ impl Daemon {
645649
});
646650

647651
let settings_event_listener = management_interface.notifier().clone();
648-
let mut settings = SettingsPersister::load(&settings_dir).await;
652+
let mut settings = SettingsPersister::load(&config.settings_dir).await;
649653
settings.register_change_listener(move |settings| {
650654
// Notify management interface server of changes to the settings
651655
settings_event_listener.notify_settings(settings.to_owned());
@@ -654,8 +658,8 @@ impl Daemon {
654658
let initial_selector_config = SelectorConfig::from_settings(&settings);
655659
let relay_selector = RelaySelector::new(
656660
initial_selector_config,
657-
resource_dir.join(RELAYS_FILENAME),
658-
cache_dir.join(RELAYS_FILENAME),
661+
config.resource_dir.join(RELAYS_FILENAME),
662+
config.cache_dir.join(RELAYS_FILENAME),
659663
);
660664

661665
let settings_relay_selector = relay_selector.clone();
@@ -667,11 +671,11 @@ impl Daemon {
667671
});
668672

669673
let (access_mode_handler, access_mode_provider) = api::AccessModeSelector::spawn(
670-
cache_dir.clone(),
674+
config.cache_dir.clone(),
671675
relay_selector.clone(),
672676
settings.api_access_methods.clone(),
673677
#[cfg(feature = "api-override")]
674-
endpoint.clone(),
678+
config.endpoint.clone(),
675679
internal_event_tx.to_specialized_sender(),
676680
api_runtime.address_cache().clone(),
677681
)
@@ -685,7 +689,7 @@ impl Daemon {
685689
api_runtime.address_cache().clone(),
686690
api_handle.clone(),
687691
#[cfg(feature = "api-override")]
688-
endpoint,
692+
config.endpoint.clone(),
689693
));
690694

691695
let access_method_handle = access_mode_handler.clone();
@@ -709,7 +713,7 @@ impl Daemon {
709713

710714
let (account_manager, data) = device::AccountManager::spawn(
711715
api_handle.clone(),
712-
&settings_dir,
716+
&config.settings_dir,
713717
settings
714718
.tunnel_options
715719
.wireguard
@@ -721,17 +725,17 @@ impl Daemon {
721725
.map_err(Error::LoadAccountManager)?;
722726

723727
let account_history = account_history::AccountHistory::new(
724-
&settings_dir,
728+
&config.settings_dir,
725729
data.device().map(|device| device.account_number.clone()),
726730
)
727731
.await
728732
.map_err(Error::LoadAccountHistory)?;
729733

730734
let target_state = if settings.auto_connect {
731735
log::info!("Automatically connecting since auto-connect is turned on");
732-
PersistentTargetState::new_secured(&cache_dir).await
736+
PersistentTargetState::new_secured(&config.cache_dir).await
733737
} else {
734-
PersistentTargetState::new(&cache_dir).await
738+
PersistentTargetState::new(&config.cache_dir).await
735739
};
736740

737741
#[cfg(any(windows, target_os = "android", target_os = "macos"))]
@@ -790,14 +794,14 @@ impl Daemon {
790794
exclude_paths,
791795
},
792796
parameters_generator.clone(),
793-
log_dir,
794-
resource_dir.clone(),
797+
config.log_dir,
798+
config.resource_dir.clone(),
795799
internal_event_tx.to_specialized_sender(),
796800
offline_state_tx,
797801
#[cfg(target_os = "windows")]
798802
volume_update_rx,
799803
#[cfg(target_os = "android")]
800-
android_context,
804+
config.android_context,
801805
#[cfg(target_os = "android")]
802806
connectivity_listener.clone(),
803807
#[cfg(target_os = "linux")]
@@ -819,14 +823,14 @@ impl Daemon {
819823
let mut relay_list_updater = RelayListUpdater::spawn(
820824
relay_selector.clone(),
821825
api_handle.clone(),
822-
&cache_dir,
826+
&config.cache_dir,
823827
on_relay_list_update,
824828
);
825829

826830
let version_updater_handle = version_check::VersionUpdater::spawn(
827831
api_handle.clone(),
828832
api_availability.clone(),
829-
cache_dir.clone(),
833+
config.cache_dir.clone(),
830834
internal_event_tx.to_specialized_sender(),
831835
settings.show_beta_releases,
832836
)

mullvad-daemon/src/main.rs

+10-11
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
use std::{path::PathBuf, thread, time::Duration};
22

3-
use mullvad_api::ApiEndpoint;
43
#[cfg(not(windows))]
54
use mullvad_daemon::cleanup_old_rpc_socket;
65
use mullvad_daemon::{
76
exception_logging, logging, rpc_uniqueness_check, runtime, version, Daemon,
8-
DaemonCommandChannel,
7+
DaemonCommandChannel, DaemonConfig,
98
};
109
use talpid_types::ErrorExt;
1110

@@ -213,16 +212,16 @@ async fn create_daemon(log_dir: Option<PathBuf>) -> Result<Daemon, String> {
213212
let cache_dir = mullvad_paths::cache_dir()
214213
.map_err(|e| e.display_chain_with_msg("Unable to get cache dir"))?;
215214

216-
let daemon_command_channel = DaemonCommandChannel::new();
217-
218215
Daemon::start(
219-
log_dir,
220-
resource_dir,
221-
settings_dir,
222-
cache_dir,
223-
rpc_socket_path,
224-
daemon_command_channel,
225-
ApiEndpoint::from_env_vars(),
216+
DaemonConfig {
217+
log_dir,
218+
resource_dir,
219+
settings_dir,
220+
cache_dir,
221+
rpc_socket_path,
222+
endpoint: mullvad_api::ApiEndpoint::from_env_vars(),
223+
},
224+
DaemonCommandChannel::new(),
226225
)
227226
.await
228227
.map_err(|e| e.display_chain_with_msg("Unable to initialize daemon"))

mullvad-jni/src/lib.rs

+15-31
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use jnix::{
1515
use mullvad_api::ApiEndpoint;
1616
use mullvad_daemon::{
1717
cleanup_old_rpc_socket, exception_logging, logging, runtime::new_multi_thread, version, Daemon,
18-
DaemonCommandChannel, DaemonCommandSender,
18+
DaemonCommandChannel, DaemonCommandSender, DaemonConfig,
1919
};
2020
use std::{
2121
io,
@@ -139,13 +139,6 @@ fn start(
139139
start_logging(&files_dir).map_err(Error::InitializeLogging)?;
140140
version::log_version();
141141

142-
#[cfg(feature = "api-override")]
143-
if let Some(api_endpoint) = api_endpoint {
144-
log::debug!("Overriding API endpoint: {api_endpoint:?}");
145-
if mullvad_api::API.override_init(api_endpoint).is_err() {
146-
log::warn!("Ignoring API settings (already initialized)");
147-
}
148-
}
149142
#[cfg(not(feature = "api-override"))]
150143
if api_endpoint.is_some() {
151144
log::warn!("api_endpoint will be ignored since 'api-override' is not enabled");
@@ -172,14 +165,18 @@ fn spawn_daemon(
172165

173166
let runtime = new_multi_thread().build().map_err(Error::InitTokio)?;
174167

175-
let running_daemon = runtime.block_on(spawn_daemon_inner(
176-
rpc_socket,
177-
files_dir,
168+
let daemon_config = DaemonConfig {
169+
rpc_socket_path: rpc_socket,
170+
log_dir: Some(files_dir.clone()),
171+
resource_dir: files_dir.clone(),
172+
settings_dir: files_dir,
178173
cache_dir,
179-
daemon_command_channel,
180174
android_context,
181175
endpoint,
182-
))?;
176+
};
177+
178+
let running_daemon =
179+
runtime.block_on(spawn_daemon_inner(daemon_config, daemon_command_channel))?;
183180

184181
Ok(DaemonContext {
185182
runtime,
@@ -189,27 +186,14 @@ fn spawn_daemon(
189186
}
190187

191188
async fn spawn_daemon_inner(
192-
rpc_socket: PathBuf,
193-
files_dir: PathBuf,
194-
cache_dir: PathBuf,
189+
daemon_config: DaemonConfig,
195190
daemon_command_channel: DaemonCommandChannel,
196-
android_context: AndroidContext,
197-
endpoint: ApiEndpoint,
198191
) -> Result<tokio::task::JoinHandle<()>, Error> {
199-
cleanup_old_rpc_socket(&rpc_socket).await;
192+
cleanup_old_rpc_socket(&daemon_config.rpc_socket_path).await;
200193

201-
let daemon = Daemon::start(
202-
Some(files_dir.clone()),
203-
files_dir.clone(),
204-
files_dir,
205-
cache_dir,
206-
rpc_socket,
207-
daemon_command_channel,
208-
endpoint,
209-
android_context,
210-
)
211-
.await
212-
.map_err(Error::InitializeDaemon)?;
194+
let daemon = Daemon::start(daemon_config, daemon_command_channel)
195+
.await
196+
.map_err(Error::InitializeDaemon)?;
213197

214198
let running_daemon = tokio::spawn(async move {
215199
match daemon.run().await {

0 commit comments

Comments
 (0)