use anyhow::{Context, Result};
use clap::Parser;
use monocore::{utils, vm::MicroVm};
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
#[arg(default_value = "93.184.216.34:80")] target: String,
#[arg(long, short, default_value_t = false)]
local_only: bool,
}
#[tokio::main]
async fn main() -> Result<()> {
tracing_subscriber::fmt()
.with_max_level(tracing::Level::DEBUG)
.init();
let args = Args::parse();
let build_dir = format!("{}/build", env!("CARGO_MANIFEST_DIR"));
let oci_dir = format!("{}/oci", build_dir);
let image_ref = "library/fedora:latest";
let (_, _, rootfs_name) = utils::parse_image_ref(image_ref).unwrap();
let rootfs_dir = format!("{}/rootfs/reference/{}", build_dir, rootfs_name);
utils::pull_docker_image(&oci_dir, image_ref).await?;
utils::merge_image_layers(&oci_dir, &rootfs_dir, image_ref).await?;
let vm = MicroVm::builder()
.root_path(format!("{}/merged", rootfs_dir))
.num_vcpus(1)
.exec_path("/bin/curl")
.args([args.target.as_str()])
.local_only(args.local_only)
.ram_mib(1024)
.build()
.context("Failed to build MicroVm")?;
tracing::info!("Starting MicroVm...");
vm.start()?;
Ok(())
}