diff options
author | Tianjie Xu <xunchang@google.com> | 2020-07-06 21:23:45 +0000 |
---|---|---|
committer | Tianjie Xu <xunchang@google.com> | 2020-07-06 21:23:45 +0000 |
commit | 242e33af30f7aa74531d436e1609100aae3b4394 (patch) | |
tree | 048c16c3935bac60f150f676ad8f8d8493248ce1 /payload_generator/generate_delta_main.cc | |
parent | 33d180914ef2cb9286595fb1fdcc3511c5fb1c34 (diff) | |
parent | 55abd3cbae6bd150b3534728a63befd1cadd6c5e (diff) |
Merge "Merge remote-tracking branch 'aosp/upstream-master' into merge"
Diffstat (limited to 'payload_generator/generate_delta_main.cc')
-rw-r--r-- | payload_generator/generate_delta_main.cc | 75 |
1 files changed, 50 insertions, 25 deletions
diff --git a/payload_generator/generate_delta_main.cc b/payload_generator/generate_delta_main.cc index f035ff16..f7df2118 100644 --- a/payload_generator/generate_delta_main.cc +++ b/payload_generator/generate_delta_main.cc @@ -38,6 +38,7 @@ #include "update_engine/payload_consumer/payload_constants.h" #include "update_engine/payload_generator/delta_diff_generator.h" #include "update_engine/payload_generator/payload_generation_config.h" +#include "update_engine/payload_generator/payload_properties.h" #include "update_engine/payload_generator/payload_signer.h" #include "update_engine/payload_generator/xz.h" #include "update_engine/update_metadata.pb.h" @@ -53,6 +54,9 @@ namespace chromeos_update_engine { namespace { +constexpr char kPayloadPropertiesFormatKeyValue[] = "key-value"; +constexpr char kPayloadPropertiesFormatJson[] = "json"; + void ParseSignatureSizes(const string& signature_sizes_flag, vector<size_t>* signature_sizes) { signature_sizes->clear(); @@ -267,14 +271,24 @@ bool ApplyPayload(const string& payload_file, return true; } -int ExtractProperties(const string& payload_path, const string& props_file) { - brillo::KeyValueStore properties; - TEST_AND_RETURN_FALSE( - PayloadSigner::ExtractPayloadProperties(payload_path, &properties)); +bool ExtractProperties(const string& payload_path, + const string& props_file, + const string& props_format) { + string properties; + PayloadProperties payload_props(payload_path); + if (props_format == kPayloadPropertiesFormatKeyValue) { + TEST_AND_RETURN_FALSE(payload_props.GetPropertiesAsKeyValue(&properties)); + } else if (props_format == kPayloadPropertiesFormatJson) { + TEST_AND_RETURN_FALSE(payload_props.GetPropertiesAsJson(&properties)); + } else { + LOG(FATAL) << "Invalid option " << props_format + << " for --properties_format flag."; + } if (props_file == "-") { - printf("%s", properties.SaveToString().c_str()); + printf("%s", properties.c_str()); } else { - properties.Save(base::FilePath(props_file)); + utils::WriteFile( + props_file.c_str(), properties.c_str(), properties.length()); LOG(INFO) << "Generated properties file at " << props_file; } return true; @@ -361,7 +375,11 @@ int Main(int argc, char** argv) { DEFINE_string(properties_file, "", "If passed, dumps the payload properties of the payload passed " - "in --in_file and exits."); + "in --in_file and exits. Look at --properties_format."); + DEFINE_string(properties_format, + kPayloadPropertiesFormatKeyValue, + "Defines the format of the --properties_file. The acceptable " + "values are: key-value (default) and json"); DEFINE_int64(max_timestamp, 0, "The maximum timestamp of the OS allowed to apply this " @@ -500,7 +518,10 @@ int Main(int argc, char** argv) { return VerifySignedPayload(FLAGS_in_file, FLAGS_public_key); } if (!FLAGS_properties_file.empty()) { - return ExtractProperties(FLAGS_in_file, FLAGS_properties_file) ? 0 : 1; + return ExtractProperties( + FLAGS_in_file, FLAGS_properties_file, FLAGS_properties_format) + ? 0 + : 1; } // A payload generation was requested. Convert the flags to a @@ -521,16 +542,10 @@ int Main(int argc, char** argv) { partition_names = base::SplitString( FLAGS_partition_names, ":", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); CHECK(!partition_names.empty()); - if (FLAGS_major_version == kChromeOSMajorPayloadVersion || - FLAGS_new_partitions.empty()) { - LOG_IF(FATAL, partition_names.size() != 2) - << "To support more than 2 partitions, please use the " - << "--new_partitions flag and major version 2."; - LOG_IF(FATAL, - partition_names[0] != kPartitionNameRoot || - partition_names[1] != kPartitionNameKernel) - << "To support non-default partition name, please use the " - << "--new_partitions flag and major version 2."; + if (FLAGS_major_version < kMinSupportedMajorPayloadVersion || + FLAGS_major_version > kMaxSupportedMajorPayloadVersion) { + LOG(FATAL) << "Unsupported major version " << FLAGS_major_version; + return 1; } if (!FLAGS_new_partitions.empty()) { @@ -591,8 +606,6 @@ int Main(int argc, char** argv) { } if (!FLAGS_new_postinstall_config_file.empty()) { - LOG_IF(FATAL, FLAGS_major_version == kChromeOSMajorPayloadVersion) - << "Postinstall config is only allowed in major version 2 or newer."; brillo::KeyValueStore store; CHECK(store.Load(base::FilePath(FLAGS_new_postinstall_config_file))); CHECK(payload_config.target.LoadPostInstallConfig(store)); @@ -610,9 +623,6 @@ int Main(int argc, char** argv) { CHECK(payload_config.target.LoadImageSize()); if (!FLAGS_dynamic_partition_info_file.empty()) { - LOG_IF(FATAL, FLAGS_major_version == kChromeOSMajorPayloadVersion) - << "Dynamic partition info is only allowed in major version 2 or " - "newer."; brillo::KeyValueStore store; CHECK(store.Load(base::FilePath(FLAGS_dynamic_partition_info_file))); CHECK(payload_config.target.LoadDynamicPartitionMetadata(store)); @@ -656,25 +666,40 @@ int Main(int argc, char** argv) { // Autodetect minor_version by looking at the update_engine.conf in the old // image. if (payload_config.is_delta) { - payload_config.version.minor = kInPlaceMinorPayloadVersion; brillo::KeyValueStore store; uint32_t minor_version; + bool minor_version_found = false; for (const PartitionConfig& part : payload_config.source.partitions) { if (part.fs_interface && part.fs_interface->LoadSettings(&store) && utils::GetMinorVersion(store, &minor_version)) { payload_config.version.minor = minor_version; + minor_version_found = true; + LOG(INFO) << "Auto-detected minor_version=" + << payload_config.version.minor; break; } } + if (!minor_version_found) { + LOG(FATAL) << "Failed to detect the minor version."; + return 1; + } } else { payload_config.version.minor = kFullPayloadMinorVersion; + LOG(INFO) << "Using non-delta minor_version=" + << payload_config.version.minor; } - LOG(INFO) << "Auto-detected minor_version=" << payload_config.version.minor; } else { payload_config.version.minor = FLAGS_minor_version; LOG(INFO) << "Using provided minor_version=" << FLAGS_minor_version; } + if (payload_config.version.minor != kFullPayloadMinorVersion && + (payload_config.version.minor < kMinSupportedMinorPayloadVersion || + payload_config.version.minor > kMaxSupportedMinorPayloadVersion)) { + LOG(FATAL) << "Unsupported minor version " << payload_config.version.minor; + return 1; + } + payload_config.max_timestamp = FLAGS_max_timestamp; if (payload_config.version.minor >= kVerityMinorPayloadVersion) |