krata/hypha/src/ctl/cfgblk.rs

94 lines
2.6 KiB
Rust
Raw Normal View History

2024-01-18 22:52:35 +00:00
use crate::image::ImageInfo;
use crate::shared::LaunchInfo;
use anyhow::Result;
2024-01-18 22:52:35 +00:00
use backhand::{FilesystemWriter, NodeHeader};
2024-01-23 05:28:14 +00:00
use log::trace;
2024-01-18 22:52:35 +00:00
use std::fs;
use std::fs::File;
use std::path::PathBuf;
use uuid::Uuid;
pub struct ConfigBlock<'a> {
pub image_info: &'a ImageInfo,
2024-01-22 10:15:53 +00:00
pub config_bundle: Option<&'a str>,
2024-01-18 22:52:35 +00:00
pub file: PathBuf,
pub dir: PathBuf,
2024-01-18 22:52:35 +00:00
}
impl ConfigBlock<'_> {
2024-01-22 10:15:53 +00:00
pub fn new<'a>(
uuid: &Uuid,
image_info: &'a ImageInfo,
config_bundle: Option<&'a str>,
) -> Result<ConfigBlock<'a>> {
let mut dir = std::env::temp_dir().clone();
dir.push(format!("hypha-cfg-{}", uuid));
fs::create_dir_all(&dir)?;
let mut file = dir.clone();
2024-01-18 22:52:35 +00:00
file.push("config.squashfs");
Ok(ConfigBlock {
image_info,
2024-01-22 10:15:53 +00:00
config_bundle,
file,
dir,
})
2024-01-18 22:52:35 +00:00
}
pub fn build(&self, launch_config: &LaunchInfo) -> Result<()> {
2024-01-23 05:28:14 +00:00
trace!("ConfigBlock build launch_config={:?}", launch_config);
2024-01-22 10:15:53 +00:00
let config_bundle_content = match self.config_bundle {
None => None,
Some(path) => Some(fs::read(path)?),
};
2024-01-18 22:52:35 +00:00
let manifest = self.image_info.config.to_string()?;
let launch = serde_json::to_string(launch_config)?;
2024-01-18 22:52:35 +00:00
let mut writer = FilesystemWriter::default();
writer.push_dir(
"/image",
NodeHeader {
permissions: 384,
uid: 0,
gid: 0,
mtime: 0,
},
)?;
writer.push_file(
manifest.as_bytes(),
"/image/config.json",
NodeHeader {
permissions: 384,
uid: 0,
gid: 0,
mtime: 0,
},
)?;
writer.push_file(
launch.as_bytes(),
"/launch.json",
NodeHeader {
permissions: 384,
uid: 0,
gid: 0,
mtime: 0,
},
)?;
2024-01-22 10:15:53 +00:00
if let Some(config_bundle_content) = config_bundle_content.as_ref() {
writer.push_file(
config_bundle_content.as_slice(),
"/bundle",
NodeHeader {
permissions: 384,
uid: 0,
gid: 0,
mtime: 0,
},
)?;
}
2024-01-18 22:52:35 +00:00
let mut file = File::create(&self.file)?;
2024-01-23 05:28:14 +00:00
trace!("ConfigBlock build write sqaushfs");
2024-01-18 22:52:35 +00:00
writer.write(&mut file)?;
2024-01-23 05:28:14 +00:00
trace!("ConfigBlock build complete");
2024-01-18 22:52:35 +00:00
Ok(())
}
}