update_attempter_android.cc revision 7ecda265a87236e83cf820364947a1618872b6be
15e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// 25e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// Copyright (C) 2016 The Android Open Source Project 35e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// 45e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 55e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// you may not use this file except in compliance with the License. 65e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// You may obtain a copy of the License at 75e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// 85e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// http://www.apache.org/licenses/LICENSE-2.0 95e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// 105e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// Unless required by applicable law or agreed to in writing, software 115e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 125e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// See the License for the specific language governing permissions and 145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// limitations under the License. 155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// 165e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 175e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/update_attempter_android.h" 185e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 195e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <algorithm> 20218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo#include <map> 215e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <utility> 225e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 235e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <base/bind.h> 245e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <base/logging.h> 25218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo#include <base/strings/string_number_conversions.h> 265e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <brillo/bind_lambda.h> 275e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include <brillo/message_loops/message_loop.h> 28218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo#include <brillo/strings/string_utils.h> 295e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 305e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/common/constants.h" 312c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo#include "update_engine/common/file_fetcher.h" 325e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/common/multi_range_http_fetcher.h" 335e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/common/utils.h" 3403a4de7dc77b058987fc0670f4f67ba10ff31bc8Alex Deymo#include "update_engine/daemon_state_interface.h" 3587792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo#include "update_engine/network_selector.h" 365e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/payload_consumer/download_action.h" 375e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/payload_consumer/filesystem_verifier_action.h" 385e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo#include "update_engine/payload_consumer/postinstall_runner_action.h" 393b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo#include "update_engine/update_status_utils.h" 405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4114c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#ifndef _UE_SIDELOAD 4214c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo// Do not include support for external HTTP(s) urls when building 4314c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo// update_engine_sideload. 4414c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#include "update_engine/libcurl_http_fetcher.h" 4514c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#endif 4614c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo 475e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing base::Bind; 485e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing base::TimeDelta; 495e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing base::TimeTicks; 505e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing std::shared_ptr; 515e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing std::string; 525e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymousing std::vector; 535e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 545e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymonamespace chromeos_update_engine { 555e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 565e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymonamespace { 575e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 580d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo// Minimum threshold to broadcast an status update in progress and time. 590d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoconst double kBroadcastThresholdProgress = 0.01; // 1% 600d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymoconst int kBroadcastThresholdSeconds = 10; 610d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo 625e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymoconst char* const kErrorDomain = "update_engine"; 635e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// TODO(deymo): Convert the different errors to a numeric value to report them 645e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// back on the service error. 655e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymoconst char* const kGenericError = "generic_error"; 665e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 675e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo// Log and set the error on the passed ErrorPtr. 685e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool LogAndSetError(brillo::ErrorPtr* error, 695e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const tracked_objects::Location& location, 705e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const string& reason) { 715e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo brillo::Error::AddTo(error, location, kErrorDomain, kGenericError, reason); 725e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(ERROR) << "Replying with failure: " << location.ToString() << ": " 735e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo << reason; 745e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return false; 755e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 765e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 775e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} // namespace 785e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 795e3ea278d9e771be3b51bd72985ad582678baddcAlex DeymoUpdateAttempterAndroid::UpdateAttempterAndroid( 8003a4de7dc77b058987fc0670f4f67ba10ff31bc8Alex Deymo DaemonStateInterface* daemon_state, 815e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo PrefsInterface* prefs, 825e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo BootControlInterface* boot_control, 835e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo HardwareInterface* hardware) 845e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo : daemon_state_(daemon_state), 855e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo prefs_(prefs), 865e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo boot_control_(boot_control), 875e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo hardware_(hardware), 885e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo processor_(new ActionProcessor()) { 8987792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo network_selector_ = network::CreateNetworkSelector(); 905e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 915e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 925e3ea278d9e771be3b51bd72985ad582678baddcAlex DeymoUpdateAttempterAndroid::~UpdateAttempterAndroid() { 935e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Release ourselves as the ActionProcessor's delegate to prevent 945e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // re-scheduling the updates due to the processing stopped. 955e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo processor_->set_delegate(nullptr); 965e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 975e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 985e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::Init() { 995e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // In case of update_engine restart without a reboot we need to restore the 1005e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // reboot needed state. 1015e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (UpdateCompletedOnThisBoot()) 1020e061aebc651e041b6d1d8a3a91834feb87e0d62Alex Deymo SetStatusAndNotify(UpdateStatus::UPDATED_NEED_REBOOT); 1035e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo else 1040e061aebc651e041b6d1d8a3a91834feb87e0d62Alex Deymo SetStatusAndNotify(UpdateStatus::IDLE); 1055e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 1065e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 1075e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::ApplyPayload( 1085e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const string& payload_url, 1095e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo int64_t payload_offset, 1105e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo int64_t payload_size, 1115e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const vector<string>& key_value_pair_headers, 1125e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo brillo::ErrorPtr* error) { 1135e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (status_ == UpdateStatus::UPDATED_NEED_REBOOT) { 1145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return LogAndSetError( 1155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo error, FROM_HERE, "An update already applied, waiting for reboot"); 1165e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 1175e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (ongoing_update_) { 1185e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return LogAndSetError( 1195e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo error, FROM_HERE, "Already processing an update, cancel it first."); 1205e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 1215e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo DCHECK(status_ == UpdateStatus::IDLE); 1225e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 123218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo std::map<string, string> headers; 124218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo for (const string& key_value_pair : key_value_pair_headers) { 125218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo string key; 126218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo string value; 127218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo if (!brillo::string_utils::SplitAtFirst( 128218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo key_value_pair, "=", &key, &value, false)) { 129218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo return LogAndSetError( 130218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo error, FROM_HERE, "Passed invalid header: " + key_value_pair); 131218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo } 132218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo if (!headers.emplace(key, value).second) 133218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo return LogAndSetError(error, FROM_HERE, "Passed repeated key: " + key); 134218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo } 135218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo 136218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo // Unique identifier for the payload. An empty string means that the payload 137218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo // can't be resumed. 138218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo string payload_id = (headers[kPayloadPropertyFileHash] + 139218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo headers[kPayloadPropertyMetadataHash]); 1405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 1415e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Setup the InstallPlan based on the request. 1425e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_ = InstallPlan(); 1435e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 1445e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.download_url = payload_url; 1455e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.version = ""; 1460fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo base_offset_ = payload_offset; 147218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo install_plan_.payload_size = payload_size; 148218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo if (!install_plan_.payload_size) { 149218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo if (!base::StringToUint64(headers[kPayloadPropertyFileSize], 150218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo &install_plan_.payload_size)) { 151218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo install_plan_.payload_size = 0; 152218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo } 153218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo } 154218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo install_plan_.payload_hash = headers[kPayloadPropertyFileHash]; 155218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo if (!base::StringToUint64(headers[kPayloadPropertyMetadataSize], 156218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo &install_plan_.metadata_size)) { 157218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo install_plan_.metadata_size = 0; 158218397ff42cbef9f1b95fdfe30e8e82145ba9908Alex Deymo } 1595e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.metadata_signature = ""; 1605e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // The |public_key_rsa| key would override the public key stored on disk. 1615e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.public_key_rsa = ""; 1625e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 1635e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.hash_checks_mandatory = hardware_->IsOfficialBuild(); 1645e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.is_resume = !payload_id.empty() && 1655e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo DeltaPerformer::CanResumeUpdate(prefs_, payload_id); 1665e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (!install_plan_.is_resume) { 1675e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (!DeltaPerformer::ResetUpdateProgress(prefs_, false)) { 1685e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(WARNING) << "Unable to reset the update progress."; 1695e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 1705e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (!prefs_->SetString(kPrefsUpdateCheckResponseHash, payload_id)) { 1715e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(WARNING) << "Unable to save the update check response hash."; 1725e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 1735e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 17464d9878470aa7b388e971862181daf6260851602Alex Deymo // The |payload_type| is not used anymore since minor_version 3. 17564d9878470aa7b388e971862181daf6260851602Alex Deymo install_plan_.payload_type = InstallPayloadType::kUnknown; 1765e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 1775e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.source_slot = boot_control_->GetCurrentSlot(); 1785e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.target_slot = install_plan_.source_slot == 0 ? 1 : 0; 179fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo 180fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo int data_wipe = 0; 181fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo install_plan_.powerwash_required = 182fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo base::StringToInt(headers[kPayloadPropertyPowerwash], &data_wipe) && 183fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo data_wipe != 0; 1845e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 18587792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo NetworkId network_id = kDefaultNetworkId; 18687792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo if (!headers[kPayloadPropertyNetworkId].empty()) { 18787792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo if (!base::StringToUint64(headers[kPayloadPropertyNetworkId], 18887792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo &network_id)) { 18987792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo return LogAndSetError( 19087792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo error, 19187792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo FROM_HERE, 19287792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo "Invalid network_id: " + headers[kPayloadPropertyNetworkId]); 19387792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo } 19487792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo if (!network_selector_->SetProcessNetwork(network_id)) { 19587792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo LOG(WARNING) << "Unable to set network_id, continuing with the update."; 19687792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo } 19787792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo } 19887792ea818a63f2d246bbba2b7429b85ee8d669fAlex Deymo 1995e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(INFO) << "Using this install plan:"; 2005e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo install_plan_.Dump(); 2015e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2022c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo BuildUpdateActions(payload_url); 2035e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo SetupDownload(); 204fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo // Setup extra headers. 205fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo HttpFetcher* fetcher = download_action_->http_fetcher(); 206fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo if (!headers[kPayloadPropertyAuthorization].empty()) 207fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo fetcher->SetHeader("Authorization", headers[kPayloadPropertyAuthorization]); 208fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo if (!headers[kPayloadPropertyUserAgent].empty()) 209fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo fetcher->SetHeader("User-Agent", headers[kPayloadPropertyUserAgent]); 210fdd6dec9c4be2fbd667cf874c4cc6f4ffecaeef9Alex Deymo 2115e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo SetStatusAndNotify(UpdateStatus::UPDATE_AVAILABLE); 212f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo ongoing_update_ = true; 2135e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Just in case we didn't update boot flags yet, make sure they're updated 2155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // before any update processing starts. This will start the update process. 2165e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo UpdateBootFlags(); 2175e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return true; 2185e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 2195e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2205e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::SuspendUpdate(brillo::ErrorPtr* error) { 221f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo if (!ongoing_update_) 222f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo return LogAndSetError(error, FROM_HERE, "No ongoing update to suspend."); 223f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo processor_->SuspendProcessing(); 224f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo return true; 2255e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 2265e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2275e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::ResumeUpdate(brillo::ErrorPtr* error) { 228f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo if (!ongoing_update_) 229f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo return LogAndSetError(error, FROM_HERE, "No ongoing update to resume."); 230f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo processor_->ResumeProcessing(); 231f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo return true; 2325e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 2335e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2345e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::CancelUpdate(brillo::ErrorPtr* error) { 235f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo if (!ongoing_update_) 2365e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return LogAndSetError(error, FROM_HERE, "No ongoing update to cancel."); 237f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo processor_->StopProcessing(); 238f28585764e91b7c25a7c2856ff645c8bb22d64a9Alex Deymo return true; 2395e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 2405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2413b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymobool UpdateAttempterAndroid::ResetStatus(brillo::ErrorPtr* error) { 2423b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo LOG(INFO) << "Attempting to reset state from " 2433b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo << UpdateStatusToString(status_) << " to UpdateStatus::IDLE"; 2443b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2453b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo switch (status_) { 2463b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo case UpdateStatus::IDLE: 2473b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo return true; 2483b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2493b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo case UpdateStatus::UPDATED_NEED_REBOOT: { 2503b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo // Remove the reboot marker so that if the machine is rebooted 2513b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo // after resetting to idle state, it doesn't go back to 2523b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo // UpdateStatus::UPDATED_NEED_REBOOT state. 2533b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo bool ret_value = prefs_->Delete(kPrefsUpdateCompletedOnBootId); 2543b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2553b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo // Update the boot flags so the current slot has higher priority. 2563b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo if (!boot_control_->SetActiveBootSlot(boot_control_->GetCurrentSlot())) 2573b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo ret_value = false; 2583b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2595259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo // Mark the current slot as successful again, since marking it as active 2605259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo // may reset the successful bit. We ignore the result of whether marking 2615259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo // the current slot as successful worked. 2625259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo if (!boot_control_->MarkBootSuccessfulAsync(Bind([](bool successful){}))) 2635259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo ret_value = false; 2645259033d23938ce3ce20e4a9b599be0eec113610Alex Deymo 2653b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo if (!ret_value) { 2663b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo return LogAndSetError( 2673b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo error, 2683b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo FROM_HERE, 2693b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo "Failed to reset the status to "); 2703b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo } 2713b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2723b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo SetStatusAndNotify(UpdateStatus::IDLE); 2733b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo LOG(INFO) << "Reset status successful"; 2743b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo return true; 2753b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo } 2763b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2773b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo default: 2783b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo return LogAndSetError( 2793b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo error, 2803b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo FROM_HERE, 2813b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo "Reset not allowed in this state. Cancel the ongoing update first"); 2823b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo } 2833b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo} 2843b678db2e7fd4baa38c6d6b8bb8334f7d88b8682Alex Deymo 2855e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::ProcessingDone(const ActionProcessor* processor, 2865e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo ErrorCode code) { 2875e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(INFO) << "Processing Done."; 2885e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 2895990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo switch (code) { 2905990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kSuccess: 2915990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo // Update succeeded. 2925990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo WriteUpdateCompletedMarker(); 2935990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo prefs_->SetInt64(kPrefsDeltaUpdateFailures, 0); 2945990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo DeltaPerformer::ResetUpdateProgress(prefs_, false); 2955990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo 2965990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo LOG(INFO) << "Update successfully applied, waiting to reboot."; 2975990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo break; 2985990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo 2995990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kFilesystemCopierError: 3005990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kNewRootfsVerificationError: 3015990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kNewKernelVerificationError: 3025990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kFilesystemVerifierError: 3035990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo case ErrorCode::kDownloadStateInitializationError: 3045990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo // Reset the ongoing update for these errors so it starts from the 3055990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo // beginning next time. 3065990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo DeltaPerformer::ResetUpdateProgress(prefs_, false); 3075990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo LOG(INFO) << "Resetting update progress."; 3085990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo break; 3095e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3105990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo default: 3115990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo // Ignore all other error codes. 3125990bf33b50beec0caf55a97f5ca87608ccbc694Alex Deymo break; 31303a4de7dc77b058987fc0670f4f67ba10ff31bc8Alex Deymo } 3145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo TerminateUpdateAndNotify(code); 3165e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3175e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3185e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::ProcessingStopped( 3195e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const ActionProcessor* processor) { 3205e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo TerminateUpdateAndNotify(ErrorCode::kUserCanceled); 3215e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3225e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3235e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::ActionCompleted(ActionProcessor* processor, 3245e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo AbstractAction* action, 3255e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo ErrorCode code) { 3265e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Reset download progress regardless of whether or not the download 3275e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // action succeeded. 3285e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo const string type = action->Type(); 3295e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (type == DownloadAction::StaticType()) { 3300d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo download_progress_ = 0; 3315e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3325e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (code != ErrorCode::kSuccess) { 3335e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // If an action failed, the ActionProcessor will cancel the whole thing. 3345e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return; 3355e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3365e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (type == DownloadAction::StaticType()) { 3375e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo SetStatusAndNotify(UpdateStatus::FINALIZING); 3385e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3395e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3415e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::BytesReceived(uint64_t bytes_progressed, 3425e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo uint64_t bytes_received, 3435e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo uint64_t total) { 3440d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo double progress = 0; 3455e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (total) 3465e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo progress = static_cast<double>(bytes_received) / static_cast<double>(total); 3470d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo if (status_ != UpdateStatus::DOWNLOADING || bytes_received == total) { 3485e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo download_progress_ = progress; 3495e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo SetStatusAndNotify(UpdateStatus::DOWNLOADING); 3500d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo } else { 3510d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo ProgressUpdate(progress); 3525e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3535e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3545e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3555e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::ShouldCancel(ErrorCode* cancel_reason) { 3565e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // TODO(deymo): Notify the DownloadAction that it should cancel the update 3575e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // download. 3585e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return false; 3595e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3605e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3615e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::DownloadComplete() { 3625e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Nothing needs to be done when the download completes. 3635e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3645e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3650d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymovoid UpdateAttempterAndroid::ProgressUpdate(double progress) { 3660d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo // Self throttle based on progress. Also send notifications if progress is 3670d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo // too slow. 3680d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo if (progress == 1.0 || 3690d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo progress - download_progress_ >= kBroadcastThresholdProgress || 3700d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo TimeTicks::Now() - last_notify_time_ >= 3710d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo TimeDelta::FromSeconds(kBroadcastThresholdSeconds)) { 3720d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo download_progress_ = progress; 3730d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo SetStatusAndNotify(status_); 3740d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo } 3750d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo} 3760d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo 3775e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::UpdateBootFlags() { 3785e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (updated_boot_flags_) { 3795e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(INFO) << "Already updated boot flags. Skipping."; 3805e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo CompleteUpdateBootFlags(true); 3815e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return; 3825e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3835e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // This is purely best effort. 3845e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(INFO) << "Marking booted slot as good."; 3855e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (!boot_control_->MarkBootSuccessfulAsync( 3865e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo Bind(&UpdateAttempterAndroid::CompleteUpdateBootFlags, 3875e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo base::Unretained(this)))) { 3885e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(ERROR) << "Failed to mark current boot as successful."; 3895e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo CompleteUpdateBootFlags(false); 3905e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 3915e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3925e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3935e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::CompleteUpdateBootFlags(bool successful) { 3945e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo updated_boot_flags_ = true; 3955e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo ScheduleProcessingStart(); 3965e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 3975e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 3985e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::ScheduleProcessingStart() { 3995e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(INFO) << "Scheduling an action processor start."; 4005e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo brillo::MessageLoop::current()->PostTask( 401f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez FROM_HERE, 402f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez Bind([](ActionProcessor* processor) { processor->StartProcessing(); }, 403f1cf34849efdc0158fb1987ba74a51f25016c5bdLuis Hector Chavez base::Unretained(processor_.get()))); 4045e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 4055e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4065e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::TerminateUpdateAndNotify(ErrorCode error_code) { 4075e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (status_ == UpdateStatus::IDLE) { 4085e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo LOG(ERROR) << "No ongoing update, but TerminatedUpdate() called."; 4095e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return; 4105e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 4115e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4120d29854cf5bb05a22cf161b50052539aa420a36eAlex Deymo download_progress_ = 0; 4135e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo actions_.clear(); 4145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo UpdateStatus new_status = 4155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo (error_code == ErrorCode::kSuccess ? UpdateStatus::UPDATED_NEED_REBOOT 4165e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo : UpdateStatus::IDLE); 4175e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo SetStatusAndNotify(new_status); 4185e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo ongoing_update_ = false; 4195e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4205e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo for (auto observer : daemon_state_->service_observers()) 4215e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo observer->SendPayloadApplicationComplete(error_code); 4225e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 4235e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4245e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::SetStatusAndNotify(UpdateStatus status) { 4255e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo status_ = status; 4265e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo for (auto observer : daemon_state_->service_observers()) { 4275e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo observer->SendStatusUpdate( 4285e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 0, download_progress_, status_, "", install_plan_.payload_size); 4295e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 4305e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo last_notify_time_ = TimeTicks::Now(); 4315e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 4325e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4332c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymovoid UpdateAttempterAndroid::BuildUpdateActions(const string& url) { 4345e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo CHECK(!processor_->IsRunning()); 4355e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo processor_->set_delegate(this); 4365e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4375e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Actions: 4385e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo shared_ptr<InstallPlanAction> install_plan_action( 4395e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo new InstallPlanAction(install_plan_)); 4405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4412c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo HttpFetcher* download_fetcher = nullptr; 4422c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo if (FileFetcher::SupportedUrl(url)) { 4432c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo DLOG(INFO) << "Using FileFetcher for file URL."; 4442c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo download_fetcher = new FileFetcher(); 4452c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo } else { 44614c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#ifdef _UE_SIDELOAD 44714c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo LOG(FATAL) << "Unsupported sideload URI: " << url; 44814c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#else 4492c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo LibcurlHttpFetcher* libcurl_fetcher = 4502c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo new LibcurlHttpFetcher(&proxy_resolver_, hardware_); 4512c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo libcurl_fetcher->set_server_to_check(ServerToCheck::kDownload); 4522c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo download_fetcher = libcurl_fetcher; 45314c0da88a93aa7b1aa71d5e7e923b537f0d419f3Alex Deymo#endif // _UE_SIDELOAD 4542c131bbf81d8c02ade163b939c96e44aa93765e9Alex Deymo } 4557ecda265a87236e83cf820364947a1618872b6beAmin Hassani shared_ptr<DownloadAction> download_action( 4567ecda265a87236e83cf820364947a1618872b6beAmin Hassani new DownloadAction(prefs_, 4577ecda265a87236e83cf820364947a1618872b6beAmin Hassani boot_control_, 4587ecda265a87236e83cf820364947a1618872b6beAmin Hassani hardware_, 4597ecda265a87236e83cf820364947a1618872b6beAmin Hassani nullptr, // system_state, not used. 4607ecda265a87236e83cf820364947a1618872b6beAmin Hassani // passes ownership 4617ecda265a87236e83cf820364947a1618872b6beAmin Hassani new MultiRangeHttpFetcher(download_fetcher), 4627ecda265a87236e83cf820364947a1618872b6beAmin Hassani true /* is_interactive */)); 463fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang shared_ptr<FilesystemVerifierAction> filesystem_verifier_action( 464e6e4bb929acd73e57b68a30d1e3a33d76607aec3Sen Jiang new FilesystemVerifierAction()); 4655e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4665e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo shared_ptr<PostinstallRunnerAction> postinstall_runner_action( 467fb905d9b8d49f8fe41297c7aba2dd0942f1be311Alex Deymo new PostinstallRunnerAction(boot_control_, hardware_)); 4685e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4695e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo download_action->set_delegate(this); 4705e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo download_action_ = download_action; 471b6eef73e20736b4b6a43611fa732d8bba72ff7ffAlex Deymo postinstall_runner_action->set_delegate(this); 4725e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4735e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo actions_.push_back(shared_ptr<AbstractAction>(install_plan_action)); 4745e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo actions_.push_back(shared_ptr<AbstractAction>(download_action)); 475fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang actions_.push_back(shared_ptr<AbstractAction>(filesystem_verifier_action)); 4765e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo actions_.push_back(shared_ptr<AbstractAction>(postinstall_runner_action)); 4775e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4785e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Bond them together. We have to use the leaf-types when calling 4795e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // BondActions(). 4805e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo BondActions(install_plan_action.get(), download_action.get()); 481fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang BondActions(download_action.get(), filesystem_verifier_action.get()); 482fef85fd9ece49941db274559a938fe8b2c5157bfSen Jiang BondActions(filesystem_verifier_action.get(), 4835e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo postinstall_runner_action.get()); 4845e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4855e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Enqueue the actions. 4865e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo for (const shared_ptr<AbstractAction>& action : actions_) 4875e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo processor_->EnqueueAction(action.get()); 4885e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 4895e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 4905e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymovoid UpdateAttempterAndroid::SetupDownload() { 4915e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo MultiRangeHttpFetcher* fetcher = 4925e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo static_cast<MultiRangeHttpFetcher*>(download_action_->http_fetcher()); 4935e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo fetcher->ClearRanges(); 4945e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo if (install_plan_.is_resume) { 4955e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // Resuming an update so fetch the update manifest metadata first. 4965e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo int64_t manifest_metadata_size = 0; 497f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo int64_t manifest_signature_size = 0; 4985e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo prefs_->GetInt64(kPrefsManifestMetadataSize, &manifest_metadata_size); 499f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo prefs_->GetInt64(kPrefsManifestSignatureSize, &manifest_signature_size); 500f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo fetcher->AddRange(base_offset_, 501f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo manifest_metadata_size + manifest_signature_size); 5025e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // If there're remaining unprocessed data blobs, fetch them. Be careful not 5035e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // to request data beyond the end of the payload to avoid 416 HTTP response 5045e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // error codes. 5055e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo int64_t next_data_offset = 0; 5065e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo prefs_->GetInt64(kPrefsUpdateStateNextDataOffset, &next_data_offset); 507f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo uint64_t resume_offset = 508f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo manifest_metadata_size + manifest_signature_size + next_data_offset; 5090fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo if (!install_plan_.payload_size) { 5100fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo fetcher->AddRange(base_offset_ + resume_offset); 5110fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo } else if (resume_offset < install_plan_.payload_size) { 5120fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo fetcher->AddRange(base_offset_ + resume_offset, 5130fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo install_plan_.payload_size - resume_offset); 5145e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 5155e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } else { 5160fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo if (install_plan_.payload_size) { 5170fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo fetcher->AddRange(base_offset_, install_plan_.payload_size); 5180fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo } else { 5190fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo // If no payload size is passed we assume we read until the end of the 5200fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo // stream. 5210fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo fetcher->AddRange(base_offset_); 5220fd51ff8fd200aab7f9ab930b47736505a7b59c3Alex Deymo } 5235e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo } 5245e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 5255e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 5265e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::WriteUpdateCompletedMarker() { 5275e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo string boot_id; 5285e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo TEST_AND_RETURN_FALSE(utils::GetBootId(&boot_id)); 5295e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo prefs_->SetString(kPrefsUpdateCompletedOnBootId, boot_id); 5305e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return true; 5315e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 5325e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 5335e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymobool UpdateAttempterAndroid::UpdateCompletedOnThisBoot() { 5345e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // In case of an update_engine restart without a reboot, we stored the boot_id 5355e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // when the update was completed by setting a pref, so we can check whether 5365e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo // the last update was on this boot or a previous one. 5375e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo string boot_id; 5385e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo TEST_AND_RETURN_FALSE(utils::GetBootId(&boot_id)); 5395e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 5405e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo string update_completed_on_boot_id; 5415e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo return (prefs_->Exists(kPrefsUpdateCompletedOnBootId) && 5425e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo prefs_->GetString(kPrefsUpdateCompletedOnBootId, 5435e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo &update_completed_on_boot_id) && 5445e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo update_completed_on_boot_id == boot_id); 5455e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} 5465e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo 5475e3ea278d9e771be3b51bd72985ad582678baddcAlex Deymo} // namespace chromeos_update_engine 548