From 706af47714fd7c33f75e16406e5ab8d08ae334a9 Mon Sep 17 00:00:00 2001 From: Ana Hobden Date: Wed, 26 Oct 2022 09:27:50 -0700 Subject: [PATCH] Tidy up some planner api Signed-off-by: Ana Hobden --- src/actions/meta/configure_nix.rs | 4 +-- src/actions/meta/create_users_and_group.rs | 4 +-- src/actions/meta/provision_nix.rs | 4 +-- src/cli/subcommand/plan.rs | 2 +- src/lib.rs | 2 +- src/planner/darwin/multi.rs | 33 +++++++++++++++++++--- src/planner/linux/multi.rs | 8 +++--- src/planner/mod.rs | 14 +++++---- src/planner/specific/steam_deck.rs | 8 +++--- src/settings.rs | 16 ++++++++--- 10 files changed, 65 insertions(+), 30 deletions(-) diff --git a/src/actions/meta/configure_nix.rs b/src/actions/meta/configure_nix.rs index e36270a..11daaad 100644 --- a/src/actions/meta/configure_nix.rs +++ b/src/actions/meta/configure_nix.rs @@ -1,7 +1,7 @@ use reqwest::Url; use serde::Serialize; -use crate::InstallSettings; +use crate::CommonSettings; use crate::{ actions::{ base::{ @@ -31,7 +31,7 @@ pub struct ConfigureNix { impl ConfigureNix { #[tracing::instrument(skip_all)] - pub async fn plan(settings: InstallSettings) -> Result { + pub async fn plan(settings: CommonSettings) -> Result { let channels: Vec<(String, Url)> = settings .channels .iter() diff --git a/src/actions/meta/create_users_and_group.rs b/src/actions/meta/create_users_and_group.rs index 9c88c16..3e720de 100644 --- a/src/actions/meta/create_users_and_group.rs +++ b/src/actions/meta/create_users_and_group.rs @@ -1,7 +1,7 @@ use serde::Serialize; use tokio::task::{JoinError, JoinSet}; -use crate::InstallSettings; +use crate::CommonSettings; use crate::actions::base::{CreateGroup, CreateGroupError, CreateUserError}; use crate::actions::{Action, ActionDescription, ActionState, Actionable, CreateUser}; @@ -20,7 +20,7 @@ pub struct CreateUsersAndGroup { impl CreateUsersAndGroup { #[tracing::instrument(skip_all)] - pub async fn plan(settings: InstallSettings) -> Result { + pub async fn plan(settings: CommonSettings) -> Result { // TODO(@hoverbear): CHeck if it exist, error if so let create_group = CreateGroup::plan( settings.nix_build_group_name.clone(), diff --git a/src/actions/meta/provision_nix.rs b/src/actions/meta/provision_nix.rs index e3eecc5..21d0fd1 100644 --- a/src/actions/meta/provision_nix.rs +++ b/src/actions/meta/provision_nix.rs @@ -6,7 +6,7 @@ use tokio::task::JoinError; use crate::actions::base::{ CreateDirectoryError, FetchNix, FetchNixError, MoveUnpackedNix, MoveUnpackedNixError, }; -use crate::InstallSettings; +use crate::CommonSettings; use crate::actions::{Action, ActionDescription, ActionState, Actionable}; @@ -23,7 +23,7 @@ pub struct ProvisionNix { impl ProvisionNix { #[tracing::instrument(skip_all)] - pub async fn plan(settings: InstallSettings) -> Result { + pub async fn plan(settings: CommonSettings) -> Result { let fetch_nix = FetchNix::plan( settings.nix_package_url.clone(), PathBuf::from("/nix/temp-install-dir"), diff --git a/src/cli/subcommand/plan.rs b/src/cli/subcommand/plan.rs index c026415..afdddaf 100644 --- a/src/cli/subcommand/plan.rs +++ b/src/cli/subcommand/plan.rs @@ -25,7 +25,7 @@ impl CommandExecute for Plan { let planner = match planner { Some(planner) => planner, - None => BuiltinPlanner::default()?, + None => BuiltinPlanner::default().await?, }; let install_plan = planner.plan().await?; diff --git a/src/lib.rs b/src/lib.rs index f32d19c..9f4f798 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -13,7 +13,7 @@ pub use error::HarmonicError; pub use plan::InstallPlan; pub use planner::BuiltinPlanner; use serde::Serializer; -pub use settings::InstallSettings; +pub use settings::CommonSettings; use tokio::process::Command; diff --git a/src/planner/darwin/multi.rs b/src/planner/darwin/multi.rs index a00a142..b2e5f00 100644 --- a/src/planner/darwin/multi.rs +++ b/src/planner/darwin/multi.rs @@ -1,5 +1,6 @@ use std::io::Cursor; +use clap::ArgAction; use tokio::process::Command; use crate::{ @@ -11,13 +12,34 @@ use crate::{ execute_command, os::darwin::DiskUtilOutput, planner::{Plannable, PlannerError}, - BuiltinPlanner, InstallPlan, InstallSettings, + BuiltinPlanner, CommonSettings, InstallPlan, }; #[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)] pub struct DarwinMulti { #[clap(flatten)] - settings: InstallSettings, + settings: CommonSettings, + #[clap( + long, + action(ArgAction::SetTrue), + default_value = "false", + env = "HARMONIC_VOLUME_ENCRYPT" + )] + volume_encrypt: bool, + #[clap(long, default_value = "Nix Store", env = "HARMONIC_VOLUME_LABEL")] + volume_label: String, + #[clap(long, env = "HARMONIC_ROOT_DISK")] + root_disk: Option, +} + +async fn default_root_disk() -> Result { + let buf = execute_command(Command::new("/usr/sbin/diskutil").args(["info", "-plist", "/"])) + .await + .unwrap() + .stdout; + let the_plist: DiskUtilOutput = plist::from_reader(Cursor::new(buf))?; + + Ok(the_plist.parent_whole_disk) } #[async_trait::async_trait] @@ -25,9 +47,12 @@ impl Plannable for DarwinMulti { const DISPLAY_STRING: &'static str = "Darwin Multi-User"; const SLUG: &'static str = "darwin-multi"; - fn default() -> Result { + async fn default() -> Result { Ok(Self { - settings: InstallSettings::default()?, + settings: CommonSettings::default()?, + root_disk: Some(default_root_disk().await?), + volume_encrypt: false, + volume_label: "Nix Store".into(), }) } diff --git a/src/planner/linux/multi.rs b/src/planner/linux/multi.rs index 9edeb5f..2b5cdee 100644 --- a/src/planner/linux/multi.rs +++ b/src/planner/linux/multi.rs @@ -5,13 +5,13 @@ use crate::{ Action, ActionError, }, planner::{Plannable, PlannerError}, - BuiltinPlanner, InstallPlan, InstallSettings, + BuiltinPlanner, CommonSettings, InstallPlan, }; #[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)] pub struct LinuxMulti { #[clap(flatten)] - settings: InstallSettings, + settings: CommonSettings, } #[async_trait::async_trait] @@ -19,9 +19,9 @@ impl Plannable for LinuxMulti { const DISPLAY_STRING: &'static str = "Linux Multi-User"; const SLUG: &'static str = "linux-multi"; - fn default() -> Result { + async fn default() -> Result { Ok(Self { - settings: InstallSettings::default()?, + settings: CommonSettings::default()?, }) } diff --git a/src/planner/mod.rs b/src/planner/mod.rs index 04ce33a..8dcc5dc 100644 --- a/src/planner/mod.rs +++ b/src/planner/mod.rs @@ -12,22 +12,22 @@ pub enum BuiltinPlanner { } impl BuiltinPlanner { - pub fn default() -> Result { + pub async fn default() -> Result { use target_lexicon::{Architecture, OperatingSystem}; match (Architecture::host(), OperatingSystem::host()) { (Architecture::X86_64, OperatingSystem::Linux) => { - Ok(Self::LinuxMulti(linux::LinuxMulti::default()?)) + Ok(Self::LinuxMulti(linux::LinuxMulti::default().await?)) }, (Architecture::Aarch64(_), OperatingSystem::Linux) => { - Ok(Self::LinuxMulti(linux::LinuxMulti::default()?)) + Ok(Self::LinuxMulti(linux::LinuxMulti::default().await?)) }, (Architecture::X86_64, OperatingSystem::MacOSX { .. }) | (Architecture::X86_64, OperatingSystem::Darwin) => { - Ok(Self::DarwinMulti(darwin::DarwinMulti::default()?)) + Ok(Self::DarwinMulti(darwin::DarwinMulti::default().await?)) }, (Architecture::Aarch64(_), OperatingSystem::MacOSX { .. }) | (Architecture::Aarch64(_), OperatingSystem::Darwin) => { - Ok(Self::DarwinMulti(darwin::DarwinMulti::default()?)) + Ok(Self::DarwinMulti(darwin::DarwinMulti::default().await?)) }, _ => Err(PlannerError::UnsupportedArchitecture(target_lexicon::HOST)), } @@ -50,7 +50,7 @@ where const DISPLAY_STRING: &'static str; const SLUG: &'static str; - fn default() -> Result; + async fn default() -> Result; async fn plan(self) -> Result; } @@ -66,4 +66,6 @@ pub enum PlannerError { ), #[error(transparent)] InstallSettings(#[from] InstallSettingsError), + #[error(transparent)] + Plist(#[from] plist::Error), } diff --git a/src/planner/specific/steam_deck.rs b/src/planner/specific/steam_deck.rs index 538eb71..04d687c 100644 --- a/src/planner/specific/steam_deck.rs +++ b/src/planner/specific/steam_deck.rs @@ -5,13 +5,13 @@ use crate::{ Action, ActionError, }, planner::{Plannable, PlannerError}, - BuiltinPlanner, InstallPlan, InstallSettings, + BuiltinPlanner, CommonSettings, InstallPlan, }; #[derive(Debug, Clone, clap::Parser, serde::Serialize, serde::Deserialize)] pub struct SteamDeck { #[clap(flatten)] - settings: InstallSettings, + settings: CommonSettings, } #[async_trait::async_trait] @@ -19,9 +19,9 @@ impl Plannable for SteamDeck { const DISPLAY_STRING: &'static str = "Steam Deck (x86_64 Linux Multi-User)"; const SLUG: &'static str = "steam-deck"; - fn default() -> Result { + async fn default() -> Result { Ok(Self { - settings: InstallSettings::default()?, + settings: CommonSettings::default()?, }) } diff --git a/src/settings.rs b/src/settings.rs index 0f4ac33..5011b9d 100644 --- a/src/settings.rs +++ b/src/settings.rs @@ -1,5 +1,4 @@ use clap::ArgAction; -use derivative::Derivative; use url::Url; pub const NIX_X64_64_LINUX_URL: &str = @@ -13,7 +12,7 @@ pub const NIX_AARCH64_DARWIN_URL: &str = #[serde_with::serde_as] #[derive(Debug, serde::Deserialize, serde::Serialize, Clone, clap::Parser)] -pub struct InstallSettings { +pub struct CommonSettings { /// Channel(s) to add by default, pass multiple times for multiple channels #[clap( long, @@ -24,6 +23,7 @@ pub struct InstallSettings { default_value = "nixpkgs=https://nixos.org/channels/nixpkgs-unstable", )] pub(crate) channels: Vec, + /// Modify the user profile to automatically load nix #[clap( long, @@ -34,21 +34,27 @@ pub struct InstallSettings { name = "no-modify-profile" )] pub(crate) modify_profile: bool, + /// Number of build users to create #[clap(long, default_value = "32", env = "HARMONIC_DAEMON_USER_COUNT")] pub(crate) daemon_user_count: usize, + #[clap(long, default_value = "nixbld", env = "HARMONIC_NIX_BUILD_GROUP_NAME")] pub(crate) nix_build_group_name: String, + #[clap(long, default_value_t = 3000, env = "HARMONIC_NIX_BUILD_GROUP_ID")] pub(crate) nix_build_group_id: usize, + #[clap(long, env = "HARMONIC_NIX_BUILD_USER_PREFIX")] #[cfg_attr(target_os = "macos", clap(default_value = "_nixbld"))] #[cfg_attr(target_os = "linux", clap(default_value = "nixbld"))] pub(crate) nix_build_user_prefix: String, + #[clap(long, env = "HARMONIC_NIX_BUILD_USER_ID_BASE")] #[cfg_attr(target_os = "macos", clap(default_value_t = 300))] #[cfg_attr(target_os = "linux", clap(default_value_t = 3000))] pub(crate) nix_build_user_id_base: usize, + #[clap(long, env = "HARMONIC_NIX_PACKAGE_URL")] #[cfg_attr( all(target_os = "macos", target_arch = "x86_64"), @@ -75,8 +81,10 @@ pub struct InstallSettings { ) )] pub(crate) nix_package_url: Url, + #[clap(long, env = "HARMONIC_EXTRA_CONF")] pub(crate) extra_conf: Option, + #[clap( long, action(ArgAction::SetTrue), @@ -87,7 +95,7 @@ pub struct InstallSettings { pub(crate) force: bool, } -impl InstallSettings { +impl CommonSettings { pub fn default() -> Result { let url; let nix_build_user_prefix; @@ -140,7 +148,7 @@ impl InstallSettings { } // Builder Pattern -impl InstallSettings { +impl CommonSettings { pub fn daemon_user_count(&mut self, count: usize) -> &mut Self { self.daemon_user_count = count; self