From 2ef795199486da8bc500e3165f625b8af9ebc0dc Mon Sep 17 00:00:00 2001 From: Ana Hobden Date: Tue, 20 Sep 2022 13:11:30 -0700 Subject: [PATCH] Further fleshing out --- src/actions/base/configure_shell_profile.rs | 4 +- src/actions/base/fetch_nix.rs | 2 +- src/actions/base/setup_default_profile.rs | 8 +-- src/actions/meta/configure_nix.rs | 68 +++++++++++++++++---- src/actions/meta/create_users_and_group.rs | 19 +++--- 5 files changed, 71 insertions(+), 30 deletions(-) diff --git a/src/actions/base/configure_shell_profile.rs b/src/actions/base/configure_shell_profile.rs index 9dd3823..63319d5 100644 --- a/src/actions/base/configure_shell_profile.rs +++ b/src/actions/base/configure_shell_profile.rs @@ -17,9 +17,9 @@ impl<'a> Actionable<'a> for ConfigureShellProfile { fn description(&self) -> Vec { vec![ ActionDescription::new( - "Start the systemd Nix daemon".to_string(), + "Configure the shell profiles".to_string(), vec![ - "The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() + "Update shell profiles to import Nix".to_string() ] ), ] diff --git a/src/actions/base/fetch_nix.rs b/src/actions/base/fetch_nix.rs index ce3664f..0452e3b 100644 --- a/src/actions/base/fetch_nix.rs +++ b/src/actions/base/fetch_nix.rs @@ -28,7 +28,7 @@ impl<'a> Actionable<'a> for FetchNix { vec![ActionDescription::new( format!("Fetch Nix from `{url}`"), vec![format!( - "Fetch a Nix archive and unpack it to `{}`", destination.display() + "Unpack it to `{}`, so it can later be moved into the Nix store at /nix", destination.display() )], )] } diff --git a/src/actions/base/setup_default_profile.rs b/src/actions/base/setup_default_profile.rs index 62b4db5..c3d6af0 100644 --- a/src/actions/base/setup_default_profile.rs +++ b/src/actions/base/setup_default_profile.rs @@ -17,9 +17,9 @@ impl<'a> Actionable<'a> for SetupDefaultProfile { fn description(&self) -> Vec { vec![ ActionDescription::new( - "Start the systemd Nix daemon".to_string(), + "Setup the default Nix profile".to_string(), vec![ - "The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() + "TODO".to_string() ] ), ] @@ -38,9 +38,9 @@ impl<'a> Revertable<'a> for SetupDefaultProfileReceipt { fn description(&self) -> Vec { vec![ ActionDescription::new( - "Stop the systemd Nix daemon".to_string(), + "Unset the default Nix profile".to_string(), vec![ - "The `nix` command line tool communicates with a running Nix daemon managed by your init system".to_string() + "TODO".to_string() ] ), ] diff --git a/src/actions/meta/configure_nix.rs b/src/actions/meta/configure_nix.rs index 08699d7..394e5a4 100644 --- a/src/actions/meta/configure_nix.rs +++ b/src/actions/meta/configure_nix.rs @@ -1,13 +1,30 @@ +use tokio::task::JoinSet; + +use crate::actions::base::{SetupDefaultProfile, ConfigureNixDaemonService, ConfigureShellProfile, SetupDefaultProfileReceipt, ConfigureNixDaemonServiceReceipt, ConfigureShellProfileReceipt}; use crate::{HarmonicError, InstallSettings}; use crate::actions::{ActionDescription, ActionReceipt, Actionable, Revertable}; #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)] -pub struct ConfigureNix {} +pub struct ConfigureNix { + setup_default_profile: SetupDefaultProfile, + configure_nix_daemon_service: ConfigureNixDaemonService, + configure_shell_profile: Option, +} impl ConfigureNix { pub fn plan(settings: InstallSettings) -> Self { - Self {} + let setup_default_profile = SetupDefaultProfile::plan(); + let configure_nix_daemon_service = ConfigureNixDaemonService::plan(); + + let configure_shell_profile = if settings.modify_profile { + Some(ConfigureShellProfile::plan()) + } else { + None + }; + + + Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile } } } @@ -15,23 +32,50 @@ impl ConfigureNix { impl<'a> Actionable<'a> for ConfigureNix { type Receipt = ConfigureNixReceipt; fn description(&self) -> Vec { - vec![ - ActionDescription::new( - "Configure the Nix daemon".to_string(), - vec![ - "Blah".to_string() - ] - ), - ] + let Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile } = &self; + + let mut buf = setup_default_profile.description(); + buf.append(&mut configure_nix_daemon_service.description()); + if let Some(configure_shell_profile) = configure_shell_profile { + buf.append(&mut configure_shell_profile.description()); + } + + buf } async fn execute(self) -> Result { - todo!() + let Self { setup_default_profile, configure_nix_daemon_service, configure_shell_profile } = self; + + let (setup_default_profile, configure_nix_daemon_service, configure_shell_profile) = if let Some(configure_shell_profile) = configure_shell_profile { + let (a, b, c) = tokio::try_join!( + setup_default_profile.execute(), + configure_nix_daemon_service.execute(), + configure_shell_profile.execute(), + )?; + (a, b, Some(c)) + } else { + let (a, b) = tokio::try_join!( + setup_default_profile.execute(), + configure_nix_daemon_service.execute(), + )?; + (a, b, None) + }; + + Ok(Self::Receipt { + setup_default_profile, + configure_nix_daemon_service, + configure_shell_profile, + }) + } } #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)] -pub struct ConfigureNixReceipt {} +pub struct ConfigureNixReceipt { + setup_default_profile: SetupDefaultProfileReceipt, + configure_nix_daemon_service: ConfigureNixDaemonServiceReceipt, + configure_shell_profile: Option, +} #[async_trait::async_trait] impl<'a> Revertable<'a> for ConfigureNixReceipt { diff --git a/src/actions/meta/create_users_and_group.rs b/src/actions/meta/create_users_and_group.rs index a7dcffa..f718b38 100644 --- a/src/actions/meta/create_users_and_group.rs +++ b/src/actions/meta/create_users_and_group.rs @@ -38,28 +38,24 @@ impl<'a> Actionable<'a> for CreateUsersAndGroup { type Receipt = CreateUsersAndGroupReceipt; fn description(&self) -> Vec { let Self { - create_users: _, - create_group: _, settings: InstallSettings { - explain: _, daemon_user_count, - channels: _, - modify_profile: _, nix_build_group_name, nix_build_group_id, nix_build_user_prefix, nix_build_user_id_base, - nix_package_url, - } + .. + }, + .. } = &self; vec![ ActionDescription::new( format!("Create build users and group"), vec![ - format!("The nix daemon requires system users it can act as in order to build"), - format!("This action will create group `{nix_build_group_name}` with uid `{nix_build_group_id}`"), - format!("This action will create {daemon_user_count} users with prefix `{nix_build_user_prefix}` starting at uid `{nix_build_user_id_base}`"), + format!("The nix daemon requires system users (and a group they share) which it can act as in order to build"), + format!("Create group `{nix_build_group_name}` with uid `{nix_build_group_id}`"), + format!("Create {daemon_user_count} users with prefix `{nix_build_user_prefix}` starting at uid `{nix_build_user_id_base}`"), ], ) ] @@ -74,9 +70,10 @@ impl<'a> Actionable<'a> for CreateUsersAndGroup { // Create users // TODO(@hoverbear): Abstract this, it will be common let mut set = JoinSet::new(); + let mut successes = Vec::with_capacity(create_users.len()); let mut errors = Vec::default(); - + for create_user in create_users { let _abort_handle = set.spawn(async move { create_user.execute().await }); }