forked from brl/citadel-tools
Rename target to image_data, make compression optional
This commit is contained in:
parent
41179a720d
commit
91530279cf
@ -10,7 +10,7 @@ use BuildConfig;
|
|||||||
|
|
||||||
pub struct UpdateBuilder {
|
pub struct UpdateBuilder {
|
||||||
config: BuildConfig,
|
config: BuildConfig,
|
||||||
target: PathBuf,
|
image_data: PathBuf,
|
||||||
|
|
||||||
nblocks: Option<usize>,
|
nblocks: Option<usize>,
|
||||||
shasum: Option<String>,
|
shasum: Option<String>,
|
||||||
@ -29,9 +29,9 @@ impl UpdateBuilder {
|
|||||||
|
|
||||||
pub fn new(config: BuildConfig) -> UpdateBuilder {
|
pub fn new(config: BuildConfig) -> UpdateBuilder {
|
||||||
let filename = UpdateBuilder::target_filename(&config);
|
let filename = UpdateBuilder::target_filename(&config);
|
||||||
let target = config.workdir_path(&filename);
|
let image_data= config.workdir_path(&filename);
|
||||||
UpdateBuilder {
|
UpdateBuilder {
|
||||||
config, target,
|
config, image_data,
|
||||||
nblocks: None, shasum: None, verity_salt: None,
|
nblocks: None, shasum: None, verity_salt: None,
|
||||||
verity_root: None,
|
verity_root: None,
|
||||||
}
|
}
|
||||||
@ -42,8 +42,8 @@ impl UpdateBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn build(&mut self) -> Result<()> {
|
pub fn build(&mut self) -> Result<()> {
|
||||||
info!("Copying source file to {}", self.target.display());
|
info!("Copying source file to {}", self.image_data.display());
|
||||||
fs::copy(self.config.source(), &self.target)?;
|
fs::copy(self.config.source(), &self.image_data)?;
|
||||||
|
|
||||||
self.pad_image()
|
self.pad_image()
|
||||||
.context("failed writing padding to image")?;
|
.context("failed writing padding to image")?;
|
||||||
@ -61,7 +61,7 @@ impl UpdateBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn pad_image(&mut self) -> Result<()> {
|
fn pad_image(&mut self) -> Result<()> {
|
||||||
let meta = self.target.metadata()?;
|
let meta = self.image_data.metadata()?;
|
||||||
let len = meta.len() as usize;
|
let len = meta.len() as usize;
|
||||||
if len % 512 != 0 {
|
if len % 512 != 0 {
|
||||||
bail!("Image file size is not a multiple of sector size (512 bytes)");
|
bail!("Image file size is not a multiple of sector size (512 bytes)");
|
||||||
@ -73,7 +73,7 @@ impl UpdateBuilder {
|
|||||||
let zeros = vec![0u8; padlen];
|
let zeros = vec![0u8; padlen];
|
||||||
let mut file = OpenOptions::new()
|
let mut file = OpenOptions::new()
|
||||||
.append(true)
|
.append(true)
|
||||||
.open(&self.target)?;
|
.open(&self.image_data)?;
|
||||||
file.write_all(&zeros)?;
|
file.write_all(&zeros)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -85,8 +85,8 @@ impl UpdateBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn calculate_shasum(&mut self) -> Result<()> {
|
fn calculate_shasum(&mut self) -> Result<()> {
|
||||||
let output = util::exec_cmdline_with_output("sha256sum", format!("{}", self.target.display()))
|
let output = util::exec_cmdline_with_output("sha256sum", format!("{}", self.image_data.display()))
|
||||||
.context(format!("failed to calculate sha256 on {}", self.target.display()))?;
|
.context(format!("failed to calculate sha256 on {}", self.image_data.display()))?;
|
||||||
let v: Vec<&str> = output.split_whitespace().collect();
|
let v: Vec<&str> = output.split_whitespace().collect();
|
||||||
let shasum = v[0].trim().to_owned();
|
let shasum = v[0].trim().to_owned();
|
||||||
info!("Sha256 of image data is {}", shasum);
|
info!("Sha256 of image data is {}", shasum);
|
||||||
@ -98,7 +98,7 @@ impl UpdateBuilder {
|
|||||||
let hashfile = self.config.workdir_path(&format!("verity-hash-{}-{:03}", self.config.image_type(), self.config.version()));
|
let hashfile = self.config.workdir_path(&format!("verity-hash-{}-{:03}", self.config.image_type(), self.config.version()));
|
||||||
let outfile = self.config.workdir_path("verity-format.out");
|
let outfile = self.config.workdir_path("verity-format.out");
|
||||||
|
|
||||||
let verity = verity::generate_initial_hashtree(&self.target, &hashfile)?;
|
let verity = verity::generate_initial_hashtree(&self.image_data, &hashfile)?;
|
||||||
|
|
||||||
fs::write(outfile, verity.output())
|
fs::write(outfile, verity.output())
|
||||||
.context("failed to write veritysetup command output to a file")?;
|
.context("failed to write veritysetup command output to a file")?;
|
||||||
@ -123,25 +123,29 @@ impl UpdateBuilder {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn compress_image(&self) -> Result<()> {
|
fn compress_image(&self) -> Result<()> {
|
||||||
|
if self.config.compress() {
|
||||||
info!("Compressing image data");
|
info!("Compressing image data");
|
||||||
util::exec_cmdline("xz", format!("-T0 {}", self.target.display()))
|
util::exec_cmdline("xz", format!("-T0 {}", self.image_data.display()))
|
||||||
.context(format!("failed to decompress {}", self.target.display()))?;
|
.context(format!("failed to compress {}", self.image_data.display()))?;
|
||||||
|
// Rename back to original image_data filename
|
||||||
|
let xz_filename = UpdateBuilder::target_filename(&self.config) + ".xz";
|
||||||
|
fs::rename(self.config.workdir_path(&xz_filename), &self.image_data)?;
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_final_image(&self) -> Result<()> {
|
fn write_final_image(&self) -> Result<()> {
|
||||||
let header = self.generate_header()?;
|
let header = self.generate_header()?;
|
||||||
let filename = format!("{}.img", UpdateBuilder::target_filename(&self.config));
|
let filename = format!("{}.img", UpdateBuilder::target_filename(&self.config));
|
||||||
let mut image_path = self.config.workdir_path(&filename);
|
let image_path = self.config.workdir_path(&filename);
|
||||||
|
|
||||||
let mut out = File::create(&image_path)
|
let mut out = File::create(&image_path)
|
||||||
.context(format!("could not open output file {}", image_path.display()))?;
|
.context(format!("could not open output file {}", image_path.display()))?;
|
||||||
|
|
||||||
header.write_header(&out)?;
|
header.write_header(&out)?;
|
||||||
|
|
||||||
image_path.set_extension("xz");
|
let mut data = File::open(&self.image_data)
|
||||||
let mut data = File::open(&image_path)
|
.context(format!("could not open image data file {}", self.image_data.display()))?;
|
||||||
.context(format!("could not open compressed image data file {}", image_path.display()))?;
|
|
||||||
io::copy(&mut data, &mut out)
|
io::copy(&mut data, &mut out)
|
||||||
.context("error copying image data to output file")?;
|
.context("error copying image data to output file")?;
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -149,7 +153,10 @@ impl UpdateBuilder {
|
|||||||
|
|
||||||
fn generate_header(&self) -> Result<ImageHeader> {
|
fn generate_header(&self) -> Result<ImageHeader> {
|
||||||
let hdr = ImageHeader::new();
|
let hdr = ImageHeader::new();
|
||||||
|
|
||||||
|
if self.config.compress() {
|
||||||
hdr.set_flag(ImageHeader::FLAG_DATA_COMPRESSED);
|
hdr.set_flag(ImageHeader::FLAG_DATA_COMPRESSED);
|
||||||
|
}
|
||||||
|
|
||||||
let metainfo = self.generate_metainfo();
|
let metainfo = self.generate_metainfo();
|
||||||
fs::write(self.config.workdir_path("metainfo"), &metainfo)?;
|
fs::write(self.config.workdir_path("metainfo"), &metainfo)?;
|
||||||
|
Loading…
Reference in New Issue
Block a user