From d4ccc6eece163618d95cc806c596019ad1f6c94e Mon Sep 17 00:00:00 2001 From: Adrian Benavides Date: Wed, 22 Jan 2025 15:00:03 +0100 Subject: [PATCH 1/4] feat(rust): custom branding config allows you to specify which commands are included --- Cargo.lock | 26 ++--- .../rust/ockam/ockam_command/build.rs | 4 + .../rust/ockam/ockam_command/src/bin/brand.rs | 42 ++++++- .../ockam_command/src/bin/brand.sample.yaml | 4 + .../rust/ockam/ockam_command/src/branding.rs | 109 ++++++++++++++++++ .../rust/ockam/ockam_command/src/command.rs | 2 +- .../src/environment/compile_time_vars.rs | 5 + .../rust/ockam/ockam_command/src/lib.rs | 1 + .../rust/ockam/ockam_command/src/node/mod.rs | 15 +-- .../ockam/ockam_command/src/subcommand.rs | 76 ++++++++++-- 10 files changed, 244 insertions(+), 40 deletions(-) create mode 100644 implementations/rust/ockam/ockam_command/src/branding.rs diff --git a/Cargo.lock b/Cargo.lock index 39673399969..f6549ab713e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1509,9 +1509,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -1519,9 +1519,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -1541,9 +1541,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.18" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1608,7 +1608,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "117725a109d387c937a1533ce01b450cbde6b88abceea8473c4d7a85853cda3c" dependencies = [ "lazy_static", - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] @@ -2468,7 +2468,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -3899,7 +3899,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -5902,7 +5902,7 @@ dependencies = [ "once_cell", "socket2", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -6348,7 +6348,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7530,7 +7530,7 @@ dependencies = [ "getrandom", "once_cell", "rustix", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -8619,7 +8619,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/implementations/rust/ockam/ockam_command/build.rs b/implementations/rust/ockam/ockam_command/build.rs index 508c774faae..5981a37cd2c 100644 --- a/implementations/rust/ockam/ockam_command/build.rs +++ b/implementations/rust/ockam/ockam_command/build.rs @@ -29,6 +29,10 @@ fn binary_name() { println!("cargo:rustc-env=OCKAM_HOME={home_dir}"); println!("cargo:rerun-if-env-changed=OCKAM_HOME"); + let commands = env::var("OCKAM_COMMANDS").unwrap_or("".to_string()); + println!("cargo:rustc-env=OCKAM_COMMANDS={commands}"); + println!("cargo:rerun-if-env-changed=OCKAM_COMMANDS"); + let orchestrator_identifier = env::var("OCKAM_CONTROLLER_IDENTITY_ID").unwrap_or("".to_string()); println!("cargo:rustc-env=OCKAM_CONTROLLER_IDENTITY_ID={orchestrator_identifier}"); diff --git a/implementations/rust/ockam/ockam_command/src/bin/brand.rs b/implementations/rust/ockam/ockam_command/src/bin/brand.rs index 41c6a8eaed9..28a6507fc38 100644 --- a/implementations/rust/ockam/ockam_command/src/bin/brand.rs +++ b/implementations/rust/ockam/ockam_command/src/bin/brand.rs @@ -5,11 +5,11 @@ use ockam_api::fmt_log; use ockam_api::orchestrator::{OCKAM_CONTROLLER_ADDRESS, OCKAM_CONTROLLER_IDENTIFIER}; use ockam_api::terminal::PADDING; use ockam_command::{ - OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, OCKAM_COMMAND_SUPPORT_EMAIL, + OCKAM_COMMANDS, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, OCKAM_COMMAND_SUPPORT_EMAIL, }; use once_cell::sync::Lazy; use serde::{Deserialize, Serialize}; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::fmt::Display; use std::path::{Path, PathBuf}; @@ -70,6 +70,28 @@ fn build_binary(bin_name: &str, brand_settings: Brand) -> Result<()> { if let Some(orchestrator_address) = brand_settings.orchestrator_address { cmd.env(OCKAM_CONTROLLER_ADDRESS, orchestrator_address); } + if let Some(commands) = brand_settings.commands { + let process_command_name = |c: &str| { + // replace _ and - with space to support writing + // commands as "node create", "node-create" or "node_create + c.replace("_", " ").replace("-", " ") + }; + + // A comma separated list of commands in the format `command1=customName,command2,command3` + let env_value = commands + .iter() + .map(|c| match c { + Command::Simple(c) => process_command_name(c), + Command::Mapped(map) => map + .iter() + .map(|(k, v)| process_command_name(&format!("{}={}", k, v))) + .collect::>() + .join(","), + }) + .collect::>() + .join(","); + cmd.env(OCKAM_COMMANDS, env_value); + } if let Some(build_args) = brand_settings.build_args { cmd.args(build_args.split_whitespace()); } @@ -131,6 +153,7 @@ struct Brand { home_dir: Option, orchestrator_identifier: Option, orchestrator_address: Option, + commands: Option>, build_args: Option, } @@ -189,6 +212,13 @@ impl Display for Brand { } } +#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)] +#[serde(untagged)] +enum Command { + Simple(String), + Mapped(HashMap), +} + #[cfg(test)] mod tests { use super::*; @@ -202,6 +232,9 @@ mod tests { home_dir: /home/brand1 orchestrator_identifier: brand1 orchestrator_address: brand1.network + commands: + - node_list + - "node create": "init" bin2: support_email: bin2@support.io brand_name: Brand2 @@ -209,18 +242,21 @@ mod tests { let parsed: Config = serde_yaml::from_str(config).unwrap(); assert_eq!(parsed.items.len(), 2); assert_eq!(parsed.items["bin1"].brand_name.as_deref(), Some("Brand1")); - assert_eq!(parsed.items["bin2"].support_email, "bin2@support.io"); assert_eq!(parsed.items["bin2"].brand_name.as_deref(), Some("Brand2")); let mut processed = parsed.clone(); processed.process_defaults().unwrap(); + + // No defaults used, should be the same as parsed assert_eq!(parsed.items["bin1"], processed.items["bin1"]); + // Check bin2 defaults let bin2 = &processed.items["bin2"]; assert_eq!(bin2.support_email, "bin2@support.io"); assert_eq!(bin2.brand_name.as_deref(), Some("Brand2")); assert_eq!(bin2.home_dir.as_ref().unwrap(), "$HOME/.bin2"); assert_eq!(bin2.orchestrator_identifier.as_deref(), None); assert_eq!(bin2.orchestrator_address.as_deref(), None); + assert_eq!(bin2.commands.as_deref(), None); } } diff --git a/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml b/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml index 988ed50272e..b4e33e55552 100644 --- a/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml +++ b/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml @@ -5,3 +5,7 @@ bin: home_dir: /home/brand1 # if not set, will default to $HOME/.bin orchestrator_identifier: brand1 # if not set, will default to the OCKAM_CONTROLLER_IDENTITY_ID env var orchestrator_address: brand1.network # if not set, will default to the OCKAM_CONTROLLER_ADDR env var + commands: + - node: "host" + - node_list + - node_create: "init" diff --git a/implementations/rust/ockam/ockam_command/src/branding.rs b/implementations/rust/ockam/ockam_command/src/branding.rs new file mode 100644 index 00000000000..a9a8cc0c266 --- /dev/null +++ b/implementations/rust/ockam/ockam_command/src/branding.rs @@ -0,0 +1,109 @@ +use crate::environment::compile_time_vars::COMMANDS; +use crate::Result; +use once_cell::sync::Lazy; +use std::fmt::{Debug, Formatter}; + +pub(crate) fn name(name: &str) -> &'static str { + CUSTOM_COMMANDS.name(name) +} + +pub(crate) fn hide(name: &str) -> bool { + CUSTOM_COMMANDS.hide(name) +} + +pub(crate) static CUSTOM_COMMANDS: Lazy = + Lazy::new(|| Commands::from_env().expect("Failed to load custom commands")); + +pub(crate) struct Commands { + commands: Vec, +} + +pub(crate) struct Command { + name: String, + custom_name: String, +} + +impl Debug for Command { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("Command") + .field("name", &self.name) + .field("custom_name", &self.custom_name) + .finish() + } +} + +impl Commands { + pub fn from_env() -> Result { + let commands = COMMANDS + .split(',') + .filter_map(|c| { + if c.is_empty() { + return None; + } + let mut parts = c.split('='); + let name = match parts.next() { + Some(name) => name, + None => return None, + }; + let custom_name = parts.next().unwrap_or(name); + Some(Command { + name: name.to_string(), + custom_name: custom_name.to_string(), + }) + }) + .collect(); + Ok(Self { commands }) + } + + pub fn hide(&self, command_name: &str) -> bool { + if self.commands.is_empty() { + return false; + } + !self.commands.iter().any(|c| c.name == command_name) + } + + pub fn name(&self, command_name: &str) -> &'static str { + if self.commands.is_empty() { + return Box::leak(command_name.to_string().into_boxed_str()); + } + self.commands + .iter() + .find(|c| c.name == command_name) + .map(|c| Box::leak(c.custom_name.clone().into_boxed_str())) + .unwrap_or(Box::leak(command_name.to_string().into_boxed_str())) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::OCKAM_COMMANDS; + + #[test] + fn test_hide() { + std::env::set_var(OCKAM_COMMANDS, "node create=host create,project,enroll"); + let commands = Commands::from_env().unwrap(); + assert!(!commands.hide("node create")); + assert!(!commands.hide("project")); + assert!(!commands.hide("enroll")); + assert!(commands.hide("command4")); + + std::env::set_var(OCKAM_COMMANDS, ""); + let commands = Commands::from_env().unwrap(); + assert!(!commands.hide("command1")); + } + + #[test] + fn test_commands() { + std::env::set_var(OCKAM_COMMANDS, "node create=host create,project,enroll"); + let commands = Commands::from_env().unwrap(); + assert_eq!(commands.name("node create"), "host create"); + assert_eq!(commands.name("project"), "project"); + assert_eq!(commands.name("enroll"), "enroll"); + assert_eq!(commands.name("command4"), "command4"); + + std::env::set_var(OCKAM_COMMANDS, ""); + let commands = Commands::from_env().unwrap(); + assert_eq!(commands.name("command1"), "command1"); + } +} diff --git a/implementations/rust/ockam/ockam_command/src/command.rs b/implementations/rust/ockam/ockam_command/src/command.rs index da9f93ed09f..19e1b8b9b8a 100644 --- a/implementations/rust/ockam/ockam_command/src/command.rs +++ b/implementations/rust/ockam/ockam_command/src/command.rs @@ -19,7 +19,7 @@ const LONG_ABOUT: &str = include_str!("./static/long_about.txt"); const AFTER_LONG_HELP: &str = include_str!("./static/after_long_help.txt"); pub use crate::environment::compile_time_vars::{ - BIN_NAME, BRAND_NAME, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, + BIN_NAME, BRAND_NAME, OCKAM_COMMANDS, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, OCKAM_COMMAND_SUPPORT_EMAIL, }; diff --git a/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs b/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs index 9552fefa2cd..a80e32b7853 100644 --- a/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs +++ b/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs @@ -5,15 +5,20 @@ use ockam_core::env::get_env_with_default; pub const OCKAM_COMMAND_BIN_NAME: &str = "OCKAM_COMMAND_BIN_NAME"; pub const OCKAM_COMMAND_BRAND_NAME: &str = "OCKAM_COMMAND_BRAND_NAME"; pub const OCKAM_COMMAND_SUPPORT_EMAIL: &str = "OCKAM_COMMAND_SUPPORT_EMAIL"; +pub const OCKAM_COMMANDS: &str = "OCKAM_COMMANDS"; pub const BIN_NAME: &str = env!("OCKAM_COMMAND_BIN_NAME"); pub const BRAND_NAME: &str = env!("OCKAM_COMMAND_BRAND_NAME"); pub const SUPPORT_EMAIL: &str = env!("OCKAM_COMMAND_SUPPORT_EMAIL"); +/// A comma separated list of commands that can be run +/// in the format `command1=customName,command2,command3` +pub const COMMANDS: &str = env!("OCKAM_COMMANDS"); pub fn load_compile_time_vars() { std::env::set_var(OCKAM_COMMAND_BIN_NAME, BIN_NAME); std::env::set_var(OCKAM_COMMAND_BRAND_NAME, BRAND_NAME); std::env::set_var(OCKAM_COMMAND_SUPPORT_EMAIL, SUPPORT_EMAIL); + std::env::set_var(OCKAM_COMMANDS, COMMANDS); if let Ok(home_dir) = get_env_with_default(OCKAM_HOME, env!("OCKAM_HOME").to_string()) { if !home_dir.is_empty() { std::env::set_var(OCKAM_HOME, home_dir); diff --git a/implementations/rust/ockam/ockam_command/src/lib.rs b/implementations/rust/ockam/ockam_command/src/lib.rs index 0b1abb932b2..8c03de497b7 100644 --- a/implementations/rust/ockam/ockam_command/src/lib.rs +++ b/implementations/rust/ockam/ockam_command/src/lib.rs @@ -30,6 +30,7 @@ pub use terminal::*; mod admin; mod arguments; mod authority; +mod branding; mod command; mod command_events; mod command_global_opts; diff --git a/implementations/rust/ockam/ockam_command/src/node/mod.rs b/implementations/rust/ockam/ockam_command/src/node/mod.rs index 88a04e103ec..da0e61a511d 100644 --- a/implementations/rust/ockam/ockam_command/src/node/mod.rs +++ b/implementations/rust/ockam/ockam_command/src/node/mod.rs @@ -29,10 +29,10 @@ const AFTER_LONG_HELP: &str = include_str!("./static/after_long_help.txt"); /// Manage Nodes #[derive(Clone, Debug, Args)] #[command( -arg_required_else_help = true, -subcommand_required = true, -long_about = docs::about(LONG_ABOUT), -after_long_help = docs::after_help(AFTER_LONG_HELP) + arg_required_else_help = true, + subcommand_required = true, + long_about = docs::about(LONG_ABOUT), + after_long_help = docs::after_help(AFTER_LONG_HELP), )] pub struct NodeCommand { #[command(subcommand)] @@ -48,20 +48,13 @@ impl NodeCommand { #[derive(Clone, Debug, Subcommand)] #[allow(clippy::large_enum_variant)] pub enum NodeSubcommand { - #[command(display_order = 800)] Create(CreateCommand), - #[command(display_order = 800)] Delete(DeleteCommand), - #[command(display_order = 800)] List(ListCommand), - #[command(display_order = 800)] Logs(LogCommand), Show(ShowCommand), - #[command(display_order = 800)] Start(StartCommand), - #[command(display_order = 800)] Stop(StopCommand), - #[command(display_order = 800)] Default(DefaultCommand), } diff --git a/implementations/rust/ockam/ockam_command/src/subcommand.rs b/implementations/rust/ockam/ockam_command/src/subcommand.rs index 301a225c7a7..f7eca758148 100644 --- a/implementations/rust/ockam/ockam_command/src/subcommand.rs +++ b/implementations/rust/ockam/ockam_command/src/subcommand.rs @@ -7,7 +7,7 @@ use std::time::Duration; use async_trait::async_trait; use clap::Subcommand; use colorful::Colorful; -use miette::IntoDiagnostic; +use miette::{miette, IntoDiagnostic}; use tokio_retry::strategy::jitter; use tracing::warn; @@ -17,6 +17,7 @@ use ockam_node::Context; use crate::admin::AdminCommand; use crate::authority::{AuthorityCommand, AuthoritySubcommand}; +use crate::branding; use crate::command_global_opts::CommandGlobalOpts; use crate::completion::CompletionCommand; use crate::credential::CredentialCommand; @@ -68,52 +69,94 @@ use crate::Result; #[derive(Clone, Debug, Subcommand)] #[command(about = docs::about("List of commands which can be executed with `ockam`"))] pub enum OckamSubcommand { + #[command(name = branding::name("enroll"), hide = branding::hide("enroll"))] + Enroll(EnrollCommand), + + #[command(name = branding::name("node"), hide = branding::hide("node"))] Node(NodeCommand), + #[command(name = branding::name("vault"), hide = branding::hide("vault"))] Vault(VaultCommand), + #[command(name = branding::name("identity"), hide = branding::hide("identity"))] Identity(IdentityCommand), + #[command(name = branding::name("project"), hide = branding::hide("project"))] Project(ProjectCommand), + #[command(name = branding::name("policy"), hide = branding::hide("policy"))] Policy(PolicyCommand), + #[command(name = branding::name("credential"), hide = branding::hide("credential"))] Credential(CredentialCommand), + #[command(name = branding::name("relay"), hide = branding::hide("relay"))] Relay(RelayCommand), + #[command(name = branding::name("tcp-outlet"), hide = branding::hide("tcp-outlet"))] TcpOutlet(TcpOutletCommand), + #[command(name = branding::name("tcp-inlet"), hide = branding::hide("tcp-inlet"))] TcpInlet(TcpInletCommand), + #[command(name = branding::name("kafka-inlet"), hide = branding::hide("kafka-inlet"))] KafkaInlet(KafkaInletCommand), + #[command(name = branding::name("kafka-outlet"), hide = branding::hide("kafka-outlet"))] KafkaOutlet(KafkaOutletCommand), - #[command(name = "influxdb-inlet")] + #[command(name = branding::name("influxdb-inlet"), hide = branding::hide("influxdb-inlet"))] InfluxDBInlet(InfluxDBInletCommand), - #[command(name = "influxdb-outlet")] + #[command(name = branding::name("influxdb-outlet"), hide = branding::hide("influxdb-outlet"))] InfluxDBOutlet(InfluxDBOutletCommand), - #[command(hide = docs::hide())] + #[command(name = branding::name("rendezvous"), hide = branding::hide("rendezvous") || docs::hide())] Rendezvous(RendezvousCommand), + #[command(name = branding::name("status"), hide = branding::hide("status"))] Status(StatusCommand), + #[command(name = branding::name("reset"), hide = branding::hide("reset"))] Reset(ResetCommand), + #[command(name = branding::name("run"), hide = branding::hide("run"))] Run(RunCommand), + #[command(name = branding::name("manpages"), hide = branding::hide("manpages"))] Manpages(ManpagesCommand), + #[command(name = branding::name("completion"), hide = branding::hide("completion"))] Completion(CompletionCommand), + #[command(name = branding::name("environment"), hide = branding::hide("environment"))] Environment(EnvironmentCommand), - Enroll(EnrollCommand), + #[command(name = branding::name("admin"), hide = branding::hide("admin"))] Admin(AdminCommand), + #[command(name = branding::name("space"), hide = branding::hide("space"))] Space(SpaceCommand), + #[command(name = branding::name("space-admin"), hide = branding::hide("space-admin"))] SpaceAdmin(SpaceAdminCommand), + #[command(name = branding::name("project-admin"), hide = branding::hide("project-admin"))] ProjectAdmin(ProjectAdminCommand), + #[command(name = branding::name("project-member"), hide = branding::hide("project-member"))] ProjectMember(ProjectMemberCommand), + #[command(name = branding::name("sidecar"), hide = branding::hide("sidecar"))] Sidecar(SidecarCommand), + #[command(name = branding::name("subscription"), hide = branding::hide("subscription"))] Subscription(SubscriptionCommand), + #[command(name = branding::name("lease"), hide = branding::hide("lease"))] Lease(LeaseCommand), + #[command(name = branding::name("authority"), hide = branding::hide("authority"))] Authority(AuthorityCommand), - Markdown(MarkdownCommand), - Worker(WorkerCommand), + #[command(name = branding::name("service"), hide = branding::hide("service"))] Service(ServiceCommand), + #[command(name = branding::name("message"), hide = branding::hide("message"))] Message(MessageCommand), + #[command(name = branding::name("markdown"), hide = branding::hide("markdown"))] + Markdown(MarkdownCommand), + + #[command(name = branding::name("migrate-database"), hide = branding::hide("migrate-database"))] MigrateDatabase(MigrateDatabaseCommand), + #[command(name = branding::name("worker"), hide = branding::hide("worker"))] + Worker(WorkerCommand), + #[command(name = branding::name("secure-channel-listener"), hide = branding::hide("secure-channel-listener"))] SecureChannelListener(SecureChannelListenerCommand), + #[command(name = branding::name("secure-channel"), hide = branding::hide("secure-channel"))] SecureChannel(SecureChannelCommand), + #[command(name = branding::name("tcp-listener"), hide = branding::hide("tcp-listener"))] TcpListener(TcpListenerCommand), + #[command(name = branding::name("tcp-connection"), hide = branding::hide("tcp-connection"))] TcpConnection(TcpConnectionCommand), + #[command(name = branding::name("flow-control"), hide = branding::hide("flow-control"))] FlowControl(FlowControlCommand), + #[command(name = branding::name("kafka-consumer"), hide = branding::hide("kafka-consumer"))] KafkaConsumer(KafkaConsumerCommand), + #[command(name = branding::name("kafka-producer"), hide = branding::hide("kafka-producer"))] KafkaProducer(KafkaProducerCommand), + #[command(name = branding::name("share"), hide = branding::hide("share"))] Share(ShareCommand), } @@ -121,6 +164,8 @@ impl OckamSubcommand { /// Run the subcommand pub fn run(self, opts: CommandGlobalOpts) -> miette::Result<()> { match self { + OckamSubcommand::Enroll(c) => c.run(opts), + OckamSubcommand::Node(c) => c.run(opts), OckamSubcommand::Vault(c) => c.run(opts), OckamSubcommand::Identity(c) => c.run(opts), @@ -142,7 +187,6 @@ impl OckamSubcommand { OckamSubcommand::Completion(c) => c.run(), OckamSubcommand::Environment(c) => c.run(), - OckamSubcommand::Enroll(c) => c.run(opts), OckamSubcommand::Admin(c) => c.run(opts), OckamSubcommand::Space(c) => c.run(opts), OckamSubcommand::SpaceAdmin(c) => c.run(opts), @@ -152,11 +196,12 @@ impl OckamSubcommand { OckamSubcommand::Subscription(c) => c.run(opts), OckamSubcommand::Lease(c) => c.run(opts), OckamSubcommand::Authority(c) => c.run(opts), + OckamSubcommand::Service(c) => c.run(opts), + OckamSubcommand::Message(c) => c.run(opts), OckamSubcommand::Markdown(c) => c.run(), + OckamSubcommand::MigrateDatabase(c) => c.run(opts), OckamSubcommand::Worker(c) => c.run(opts), - OckamSubcommand::Service(c) => c.run(opts), - OckamSubcommand::Message(c) => c.run(opts), OckamSubcommand::SecureChannelListener(c) => c.run(opts), OckamSubcommand::SecureChannel(c) => c.run(opts), OckamSubcommand::TcpListener(c) => c.run(opts), @@ -267,6 +312,7 @@ impl OckamSubcommand { /// Return the subcommand name pub fn name(&self) -> String { match self { + OckamSubcommand::Enroll(c) => c.name(), OckamSubcommand::Node(c) => c.name(), OckamSubcommand::Vault(c) => c.name(), OckamSubcommand::Identity(c) => c.name(), @@ -287,7 +333,6 @@ impl OckamSubcommand { OckamSubcommand::Manpages(c) => c.name(), OckamSubcommand::Completion(c) => c.name(), OckamSubcommand::Environment(c) => c.name(), - OckamSubcommand::Enroll(c) => c.name(), OckamSubcommand::Admin(c) => c.name(), OckamSubcommand::Space(c) => c.name(), OckamSubcommand::SpaceAdmin(c) => c.name(), @@ -319,7 +364,11 @@ pub trait Command: Debug + Clone + Sized + Send + Sync + 'static { const NAME: &'static str; fn name(&self) -> String { - Self::NAME.into() + branding::CUSTOM_COMMANDS.name(Self::NAME).to_string() + } + + fn hide() -> bool { + branding::CUSTOM_COMMANDS.hide(Self::NAME) } fn retry_opts(&self) -> Option { @@ -327,6 +376,9 @@ pub trait Command: Debug + Clone + Sized + Send + Sync + 'static { } fn run(self, opts: CommandGlobalOpts) -> miette::Result<()> { + if Self::hide() { + return Err(miette!("This command is not available")); + } async_cmd(Self::NAME, opts.clone(), |ctx| async move { self.async_run_with_retry(&ctx, opts).await }) From 00f1f85915dc924043356cae25c837bc52d0e05f Mon Sep 17 00:00:00 2001 From: Adrian Benavides Date: Wed, 22 Jan 2025 15:15:33 +0100 Subject: [PATCH 2/4] feat(rust): in the command, use a different footer when the binary is not ockam --- .../rust/ockam/ockam_command/src/command.rs | 2 +- .../rust/ockam/ockam_command/src/docs.rs | 26 +++++++++++++++---- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/implementations/rust/ockam/ockam_command/src/command.rs b/implementations/rust/ockam/ockam_command/src/command.rs index 19e1b8b9b8a..d71dd60d199 100644 --- a/implementations/rust/ockam/ockam_command/src/command.rs +++ b/implementations/rust/ockam/ockam_command/src/command.rs @@ -20,7 +20,7 @@ const AFTER_LONG_HELP: &str = include_str!("./static/after_long_help.txt"); pub use crate::environment::compile_time_vars::{ BIN_NAME, BRAND_NAME, OCKAM_COMMANDS, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, - OCKAM_COMMAND_SUPPORT_EMAIL, + OCKAM_COMMAND_SUPPORT_EMAIL, SUPPORT_EMAIL, }; /// Top-level command, with: diff --git a/implementations/rust/ockam/ockam_command/src/docs.rs b/implementations/rust/ockam/ockam_command/src/docs.rs index 2dcb468d37c..11f45fc576b 100644 --- a/implementations/rust/ockam/ockam_command/src/docs.rs +++ b/implementations/rust/ockam/ockam_command/src/docs.rs @@ -1,4 +1,4 @@ -use crate::command::{BIN_NAME, BRAND_NAME}; +use crate::command::{BIN_NAME, BRAND_NAME, SUPPORT_EMAIL}; use crate::Result; use colorful::Colorful; use ockam_api::terminal::TextHighlighter; @@ -11,7 +11,9 @@ const PREVIEW_TAG: &str = include_str!("./static/preview_tag.txt"); const UNSAFE_TOOLTIP_TEXT: &str = include_str!("./static/unsafe_tooltip.txt"); const UNSAFE_TAG: &str = include_str!("./static/unsafe_tag.txt"); -const FOOTER: &str = " +static FOOTER: Lazy = Lazy::new(|| { + if BIN_NAME == "ockam" { + " Learn More: Use 'ockam --help' for more information about a subcommand. @@ -22,8 +24,22 @@ Learn more about Ockam: https://docs.ockam.io/reference/command Feedback: If you have questions, as you explore, join us on the contributors -discord channel https://discord.ockam.io -"; +discord channel https://discord.ockam.io" + .to_string() + } else { + format!( + " +Learn More: + +Use 'ockam --help' for more information about a subcommand. +Where might be: 'node', 'status', 'enroll', etc. + +Feedback: + +If you have questions, please email us on {SUPPORT_EMAIL}" + ) + } +}); static HEADER_RE: Lazy = Lazy::new(|| Regex::new("^(Examples|Learn More|Feedback):$".into())); @@ -63,7 +79,7 @@ pub(crate) fn after_help(text: &str) -> &'static str { } else { processed.push_str("Examples:\n\n"); processed.push_str(text); - processed.push_str(FOOTER); + processed.push_str(&FOOTER); } render(processed.as_str()) } From 888cba0a8bd926e37fb87b5ee1b99ddf43ede10f Mon Sep 17 00:00:00 2001 From: Adrian Benavides Date: Wed, 22 Jan 2025 15:38:30 +0100 Subject: [PATCH 3/4] chore(rust): minor improvements in command docs --- .../rust/ockam/ockam_command/src/bin/brand.rs | 25 +++++++++++++----- .../ockam_command/src/bin/brand.sample.yaml | 2 ++ .../rust/ockam/ockam_command/src/branding.rs | 21 +++++++-------- .../rust/ockam/ockam_command/src/docs.rs | 26 ++++++++++--------- 4 files changed, 44 insertions(+), 30 deletions(-) diff --git a/implementations/rust/ockam/ockam_command/src/bin/brand.rs b/implementations/rust/ockam/ockam_command/src/bin/brand.rs index 28a6507fc38..658befc6f7b 100644 --- a/implementations/rust/ockam/ockam_command/src/bin/brand.rs +++ b/implementations/rust/ockam/ockam_command/src/bin/brand.rs @@ -21,9 +21,8 @@ static CRATE_DIR: Lazy = Lazy::new(|| { static BIN_DIR: Lazy = Lazy::new(|| CRATE_DIR.join("src/bin")); -/// Builds the binaries with the passed configuration -/// How to run: -/// `cargo run --bin brand ./path/to/config.yaml --release` +/// Builds the binaries with the passed configuration: +/// `cargo run --bin brand ./path/to/config.yaml` /// `cargo run --bin brand "{bin1: {brand_name: "Name"}}"` fn main() -> Result<()> { // first argument: inline config or path to config file @@ -93,7 +92,7 @@ fn build_binary(bin_name: &str, brand_settings: Brand) -> Result<()> { cmd.env(OCKAM_COMMANDS, env_value); } if let Some(build_args) = brand_settings.build_args { - cmd.args(build_args.split_whitespace()); + cmd.args(build_args); } let res = cmd @@ -154,7 +153,7 @@ struct Brand { orchestrator_identifier: Option, orchestrator_address: Option, commands: Option>, - build_args: Option, + build_args: Option>, } impl Display for Brand { @@ -205,7 +204,10 @@ impl Display for Brand { writeln!( f, "{}", - fmt_log!("{PADDING}build args {}", color_primary(build_args)) + fmt_log!( + "{PADDING}build args {}", + color_primary(build_args.join(" ")) + ) )?; } Ok(()) @@ -238,6 +240,10 @@ mod tests { bin2: support_email: bin2@support.io brand_name: Brand2 + build_args: + - --release + - --target + - armv7-unknown-linux-gnueabihf "#; let parsed: Config = serde_yaml::from_str(config).unwrap(); assert_eq!(parsed.items.len(), 2); @@ -248,7 +254,8 @@ mod tests { processed.process_defaults().unwrap(); // No defaults used, should be the same as parsed - assert_eq!(parsed.items["bin1"], processed.items["bin1"]); + let bin1 = &processed.items["bin1"]; + assert_eq!(&parsed.items["bin1"], bin1); // Check bin2 defaults let bin2 = &processed.items["bin2"]; @@ -258,5 +265,9 @@ mod tests { assert_eq!(bin2.orchestrator_identifier.as_deref(), None); assert_eq!(bin2.orchestrator_address.as_deref(), None); assert_eq!(bin2.commands.as_deref(), None); + assert_eq!( + bin2.build_args.clone().unwrap(), + vec!["--release", "--target", "armv7-unknown-linux-gnueabihf",] + ); } } diff --git a/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml b/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml index b4e33e55552..b36e80ec807 100644 --- a/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml +++ b/implementations/rust/ockam/ockam_command/src/bin/brand.sample.yaml @@ -5,6 +5,8 @@ bin: home_dir: /home/brand1 # if not set, will default to $HOME/.bin orchestrator_identifier: brand1 # if not set, will default to the OCKAM_CONTROLLER_IDENTITY_ID env var orchestrator_address: brand1.network # if not set, will default to the OCKAM_CONTROLLER_ADDR env var + build_args: # if not set, will default to empty string + - --release commands: - node: "host" - node_list diff --git a/implementations/rust/ockam/ockam_command/src/branding.rs b/implementations/rust/ockam/ockam_command/src/branding.rs index a9a8cc0c266..8ba9a6dcff4 100644 --- a/implementations/rust/ockam/ockam_command/src/branding.rs +++ b/implementations/rust/ockam/ockam_command/src/branding.rs @@ -33,8 +33,8 @@ impl Debug for Command { } impl Commands { - pub fn from_env() -> Result { - let commands = COMMANDS + fn new(commands: &str) -> Result { + let commands = commands .split(',') .filter_map(|c| { if c.is_empty() { @@ -55,6 +55,10 @@ impl Commands { Ok(Self { commands }) } + pub fn from_env() -> Result { + Self::new(COMMANDS) + } + pub fn hide(&self, command_name: &str) -> bool { if self.commands.is_empty() { return false; @@ -77,33 +81,28 @@ impl Commands { #[cfg(test)] mod tests { use super::*; - use crate::OCKAM_COMMANDS; #[test] fn test_hide() { - std::env::set_var(OCKAM_COMMANDS, "node create=host create,project,enroll"); - let commands = Commands::from_env().unwrap(); + let commands = Commands::new("node create=host create,project,enroll").unwrap(); assert!(!commands.hide("node create")); assert!(!commands.hide("project")); assert!(!commands.hide("enroll")); assert!(commands.hide("command4")); - std::env::set_var(OCKAM_COMMANDS, ""); - let commands = Commands::from_env().unwrap(); + let commands = Commands::new("").unwrap(); assert!(!commands.hide("command1")); } #[test] fn test_commands() { - std::env::set_var(OCKAM_COMMANDS, "node create=host create,project,enroll"); - let commands = Commands::from_env().unwrap(); + let commands = Commands::new("node create=host create,project,enroll").unwrap(); assert_eq!(commands.name("node create"), "host create"); assert_eq!(commands.name("project"), "project"); assert_eq!(commands.name("enroll"), "enroll"); assert_eq!(commands.name("command4"), "command4"); - std::env::set_var(OCKAM_COMMANDS, ""); - let commands = Commands::from_env().unwrap(); + let commands = Commands::new("").unwrap(); assert_eq!(commands.name("command1"), "command1"); } } diff --git a/implementations/rust/ockam/ockam_command/src/docs.rs b/implementations/rust/ockam/ockam_command/src/docs.rs index 11f45fc576b..2353aae3cfa 100644 --- a/implementations/rust/ockam/ockam_command/src/docs.rs +++ b/implementations/rust/ockam/ockam_command/src/docs.rs @@ -11,6 +11,15 @@ const PREVIEW_TAG: &str = include_str!("./static/preview_tag.txt"); const UNSAFE_TOOLTIP_TEXT: &str = include_str!("./static/unsafe_tooltip.txt"); const UNSAFE_TAG: &str = include_str!("./static/unsafe_tag.txt"); +static IS_MARKDOWN: Lazy = + Lazy::new(|| get_env_with_default("OCKAM_HELP_RENDER_MARKDOWN", false).unwrap_or(false)); + +static HIDE: Lazy = + Lazy::new(|| get_env_with_default("OCKAM_HELP_SHOW_HIDDEN", true).unwrap_or(true)); + +static HEADER_RE: Lazy = + Lazy::new(|| Regex::new(r"^(Examples:|Learn More:|Feedback:).*$".into())); + static FOOTER: Lazy = Lazy::new(|| { if BIN_NAME == "ockam" { " @@ -41,15 +50,8 @@ If you have questions, please email us on {SUPPORT_EMAIL}" } }); -static HEADER_RE: Lazy = - Lazy::new(|| Regex::new("^(Examples|Learn More|Feedback):$".into())); - -fn is_markdown() -> bool { - get_env_with_default("OCKAM_HELP_RENDER_MARKDOWN", false).unwrap_or(false) -} - pub(crate) fn hide() -> bool { - get_env_with_default("OCKAM_HELP_SHOW_HIDDEN", true).unwrap_or(true) + *HIDE } pub(crate) fn about(text: &str) -> &'static str { @@ -58,7 +60,7 @@ pub(crate) fn about(text: &str) -> &'static str { pub(crate) fn before_help(text: &str) -> &'static str { let mut processed = String::new(); - if is_markdown() { + if *IS_MARKDOWN { if let Some(s) = enrich_preview_tag(text) { processed.push_str(&s); } @@ -73,7 +75,7 @@ pub(crate) fn before_help(text: &str) -> &'static str { pub(crate) fn after_help(text: &str) -> &'static str { let mut processed = String::new(); - if is_markdown() { + if *IS_MARKDOWN { processed.push_str("### Examples\n\n"); processed.push_str(text); } else { @@ -88,7 +90,7 @@ pub(crate) fn after_help(text: &str) -> &'static str { /// Otherwise, if it is a Markdown document just return a static string fn render(body: &str) -> &'static str { let body = process_branding(body); - if is_markdown() { + if *IS_MARKDOWN { Box::leak(body.into_boxed_str()) } else { let syntax_highlighted = process_terminal_docs(body); @@ -117,7 +119,7 @@ fn process_terminal_docs(input: String) -> String { for line in LinesWithEndings::from(&input) { // Bold and underline known headers if HEADER_RE.is_match(line) { - output.push(line.to_string().bold().underlined().to_string()); + output.push(line.bold().underlined().to_string()); } // Underline H4 headers else if line.starts_with("#### ") { From 6217759433b3d79705a9a200836a539e2e6a6424 Mon Sep 17 00:00:00 2001 From: Adrian Benavides Date: Thu, 23 Jan 2025 16:43:04 +0100 Subject: [PATCH 4/4] feat(rust): disable --all functionality in reset command if `OCKAM_DEVELOPER` is not set --- .../ockam/ockam_api/src/logs/env_variables.rs | 2 +- .../rust/ockam/ockam_api/src/logs/mod.rs | 2 +- .../rust/ockam/ockam_command/build.rs | 4 ++++ .../rust/ockam/ockam_command/src/bin/brand.rs | 2 +- .../rust/ockam/ockam_command/src/command.rs | 6 +----- .../ockam_command/src/command_global_opts.rs | 3 +-- .../rust/ockam/ockam_command/src/docs.rs | 2 +- .../src/environment/compile_time_vars.rs | 17 ++++++++++++----- .../rust/ockam/ockam_command/src/lib.rs | 2 +- .../rust/ockam/ockam_command/src/manpages.rs | 3 ++- .../ockam/ockam_command/src/markdown/mod.rs | 4 ++-- .../rust/ockam/ockam_command/src/reset/mod.rs | 3 ++- .../rust/ockam/ockam_command/src/version.rs | 2 +- 13 files changed, 30 insertions(+), 22 deletions(-) diff --git a/implementations/rust/ockam/ockam_api/src/logs/env_variables.rs b/implementations/rust/ockam/ockam_api/src/logs/env_variables.rs index 0a6b10a1027..2f511b7dcb2 100644 --- a/implementations/rust/ockam/ockam_api/src/logs/env_variables.rs +++ b/implementations/rust/ockam/ockam_api/src/logs/env_variables.rs @@ -38,7 +38,7 @@ pub(crate) const OCKAM_OPENTELEMETRY_EXPORT: &str = "OCKAM_OPENTELEMETRY_EXPORT" pub(crate) const OCKAM_TELEMETRY_EXPORT_VIA_PORTAL: &str = "OCKAM_TELEMETRY_EXPORT_VIA_PORTAL"; /// Boolean set to true if the current user is an Ockam developer -pub(crate) const OCKAM_DEVELOPER: &str = "OCKAM_DEVELOPER"; +pub const OCKAM_DEVELOPER: &str = "OCKAM_DEVELOPER"; /// If this variable is true, print statements will debug the setting of the OpenTelemetry export pub(crate) const OCKAM_OPENTELEMETRY_EXPORT_DEBUG: &str = "OCKAM_OPENTELEMETRY_EXPORT_DEBUG"; diff --git a/implementations/rust/ockam/ockam_api/src/logs/mod.rs b/implementations/rust/ockam/ockam_api/src/logs/mod.rs index 8a6cc308158..4159a438f22 100644 --- a/implementations/rust/ockam/ockam_api/src/logs/mod.rs +++ b/implementations/rust/ockam/ockam_api/src/logs/mod.rs @@ -11,7 +11,7 @@ /// mod current_span; mod default_values; -mod env_variables; +pub mod env_variables; pub mod exporting_configuration; mod log_exporters; pub mod logging_configuration; diff --git a/implementations/rust/ockam/ockam_command/build.rs b/implementations/rust/ockam/ockam_command/build.rs index 5981a37cd2c..4f33f6f5f31 100644 --- a/implementations/rust/ockam/ockam_command/build.rs +++ b/implementations/rust/ockam/ockam_command/build.rs @@ -12,6 +12,10 @@ fn hash() { } fn binary_name() { + let is_developer = env::var("OCKAM_DEVELOPER").unwrap_or("false".to_string()); + println!("cargo:rustc-env=OCKAM_DEVELOPER={is_developer}"); + println!("cargo:rerun-if-env-changed=OCKAM_DEVELOPER"); + let bin_name = env::var("OCKAM_COMMAND_BIN_NAME").unwrap_or("ockam".to_string()); println!("cargo:rustc-env=OCKAM_COMMAND_BIN_NAME={bin_name}"); println!("cargo:rerun-if-env-changed=OCKAM_COMMAND_BIN_NAME"); diff --git a/implementations/rust/ockam/ockam_command/src/bin/brand.rs b/implementations/rust/ockam/ockam_command/src/bin/brand.rs index 658befc6f7b..b6b7f3ce295 100644 --- a/implementations/rust/ockam/ockam_command/src/bin/brand.rs +++ b/implementations/rust/ockam/ockam_command/src/bin/brand.rs @@ -4,7 +4,7 @@ use ockam_api::colors::color_primary; use ockam_api::fmt_log; use ockam_api::orchestrator::{OCKAM_CONTROLLER_ADDRESS, OCKAM_CONTROLLER_IDENTIFIER}; use ockam_api::terminal::PADDING; -use ockam_command::{ +use ockam_command::environment::compile_time_vars::{ OCKAM_COMMANDS, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, OCKAM_COMMAND_SUPPORT_EMAIL, }; use once_cell::sync::Lazy; diff --git a/implementations/rust/ockam/ockam_command/src/command.rs b/implementations/rust/ockam/ockam_command/src/command.rs index d71dd60d199..f5c40fabc1b 100644 --- a/implementations/rust/ockam/ockam_command/src/command.rs +++ b/implementations/rust/ockam/ockam_command/src/command.rs @@ -1,5 +1,6 @@ use crate::command_events::{add_command_error_event, add_command_event}; use crate::command_global_opts::CommandGlobalOpts; +use crate::environment::compile_time_vars::BIN_NAME; use crate::global_args::GlobalArgs; use crate::subcommand::OckamSubcommand; use crate::upgrade::check_if_an_upgrade_is_available; @@ -18,11 +19,6 @@ const ABOUT: &str = include_str!("./static/about.txt"); const LONG_ABOUT: &str = include_str!("./static/long_about.txt"); const AFTER_LONG_HELP: &str = include_str!("./static/after_long_help.txt"); -pub use crate::environment::compile_time_vars::{ - BIN_NAME, BRAND_NAME, OCKAM_COMMANDS, OCKAM_COMMAND_BIN_NAME, OCKAM_COMMAND_BRAND_NAME, - OCKAM_COMMAND_SUPPORT_EMAIL, SUPPORT_EMAIL, -}; - /// Top-level command, with: /// - Global arguments /// - A specific subcommand diff --git a/implementations/rust/ockam/ockam_command/src/command_global_opts.rs b/implementations/rust/ockam/ockam_command/src/command_global_opts.rs index 50c3556e154..95b76f3d9bc 100644 --- a/implementations/rust/ockam/ockam_command/src/command_global_opts.rs +++ b/implementations/rust/ockam/ockam_command/src/command_global_opts.rs @@ -6,8 +6,7 @@ use std::sync::Arc; use tokio::runtime::Runtime; use tracing::{debug, info}; -use crate::command::{BIN_NAME, BRAND_NAME}; -use crate::environment::compile_time_vars::load_compile_time_vars; +use crate::environment::compile_time_vars::{load_compile_time_vars, BIN_NAME, BRAND_NAME}; use crate::subcommand::OckamSubcommand; use crate::util::exitcode; use crate::version::Version; diff --git a/implementations/rust/ockam/ockam_command/src/docs.rs b/implementations/rust/ockam/ockam_command/src/docs.rs index 2353aae3cfa..c9f0f4bdea7 100644 --- a/implementations/rust/ockam/ockam_command/src/docs.rs +++ b/implementations/rust/ockam/ockam_command/src/docs.rs @@ -1,4 +1,4 @@ -use crate::command::{BIN_NAME, BRAND_NAME, SUPPORT_EMAIL}; +use crate::environment::compile_time_vars::{BIN_NAME, BRAND_NAME, SUPPORT_EMAIL}; use crate::Result; use colorful::Colorful; use ockam_api::terminal::TextHighlighter; diff --git a/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs b/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs index a80e32b7853..7add990726b 100644 --- a/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs +++ b/implementations/rust/ockam/ockam_command/src/environment/compile_time_vars.rs @@ -1,12 +1,15 @@ use ockam_api::cli_state::OCKAM_HOME; use ockam_api::orchestrator::{OCKAM_CONTROLLER_ADDRESS, OCKAM_CONTROLLER_IDENTIFIER}; -use ockam_core::env::get_env_with_default; +use ockam_core::env::{get_env_with_default, FromString}; +// Runtime environment variables names used in the brand.rs binary pub const OCKAM_COMMAND_BIN_NAME: &str = "OCKAM_COMMAND_BIN_NAME"; pub const OCKAM_COMMAND_BRAND_NAME: &str = "OCKAM_COMMAND_BRAND_NAME"; pub const OCKAM_COMMAND_SUPPORT_EMAIL: &str = "OCKAM_COMMAND_SUPPORT_EMAIL"; pub const OCKAM_COMMANDS: &str = "OCKAM_COMMANDS"; +// Compile time environment variables names used in the command binary +pub const OCKAM_DEVELOPER: &str = env!("OCKAM_DEVELOPER"); pub const BIN_NAME: &str = env!("OCKAM_COMMAND_BIN_NAME"); pub const BRAND_NAME: &str = env!("OCKAM_COMMAND_BRAND_NAME"); pub const SUPPORT_EMAIL: &str = env!("OCKAM_COMMAND_SUPPORT_EMAIL"); @@ -15,10 +18,10 @@ pub const SUPPORT_EMAIL: &str = env!("OCKAM_COMMAND_SUPPORT_EMAIL"); pub const COMMANDS: &str = env!("OCKAM_COMMANDS"); pub fn load_compile_time_vars() { - std::env::set_var(OCKAM_COMMAND_BIN_NAME, BIN_NAME); - std::env::set_var(OCKAM_COMMAND_BRAND_NAME, BRAND_NAME); - std::env::set_var(OCKAM_COMMAND_SUPPORT_EMAIL, SUPPORT_EMAIL); - std::env::set_var(OCKAM_COMMANDS, COMMANDS); + std::env::set_var( + ockam_api::logs::env_variables::OCKAM_DEVELOPER, + OCKAM_DEVELOPER, + ); if let Ok(home_dir) = get_env_with_default(OCKAM_HOME, env!("OCKAM_HOME").to_string()) { if !home_dir.is_empty() { std::env::set_var(OCKAM_HOME, home_dir); @@ -41,3 +44,7 @@ pub fn load_compile_time_vars() { } } } + +pub fn is_ockam_developer() -> bool { + bool::from_string(OCKAM_DEVELOPER).unwrap_or(false) +} diff --git a/implementations/rust/ockam/ockam_command/src/lib.rs b/implementations/rust/ockam/ockam_command/src/lib.rs index 8c03de497b7..b8e13fbcf9d 100644 --- a/implementations/rust/ockam/ockam_command/src/lib.rs +++ b/implementations/rust/ockam/ockam_command/src/lib.rs @@ -39,7 +39,7 @@ mod credential; mod docs; pub mod enroll; pub mod entry_point; -mod environment; +pub mod environment; pub mod error; mod flow_control; mod global_args; diff --git a/implementations/rust/ockam/ockam_command/src/manpages.rs b/implementations/rust/ockam/ockam_command/src/manpages.rs index c9fe265b0b1..c9d43da0e6e 100644 --- a/implementations/rust/ockam/ockam_command/src/manpages.rs +++ b/implementations/rust/ockam/ockam_command/src/manpages.rs @@ -12,7 +12,8 @@ use tracing::error; use ockam_core::env::get_env_with_default; -use crate::{docs, OckamCommand, BIN_NAME}; +use crate::environment::compile_time_vars::BIN_NAME; +use crate::{docs, OckamCommand}; #[derive(Clone, Debug, Args)] #[command( diff --git a/implementations/rust/ockam/ockam_command/src/markdown/mod.rs b/implementations/rust/ockam/ockam_command/src/markdown/mod.rs index e5ccd628f72..93a7697888f 100644 --- a/implementations/rust/ockam/ockam_command/src/markdown/mod.rs +++ b/implementations/rust/ockam/ockam_command/src/markdown/mod.rs @@ -9,8 +9,8 @@ use once_cell::sync::Lazy; use regex::Regex; use tracing::error; -use crate::OckamCommand; -use crate::{docs, BIN_NAME}; +use crate::environment::compile_time_vars::BIN_NAME; +use crate::{docs, OckamCommand}; #[derive(Clone, Debug, Args)] #[command( diff --git a/implementations/rust/ockam/ockam_command/src/reset/mod.rs b/implementations/rust/ockam/ockam_command/src/reset/mod.rs index 3314dbfb99f..6780e0541f4 100644 --- a/implementations/rust/ockam/ockam_command/src/reset/mod.rs +++ b/implementations/rust/ockam/ockam_command/src/reset/mod.rs @@ -13,6 +13,7 @@ use ockam_api::{color, fmt_ok, CliState}; use ockam_node::Context; use crate::docs; +use crate::environment::compile_time_vars::is_ockam_developer; use crate::util::async_cmd; const LONG_ABOUT: &str = include_str!("./static/long_about.txt"); @@ -56,7 +57,7 @@ impl ResetCommand { async fn async_run(&self, ctx: &Context, opts: CommandGlobalOpts) -> miette::Result<()> { let delete_orchestrator_resources = - self.all && opts.state.is_enrolled().await.unwrap_or_default(); + is_ockam_developer() && self.all && opts.state.is_enrolled().await.unwrap_or_default(); if !self.yes { let msg = if delete_orchestrator_resources { "This will delete the local Ockam configuration and remove your spaces from the Orchestrator. Are you sure?" diff --git a/implementations/rust/ockam/ockam_command/src/version.rs b/implementations/rust/ockam/ockam_command/src/version.rs index 81efc240122..6df6a567bee 100644 --- a/implementations/rust/ockam/ockam_command/src/version.rs +++ b/implementations/rust/ockam/ockam_command/src/version.rs @@ -6,7 +6,7 @@ use ockam_api::output::Output; use serde::Serialize; use std::fmt::Display; -use crate::BIN_NAME; +use crate::environment::compile_time_vars::BIN_NAME; #[derive(Debug, Clone, Serialize)] pub(crate) struct Version {