From e9063cba61895d757031ba279d80f217db92c648 Mon Sep 17 00:00:00 2001 From: Noor Date: Tue, 4 Mar 2025 09:41:05 +0000 Subject: [PATCH] fix for new packaging type fix tokio blocking code panic get top level dir from archive --- src/container.rs | 4 ++-- src/data.rs | 7 +++---- src/global.rs | 3 ++- src/utils.rs | 25 +++++++++++++++++++++++-- 4 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/container.rs b/src/container.rs index 27029d0..2e16b6d 100644 --- a/src/container.rs +++ b/src/container.rs @@ -2,7 +2,7 @@ use anyhow::{anyhow, Result}; use log::info; use std::process::Command; -pub async fn deploy_enclave( +pub fn deploy_enclave( enclave_path: &str, container_name_uuid: String, port_map: Vec<(u16, u16)>, @@ -15,7 +15,7 @@ pub async fn deploy_enclave( info!("Deploying enclave: {:?}", enclave_path); let docker_deploy_str = format!( - r#"docker run -d --name {container_name_uuid} -v {enclave_path}/enclave_packager:/enclave_packager \ + r#"docker run -d --name {container_name_uuid} -v {enclave_path}:/enclave_packager \ --device /dev/sgx/enclave --device /dev/sgx/provision {port_maping_string} noormohammedb/occlum-enclave:v1"# ); diff --git a/src/data.rs b/src/data.rs index d9d3c5c..8acfe4e 100644 --- a/src/data.rs +++ b/src/data.rs @@ -119,11 +119,10 @@ impl App { let mapped_ports = prepare_port_map(new_app_req.resource.port.clone()).await; let app_name = format!("{APP_NAME_PREFIX}-{app_uuid}"); - let unarchive_dir = + let package_path = handle_package(package_url, app_uuid.clone(), host_config.delete_archive).await?; - let exit_code = - deploy_enclave(&unarchive_dir, app_name.clone(), mapped_ports.clone()).await?; + let exit_code = deploy_enclave(&package_path, app_name.clone(), mapped_ports.clone())?; if exit_code != 0 { // TODO: cleanup unarchive_dir @@ -133,7 +132,7 @@ impl App { let app_instance = Self { uuid: app_uuid, name: app_name, - package_path: unarchive_dir, + package_path, status: "running".to_string(), admin_pubkey: new_app_req.admin_pubkey, app_resource: new_app_req.resource, diff --git a/src/global.rs b/src/global.rs index 35e2369..4c48363 100644 --- a/src/global.rs +++ b/src/global.rs @@ -13,7 +13,8 @@ pub const APP_NAME_PREFIX: &str = "dtpm"; const DETEE_DIR_ENV_NAME: &str = "DETEE_DIR"; -pub static IP_INFO: LazyLock = LazyLock::new(|| get_ip_info().unwrap()); +pub static IP_INFO: LazyLock = + LazyLock::new(|| tokio::task::block_in_place(|| get_ip_info().unwrap())); pub static USED_RESOURCES_PATH: LazyLock = LazyLock::new(|| { let home = home::home_dir().unwrap().to_string_lossy().into_owned(); diff --git a/src/utils.rs b/src/utils.rs index a1bb370..83019f3 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -35,15 +35,36 @@ pub async fn handle_package( return Err(anyhow!("Error: file not an archive: {er:?}")); }; - let unarchive_dir = format!("{PACKAGE_DIR_PATH}/{}", container_uuid); + let unarchive_dir = format!("{PACKAGE_DIR_PATH}/{container_uuid}"); fs::create_dir_all(Path::new(&unarchive_dir)).await?; + + let top_level_directory = get_top_level_dir(file_path.to_string_lossy().to_string()) + .ok_or(anyhow!("Error: failed get toplevel directory"))?; + archive.unpack(&unarchive_dir)?; if delete_archive { let _ = fs::remove_file(file_path).await; } - Ok(unarchive_dir) + Ok(format!("{unarchive_dir}/{top_level_directory}")) +} + +fn get_top_level_dir(file_path: String) -> Option { + let file = std::fs::File::open(file_path).ok()?; + let reader = BufReader::new(file); + let mut archive = Archive::new(GzDecoder::new(reader)); + + archive.entries().ok()?.flatten().find_map(|entry| { + entry + .path() + .ok()? + .components() + .next()? + .as_os_str() + .to_str() + .map(String::from) + }) } pub async fn download_file(url: &str, file_path: &Path) -> Result<(), Box> {