blob: 0d535f7bab68c3cf63073c3272e49e32bfecd6e0 [file] [log] [blame]
Jae Hoon Kim886d60a2022-02-16 17:27:57 -08001# Copyright 2022 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Script to generate Chromium OS quick provision payloads."""
6
7import os
8
9from chromite.lib import commandline
10from chromite.lib import constants
11from chromite.lib import cros_build_lib
12from chromite.lib import osutils
13from chromite.lib import parallel
14from chromite.lib.paygen import partition_lib
15from chromite.lib.paygen import paygen_stateful_payload_lib
16
17
18def ParseArguments(argv):
19 """Returns a namespace for the CLI arguments."""
20 parser = commandline.ArgumentParser(description=__doc__)
21 parser.add_argument('--image', type='path', required=True,
22 help='The path to local image to build the quick '
23 'provision payloads for.')
24 parser.add_argument('--output', type='path',
25 help='The output directory to generate quick '
26 'provision payloads for.', default='.')
27
28 opts = parser.parse_args(argv)
29 # Check if output is valid directory.
30 if not os.path.isdir(opts.output):
31 parser.error('Please pass in a valid output directory.')
32
33 opts.Freeze()
34
35 return opts
36
37
38def CreateKernelQuickProvisionPayload(image, output):
39 with osutils.TempDir() as temp_dir:
40 # Extract kernel.
41 kern = os.path.join(temp_dir, 'kern')
42 partition_lib.ExtractKernel(image, os.path.join(temp_dir, kern))
43 # Compress kernel.
44 cros_build_lib.CompressFile(
45 kern,
46 os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_KERNEL))
47
48
49def CreateRootQuickProvisionPayload(image, output):
50 with osutils.TempDir() as temp_dir:
51 # Extract root.
52 root = os.path.join(temp_dir, 'root')
53 partition_lib.ExtractRoot(image, os.path.join(temp_dir, root))
54 # Compress root.
55 cros_build_lib.CompressFile(
56 root,
57 os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_ROOTFS))
58
59
60def CreateStatefulQuickProvisionPayload(image, output):
61 # Create stateful quick provision payload.
62 paygen_stateful_payload_lib.GenerateStatefulPayload(image, output)
63 # Change output ownership of file.
64
65
66def main(argv):
67 opts = ParseArguments(argv)
68
69 parallel.RunParallelSteps([
70 # Stateful generation is usually the slowest.
71 lambda: CreateStatefulQuickProvisionPayload(opts.image, opts.output),
72 lambda: CreateKernelQuickProvisionPayload(opts.image, opts.output),
73 lambda: CreateRootQuickProvisionPayload(opts.image, opts.output),
74 ])