blob: 0d535f7bab68c3cf63073c3272e49e32bfecd6e0 [file] [log] [blame]
# Copyright 2022 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Script to generate Chromium OS quick provision payloads."""
import os
from chromite.lib import commandline
from chromite.lib import constants
from chromite.lib import cros_build_lib
from chromite.lib import osutils
from chromite.lib import parallel
from chromite.lib.paygen import partition_lib
from chromite.lib.paygen import paygen_stateful_payload_lib
def ParseArguments(argv):
"""Returns a namespace for the CLI arguments."""
parser = commandline.ArgumentParser(description=__doc__)
parser.add_argument('--image', type='path', required=True,
help='The path to local image to build the quick '
'provision payloads for.')
parser.add_argument('--output', type='path',
help='The output directory to generate quick '
'provision payloads for.', default='.')
opts = parser.parse_args(argv)
# Check if output is valid directory.
if not os.path.isdir(opts.output):
parser.error('Please pass in a valid output directory.')
opts.Freeze()
return opts
def CreateKernelQuickProvisionPayload(image, output):
with osutils.TempDir() as temp_dir:
# Extract kernel.
kern = os.path.join(temp_dir, 'kern')
partition_lib.ExtractKernel(image, os.path.join(temp_dir, kern))
# Compress kernel.
cros_build_lib.CompressFile(
kern,
os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_KERNEL))
def CreateRootQuickProvisionPayload(image, output):
with osutils.TempDir() as temp_dir:
# Extract root.
root = os.path.join(temp_dir, 'root')
partition_lib.ExtractRoot(image, os.path.join(temp_dir, root))
# Compress root.
cros_build_lib.CompressFile(
root,
os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_ROOTFS))
def CreateStatefulQuickProvisionPayload(image, output):
# Create stateful quick provision payload.
paygen_stateful_payload_lib.GenerateStatefulPayload(image, output)
# Change output ownership of file.
def main(argv):
opts = ParseArguments(argv)
parallel.RunParallelSteps([
# Stateful generation is usually the slowest.
lambda: CreateStatefulQuickProvisionPayload(opts.image, opts.output),
lambda: CreateKernelQuickProvisionPayload(opts.image, opts.output),
lambda: CreateRootQuickProvisionPayload(opts.image, opts.output),
])