Module: Tebako::LayeredPackage

Defined in:
lib/tebako/layered_package.rb

Overview

Writes application packages made from independently reusable DwarFS images.

Defined Under Namespace

Classes: InspectedLayer, Inspection, Layer

Constant Summary collapse

MAGIC =
Tebako::Generated::LayeredFormat::MAGIC

Class Method Summary collapse

Class Method Details

.inspect(path) ⇒ Object



53
54
55
# File 'lib/tebako/layered_package.rb', line 53

def inspect(path)
  inspect_bytes(File.binread(path))
end

.inspect_bytes(package) ⇒ Object

Raises:

  • (ArgumentError)


57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/tebako/layered_package.rb', line 57

def inspect_bytes(package)
  raise ArgumentError, "Package is too small for a layered footer" if package.bytesize < footer_size
  raise ArgumentError, "Package is not a supported layered package" unless package.end_with?(MAGIC)

  manifest_size = package.byteslice(-footer_size, 8).unpack1("Q<")
  footer_offset = package.bytesize - footer_size
  raise ArgumentError, "Invalid layer manifest size" if manifest_size > footer_offset

  manifest_offset = footer_offset - manifest_size
  layers = decode_manifest(package, manifest_offset, footer_offset)
  Inspection.new(
    format: "layered",
    major_version: Tebako::Generated::LayeredFormat::MAJOR_VERSION,
    minor_version: Tebako::Generated::LayeredFormat::MINOR_VERSION,
    descriptor_size: layers.map(&:offset).min,
    byte_size: package.bytesize,
    sha256: Digest::SHA256.hexdigest(package),
    layers: layers
  )
end

.write(output, descriptor:, layers:) ⇒ Object



43
44
45
46
47
48
49
50
51
# File 'lib/tebako/layered_package.rb', line 43

def write(output, descriptor:, layers:)
  validate_layers(layers)
  FileUtils.mkdir_p(File.dirname(File.expand_path(output)))
  temporary = "#{output}.#{Process.pid}.tmp"
  write_package(temporary, descriptor, layers)
  File.rename(temporary, output)
ensure
  FileUtils.rm_f(temporary) if temporary
end