2024-01-18 22:52:35 +00:00
|
|
|
use crate::image::ImageInfo;
|
2024-01-22 13:30:02 +00:00
|
|
|
use crate::shared::LaunchInfo;
|
2024-01-30 10:15:03 +00:00
|
|
|
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,
|
2024-01-21 08:13:05 +00:00
|
|
|
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>> {
|
2024-01-21 08:13:05 +00:00
|
|
|
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");
|
2024-01-21 08:13:05 +00:00
|
|
|
Ok(ConfigBlock {
|
|
|
|
image_info,
|
2024-01-22 10:15:53 +00:00
|
|
|
config_bundle,
|
2024-01-21 08:13:05 +00:00
|
|
|
file,
|
|
|
|
dir,
|
|
|
|
})
|
2024-01-18 22:52:35 +00:00
|
|
|
}
|
|
|
|
|
2024-01-22 13:30:02 +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()?;
|
2024-01-22 13:30:02 +00:00
|
|
|
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,
|
|
|
|
},
|
|
|
|
)?;
|
2024-01-22 13:30:02 +00:00
|
|
|
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(())
|
|
|
|
}
|
|
|
|
}
|