kratart/
cfgblk.rs

1use anyhow::Result;
2use backhand::compression::Compressor;
3use backhand::{FilesystemCompressor, FilesystemWriter, NodeHeader};
4use krata::launchcfg::LaunchInfo;
5use krataoci::packer::OciPackedImage;
6use log::trace;
7use std::fs;
8use std::fs::File;
9use std::path::PathBuf;
10use uuid::Uuid;
11
12pub struct ConfigBlock {
13    pub image: OciPackedImage,
14    pub file: PathBuf,
15    pub dir: PathBuf,
16}
17
18impl ConfigBlock {
19    pub fn new(uuid: &Uuid, image: OciPackedImage) -> Result<ConfigBlock> {
20        let mut dir = std::env::temp_dir().clone();
21        dir.push(format!("krata-cfg-{}", uuid));
22        fs::create_dir_all(&dir)?;
23        let mut file = dir.clone();
24        file.push("config.squashfs");
25        Ok(ConfigBlock { image, file, dir })
26    }
27
28    pub fn build(&self, launch_config: &LaunchInfo) -> Result<()> {
29        trace!("build launch_config={:?}", launch_config);
30        let config = self.image.config.raw();
31        let launch = serde_json::to_string(launch_config)?;
32        let mut writer = FilesystemWriter::default();
33        writer.set_compressor(FilesystemCompressor::new(Compressor::Gzip, None)?);
34        writer.push_dir(
35            "/image",
36            NodeHeader {
37                permissions: 384,
38                uid: 0,
39                gid: 0,
40                mtime: 0,
41            },
42        )?;
43        writer.push_file(
44            config,
45            "/image/config.json",
46            NodeHeader {
47                permissions: 384,
48                uid: 0,
49                gid: 0,
50                mtime: 0,
51            },
52        )?;
53        writer.push_file(
54            launch.as_bytes(),
55            "/launch.json",
56            NodeHeader {
57                permissions: 384,
58                uid: 0,
59                gid: 0,
60                mtime: 0,
61            },
62        )?;
63        let mut file = File::create(&self.file)?;
64        trace!("build write sqaushfs");
65        writer.write(&mut file)?;
66        trace!("build complete");
67        Ok(())
68    }
69}