blob: 92ebbe570823397b4b7361075dbf4829aa7d67e7 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2015 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Alex Deymof1cbe172015-03-05 15:58:37 -080016
17#ifndef UPDATE_ENGINE_PAYLOAD_GENERATOR_PAYLOAD_GENERATION_CONFIG_H_
18#define UPDATE_ENGINE_PAYLOAD_GENERATOR_PAYLOAD_GENERATION_CONFIG_H_
19
20#include <cstddef>
21
Alex Deymob42b98d2015-07-06 17:42:38 -070022#include <memory>
Alex Deymof1cbe172015-03-05 15:58:37 -080023#include <string>
24#include <vector>
25
Sen Jiang05feee02015-11-11 15:59:49 -080026#include <brillo/key_value_store.h>
27
Alex Deymo39910dc2015-11-09 17:04:30 -080028#include "update_engine/payload_consumer/payload_constants.h"
Alex Deymob42b98d2015-07-06 17:42:38 -070029#include "update_engine/payload_generator/filesystem_interface.h"
Alex Deymof1cbe172015-03-05 15:58:37 -080030#include "update_engine/update_metadata.pb.h"
31
32namespace chromeos_update_engine {
33
Sen Jiang05feee02015-11-11 15:59:49 -080034struct PostInstallConfig {
35 // Whether the postinstall config is empty.
36 bool IsEmpty() const;
37
38 // Whether this partition carries a filesystem with post-install program that
39 // must be run to finalize the update process.
40 bool run = false;
41
42 // The path to the post-install program relative to the root of this
43 // filesystem.
44 std::string path;
45
46 // The filesystem type used to mount the partition in order to run the
47 // post-install program.
48 std::string filesystem_type;
49};
50
Alex Deymo35589c22015-06-07 17:33:18 +020051struct PartitionConfig {
Sen Jiang625406c2015-09-16 16:35:23 -070052 explicit PartitionConfig(std::string name) : name(name) {}
Alex Deymo14158572015-06-13 03:37:08 -070053
Alex Deymo35589c22015-06-07 17:33:18 +020054 // Returns whether the PartitionConfig is not an empty image and all the
55 // fields are set correctly to a valid image file.
56 bool ValidateExists() const;
57
Alex Deymob42b98d2015-07-06 17:42:38 -070058 // Open then filesystem stored in this partition and stores it in
59 // |fs_interface|. Returns whether opening the filesystem worked.
60 bool OpenFilesystem();
61
Alex Deymo35589c22015-06-07 17:33:18 +020062 // The path to the partition file. This can be a regular file or a block
63 // device such as a loop device.
64 std::string path;
65
66 // The size of the data in |path|. If rootfs verification is used (verity)
67 // this value should match the size of the verity device for the rootfs, and
68 // the size of the whole kernel. This value could be smaller than the
69 // partition and is the size of the data update_engine assumes verified for
70 // the source image, and the size of that data it should generate for the
71 // target image.
72 uint64_t size = 0;
Alex Deymo14158572015-06-13 03:37:08 -070073
Alex Deymob42b98d2015-07-06 17:42:38 -070074 // The FilesystemInterface implementation used to access this partition's
75 // files.
76 std::unique_ptr<FilesystemInterface> fs_interface;
77
Sen Jiang625406c2015-09-16 16:35:23 -070078 std::string name;
Sen Jiang05feee02015-11-11 15:59:49 -080079
80 PostInstallConfig postinstall;
Alex Deymo35589c22015-06-07 17:33:18 +020081};
82
Alex Deymof1cbe172015-03-05 15:58:37 -080083// The ImageConfig struct describes a pair of binaries kernel and rootfs and the
84// metadata associated with the image they are part of, like build number, size,
85// etc.
86struct ImageConfig {
87 // Returns whether the ImageConfig is an empty image.
88 bool ValidateIsEmpty() const;
89
Alex Deymo35589c22015-06-07 17:33:18 +020090 // Load |rootfs_size| and |kernel.size| from the respective image files. For
91 // the kernel, the whole |kernel.path| file is assumed. For the rootfs, the
Alex Deymof1cbe172015-03-05 15:58:37 -080092 // size is detected from the filesystem.
93 // Returns whether the image size was properly detected.
94 bool LoadImageSize();
95
Sen Jiang05feee02015-11-11 15:59:49 -080096 // Load postinstall config from a key value store.
97 bool LoadPostInstallConfig(const brillo::KeyValueStore& store);
98
Alex Deymof1cbe172015-03-05 15:58:37 -080099 // Returns whether the |image_info| field is empty.
100 bool ImageInfoIsEmpty() const;
101
102 // The ImageInfo message defined in the update_metadata.proto file describes
103 // the metadata of the image.
104 ImageInfo image_info;
105
Alex Deymo35589c22015-06-07 17:33:18 +0200106 // The updated partitions.
Sen Jiang981eb112015-08-25 17:03:18 -0700107 std::vector<PartitionConfig> partitions;
Alex Deymof1cbe172015-03-05 15:58:37 -0800108};
109
110// The PayloadGenerationConfig struct encapsulates all the configuration to
111// build the requested payload. This includes information about the old and new
112// image as well as the restrictions applied to the payload (like minor-version
113// and full/delta payload).
114struct PayloadGenerationConfig {
115 // Returns whether the PayloadGenerationConfig is valid.
116 bool Validate() const;
117
118 // Image information about the new image that's the target of this payload.
119 ImageConfig target;
120
121 // Image information pertaining the old image, if any. This is only valid
122 // if is_full is false, so we are requested a delta payload.
123 ImageConfig source;
124
125 // Wheter the requested payload is a delta payload.
126 bool is_delta = false;
127
Sen Jiang55c4f9b2016-02-10 11:26:20 -0800128 // Wheter the IMGDIFF operation is allowed.
129 bool imgdiff_allowed = false;
130
Sen Jiang46e9b172015-08-31 14:11:01 -0700131 // The major_version of the requested payload.
132 uint64_t major_version;
133
Alex Deymof1cbe172015-03-05 15:58:37 -0800134 // The minor_version of the requested payload.
135 uint32_t minor_version;
136
Alex Deymo9b244df2015-03-11 21:51:18 -0700137 // The size of the rootfs partition, that not necessarily is the same as the
138 // filesystem in either source or target version, since there is some space
139 // after the partition used to store the verity hashes and or the bootcache.
140 uint64_t rootfs_partition_size = 0;
141
Alex Deymo2d3b2d62015-07-17 17:34:36 -0700142 // The |hard_chunk_size| is the maximum size that a single operation should
143 // write in the destination. Operations bigger than chunk_size should be
144 // split. A value of -1 means no hard chunk size limit. A very low limit
145 // means more operations, and less of a chance to reuse the data.
146 ssize_t hard_chunk_size = -1;
147
148 // The |soft_chunk_size| is the preferred chunk size to use when there's no
149 // significant impact to the operations. For example, REPLACE, MOVE and
150 // SOURCE_COPY operations are not significantly impacted by the chunk size,
151 // except for a few bytes overhead in the manifest to describe extra
152 // operations. On the other hand, splitting BSDIFF operations impacts the
153 // payload size since it is not possible to use the redundancy *between*
154 // chunks.
155 size_t soft_chunk_size = 2 * 1024 * 1024;
Alex Deymof1cbe172015-03-05 15:58:37 -0800156
157 // TODO(deymo): Remove the block_size member and maybe replace it with a
Alex Deymo35589c22015-06-07 17:33:18 +0200158 // minimum alignment size for blocks (if needed). Algorithms should be able to
Alex Deymof1cbe172015-03-05 15:58:37 -0800159 // pick the block_size they want, but for now only 4 KiB is supported.
160
161 // The block size used for all the operations in the manifest.
162 size_t block_size = 4096;
163};
164
165} // namespace chromeos_update_engine
166
167#endif // UPDATE_ENGINE_PAYLOAD_GENERATOR_PAYLOAD_GENERATION_CONFIG_H_