diff --git a/Cargo.lock b/Cargo.lock index 8a2b6e4116..cc594b6356 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1791,6 +1791,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" +[[package]] +name = "is-root" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04a4202a60e86f1c9702706bb42270dadd333f2db7810157563c86f17af3c873" +dependencies = [ + "users 0.10.0", + "winapi 0.3.9", +] + [[package]] name = "is_ci" version = "1.1.1" @@ -2560,6 +2570,7 @@ dependencies = [ "htmlescape", "ical", "indexmap", + "is-root", "itertools", "lazy_static", "log", @@ -2614,7 +2625,7 @@ dependencies = [ "umask", "unicode-segmentation", "url", - "users", + "users 0.11.0", "uuid", "wax", "which", @@ -4973,6 +4984,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "users" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4227e95324a443c9fcb06e03d4d85e91aabe9a5a02aa818688b6918b6af486" +dependencies = [ + "libc", + "log", +] + [[package]] name = "users" version = "0.11.0" diff --git a/crates/nu-command/Cargo.toml b/crates/nu-command/Cargo.toml index a09961d2c9..2b347f8816 100644 --- a/crates/nu-command/Cargo.toml +++ b/crates/nu-command/Cargo.toml @@ -47,6 +47,7 @@ htmlescape = "0.3.1" ical = "0.7.0" indexmap = { version="1.7", features=["serde-1"] } Inflector = "0.11" +is-root = "0.1.2" itertools = "0.10.0" lazy_static = "1.4.0" log = "0.4.14" diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index 4877a801d5..3662f7e256 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -382,6 +382,7 @@ pub fn create_default_context(cwd: impl AsRef) -> EngineState { // Experimental bind_command! { ViewSource, + IsAdmin, }; // Deprecated diff --git a/crates/nu-command/src/experimental/is_admin.rs b/crates/nu-command/src/experimental/is_admin.rs new file mode 100644 index 0000000000..d397ac35f8 --- /dev/null +++ b/crates/nu-command/src/experimental/is_admin.rs @@ -0,0 +1,48 @@ +use is_root::is_root; +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{Category, Example, IntoPipelineData, PipelineData, Signature, Span, Value}; + +#[derive(Clone)] +pub struct IsAdmin; + +impl Command for IsAdmin { + fn name(&self) -> &str { + "is-admin" + } + + fn usage(&self) -> &str { + "Check if nushell is running with administrator or root privileges" + } + + fn signature(&self) -> nu_protocol::Signature { + Signature::build("is-admin").category(Category::Core) + } + + fn run( + &self, + _engine_state: &EngineState, + _stack: &mut Stack, + call: &Call, + _input: PipelineData, + ) -> Result { + Ok(Value::Bool { + val: is_root(), + span: call.head, + } + .into_pipeline_data()) + } + + fn examples(&self) -> Vec { + vec![ + Example { + description: "Echo 'iamroot' if nushell is running with admin/root privileges, and 'iamnotroot' if not.", + example: r#"if is-admin { echo "iamroot" } else { echo "iamnotroot" }"#, + result: Some(Value::String { + val: "iamnotroot".to_string(), + span: Span::test_data(), + }), + }, + ] + } +} diff --git a/crates/nu-command/src/experimental/mod.rs b/crates/nu-command/src/experimental/mod.rs index 506c7e873b..b912a315a2 100644 --- a/crates/nu-command/src/experimental/mod.rs +++ b/crates/nu-command/src/experimental/mod.rs @@ -1,3 +1,5 @@ +mod is_admin; mod view_source; +pub use is_admin::IsAdmin; pub use view_source::ViewSource;