Hammer out a bunch of Mac support
This commit is contained in:
parent
fcc200b9d0
commit
c75a4ed511
36
Cargo.lock
generated
36
Cargo.lock
generated
|
@ -754,6 +754,7 @@ dependencies = [
|
||||||
"glob",
|
"glob",
|
||||||
"nix",
|
"nix",
|
||||||
"owo-colors",
|
"owo-colors",
|
||||||
|
"plist",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
@ -1007,6 +1008,15 @@ version = "0.2.132"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
|
checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "line-wrap"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9"
|
||||||
|
dependencies = [
|
||||||
|
"safemem",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "link-cplusplus"
|
name = "link-cplusplus"
|
||||||
version = "1.0.7"
|
version = "1.0.7"
|
||||||
|
@ -1248,6 +1258,20 @@ version = "0.3.25"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
|
checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "plist"
|
||||||
|
version = "1.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225"
|
||||||
|
dependencies = [
|
||||||
|
"base64",
|
||||||
|
"indexmap",
|
||||||
|
"line-wrap",
|
||||||
|
"serde",
|
||||||
|
"time",
|
||||||
|
"xml-rs",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "polling"
|
name = "polling"
|
||||||
version = "2.3.0"
|
version = "2.3.0"
|
||||||
|
@ -1477,6 +1501,12 @@ version = "1.0.11"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "safemem"
|
||||||
|
version = "0.3.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "same-file"
|
name = "same-file"
|
||||||
version = "1.0.6"
|
version = "1.0.6"
|
||||||
|
@ -2306,6 +2336,12 @@ dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "xml-rs"
|
||||||
|
version = "0.8.4"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "xz2"
|
name = "xz2"
|
||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
|
|
|
@ -38,3 +38,4 @@ walkdir = "2.3.2"
|
||||||
sxd-xpath = "0.4.2"
|
sxd-xpath = "0.4.2"
|
||||||
xz2 = { version = "0.1.7", features = ["static", "tokio"] }
|
xz2 = { version = "0.1.7", features = ["static", "tokio"] }
|
||||||
sxd-document = "0.3.2"
|
sxd-document = "0.3.2"
|
||||||
|
plist = "1.3.1"
|
||||||
|
|
|
@ -62,12 +62,13 @@ impl Actionable for CreateGroup {
|
||||||
tracing::debug!("Creating group");
|
tracing::debug!("Creating group");
|
||||||
|
|
||||||
use target_lexicon::OperatingSystem;
|
use target_lexicon::OperatingSystem;
|
||||||
match target_lexicon::HOST.operating_system {
|
match target_lexicon::OperatingSystem::host() {
|
||||||
OperatingSystem::MacOSX {
|
OperatingSystem::MacOSX {
|
||||||
major: _,
|
major: _,
|
||||||
minor: _,
|
minor: _,
|
||||||
patch: _,
|
patch: _,
|
||||||
} => {
|
}
|
||||||
|
| OperatingSystem::Darwin => {
|
||||||
execute_command(Command::new("/usr/sbin/dseditgroup").args([
|
execute_command(Command::new("/usr/sbin/dseditgroup").args([
|
||||||
"-o",
|
"-o",
|
||||||
"create",
|
"create",
|
||||||
|
@ -131,9 +132,24 @@ impl Actionable for CreateGroup {
|
||||||
}
|
}
|
||||||
tracing::debug!("Deleting group");
|
tracing::debug!("Deleting group");
|
||||||
|
|
||||||
execute_command(Command::new("groupdel").arg(&name))
|
use target_lexicon::OperatingSystem;
|
||||||
.await
|
match target_lexicon::OperatingSystem::host() {
|
||||||
.map_err(CreateGroupError::Command)?;
|
OperatingSystem::MacOSX {
|
||||||
|
major: _,
|
||||||
|
minor: _,
|
||||||
|
patch: _,
|
||||||
|
}
|
||||||
|
| OperatingSystem::Darwin => {
|
||||||
|
execute_command(Command::new("groupdel").arg(&name))
|
||||||
|
.await
|
||||||
|
.map_err(CreateGroupError::Command)?;
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
execute_command(Command::new("userdel").args([&name.to_string()]))
|
||||||
|
.await
|
||||||
|
.map_err(Self::Error::Command)?;
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
tracing::trace!("Deleted group");
|
tracing::trace!("Deleted group");
|
||||||
*action_state = ActionState::Uncompleted;
|
*action_state = ActionState::Uncompleted;
|
||||||
|
|
|
@ -68,12 +68,13 @@ impl Actionable for CreateUser {
|
||||||
tracing::debug!("Creating user");
|
tracing::debug!("Creating user");
|
||||||
|
|
||||||
use target_lexicon::OperatingSystem;
|
use target_lexicon::OperatingSystem;
|
||||||
match target_lexicon::HOST.operating_system {
|
match target_lexicon::OperatingSystem::host() {
|
||||||
OperatingSystem::MacOSX {
|
OperatingSystem::MacOSX {
|
||||||
major: _,
|
major: _,
|
||||||
minor: _,
|
minor: _,
|
||||||
patch: _,
|
patch: _,
|
||||||
} => {
|
}
|
||||||
|
| OperatingSystem::Darwin => {
|
||||||
execute_command(Command::new("/usr/bin/dscl").args([
|
execute_command(Command::new("/usr/bin/dscl").args([
|
||||||
".",
|
".",
|
||||||
"create",
|
"create",
|
||||||
|
@ -155,12 +156,13 @@ impl Actionable for CreateUser {
|
||||||
tracing::debug!("Deleting user");
|
tracing::debug!("Deleting user");
|
||||||
|
|
||||||
use target_lexicon::OperatingSystem;
|
use target_lexicon::OperatingSystem;
|
||||||
match target_lexicon::HOST.operating_system {
|
match target_lexicon::OperatingSystem::host() {
|
||||||
OperatingSystem::MacOSX {
|
OperatingSystem::MacOSX {
|
||||||
major: _,
|
major: _,
|
||||||
minor: _,
|
minor: _,
|
||||||
patch: _,
|
patch: _,
|
||||||
} => {
|
}
|
||||||
|
| OperatingSystem::Darwin => {
|
||||||
todo!()
|
todo!()
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
use std::io::Cursor;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
|
@ -6,6 +7,7 @@ use tokio::process::Command;
|
||||||
use crate::execute_command;
|
use crate::execute_command;
|
||||||
|
|
||||||
use crate::actions::{Action, ActionDescription, ActionState, Actionable};
|
use crate::actions::{Action, ActionDescription, ActionState, Actionable};
|
||||||
|
use crate::os::darwin::DiskUtilOutput;
|
||||||
|
|
||||||
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
|
#[derive(Debug, serde::Deserialize, serde::Serialize, Clone)]
|
||||||
pub struct EnableOwnership {
|
pub struct EnableOwnership {
|
||||||
|
@ -58,17 +60,9 @@ impl Actionable for EnableOwnership {
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.stdout;
|
.stdout;
|
||||||
let package = sxd_document::parser::parse(&String::from_utf8(buf).unwrap()).unwrap();
|
let the_plist: DiskUtilOutput = plist::from_reader(Cursor::new(buf)).unwrap();
|
||||||
|
|
||||||
match sxd_xpath::evaluate_xpath(
|
the_plist.global_permissions_enabled
|
||||||
&package.as_document(),
|
|
||||||
"(/plist/dict/key[text()='GlobalPermissionsEnabled'])/following-sibling::*[1]",
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
{
|
|
||||||
sxd_xpath::Value::Boolean(bool) => bool,
|
|
||||||
_ => panic!("At the other disk i/o!!!"),
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if should_enable_ownership {
|
if should_enable_ownership {
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
mod actions;
|
mod actions;
|
||||||
mod error;
|
mod error;
|
||||||
|
mod os;
|
||||||
mod plan;
|
mod plan;
|
||||||
mod planner;
|
mod planner;
|
||||||
mod settings;
|
mod settings;
|
||||||
|
|
6
src/os/darwin.rs
Normal file
6
src/os/darwin.rs
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
#[derive(serde::Deserialize)]
|
||||||
|
#[serde(rename_all = "PascalCase")]
|
||||||
|
pub struct DiskUtilOutput {
|
||||||
|
pub parent_whole_disk: String,
|
||||||
|
pub global_permissions_enabled: bool,
|
||||||
|
}
|
1
src/os/mod.rs
Normal file
1
src/os/mod.rs
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pub mod darwin;
|
|
@ -1,3 +1,5 @@
|
||||||
|
use std::io::Cursor;
|
||||||
|
|
||||||
use tokio::process::Command;
|
use tokio::process::Command;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -6,6 +8,7 @@ use crate::{
|
||||||
Action, ActionError,
|
Action, ActionError,
|
||||||
},
|
},
|
||||||
execute_command,
|
execute_command,
|
||||||
|
os::darwin::DiskUtilOutput,
|
||||||
planner::{Plannable, PlannerError},
|
planner::{Plannable, PlannerError},
|
||||||
InstallPlan, Planner,
|
InstallPlan, Planner,
|
||||||
};
|
};
|
||||||
|
@ -22,23 +25,14 @@ impl Plannable for DarwinMultiUser {
|
||||||
settings: crate::InstallSettings,
|
settings: crate::InstallSettings,
|
||||||
) -> Result<crate::InstallPlan, crate::planner::PlannerError> {
|
) -> Result<crate::InstallPlan, crate::planner::PlannerError> {
|
||||||
let root_disk = {
|
let root_disk = {
|
||||||
let root_disk_buf =
|
let buf =
|
||||||
execute_command(Command::new("/usr/sbin/diskutil").args(["info", "-plist", "/"]))
|
execute_command(Command::new("/usr/sbin/diskutil").args(["info", "-plist", "/"]))
|
||||||
.await
|
.await
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.stdout;
|
.stdout;
|
||||||
let package =
|
let the_plist: DiskUtilOutput = plist::from_reader(Cursor::new(buf)).unwrap();
|
||||||
sxd_document::parser::parse(&String::from_utf8(root_disk_buf).unwrap()).unwrap();
|
|
||||||
|
|
||||||
match sxd_xpath::evaluate_xpath(
|
the_plist.parent_whole_disk
|
||||||
&package.as_document(),
|
|
||||||
"/plist/dict/key[text()='ParentWholeDisk']/following-sibling::string[1]/text()",
|
|
||||||
)
|
|
||||||
.unwrap()
|
|
||||||
{
|
|
||||||
sxd_xpath::Value::String(s) => s,
|
|
||||||
_ => panic!("At the disk i/o!!!"),
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let volume_label = "Nix Store".into();
|
let volume_label = "Nix Store".into();
|
||||||
|
|
|
@ -31,10 +31,12 @@ impl InstallSettings {
|
||||||
(Architecture::Aarch64(_), OperatingSystem::Linux) => {
|
(Architecture::Aarch64(_), OperatingSystem::Linux) => {
|
||||||
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-aarch64-linux.tar.xz";
|
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-aarch64-linux.tar.xz";
|
||||||
},
|
},
|
||||||
(Architecture::X86_64, OperatingSystem::MacOSX { .. }) => {
|
(Architecture::X86_64, OperatingSystem::MacOSX { .. })
|
||||||
|
| (Architecture::X86_64, OperatingSystem::Darwin) => {
|
||||||
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-x86_64-darwin.tar.xz";
|
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-x86_64-darwin.tar.xz";
|
||||||
},
|
},
|
||||||
(Architecture::Aarch64(_), OperatingSystem::MacOSX { .. }) => {
|
(Architecture::Aarch64(_), OperatingSystem::MacOSX { .. })
|
||||||
|
| (Architecture::Aarch64(_), OperatingSystem::Darwin) => {
|
||||||
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-aarch64-darwin.tar.xz";
|
url = "https://releases.nixos.org/nix/nix-2.11.0/nix-2.11.0-aarch64-darwin.tar.xz";
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
|
Loading…
Reference in a new issue