diff options
| -rw-r--r-- | mullvad-daemon/src/lib.rs | 48 | ||||
| -rw-r--r-- | mullvad-daemon/src/migrations/mod.rs | 43 |
2 files changed, 48 insertions, 43 deletions
diff --git a/mullvad-daemon/src/lib.rs b/mullvad-daemon/src/lib.rs index 77c1be91fc..b69a7ba2b4 100644 --- a/mullvad-daemon/src/lib.rs +++ b/mullvad-daemon/src/lib.rs @@ -625,30 +625,35 @@ where let endpoint_updater = api::ApiEndpointUpdaterHandle::new(); + let migration_data = migrations::migrate_all(&cache_dir, &settings_dir) + .await + .unwrap_or_else(|error| { + log::error!( + "{}", + error.display_chain_with_msg("Failed to migrate settings or cache") + ); + None + }); + let settings = SettingsPersister::load(&settings_dir).await; + + let initial_selector_config = new_selector_config(&settings); + let relay_selector = RelaySelector::new(initial_selector_config, &resource_dir, &cache_dir); + let (proxy_provider, proxy_provider_handle) = api::ApiConnectionModeProvider::new(cache_dir.clone()); + proxy_provider_handle.set_relay_selector(relay_selector.clone()); let api_handle = api_runtime .mullvad_rest_handle(proxy_provider, endpoint_updater.callback()) .await; - let migration_complete = migrations::migrate_all( - &cache_dir, - &settings_dir, - api_handle.clone(), - internal_event_tx.clone(), - ) - .await - .unwrap_or_else(|error| { - log::error!( - "{}", - error.display_chain_with_msg("Failed to migrate settings or cache") - ); + let migration_complete = if let Some(migration_data) = migration_data { + migrations::migrate_device( + migration_data, + api_handle.clone(), + internal_event_tx.clone(), + ) + } else { migrations::MigrationComplete::new(true) - }); - let settings = SettingsPersister::load(&settings_dir).await; - - let tunnel_parameters_generator = MullvadTunnelParametersGenerator { - tx: internal_event_tx.clone(), }; let account_manager = device::AccountManager::spawn( @@ -700,7 +705,9 @@ where let initial_api_endpoint = api::get_allowed_endpoint(api_runtime.address_cache.get_address().await); - + let tunnel_parameters_generator = MullvadTunnelParametersGenerator { + tx: internal_event_tx.clone(), + }; let (offline_state_tx, offline_state_rx) = mpsc::unbounded(); #[cfg(target_os = "windows")] let (volume_update_tx, volume_update_rx) = mpsc::unbounded(); @@ -738,11 +745,6 @@ where relay_list_listener.notify_relay_list(relay_list.clone()); }; - let initial_selector_config = new_selector_config(&settings); - let relay_selector = RelaySelector::new(initial_selector_config, &resource_dir, &cache_dir); - - proxy_provider_handle.set_relay_selector(relay_selector.clone()); - let mut relay_list_updater = RelayListUpdater::new( relay_selector.clone(), api_handle.clone(), diff --git a/mullvad-daemon/src/migrations/mod.rs b/mullvad-daemon/src/migrations/mod.rs index a280d55af5..bb1e9d1ba0 100644 --- a/mullvad-daemon/src/migrations/mod.rs +++ b/mullvad-daemon/src/migrations/mod.rs @@ -93,8 +93,7 @@ pub enum Error { pub type Result<T> = std::result::Result<T, Error>; -/// Returns whether there is any background work remaining -/// after `migrate_all` has returned. +/// Returns whether there is any background work remaining. #[derive(Clone)] pub(crate) struct MigrationComplete(Arc<AtomicBool>); @@ -112,12 +111,13 @@ impl MigrationComplete { } } +/// Contains discarded data that may be useful for later work. +pub(crate) type MigrationData = v5::MigrationData; + pub(crate) async fn migrate_all( cache_dir: &Path, settings_dir: &Path, - rest_handle: mullvad_api::rest::MullvadRestHandle, - daemon_tx: crate::DaemonEventSender, -) -> Result<MigrationComplete> { +) -> Result<Option<MigrationData>> { #[cfg(windows)] windows::migrate_after_windows_update(settings_dir) .await @@ -126,7 +126,7 @@ pub(crate) async fn migrate_all( let path = settings_dir.join(SETTINGS_FILE); if !path.is_file() { - return Ok(MigrationComplete::new(true)); + return Ok(None); } let settings_bytes = fs::read(&path).await.map_err(Error::ReadError)?; @@ -149,22 +149,10 @@ pub(crate) async fn migrate_all( account_history::migrate_formats(settings_dir, &mut settings).await?; let migration_data = v5::migrate(&mut settings).await?; - let mut migration_complete = MigrationComplete::new(false); - - if let Some(migration_data) = migration_data { - device::generate_device( - migration_data, - migration_complete.clone(), - rest_handle, - daemon_tx, - ); - } else { - migration_complete.set_complete(); - } if settings == old_settings { // Nothing changed - return Ok(migration_complete); + return Ok(migration_data); } let buffer = serde_json::to_string_pretty(&settings).map_err(Error::SerializeError)?; @@ -188,7 +176,22 @@ pub(crate) async fn migrate_all( log::debug!("Migrated settings. Wrote settings to {}", path.display()); - Ok(migration_complete) + Ok(migration_data) +} + +pub(crate) fn migrate_device( + migration_data: MigrationData, + rest_handle: mullvad_api::rest::MullvadRestHandle, + daemon_tx: crate::DaemonEventSender, +) -> MigrationComplete { + let migration_complete = MigrationComplete::new(false); + device::generate_device( + migration_data, + migration_complete.clone(), + rest_handle, + daemon_tx, + ); + migration_complete } #[cfg(windows)] |
