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}