diff options
| -rw-r--r-- | src/main.rs | 63 |
1 files changed, 49 insertions, 14 deletions
diff --git a/src/main.rs b/src/main.rs index c19bc76..dbc8985 100644 --- a/src/main.rs +++ b/src/main.rs @@ -136,12 +136,14 @@ fn unmount_usb_device(mount_point: &str) -> Result<(), io::Error> { } } -fn is_file_a_container_image_archive(path: &Path) -> bool { +const SUPPORTED_TRANSPORTS: &[&str] = &["docker-archive", "oci-archive"]; + +fn does_file_use_supported_transport(path: &Path, transport: &str) -> bool { let output = Command::new("skopeo") .arg("inspect") - .arg(format!("docker-archive:{}", path.display())) + .arg(format!("{}:{}", transport, path.display())) .output(); - + match output { Ok(result) => result.status.success(), Err(_) => false, @@ -156,8 +158,10 @@ fn list_container_image_archives(dir_path: &str) -> std::io::Result<Vec<String>> let path = entry.path(); if path.extension().map_or(false, |ext| ext == "tar") { - if is_file_a_container_image_archive(&path) { - images.push(path.display().to_string()); + for transport in SUPPORTED_TRANSPORTS { + if does_file_use_supported_transport(&path, transport) { + images.push(path.display().to_string()) + } } } } @@ -165,10 +169,10 @@ fn list_container_image_archives(dir_path: &str) -> std::io::Result<Vec<String>> Ok(images) } -fn inspect_container_image_archive(path: &Path) -> std::io::Result<String> { +fn try_inspect_with_transport(path: &Path, transport: &str) -> std::io::Result<String> { let output = Command::new("skopeo") .arg("inspect") - .arg(format!("docker-archive:{}", path.display())) + .arg(format!("{}:{}", transport, path.display())) .output()?; if output.status.success() { @@ -176,11 +180,27 @@ fn inspect_container_image_archive(path: &Path) -> std::io::Result<String> { Ok(inspect_msg.to_string()) } else { let error_msg = String::from_utf8_lossy(&output.stderr); - eprintln!("Insepct failed: {}", error_msg); Err(io::Error::new(io::ErrorKind::Other, error_msg.to_string())) } } +fn inspect_container_image_archive(path: &Path) -> std::io::Result<String> { + let mut errors = Vec::new(); + + for transport in SUPPORTED_TRANSPORTS { + match try_inspect_with_transport(path, transport) { + Ok(output) => return Ok(output), + Err(e) => { + errors.push(format!("{}: {}", transport, e)); + } + } + } + + let combined_error = format!("Failed with all transports: {}", errors.join(", ")); + eprintln!("Inspect failed: {}", combined_error); + Err(io::Error::new(io::ErrorKind::Other, combined_error)) +} + fn create_container_image_archives(archive_paths: Vec<String>) -> Result<Vec<ImageArchive>, Box<dyn std::error::Error>> { archive_paths .into_iter() @@ -203,24 +223,39 @@ fn create_container_image_archives(archive_paths: Vec<String>) -> Result<Vec<Ima .collect() } -fn load_container_image_archive(path: &Path, image_name: &str, image_tag: &str) -> Result<(), io::Error> { +fn try_load_with_transport(path: &Path, transport: &str, image_name: &str, image_tag: &str) -> Result<(), io::Error> { let output = Command::new("skopeo") .arg("copy") - .arg(format!("docker-archive:{}", path.display())) + .arg(format!("{}:{}", transport, path.display())) .arg(format!("docker://localhost:5000/{}:{}", image_name, image_tag)) .output()?; if output.status.success() { - println!("Successfully loaded {}", path.display()); + println!("Successfully loaded {} using {} transport", path.display(), transport); Ok(()) - } - else { + } else { let error_msg = String::from_utf8_lossy(&output.stderr); - eprintln!("Loading image failed: {}", error_msg); Err(io::Error::new(io::ErrorKind::Other, error_msg.to_string())) } } +fn load_container_image_archive(path: &Path, image_name: &str, image_tag: &str) -> Result<(), io::Error> { + let mut errors = Vec::new(); + + for transport in SUPPORTED_TRANSPORTS { + match try_load_with_transport(path, transport, image_name, image_tag) { + Ok(()) => return Ok(()), + Err(e) => { + errors.push(format!("{}: {}", transport, e)); + } + } + } + + let combined_error = format!("Failed to load with all transports: {}", errors.join(", ")); + eprintln!("Loading image failed: {}", combined_error); + Err(io::Error::new(io::ErrorKind::Other, combined_error)) +} + #[tonic::async_trait] impl Ormos for MyOrmos { async fn list_usb_devices( |
