diff --git a/nix/tests/vm-test/default.nix b/nix/tests/vm-test/default.nix index 24fc4dc..fb18048 100644 --- a/nix/tests/vm-test/default.nix +++ b/nix/tests/vm-test/default.nix @@ -185,12 +185,6 @@ let $ssh <, group: Option, mode: Option, buf: String, + position: Position, } -impl CreateOrAppendFile { +impl CreateOrInsertIntoFile { #[tracing::instrument(level = "debug", skip_all)] pub async fn plan( path: impl AsRef, @@ -37,6 +43,7 @@ impl CreateOrAppendFile { group: impl Into>, mode: impl Into>, buf: String, + position: Position, ) -> Result, ActionError> { let path = path.as_ref().to_path_buf(); @@ -46,22 +53,23 @@ impl CreateOrAppendFile { group: group.into(), mode: mode.into(), buf, + position, } .into()) } } #[async_trait::async_trait] -#[typetag::serde(name = "create_or_append_file")] -impl Action for CreateOrAppendFile { +#[typetag::serde(name = "create_or_insert_into_file")] +impl Action for CreateOrInsertIntoFile { fn tracing_synopsis(&self) -> String { - format!("Create or append file `{}`", self.path.display()) + format!("Create or insert file `{}`", self.path.display()) } fn tracing_span(&self) -> Span { let span = span!( tracing::Level::DEBUG, - "create_or_append_file", + "create_or_insert_file", path = tracing::field::display(self.path.display()), user = self.user, group = self.group, @@ -89,23 +97,63 @@ impl Action for CreateOrAppendFile { group, mode, buf, + position, } = self; - let mut file = OpenOptions::new() + let mut orig_file = match OpenOptions::new().read(true).open(&path).await { + Ok(f) => Some(f), + Err(e) if e.kind() == std::io::ErrorKind::NotFound => None, + Err(e) => return Err(ActionError::Open(path.to_owned(), e)), + }; + + // Create a temporary file in the same directory as the one + // that the final file goes in, so that we can rename it + // atomically + let parent_dir = path.parent().expect("File must be in a directory"); + let mut temp_file_path = parent_dir.to_owned(); + { + let mut rng = rand::thread_rng(); + temp_file_path.push(format!("nix-installer-tmp.{}", rng.gen::())); + } + let mut temp_file = OpenOptions::new() .create(true) .write(true) - .read(true) - .open(&path) + // If the file is created, ensure that it has harmless + // permissions regardless of whether the mode will be + // changed later (if we ever create setuid executables, + // they should only become setuid once they are owned by + // the appropriate user) + .mode(0o600) + .open(&temp_file_path) .await - .map_err(|e| ActionError::Open(path.to_owned(), e))?; + .map_err(|e| { + ActionError::Open(temp_file_path.clone(), e) + })?; - file.seek(SeekFrom::End(0)) - .await - .map_err(|e| ActionError::Seek(path.to_owned(), e))?; + if *position == Position::End { + if let Some(ref mut orig_file) = orig_file { + tokio::io::copy(orig_file, &mut temp_file) + .await + .map_err(|e| { + ActionError::Copy(path.to_owned(), temp_file_path.to_owned(), e) + })?; + } + } - file.write_all(buf.as_bytes()) + temp_file + .write_all(buf.as_bytes()) .await - .map_err(|e| ActionError::Write(path.to_owned(), e))?; + .map_err(|e| ActionError::Write(temp_file_path.clone(), e))?; + + if *position == Position::Beginning { + if let Some(ref mut orig_file) = orig_file { + tokio::io::copy(orig_file, &mut temp_file) + .await + .map_err(|e| { + ActionError::Copy(path.to_owned(), temp_file_path.to_owned(), e) + })?; + } + } let gid = if let Some(group) = group { Some( @@ -128,13 +176,24 @@ impl Action for CreateOrAppendFile { None }; + // Change ownership _before_ applying mode, to ensure that if + // a file needs to be setuid it will never be setuid for the + // wrong user + chown(&temp_file_path, uid, gid).map_err(|e| ActionError::Chown(path.clone(), e))?; + if let Some(mode) = mode { - tokio::fs::set_permissions(&path, PermissionsExt::from_mode(*mode)) + tokio::fs::set_permissions(&temp_file_path, PermissionsExt::from_mode(*mode)) .await .map_err(|e| ActionError::SetPermissions(*mode, path.to_owned(), e))?; + } else if orig_file.is_some() { + tokio::fs::set_permissions(&temp_file_path, PermissionsExt::from_mode(0o644)) + .await + .map_err(|e| ActionError::SetPermissions(0o644, path.to_owned(), e))?; } - chown(path, uid, gid).map_err(|e| ActionError::Chown(path.clone(), e))?; + tokio::fs::rename(&temp_file_path, &path) + .await + .map_err(|e| ActionError::Rename(path.to_owned(), temp_file_path.to_owned(), e))?; Ok(()) } @@ -146,6 +205,7 @@ impl Action for CreateOrAppendFile { group: _, mode: _, buf, + position: _, } = &self; vec![ActionDescription::new( format!("Delete Nix related fragment from file `{}`", path.display()), @@ -164,6 +224,7 @@ impl Action for CreateOrAppendFile { group: _, mode: _, buf, + position: _, } = self; let mut file = OpenOptions::new() .create(false) @@ -171,12 +232,12 @@ impl Action for CreateOrAppendFile { .read(true) .open(&path) .await - .map_err(|e| ActionError::Read(path.to_owned(), e))?; + .map_err(|e| ActionError::Open(path.to_owned(), e))?; let mut file_contents = String::default(); file.read_to_string(&mut file_contents) .await - .map_err(|e| ActionError::Seek(path.to_owned(), e))?; + .map_err(|e| ActionError::Read(path.to_owned(), e))?; if let Some(start) = file_contents.rfind(buf.as_str()) { let end = start + buf.len(); diff --git a/src/action/base/mod.rs b/src/action/base/mod.rs index 19d6a11..204f629 100644 --- a/src/action/base/mod.rs +++ b/src/action/base/mod.rs @@ -3,7 +3,7 @@ pub(crate) mod create_directory; pub(crate) mod create_file; pub(crate) mod create_group; -pub(crate) mod create_or_append_file; +pub(crate) mod create_or_insert_into_file; pub(crate) mod create_user; pub(crate) mod fetch_and_unpack_nix; pub(crate) mod move_unpacked_nix; @@ -12,7 +12,7 @@ pub(crate) mod setup_default_profile; pub use create_directory::CreateDirectory; pub use create_file::CreateFile; pub use create_group::CreateGroup; -pub use create_or_append_file::CreateOrAppendFile; +pub use create_or_insert_into_file::CreateOrInsertIntoFile; pub use create_user::CreateUser; pub use fetch_and_unpack_nix::{FetchAndUnpackNix, FetchUrlError}; pub use move_unpacked_nix::{MoveUnpackedNix, MoveUnpackedNixError}; diff --git a/src/action/common/configure_shell_profile.rs b/src/action/common/configure_shell_profile.rs index c27837d..d26bf88 100644 --- a/src/action/common/configure_shell_profile.rs +++ b/src/action/common/configure_shell_profile.rs @@ -1,4 +1,4 @@ -use crate::action::base::{CreateDirectory, CreateOrAppendFile}; +use crate::action::base::{create_or_insert_into_file, CreateDirectory, CreateOrInsertIntoFile}; use crate::action::{Action, ActionDescription, ActionError, StatefulAction}; use nix::unistd::User; @@ -23,9 +23,9 @@ const PROFILE_FISH_PREFIXES: &[&str] = &[ const PROFILE_TARGETS: &[&str] = &[ "/etc/bashrc", "/etc/profile.d/nix.sh", - "/etc/zshrc", + "/etc/zshenv", "/etc/bash.bashrc", - "/etc/zsh/zshrc", + "/etc/zsh/zshenv", ]; const PROFILE_NIX_FILE_SHELL: &str = "/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh"; const PROFILE_NIX_FILE_FISH: &str = "/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish"; @@ -36,13 +36,13 @@ Configure any detected shell profiles to include Nix support #[derive(Debug, serde::Deserialize, serde::Serialize, Clone)] pub struct ConfigureShellProfile { create_directories: Vec>, - create_or_append_files: Vec>, + create_or_insert_into_files: Vec>, } impl ConfigureShellProfile { #[tracing::instrument(level = "debug", skip_all)] pub async fn plan() -> Result, ActionError> { - let mut create_or_append_files = Vec::default(); + let mut create_or_insert_files = Vec::default(); let mut create_directories = Vec::default(); let shell_buf = format!( @@ -61,17 +61,18 @@ impl ConfigureShellProfile { if let Some(parent) = profile_target_path.parent() { if !parent.exists() { tracing::trace!( - "Did not plan to edit `{profile_target}` as it's parent folder does not exist." + "Did not plan to edit `{profile_target}` as its parent folder does not exist." ); continue; } - create_or_append_files.push( - CreateOrAppendFile::plan( + create_or_insert_files.push( + CreateOrInsertIntoFile::plan( profile_target_path, None, None, 0o0755, shell_buf.to_string(), + create_or_insert_into_file::Position::Beginning, ) .await?, ); @@ -106,9 +107,16 @@ impl ConfigureShellProfile { ); } - create_or_append_files.push( - CreateOrAppendFile::plan(profile_target, None, None, 0o0755, fish_buf.to_string()) - .await?, + create_or_insert_files.push( + CreateOrInsertIntoFile::plan( + profile_target, + None, + None, + 0o0755, + fish_buf.to_string(), + create_or_insert_into_file::Position::Beginning, + ) + .await?, ); } @@ -123,13 +131,22 @@ impl ConfigureShellProfile { runner.name ); } - create_or_append_files - .push(CreateOrAppendFile::plan(&github_path, None, None, None, buf).await?) + create_or_insert_files.push( + CreateOrInsertIntoFile::plan( + &github_path, + None, + None, + None, + buf, + create_or_insert_into_file::Position::End, + ) + .await?, + ) } Ok(Self { create_directories, - create_or_append_files, + create_or_insert_into_files: create_or_insert_files, } .into()) } @@ -156,7 +173,7 @@ impl Action for ConfigureShellProfile { #[tracing::instrument(level = "debug", skip_all)] async fn execute(&mut self) -> Result<(), ActionError> { let Self { - create_or_append_files, + create_or_insert_into_files, create_directories, } = self; @@ -167,22 +184,22 @@ impl Action for ConfigureShellProfile { let mut set = JoinSet::new(); let mut errors = Vec::default(); - for (idx, create_or_append_file) in create_or_append_files.iter().enumerate() { + for (idx, create_or_insert_into_file) in create_or_insert_into_files.iter().enumerate() { let span = tracing::Span::current().clone(); - let mut create_or_append_file_clone = create_or_append_file.clone(); + let mut create_or_insert_into_file_clone = create_or_insert_into_file.clone(); let _abort_handle = set.spawn(async move { - create_or_append_file_clone + create_or_insert_into_file_clone .try_execute() .instrument(span) .await?; - Result::<_, ActionError>::Ok((idx, create_or_append_file_clone)) + Result::<_, ActionError>::Ok((idx, create_or_insert_into_file_clone)) }); } while let Some(result) = set.join_next().await { match result { - Ok(Ok((idx, create_or_append_file))) => { - create_or_append_files[idx] = create_or_append_file + Ok(Ok((idx, create_or_insert_into_file))) => { + create_or_insert_into_files[idx] = create_or_insert_into_file }, Ok(Err(e)) => errors.push(Box::new(e)), Err(e) => return Err(e.into()), @@ -211,24 +228,24 @@ impl Action for ConfigureShellProfile { async fn revert(&mut self) -> Result<(), ActionError> { let Self { create_directories, - create_or_append_files, + create_or_insert_into_files, } = self; let mut set = JoinSet::new(); let mut errors: Vec> = Vec::default(); - for (idx, create_or_append_file) in create_or_append_files.iter().enumerate() { - let mut create_or_append_file_clone = create_or_append_file.clone(); + for (idx, create_or_insert_into_file) in create_or_insert_into_files.iter().enumerate() { + let mut create_or_insert_file_clone = create_or_insert_into_file.clone(); let _abort_handle = set.spawn(async move { - create_or_append_file_clone.try_revert().await?; - Result::<_, _>::Ok((idx, create_or_append_file_clone)) + create_or_insert_file_clone.try_revert().await?; + Result::<_, _>::Ok((idx, create_or_insert_file_clone)) }); } while let Some(result) = set.join_next().await { match result { - Ok(Ok((idx, create_or_append_file))) => { - create_or_append_files[idx] = create_or_append_file + Ok(Ok((idx, create_or_insert_into_file))) => { + create_or_insert_into_files[idx] = create_or_insert_into_file }, Ok(Err(e)) => errors.push(Box::new(e)), Err(e) => return Err(e.into()), diff --git a/src/action/darwin/create_nix_volume.rs b/src/action/darwin/create_nix_volume.rs index 7f1fc75..4076505 100644 --- a/src/action/darwin/create_nix_volume.rs +++ b/src/action/darwin/create_nix_volume.rs @@ -1,5 +1,5 @@ use crate::action::{ - base::{CreateFile, CreateOrAppendFile}, + base::{create_or_insert_into_file, CreateFile, CreateOrInsertIntoFile}, darwin::{ BootstrapApfsVolume, CreateApfsVolume, CreateSyntheticObjects, EnableOwnership, EncryptApfsVolume, UnmountApfsVolume, @@ -22,11 +22,11 @@ pub struct CreateNixVolume { name: String, case_sensitive: bool, encrypt: bool, - create_or_append_synthetic_conf: StatefulAction, + create_or_append_synthetic_conf: StatefulAction, create_synthetic_objects: StatefulAction, unmount_volume: StatefulAction, create_volume: StatefulAction, - create_or_append_fstab: StatefulAction, + create_or_append_fstab: StatefulAction, encrypt_volume: Option>, setup_volume_daemon: StatefulAction, bootstrap_volume: StatefulAction, @@ -42,12 +42,13 @@ impl CreateNixVolume { encrypt: bool, ) -> Result, ActionError> { let disk = disk.as_ref(); - let create_or_append_synthetic_conf = CreateOrAppendFile::plan( + let create_or_append_synthetic_conf = CreateOrInsertIntoFile::plan( "/etc/synthetic.conf", None, None, 0o0655, "nix\n".into(), /* The newline is required otherwise it segfaults */ + create_or_insert_into_file::Position::End, ) .await .map_err(|e| ActionError::Child(Box::new(e)))?; @@ -58,12 +59,13 @@ impl CreateNixVolume { let create_volume = CreateApfsVolume::plan(disk, name.clone(), case_sensitive).await?; - let create_or_append_fstab = CreateOrAppendFile::plan( + let create_or_append_fstab = CreateOrInsertIntoFile::plan( "/etc/fstab", None, None, 0o0655, format!("NAME=\"{name}\" /nix apfs rw,noauto,nobrowse,suid,owners"), + create_or_insert_into_file::Position::End, ) .await .map_err(|e| ActionError::Child(Box::new(e)))?; diff --git a/src/cli/interaction.rs b/src/cli/interaction.rs index f66d397..badea08 100644 --- a/src/cli/interaction.rs +++ b/src/cli/interaction.rs @@ -19,8 +19,8 @@ pub(crate) async fn confirm(question: impl AsRef, default: bool) -> eyre::R ", question = question.as_ref(), are_you_sure = "Proceed?".bold(), - no = "N".red().bold(), - yes = "y".green(), + no = if default { "n" } else { "N" }.red(), + yes = if default { "Y" } else { "y" }.green(), ); term.write_all(with_confirm.as_bytes())?; diff --git a/tests/fixtures/darwin/darwin-multi.json b/tests/fixtures/darwin/darwin-multi.json index 39a07b4..676f06d 100644 --- a/tests/fixtures/darwin/darwin-multi.json +++ b/tests/fixtures/darwin/darwin-multi.json @@ -1,682 +1,687 @@ { - "version": "0.0.0-unreleased", - "actions": [ - { - "action": { - "action": "create_apfs_volume", - "disk": "disk1", - "name": "Nix Store", - "case_sensitive": false, - "encrypt": true, - "create_or_append_synthetic_conf": { - "action": { - "path": "/etc/synthetic.conf", - "user": null, - "group": null, - "mode": 429, - "buf": "nix\n" - }, - "state": "Uncompleted" - }, - "create_synthetic_objects": { - "action": null, - "state": "Uncompleted" - }, - "unmount_volume": { - "action": { - "disk": "disk1", - "name": "Nix Store" - }, - "state": "Uncompleted" - }, - "create_volume": { - "action": { - "disk": "disk1", - "name": "Nix Store", - "case_sensitive": false - }, - "state": "Uncompleted" - }, - "create_or_append_fstab": { - "action": { - "path": "/etc/fstab", - "user": null, - "group": null, - "mode": 429, - "buf": "NAME=\"Nix Store\" /nix apfs rw,noauto,nobrowse,suid,owners" - }, - "state": "Uncompleted" - }, - "encrypt_volume": { - "action": { - "disk": "disk1", - "name": "Nix Store" - }, - "state": "Uncompleted" - }, - "setup_volume_daemon": { - "action": { - "path": "/Library/LaunchDaemons/org.nixos.darwin-store.plist", - "user": null, - "group": null, - "mode": null, - "buf": "\n\n\n\nRunAtLoad\n\nLabel\norg.nixos.darwin-store\nProgramArguments\n\n/bin/sh\n\n-c\n\n/usr/bin/security find-generic-password -s \"Nix Store\" -w | /usr/sbin/diskutil apfs unlockVolume \"Nix Store\" -mountpoint /nix -stdinpassphrase\n\n\n\n", - "force": false - }, - "state": "Uncompleted" - }, - "bootstrap_volume": { - "action": { - "path": "/Library/LaunchDaemons/org.nixos.darwin-store.plist" - }, - "state": "Uncompleted" - }, - "enable_ownership": { - "action": { - "path": "/nix" - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" + "version": "0.0.0-unreleased", + "actions": [ + { + "action": { + "action": "create_apfs_volume", + "disk": "disk3", + "name": "Nix Store", + "case_sensitive": false, + "encrypt": true, + "create_or_append_synthetic_conf": { + "action": { + "path": "/etc/synthetic.conf", + "user": null, + "group": null, + "mode": 429, + "buf": "nix\n", + "position": "End" + }, + "state": "Uncompleted" }, - { - "action": { - "action": "provision_nix", - "fetch_nix": { - "action": { - "url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-darwin.tar.xz", - "dest": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - }, - "create_users_and_group": { - "action": { - "daemon_user_count": 32, - "nix_build_group_name": "nixbld", - "nix_build_group_id": 3000, - "nix_build_user_prefix": "_nixbld", - "nix_build_user_id_base": 300, - "create_group": { - "action": { - "name": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - "create_users": [ - { - "action": { - "name": "_nixbld0", - "uid": 300, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld1", - "uid": 301, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld2", - "uid": 302, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld3", - "uid": 303, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld4", - "uid": 304, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld5", - "uid": 305, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld6", - "uid": 306, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld7", - "uid": 307, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld8", - "uid": 308, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld9", - "uid": 309, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld10", - "uid": 310, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld11", - "uid": 311, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld12", - "uid": 312, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld13", - "uid": 313, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld14", - "uid": 314, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld15", - "uid": 315, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld16", - "uid": 316, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld17", - "uid": 317, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld18", - "uid": 318, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld19", - "uid": 319, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld20", - "uid": 320, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld21", - "uid": 321, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld22", - "uid": 322, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld23", - "uid": 323, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld24", - "uid": 324, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld25", - "uid": 325, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld26", - "uid": 326, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld27", - "uid": 327, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld28", - "uid": 328, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld29", - "uid": 329, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld30", - "uid": 330, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "_nixbld31", - "uid": 331, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "create_nix_tree": { - "action": { - "create_directories": [ - { - "action": { - "path": "/nix/var", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix/drvs", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/db", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/temproots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/userpool", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/daemon-socket", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "move_unpacked_nix": { - "action": { - "src": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" + "create_synthetic_objects": { + "action": null, + "state": "Uncompleted" }, - { - "action": { - "action": "configure_nix", - "setup_default_profile": { - "action": { - "channels": [ - "nixpkgs" - ] - }, - "state": "Uncompleted" - }, - "configure_shell_profile": { - "action": { - "create_directories": [], - "create_or_append_files": [ - { - "action": { - "path": "/etc/bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/zshrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/bash.bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "place_channel_configuration": { - "action": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "create_file": { - "action": { - "path": "/Users/ephemeraladmin/.nix-channels", - "user": null, - "group": null, - "mode": 436, - "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "place_nix_configuration": { - "action": { - "create_directory": { - "action": { - "path": "/etc/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - "create_file": { - "action": { - "path": "/etc/nix/nix.conf", - "user": null, - "group": null, - "mode": 436, - "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "configure_nix_daemon_service": { - "action": {}, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" + "unmount_volume": { + "action": { + "disk": "disk3", + "name": "Nix Store" + }, + "state": "Uncompleted" }, - { - "action": { - "action": "kickstart_launchctl_service", - "unit": "system/org.nixos.nix-daemon" - }, - "state": "Uncompleted" + "create_volume": { + "action": { + "disk": "disk3", + "name": "Nix Store", + "case_sensitive": false + }, + "state": "Uncompleted" + }, + "create_or_append_fstab": { + "action": { + "path": "/etc/fstab", + "user": null, + "group": null, + "mode": 429, + "buf": "NAME=\"Nix Store\" /nix apfs rw,noauto,nobrowse,suid,owners", + "position": "End" + }, + "state": "Uncompleted" + }, + "encrypt_volume": { + "action": { + "disk": "disk3", + "name": "Nix Store" + }, + "state": "Uncompleted" + }, + "setup_volume_daemon": { + "action": { + "path": "/Library/LaunchDaemons/org.nixos.darwin-store.plist", + "user": null, + "group": null, + "mode": null, + "buf": "\n\n\n\nRunAtLoad\n\nLabel\norg.nixos.darwin-store\nProgramArguments\n\n/bin/sh\n\n-c\n\n/usr/bin/security find-generic-password -s \"Nix Store\" -w | /usr/sbin/diskutil apfs unlockVolume \"Nix Store\" -mountpoint /nix -stdinpassphrase\n\n\n\n", + "force": false + }, + "state": "Uncompleted" + }, + "bootstrap_volume": { + "action": { + "path": "/Library/LaunchDaemons/org.nixos.darwin-store.plist" + }, + "state": "Uncompleted" + }, + "enable_ownership": { + "action": { + "path": "/nix" + }, + "state": "Uncompleted" } - ], - "planner": { - "planner": "darwin-multi", - "settings": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "modify_profile": true, + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "provision_nix", + "fetch_nix": { + "action": { + "url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-aarch64-darwin.tar.xz", + "dest": "/nix/temp-install-dir" + }, + "state": "Uncompleted" + }, + "create_users_and_group": { + "action": { "daemon_user_count": 32, "nix_build_group_name": "nixbld", "nix_build_group_id": 3000, "nix_build_user_prefix": "_nixbld", "nix_build_user_id_base": 300, - "nix_package_url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-darwin.tar.xz", - "extra_conf": [], - "force": false + "create_group": { + "action": { + "name": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + "create_users": [ + { + "action": { + "name": "_nixbld0", + "uid": 300, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld1", + "uid": 301, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld2", + "uid": 302, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld3", + "uid": 303, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld4", + "uid": 304, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld5", + "uid": 305, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld6", + "uid": 306, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld7", + "uid": 307, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld8", + "uid": 308, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld9", + "uid": 309, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld10", + "uid": 310, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld11", + "uid": 311, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld12", + "uid": 312, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld13", + "uid": 313, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld14", + "uid": 314, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld15", + "uid": 315, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld16", + "uid": 316, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld17", + "uid": 317, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld18", + "uid": 318, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld19", + "uid": 319, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld20", + "uid": 320, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld21", + "uid": 321, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld22", + "uid": 322, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld23", + "uid": 323, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld24", + "uid": 324, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld25", + "uid": 325, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld26", + "uid": 326, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld27", + "uid": 327, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld28", + "uid": 328, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld29", + "uid": 329, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld30", + "uid": 330, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "_nixbld31", + "uid": 331, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" }, - "encrypt": null, - "case_sensitive": false, - "volume_label": "Nix Store", - "root_disk": "disk1" + "create_nix_tree": { + "action": { + "create_directories": [ + { + "action": { + "path": "/nix/var", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix/drvs", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/db", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/temproots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/userpool", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/daemon-socket", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "move_unpacked_nix": { + "action": { + "src": "/nix/temp-install-dir" + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "configure_nix", + "setup_default_profile": { + "action": { + "channels": [ + "nixpkgs" + ] + }, + "state": "Uncompleted" + }, + "configure_shell_profile": { + "action": { + "create_directories": [], + "create_or_insert_into_files": [ + { + "action": { + "path": "/etc/bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/zshenv", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/bash.bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "place_channel_configuration": { + "action": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "create_file": { + "action": { + "path": "/Users/ephemeraladmin/.nix-channels", + "user": null, + "group": null, + "mode": 436, + "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "place_nix_configuration": { + "action": { + "create_directory": { + "action": { + "path": "/etc/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + "create_file": { + "action": { + "path": "/etc/nix/nix.conf", + "user": null, + "group": null, + "mode": 436, + "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "configure_nix_daemon_service": { + "action": {}, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "kickstart_launchctl_service", + "unit": "system/org.nixos.nix-daemon" + }, + "state": "Uncompleted" } + ], + "planner": { + "planner": "darwin-multi", + "settings": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "modify_profile": true, + "daemon_user_count": 32, + "nix_build_group_name": "nixbld", + "nix_build_group_id": 3000, + "nix_build_user_prefix": "_nixbld", + "nix_build_user_id_base": 300, + "nix_package_url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-aarch64-darwin.tar.xz", + "extra_conf": [], + "force": false + }, + "encrypt": null, + "case_sensitive": false, + "volume_label": "Nix Store", + "root_disk": "disk3" + } } \ No newline at end of file diff --git a/tests/fixtures/linux/linux-multi.json b/tests/fixtures/linux/linux-multi.json index 6f11708..eb1fa09 100644 --- a/tests/fixtures/linux/linux-multi.json +++ b/tests/fixtures/linux/linux-multi.json @@ -1,620 +1,617 @@ { - "version": "0.0.0-unreleased", - "actions": [ - { - "action": { - "action": "create_directory", - "path": "/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": true - }, - "state": "Uncompleted" + "version": "0.0.0-unreleased", + "actions": [ + { + "action": { + "action": "create_directory", + "path": "/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": true + }, + "state": "Skipped" + }, + { + "action": { + "action": "provision_nix", + "fetch_nix": { + "action": { + "url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-x86_64-linux.tar.xz", + "dest": "/nix/temp-install-dir" + }, + "state": "Uncompleted" }, - { - "action": { - "action": "provision_nix", - "fetch_nix": { - "action": { - "url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-linux.tar.xz", - "dest": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - }, - "create_users_and_group": { - "action": { - "daemon_user_count": 32, - "nix_build_group_name": "nixbld", - "nix_build_group_id": 3000, - "nix_build_user_prefix": "nixbld", - "nix_build_user_id_base": 3000, - "create_group": { - "action": { - "name": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - "create_users": [ - { - "action": { - "name": "nixbld0", - "uid": 3000, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld1", - "uid": 3001, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld2", - "uid": 3002, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld3", - "uid": 3003, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld4", - "uid": 3004, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld5", - "uid": 3005, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld6", - "uid": 3006, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld7", - "uid": 3007, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld8", - "uid": 3008, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld9", - "uid": 3009, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld10", - "uid": 3010, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld11", - "uid": 3011, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld12", - "uid": 3012, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld13", - "uid": 3013, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld14", - "uid": 3014, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld15", - "uid": 3015, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld16", - "uid": 3016, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld17", - "uid": 3017, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld18", - "uid": 3018, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld19", - "uid": 3019, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld20", - "uid": 3020, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld21", - "uid": 3021, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld22", - "uid": 3022, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld23", - "uid": 3023, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld24", - "uid": 3024, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld25", - "uid": 3025, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld26", - "uid": 3026, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld27", - "uid": 3027, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld28", - "uid": 3028, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld29", - "uid": 3029, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld30", - "uid": 3030, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld31", - "uid": 3031, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "create_nix_tree": { - "action": { - "create_directories": [ - { - "action": { - "path": "/nix/var", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix/drvs", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/db", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/temproots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/userpool", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/daemon-socket", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "move_unpacked_nix": { - "action": { - "src": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "configure_nix", - "setup_default_profile": { - "action": { - "channels": [ - "nixpkgs" - ] - }, - "state": "Uncompleted" - }, - "configure_shell_profile": { - "action": { - "create_directories": [], - "create_or_append_files": [ - { - "action": { - "path": "/etc/bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/profile.d/nix.sh", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/zshrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/bash.bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "place_channel_configuration": { - "action": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "create_file": { - "action": { - "path": "/root/.nix-channels", - "user": null, - "group": null, - "mode": 436, - "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "place_nix_configuration": { - "action": { - "create_directory": { - "action": { - "path": "/etc/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - "create_file": { - "action": { - "path": "/etc/nix/nix.conf", - "user": null, - "group": null, - "mode": 436, - "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "configure_nix_daemon_service": { - "action": {}, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "start_systemd_unit", - "unit": "nix-daemon.socket" - }, - "state": "Uncompleted" - } - ], - "planner": { - "planner": "linux-multi", - "settings": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "modify_profile": true, + "create_users_and_group": { + "action": { "daemon_user_count": 32, "nix_build_group_name": "nixbld", "nix_build_group_id": 3000, "nix_build_user_prefix": "nixbld", "nix_build_user_id_base": 3000, - "nix_package_url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-linux.tar.xz", - "extra_conf": [], - "force": false + "create_group": { + "action": { + "name": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + "create_users": [ + { + "action": { + "name": "nixbld0", + "uid": 3000, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld1", + "uid": 3001, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld2", + "uid": 3002, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld3", + "uid": 3003, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld4", + "uid": 3004, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld5", + "uid": 3005, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld6", + "uid": 3006, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld7", + "uid": 3007, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld8", + "uid": 3008, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld9", + "uid": 3009, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld10", + "uid": 3010, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld11", + "uid": 3011, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld12", + "uid": 3012, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld13", + "uid": 3013, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld14", + "uid": 3014, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld15", + "uid": 3015, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld16", + "uid": 3016, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld17", + "uid": 3017, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld18", + "uid": 3018, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld19", + "uid": 3019, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld20", + "uid": 3020, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld21", + "uid": 3021, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld22", + "uid": 3022, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld23", + "uid": 3023, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld24", + "uid": 3024, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld25", + "uid": 3025, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld26", + "uid": 3026, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld27", + "uid": 3027, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld28", + "uid": 3028, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld29", + "uid": 3029, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld30", + "uid": 3030, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld31", + "uid": 3031, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "create_nix_tree": { + "action": { + "create_directories": [ + { + "action": { + "path": "/nix/var", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix/drvs", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/db", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/temproots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/userpool", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/daemon-socket", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "move_unpacked_nix": { + "action": { + "src": "/nix/temp-install-dir" + }, + "state": "Uncompleted" } + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "configure_nix", + "setup_default_profile": { + "action": { + "channels": [ + "nixpkgs" + ] + }, + "state": "Uncompleted" + }, + "configure_shell_profile": { + "action": { + "create_directories": [], + "create_or_insert_into_files": [ + { + "action": { + "path": "/etc/bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/profile.d/nix.sh", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/zshenv", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/bash.bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "place_channel_configuration": { + "action": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "create_file": { + "action": { + "path": "/root/.nix-channels", + "user": null, + "group": null, + "mode": 436, + "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "place_nix_configuration": { + "action": { + "create_directory": { + "action": { + "path": "/etc/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + "create_file": { + "action": { + "path": "/etc/nix/nix.conf", + "user": null, + "group": null, + "mode": 436, + "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "configure_nix_daemon_service": { + "action": {}, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" } + ], + "planner": { + "planner": "linux-multi", + "settings": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "modify_profile": true, + "daemon_user_count": 32, + "nix_build_group_name": "nixbld", + "nix_build_group_id": 3000, + "nix_build_user_prefix": "nixbld", + "nix_build_user_id_base": 3000, + "nix_package_url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-x86_64-linux.tar.xz", + "extra_conf": [], + "force": false + } + } } \ No newline at end of file diff --git a/tests/fixtures/linux/steam-deck.json b/tests/fixtures/linux/steam-deck.json index db94592..cee65ca 100644 --- a/tests/fixtures/linux/steam-deck.json +++ b/tests/fixtures/linux/steam-deck.json @@ -1,664 +1,661 @@ { - "version": "0.0.0-unreleased", - "actions": [ - { - "action": { - "action": "create_directory", - "path": "/home/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": true - }, - "state": "Uncompleted" + "version": "0.0.0-unreleased", + "actions": [ + { + "action": { + "action": "create_directory", + "path": "/home/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": true + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "create_file", + "path": "/etc/systemd/system/nix-directory.service", + "user": null, + "group": null, + "mode": 420, + "buf": "[Unit]\nDescription=Create a `/nix` directory to be used for bind mounting\nPropagatesStopTo=nix-daemon.service\nPropagatesStopTo=nix.mount\nDefaultDependencies=no\nAfter=grub-recordfail.service\nAfter=steamos-finish-oobe-migration.service\n\n[Service]\nType=oneshot\nExecStart=steamos-readonly disable\nExecStart=mkdir -vp /nix\nExecStart=chmod -v 0755 /nix\nExecStart=chown -v root /nix\nExecStart=chgrp -v root /nix\nExecStart=steamos-readonly enable\nExecStop=steamos-readonly disable\nExecStop=rmdir /nix\nExecStop=steamos-readonly enable\nRemainAfterExit=true\n", + "force": false + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "create_file", + "path": "/etc/systemd/system/nix.mount", + "user": null, + "group": null, + "mode": 420, + "buf": "[Unit]\nDescription=Mount `/home/nix` on `/nix`\nPropagatesStopTo=nix-daemon.service\nPropagatesStopTo=nix-directory.service\nAfter=nix-directory.service\nRequires=nix-directory.service\nConditionPathIsDirectory=/nix\nDefaultDependencies=no\n\n[Mount]\nWhat=/home/nix\nWhere=/nix\nType=none\nDirectoryMode=0755\nOptions=bind\n", + "force": false + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "create_file", + "path": "/etc/systemd/system/ensure-symlinked-units-resolve.service", + "user": null, + "group": null, + "mode": 420, + "buf": "[Unit]\nDescription=Ensure Nix related units which are symlinked resolve\nAfter=nix.mount\nRequires=nix-directory.service\nRequires=nix.mount\nPropagatesStopTo=nix-directory.service\nPropagatesStopTo=nix.mount\nDefaultDependencies=no\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=/usr/bin/systemctl daemon-reload\nExecStart=/usr/bin/systemctl restart --no-block sockets.target timers.target multi-user.target\n\n[Install]\nWantedBy=sysinit.target\n", + "force": false + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "start_systemd_unit", + "unit": "ensure-symlinked-units-resolve.service" + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "provision_nix", + "fetch_nix": { + "action": { + "url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-x86_64-linux.tar.xz", + "dest": "/nix/temp-install-dir" + }, + "state": "Uncompleted" }, - { - "action": { - "action": "create_file", - "path": "/etc/systemd/system/nix-directory.service", - "user": null, - "group": null, - "mode": 420, - "buf": "\n [Unit]\nDescription=Create a `/nix` directory to be used for bind mounting\nPropagatesStopTo=nix-daemon.service\nPropagatesStopTo=nix.mount\nDefaultDependencies=no\n\n[Service]\nType=oneshot\nExecCondition=sh -c \"if [ -d /nix ]; then exit 1; else exit 0; fi\"\n ExecStart=steamos-readonly disable\nExecStart=mkdir -vp /nix\nExecStart=chmod -v 0755 /nix\nExecStart=chown -v root /nix\nExecStart=chgrp -v root /nix\nExecStart=steamos-readonly enable\nExecStop=steamos-readonly disable\nExecStop=rmdir /nix\nExecStop=steamos-readonly enable\nRemainAfterExit=true\n", - "force": false - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "create_file", - "path": "/etc/systemd/system/nix.mount", - "user": null, - "group": null, - "mode": 420, - "buf": "[Unit]\nDescription=Mount `/home/nix` on `/nix`\nPropagatesStopTo=nix-daemon.service\nPropagatesStopTo=nix-directory.service\nAfter=nix-directory.service\nRequires=nix-directory.service\nConditionPathIsDirectory=/nix\nDefaultDependencies=no\n\n[Mount]\nWhat=/home/nix\nWhere=/nix\nType=none\nDirectoryMode=0755\nOptions=bind\n", - "force": false - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "create_file", - "path": "/etc/systemd/system/ensure-symlinked-units-resolve.service", - "user": null, - "group": null, - "mode": 420, - "buf": "[Unit]\nDescription=Ensure Nix related units which are symlinked resolve\nAfter=nix.mount\nRequires=nix-directory.service\nRequires=nix.mount\nPropagatesStopTo=nix-directory.service\nPropagatesStopTo=nix.mount\nDefaultDependencies=no\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=/usr/bin/systemctl daemon-reload\nExecStart=/usr/bin/systemctl restart --no-block sockets.target timers.target multi-user.target\n\n[Install]\nWantedBy=sysinit.target\n", - "force": false - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "start_systemd_unit", - "unit": "ensure-symlinked-units-resolve.service" - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "provision_nix", - "fetch_nix": { - "action": { - "url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-linux.tar.xz", - "dest": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - }, - "create_users_and_group": { - "action": { - "daemon_user_count": 32, - "nix_build_group_name": "nixbld", - "nix_build_group_id": 3000, - "nix_build_user_prefix": "nixbld", - "nix_build_user_id_base": 3000, - "create_group": { - "action": { - "name": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - "create_users": [ - { - "action": { - "name": "nixbld0", - "uid": 3000, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld1", - "uid": 3001, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld2", - "uid": 3002, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld3", - "uid": 3003, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld4", - "uid": 3004, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld5", - "uid": 3005, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld6", - "uid": 3006, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld7", - "uid": 3007, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld8", - "uid": 3008, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld9", - "uid": 3009, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld10", - "uid": 3010, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld11", - "uid": 3011, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld12", - "uid": 3012, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld13", - "uid": 3013, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld14", - "uid": 3014, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld15", - "uid": 3015, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld16", - "uid": 3016, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld17", - "uid": 3017, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld18", - "uid": 3018, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld19", - "uid": 3019, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld20", - "uid": 3020, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld21", - "uid": 3021, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld22", - "uid": 3022, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld23", - "uid": 3023, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld24", - "uid": 3024, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld25", - "uid": 3025, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld26", - "uid": 3026, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld27", - "uid": 3027, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld28", - "uid": 3028, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld29", - "uid": 3029, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld30", - "uid": 3030, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - }, - { - "action": { - "name": "nixbld31", - "uid": 3031, - "groupname": "nixbld", - "gid": 3000 - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "create_nix_tree": { - "action": { - "create_directories": [ - { - "action": { - "path": "/nix/var", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/log/nix/drvs", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/db", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/gcroots/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/profiles/per-user", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/temproots", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/userpool", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/nix/var/nix/daemon-socket", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "move_unpacked_nix": { - "action": { - "src": "/nix/temp-install-dir" - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "configure_nix", - "setup_default_profile": { - "action": { - "channels": [ - "nixpkgs" - ] - }, - "state": "Uncompleted" - }, - "configure_shell_profile": { - "action": { - "create_directories": [], - "create_or_append_files": [ - { - "action": { - "path": "/etc/bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/profile.d/nix.sh", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/zshrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - }, - { - "action": { - "path": "/etc/bash.bashrc", - "user": null, - "group": null, - "mode": 493, - "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n" - }, - "state": "Uncompleted" - } - ] - }, - "state": "Uncompleted" - }, - "place_channel_configuration": { - "action": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "create_file": { - "action": { - "path": "/root/.nix-channels", - "user": null, - "group": null, - "mode": 436, - "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "place_nix_configuration": { - "action": { - "create_directory": { - "action": { - "path": "/etc/nix", - "user": null, - "group": null, - "mode": 493, - "force_prune_on_revert": false - }, - "state": "Uncompleted" - }, - "create_file": { - "action": { - "path": "/etc/nix/nix.conf", - "user": null, - "group": null, - "mode": 436, - "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", - "force": false - }, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - "configure_nix_daemon_service": { - "action": {}, - "state": "Uncompleted" - } - }, - "state": "Uncompleted" - }, - { - "action": { - "action": "start_systemd_unit", - "unit": "nix-daemon.socket" - }, - "state": "Uncompleted" - } - ], - "planner": { - "planner": "steam-deck", - "persistence": "/home/nix", - "settings": { - "channels": [ - [ - "nixpkgs", - "https://nixos.org/channels/nixpkgs-unstable" - ] - ], - "modify_profile": true, + "create_users_and_group": { + "action": { "daemon_user_count": 32, "nix_build_group_name": "nixbld", "nix_build_group_id": 3000, "nix_build_user_prefix": "nixbld", "nix_build_user_id_base": 3000, - "nix_package_url": "https://releases.nixos.org/nix/nix-2.11.1/nix-2.11.1-x86_64-linux.tar.xz", - "extra_conf": [], - "force": false + "create_group": { + "action": { + "name": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + "create_users": [ + { + "action": { + "name": "nixbld0", + "uid": 3000, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld1", + "uid": 3001, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld2", + "uid": 3002, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld3", + "uid": 3003, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld4", + "uid": 3004, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld5", + "uid": 3005, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld6", + "uid": 3006, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld7", + "uid": 3007, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld8", + "uid": 3008, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld9", + "uid": 3009, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld10", + "uid": 3010, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld11", + "uid": 3011, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld12", + "uid": 3012, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld13", + "uid": 3013, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld14", + "uid": 3014, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld15", + "uid": 3015, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld16", + "uid": 3016, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld17", + "uid": 3017, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld18", + "uid": 3018, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld19", + "uid": 3019, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld20", + "uid": 3020, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld21", + "uid": 3021, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld22", + "uid": 3022, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld23", + "uid": 3023, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld24", + "uid": 3024, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld25", + "uid": 3025, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld26", + "uid": 3026, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld27", + "uid": 3027, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld28", + "uid": 3028, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld29", + "uid": 3029, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld30", + "uid": 3030, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + }, + { + "action": { + "name": "nixbld31", + "uid": 3031, + "groupname": "nixbld", + "gid": 3000 + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "create_nix_tree": { + "action": { + "create_directories": [ + { + "action": { + "path": "/nix/var", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/log/nix/drvs", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/db", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/gcroots/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/profiles/per-user", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/temproots", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/userpool", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/nix/var/nix/daemon-socket", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "move_unpacked_nix": { + "action": { + "src": "/nix/temp-install-dir" + }, + "state": "Uncompleted" } + }, + "state": "Uncompleted" + }, + { + "action": { + "action": "configure_nix", + "setup_default_profile": { + "action": { + "channels": [ + "nixpkgs" + ] + }, + "state": "Uncompleted" + }, + "configure_shell_profile": { + "action": { + "create_directories": [], + "create_or_insert_into_files": [ + { + "action": { + "path": "/etc/bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/profile.d/nix.sh", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/zshenv", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + }, + { + "action": { + "path": "/etc/bash.bashrc", + "user": null, + "group": null, + "mode": 493, + "buf": "\n# Nix\nif [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then\n . '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'\nfi\n# End Nix\n\n \n", + "position": "Beginning" + }, + "state": "Uncompleted" + } + ] + }, + "state": "Uncompleted" + }, + "place_channel_configuration": { + "action": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "create_file": { + "action": { + "path": "/root/.nix-channels", + "user": null, + "group": null, + "mode": 436, + "buf": "https://nixos.org/channels/nixpkgs-unstable nixpkgs", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "place_nix_configuration": { + "action": { + "create_directory": { + "action": { + "path": "/etc/nix", + "user": null, + "group": null, + "mode": 493, + "force_prune_on_revert": false + }, + "state": "Uncompleted" + }, + "create_file": { + "action": { + "path": "/etc/nix/nix.conf", + "user": null, + "group": null, + "mode": 436, + "buf": "\n\nbuild-users-group = nixbld\n\nexperimental-features = nix-command flakes\n\nauto-optimise-store = true\n", + "force": false + }, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" + }, + "configure_nix_daemon_service": { + "action": {}, + "state": "Uncompleted" + } + }, + "state": "Uncompleted" } + ], + "planner": { + "planner": "steam-deck", + "persistence": "/home/nix", + "settings": { + "channels": [ + [ + "nixpkgs", + "https://nixos.org/channels/nixpkgs-unstable" + ] + ], + "modify_profile": true, + "daemon_user_count": 32, + "nix_build_group_name": "nixbld", + "nix_build_group_id": 3000, + "nix_build_user_prefix": "nixbld", + "nix_build_user_id_base": 3000, + "nix_package_url": "https://releases.nixos.org/nix/nix-2.12.0/nix-2.12.0-x86_64-linux.tar.xz", + "extra_conf": [], + "force": false + } + } } \ No newline at end of file