m/cup
1
0
mirror of https://github.com/sergi0g/cup.git synced 2025-11-17 17:43:37 -05:00

Complete rewrite

This commit is contained in:
Sergio
2024-07-08 16:57:00 +03:00
commit a3068324ee
19 changed files with 3653 additions and 0 deletions

84
src/docker.rs Normal file
View File

@@ -0,0 +1,84 @@
use bollard::{
secret::ImageSummary,
ClientVersion, Docker,
};
#[cfg(feature = "cli")]
use bollard::secret::ImageInspect;
use crate::{error, image::Image, utils::split_image};
fn create_docker_client(socket: Option<String>) -> Docker {
let client: Result<Docker, bollard::errors::Error> = match socket {
Some(sock) => Docker::connect_with_local(
&sock,
120,
&ClientVersion {
major_version: 1,
minor_version: 44,
},
),
None => Docker::connect_with_local_defaults(),
};
match client {
Ok(d) => d,
Err(e) => error!("Failed to connect to docker socket!\n{}", e),
}
}
pub async fn get_images_from_docker_daemon(socket: Option<String>) -> Vec<Image> {
let client: Docker = create_docker_client(socket);
let images: Vec<ImageSummary> = match client.list_images::<String>(None).await {
Ok(images) => images,
Err(e) => {
error!("Failed to retrieve list of images available!\n{}", e)
}
};
let mut result: Vec<Image> = Vec::new();
for image in images {
if !image.repo_tags.is_empty() && image.repo_digests.len() == 1 {
for t in &image.repo_tags {
let (registry, repository, tag) = split_image(t);
result.push(Image {
registry,
repository,
tag,
digest: Some(
image.repo_digests[0]
.clone()
.split('@')
.collect::<Vec<&str>>()[1]
.to_string(),
),
});
}
}
}
result
}
#[cfg(feature = "cli")]
pub async fn get_image_from_docker_daemon(socket: Option<String>, name: &str) -> Image {
let client: Docker = create_docker_client(socket);
let image: ImageInspect = match client.inspect_image(name).await {
Ok(i) => i,
Err(e) => error!("Failed to retrieve image {} from daemon\n{}", name, e),
};
match image.repo_tags {
Some(_) => (),
None => error!("Image has no tags"), // I think this is actually unreachable
}
match image.repo_digests {
Some(d) => {
let (registry, repository, tag) = split_image(&image.repo_tags.unwrap()[0]);
Image {
registry,
repository,
tag,
digest: Some(d[0].clone().split('@').collect::<Vec<&str>>()[1].to_string()),
}
}
None => error!("No digests found for image {}", name),
}
}