draft(daemon) module init

This commit is contained in:
lumither committed 2025-10-08 12:48:43 -04:00
1 parent 2a56263382
commit f3cc387013
8 files changed
+123

No files matched your search

+3
View File
@@ -0,0 +1,3 @@
target/
Cargo.lock
+9
View File
@@ -0,0 +1,9 @@
[package]
name = "daemon"
version = "0.1.0"
edition = "2024"
[dependencies]
clap = { version = "4.5.47", features = ["derive"] }
containerd-client = "0.8.0"
tokio = { version = "1.45.1", features = ["macros", "rt-multi-thread"] }
+13
View File
@@ -0,0 +1,13 @@
.PHONY: rebuild
rebuild:
cargo clean
cargo build
.PHONY: rebuild-release
rebuild-release:
cargo clean
cargo build -r
.PHONY: run
run:
sudo ./target/debug/daemon
+1
View File
@@ -0,0 +1 @@
mod pull;
View File
Whitespace-only changes.
+8
View File
@@ -0,0 +1,8 @@
{
"images": [
{
"id": "",
"image": ""
}
]
}
View File
Whitespace-only changes.
+89
View File
@@ -0,0 +1,89 @@
mod actions;
mod config;
use clap::Parser;
use containerd_client::tonic::Request;
use containerd_client::{
connect,
services::v1::{transfer_client::TransferClient, TransferOptions, TransferRequest},
to_any,
types::transfer::OciRegistry,
types::transfer::{ImageStore, UnpackConfiguration},
types::Platform,
with_namespace,
};
use std::env::consts;
#[derive(Parser, Debug)]
struct Args {
/// containerd namespace
#[arg(short, long, default_value = "nocturne")]
namespace: String,
/// containerd socket
#[arg(short, long, default_value = "/run/containerd/containerd.sock")]
socket: String,
}
const IMAGE: &str = "docker.io/library/alpine:latest";
#[tokio::main]
async fn main() {
let args = Args::parse();
let arch = match consts::ARCH {
"x86_64" => "amd64",
"aarch64" => "arm64",
_ => consts::ARCH,
};
dbg!(&args);
let channel = connect(&args.socket).await.expect("failed to bind socket");
let mut client = TransferClient::new(channel.clone());
let registry = OciRegistry {
reference: IMAGE.to_string(),
resolver: Default::default(),
};
let platform = Platform {
os: "linux".to_string(),
architecture: arch.to_string(),
variant: "".to_string(),
os_version: "".to_string(),
};
let destination = ImageStore {
name: IMAGE.to_string(),
platforms: vec![platform.clone()],
unpacks: vec![UnpackConfiguration {
platform: Some(platform),
..Default::default()
}],
..Default::default()
};
let anys = to_any(&registry);
let anyd = to_any(&destination);
println!(
"Pulling image for linux/{} from source: {:?}",
arch, registry
);
let request = TransferRequest {
source: Some(anys),
destination: Some(anyd),
options: Some(TransferOptions {
..Default::default()
}),
};
// let request = Request::new(request);
let req = with_namespace!(request, args.namespace);
client
.transfer(req)
.await
.expect("unable to transfer image");
}