diff --git a/Cargo.lock b/Cargo.lock index a26f613..29e603e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1109,7 +1109,7 @@ dependencies = [ [[package]] name = "detee-shared" version = "0.1.0" -source = "git+ssh://git@gitea.detee.cloud/testnet/proto.git?branch=main#cf0c9a2c0d2edf9254f25c6faa7494afcfa00d64" +source = "git+ssh://git@gitea.detee.cloud/testnet/proto.git?branch=main#a874749fd5d7d8a5c964835f11bc8f97007f9f9e" dependencies = [ "base64", "prost", diff --git a/src/bin/detee-cli.rs b/src/bin/detee-cli.rs index 9773d6d..c35c5ef 100644 --- a/src/bin/detee-cli.rs +++ b/src/bin/detee-cli.rs @@ -2,7 +2,6 @@ use clap::{builder::PossibleValue, Arg, ArgMatches, Command}; use clap_complete::{generate, Shell}; use detee_cli::sgx::cli_handler::handle_app; use detee_cli::*; -use snp; use std::error::Error; use std::io; @@ -155,7 +154,6 @@ fn main() { .default_value("200000") .value_parser(clap::value_parser!(u64).range(1..50000000)) ) - // TODO: implement location .arg( Arg::new("location") .help("deploy to a specific location") @@ -163,16 +161,23 @@ fn main() { .default_value("DE") .value_parser([ PossibleValue::new("DE").help("Frankfurt am Main, Hesse, Germany"), - // PossibleValue::new("GB").help("London, England, GB"), - // PossibleValue::new("Canada").help("Montréal or Vancouver"), - // PossibleValue::new("Montreal").help("Montréal, Quebec, CA"), - // PossibleValue::new("Vancouver").help("Vancouver, British Columbia, CA"), - // PossibleValue::new("California").help("San Jose, California, US"), - // PossibleValue::new("US").help("San Jose, California, US"), - // PossibleValue::new("France").help("Paris, Île-de-France, FR"), - // PossibleValue::new("Random").help("Just deploy somewhere..."), ]), ) + .arg( + Arg::new("env") + .short('e') + .long("env") + .help("env override") + .long_help("environment variable override on launch config") + .action(clap::ArgAction::Append) + ) + .arg( + Arg::new("arg") + .long("arg") + .help("arg override") + .long_help("application arguement variable override on launch config") + .action(clap::ArgAction::Append) + ) ) .subcommand( Command::new("delete") diff --git a/src/sgx/cli_handler.rs b/src/sgx/cli_handler.rs index f3dc6da..09c5372 100644 --- a/src/sgx/cli_handler.rs +++ b/src/sgx/cli_handler.rs @@ -4,7 +4,7 @@ use crate::sgx::grpc_brain::{delete_app, new_app}; use crate::sgx::grpc_dtpm::{attest_and_send_config, get_config_from_enclave}; use crate::sgx::packaging::package_enclave; use crate::sgx::AppDeleteResponse; -use crate::utils::{block_on, fetch_config_and_mr_enclave}; +use crate::utils::{block_on, fetch_config_and_mr_enclave, override_envs_and_args_launch_config}; use crate::{cli_print, SimpleOutput}; use clap::ArgMatches; use detee_shared::sgx::types::brain::AppDeployConfig; @@ -90,10 +90,17 @@ fn handle_deploy( app_deploy_config.app_name = random_app_name(); } - let (mr_enclave, launch_config) = + let (mr_enclave, mut launch_config) = block_on(fetch_config_and_mr_enclave(&app_deploy_config.package_url))?; app_deploy_config.public_package_mr_enclave = Some(mr_enclave.to_vec()); + let envs = + deploy_match.get_many::("env").unwrap_or_default().cloned().collect::>(); + let args = + deploy_match.get_many::("arg").unwrap_or_default().cloned().collect::>(); + + override_envs_and_args_launch_config(&mut launch_config, envs, args); + match block_on(new_app(app_deploy_config)) { Ok(new_app_res) if new_app_res.error == "" => { println!("Deploying..."); diff --git a/src/sgx/grpc_dtpm.rs b/src/sgx/grpc_dtpm.rs index 93b58c5..f873ce2 100644 --- a/src/sgx/grpc_dtpm.rs +++ b/src/sgx/grpc_dtpm.rs @@ -1,5 +1,5 @@ use detee_sgx::{prelude::*, HRaTlsConfigBuilder}; -use detee_shared::sgx::pb::dtpm_proto::DtpmGetConfigReq; +use detee_shared::common_proto::Empty; use hyper_rustls::HttpsConnectorBuilder; use rustls::ClientConfig; use std::sync::{Arc, RwLock}; @@ -94,7 +94,7 @@ pub async fn get_config_from_enclave(uuid: &str) -> Result { let mgr_config_pb = client .max_decoding_message_size(10240000) - .get_config(tonic::Request::new(DtpmGetConfigReq { empty: None })) + .get_config(tonic::Request::new(Empty {})) .await? .into_inner(); diff --git a/src/utils.rs b/src/utils.rs index 03c84d7..935d516 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -2,6 +2,7 @@ use crate::config::Config; use crate::constants::HRATLS_APP_PORT; use crate::sgx::grpc_brain::list_apps; use detee_shared::sgx::types::dtpm::DtpmConfig; +use detee_shared::sgx::types::dtpm::EnvironmentEntry; use serde::{Deserialize, Serialize}; use tonic::metadata::errors::InvalidMetadataValue; use tonic::metadata::AsciiMetadataValue; @@ -123,3 +124,35 @@ pub fn calculate_nanolp_for_app( ); locked_nano } + +pub fn override_envs_and_args_launch_config( + launch_config: &mut DtpmConfig, + envs: Vec, + args: Vec, +) { + for env in envs { + let mut env = env.split("="); + let key = env.next().expect("environment variable must be in the format 'key=value'"); + let value = + env.next().expect("environment variable pair must be in the format 'key=value'"); + + if launch_config.environments.iter().find(|env| env.name == key).is_some() { + let existing_env = + launch_config.environments.iter_mut().find(|env| env.name == key).unwrap(); + + existing_env.name = key.to_string(); + existing_env.value = value.to_string(); + } else { + let mut new_env = EnvironmentEntry::default(); + + new_env.name = key.to_string(); + new_env.value = value.to_string(); + + launch_config.environments.push(new_env); + } + } + + for arg in args { + launch_config.child_processes.first_mut().unwrap().arguments.push(arg); + } +}