diff options
| -rw-r--r-- | proto/ormos.proto | 11 | ||||
| -rw-r--r-- | src/main.rs | 45 |
2 files changed, 55 insertions, 1 deletions
diff --git a/proto/ormos.proto b/proto/ormos.proto index 784d235..700bd70 100644 --- a/proto/ormos.proto +++ b/proto/ormos.proto @@ -9,6 +9,7 @@ service Ormos { rpc ListImageArchives (ListImageArchivesRequest) returns (ListImageArchivesResponse) {} rpc LoadImageArchive (LoadImageArchiveRequest) returns (LoadImageArchiveResponse) {} + rpc InspectImageArchive (InspectImageArchiveRequest) returns (InspectImageArchiveResponse) {} } message MountUsbDeviceRequest { @@ -66,3 +67,13 @@ message LoadImageArchiveResponse { bool is_success = 1; string error_message = 2; } + +message InspectImageArchiveRequest { + string file_path = 1; +} + +message InspectImageArchiveResponse { + bool is_success = 1; + string stdout = 2; + string stderr = 3; +} diff --git a/src/main.rs b/src/main.rs index a032fb8..39c010d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ use tonic::{transport::Server, Request, Response, Status}; use skopos::ormos_server::{Ormos, OrmosServer}; -use skopos::{ListUsbDevicesRequest, ListUsbDevicesResponse, UsbDevice, MountUsbDeviceRequest, MountUsbDeviceResponse, UnmountUsbDeviceRequest, UnmountUsbDeviceResponse, ListImageArchivesRequest, ListImageArchivesResponse, ImageArchive, LoadImageArchiveRequest, LoadImageArchiveResponse}; +use skopos::{ListUsbDevicesRequest, ListUsbDevicesResponse, UsbDevice, MountUsbDeviceRequest, MountUsbDeviceResponse, UnmountUsbDeviceRequest, UnmountUsbDeviceResponse, ListImageArchivesRequest, ListImageArchivesResponse, ImageArchive, LoadImageArchiveRequest, LoadImageArchiveResponse, InspectImageArchiveRequest, InspectImageArchiveResponse}; use std::io; use std::fs; use std::process::Command; @@ -163,6 +163,22 @@ 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> { + let output = Command::new("skopeo") + .arg("inspect") + .arg(format!("docker-archive:{}", path.display())) + .output()?; + + if output.status.success() { + let inspect_msg = String::from_utf8_lossy(&output.stdout); + 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 create_container_image_archives(archive_paths: Vec<String>) -> Result<Vec<ImageArchive>, Box<dyn std::error::Error>> { archive_paths .into_iter() @@ -323,6 +339,33 @@ impl Ormos for MyOrmos { } } } + + async fn inspect_image_archive( + &self, + request: Request<InspectImageArchiveRequest>, + ) -> Result<Response<InspectImageArchiveResponse>, Status> { + let req = request.into_inner(); + let file_path = req.file_path; + + match inspect_container_image_archive(Path::new(&file_path)) { + Ok(output) => { + let response = InspectImageArchiveResponse { + is_success: true, + stdout: output, + stderr: String::new(), + }; + Ok(Response::new(response)) + } + Err(e) => { + let response = InspectImageArchiveResponse { + is_success: false, + stdout: String::new(), + stderr: e.to_string(), + }; + Ok(Response::new(response)) + } + } + } } #[tokio::main] |
