blob: b989ad0233db63421ee7e7ac7d27afe88727dedc [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2022 The ChromiumOS Authors
Jae Hoon Kim886d60a2022-02-16 17:27:57 -08002# 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):
Alex Klein1699fab2022-09-08 08:46:06 -060019 """Returns a namespace for the CLI arguments."""
20 parser = commandline.ArgumentParser(description=__doc__)
21 parser.add_argument(
22 "--image",
23 type="path",
24 required=True,
25 help="The path to local image to build the quick "
26 "provision payloads for.",
27 )
28 parser.add_argument(
29 "--output",
30 type="path",
31 help="The output directory to generate quick "
32 "provision payloads for.",
33 default=".",
34 )
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080035
Alex Klein1699fab2022-09-08 08:46:06 -060036 opts = parser.parse_args(argv)
37 # Check if output is valid directory.
38 if not os.path.isdir(opts.output):
39 parser.error("Please pass in a valid output directory.")
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080040
Alex Klein1699fab2022-09-08 08:46:06 -060041 opts.Freeze()
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080042
Alex Klein1699fab2022-09-08 08:46:06 -060043 return opts
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080044
45
46def CreateKernelQuickProvisionPayload(image, output):
Alex Klein1699fab2022-09-08 08:46:06 -060047 with osutils.TempDir() as temp_dir:
48 # Extract kernel.
49 kern = os.path.join(temp_dir, "kern")
50 partition_lib.ExtractKernel(image, os.path.join(temp_dir, kern))
51 # Compress kernel.
52 cros_build_lib.CompressFile(
53 kern, os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_KERNEL)
54 )
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080055
56
57def CreateRootQuickProvisionPayload(image, output):
Alex Klein1699fab2022-09-08 08:46:06 -060058 with osutils.TempDir() as temp_dir:
59 # Extract root.
60 root = os.path.join(temp_dir, "root")
61 partition_lib.ExtractRoot(image, os.path.join(temp_dir, root))
62 # Compress root.
63 cros_build_lib.CompressFile(
64 root, os.path.join(output, constants.QUICK_PROVISION_PAYLOAD_ROOTFS)
65 )
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080066
67
68def CreateStatefulQuickProvisionPayload(image, output):
Alex Klein1699fab2022-09-08 08:46:06 -060069 # Create stateful quick provision payload.
70 paygen_stateful_payload_lib.GenerateStatefulPayload(image, output)
71 # Change output ownership of file.
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080072
73
74def main(argv):
Alex Klein1699fab2022-09-08 08:46:06 -060075 opts = ParseArguments(argv)
Jae Hoon Kim886d60a2022-02-16 17:27:57 -080076
Alex Klein1699fab2022-09-08 08:46:06 -060077 parallel.RunParallelSteps(
78 [
79 # Stateful generation is usually the slowest.
80 lambda: CreateStatefulQuickProvisionPayload(
81 opts.image, opts.output
82 ),
83 lambda: CreateKernelQuickProvisionPayload(opts.image, opts.output),
84 lambda: CreateRootQuickProvisionPayload(opts.image, opts.output),
85 ]
86 )