use clap::Args; use tracing_log::LogTracer; use tracing_subscriber::{ fmt, prelude::__tracing_subscriber_SubscriberExt, EnvFilter, Layer, Registry, }; use url::Url; pub fn block_on_ctrl_c() { let (tx, rx) = std::sync::mpsc::channel(); ctrlc::set_handler(move || tx.send(()).expect("Could not send stop signal on channel.")) .expect("Error setting Ctrl-C handler"); rx.recv().expect("Could not receive ctrl-c signal"); } pub fn setup_global_subscriber(additional_layer: L) where L: Layer + Send + Sync, { let subscriber = Registry::default() .with(additional_layer.with_filter(EnvFilter::from_default_env())) .with(fmt::layer().with_filter(EnvFilter::from_default_env())); tracing::subscriber::set_global_default(subscriber).expect("Could not set global default"); LogTracer::init().unwrap(); } /// Arguments common to all Firezone CLI components. #[derive(Args, Clone)] pub struct CommonArgs { #[arg( short = 'u', long, hide = true, env = "FIREZONE_API_URL", default_value = "wss://api.firezone.dev" )] pub api_url: Url, /// Token generated by the portal to authorize websocket connection. #[arg(env = "FIREZONE_TOKEN")] pub token: String, /// Friendly name to display in the UI #[arg(short = 'n', long, env = "FIREZONE_NAME")] pub firezone_name: Option, }