use std::path::PathBuf;
use clap::Args;
use microsandbox_runtime::{
logging::LogLevel,
vm::{Config, VmConfig},
};
#[derive(Debug, Args)]
pub struct SandboxArgs {
#[arg(long = "name")]
pub sandbox_name: String,
#[arg(long = "sandbox-id")]
pub sandbox_id: i32,
#[arg(long = "db-path")]
pub sandbox_db_path: PathBuf,
#[arg(long)]
pub log_dir: PathBuf,
#[arg(long)]
pub runtime_dir: PathBuf,
#[arg(long)]
pub agent_sock: PathBuf,
#[arg(long = "forward")]
pub forward_output: bool,
#[arg(long)]
pub max_duration: Option<u64>,
#[arg(long)]
pub idle_timeout: Option<u64>,
#[arg(long)]
pub libkrunfw_path: PathBuf,
#[arg(long, default_value_t = 1)]
pub vcpus: u8,
#[arg(long, default_value_t = 512)]
pub memory_mib: u32,
#[arg(long)]
pub rootfs_path: Option<PathBuf>,
#[arg(long)]
pub rootfs_lower: Vec<PathBuf>,
#[arg(long)]
pub rootfs_upper: Option<PathBuf>,
#[arg(long)]
pub rootfs_staging: Option<PathBuf>,
#[arg(long)]
pub rootfs_disk: Option<PathBuf>,
#[arg(long)]
pub rootfs_disk_format: Option<String>,
#[arg(long)]
pub rootfs_disk_readonly: bool,
#[arg(long)]
pub mount: Vec<String>,
#[arg(long)]
pub init_path: Option<PathBuf>,
#[arg(long)]
pub env: Vec<String>,
#[arg(long)]
pub workdir: Option<PathBuf>,
#[arg(long)]
pub exec_path: Option<PathBuf>,
#[cfg(feature = "net")]
#[arg(long)]
pub network_config: Option<String>,
#[cfg(feature = "net")]
#[arg(long, default_value_t = 0)]
pub sandbox_slot: u64,
#[arg(last = true)]
pub exec_args: Vec<String>,
}
pub fn run(args: SandboxArgs, log_level: Option<LogLevel>) -> ! {
let vm_config = VmConfig {
libkrunfw_path: args.libkrunfw_path,
vcpus: args.vcpus,
memory_mib: args.memory_mib,
rootfs_path: args.rootfs_path,
rootfs_lowers: args.rootfs_lower,
rootfs_upper: args.rootfs_upper,
rootfs_staging: args.rootfs_staging,
rootfs_disk: args.rootfs_disk,
rootfs_disk_format: args.rootfs_disk_format,
rootfs_disk_readonly: args.rootfs_disk_readonly,
mounts: args.mount,
backends: vec![],
init_path: args.init_path,
env: args.env,
workdir: args.workdir,
exec_path: args.exec_path,
exec_args: args.exec_args,
#[cfg(feature = "net")]
network: args
.network_config
.as_deref()
.map(|json| {
serde_json::from_str::<microsandbox_network::config::NetworkConfig>(json)
.expect("invalid network config JSON")
})
.unwrap_or_default(),
#[cfg(feature = "net")]
sandbox_slot: args.sandbox_slot,
};
let config = Config {
sandbox_name: args.sandbox_name,
sandbox_id: args.sandbox_id,
log_level,
sandbox_db_path: args.sandbox_db_path,
log_dir: args.log_dir,
runtime_dir: args.runtime_dir,
agent_sock_path: args.agent_sock,
forward_output: args.forward_output,
idle_timeout_secs: args.idle_timeout,
max_duration_secs: args.max_duration,
vm: vm_config,
};
microsandbox_runtime::vm::enter(config)
}