summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mullvad-daemon/src/lib.rs48
-rw-r--r--mullvad-daemon/src/migrations/mod.rs43
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)]