1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2012 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 164e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 174e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/update_attempter.h" 1863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes 199abb763fa3840d69cc1098c0233162557a7f99eaBen Chan#include <stdint.h> 209abb763fa3840d69cc1098c0233162557a7f99eaBen Chan 21bc91a2743fd3ffabb3ead3181ad8da3060afe1f1Alex Deymo#include <algorithm> 22bc91a2743fd3ffabb3ead3181ad8da3060afe1f1Alex Deymo#include <memory> 23d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko#include <set> 244e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include <string> 25d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko#include <utility> 2644666f97392f1f0f8be292fe6a4edcf9237540dfAlex Deymo#include <vector> 279d65b7b9249124a433b9a018a1952435f7f75c4dDarin Petkov 28ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold#include <base/bind.h> 2906c76a49bfd29c8abdb8abd5b646a6583783191aBen Chan#include <base/files/file_util.h> 303c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen#include <base/logging.h> 314516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes#include <base/rand_util.h> 3265f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat#include <base/strings/string_util.h> 3375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/stringprintf.h> 343f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/bind_lambda.h> 35c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo#include <brillo/make_unique_ptr.h> 363f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko#include <brillo/message_loops/message_loop.h> 37d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <debugd/dbus-constants.h> 387fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy#include <policy/device_policy.h> 39bc91a2743fd3ffabb3ead3181ad8da3060afe1f1Alex Deymo#include <policy/libpolicy.h> 40d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <power_manager/dbus-constants.h> 41d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <power_manager/dbus-proxies.h> 42d6deb1d0357f47d5525bfaeffa6c201b19abd3e7Alex Deymo#include <update_engine/dbus-constants.h> 439d65b7b9249124a433b9a018a1952435f7f75c4dDarin Petkov 4439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/boot_control_interface.h" 4539910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/certificate_checker.h" 4639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/clock_interface.h" 4739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h" 4839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/hardware_interface.h" 4939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/libcurl_http_fetcher.h" 5039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/multi_range_http_fetcher.h" 5139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/platform_constants.h" 5239910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/prefs_interface.h" 5339910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/subprocess.h" 5439910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h" 5563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes#include "update_engine/dbus_service.h" 5633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen#include "update_engine/metrics.h" 576a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov#include "update_engine/omaha_request_action.h" 58a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov#include "update_engine/omaha_request_params.h" 594e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes#include "update_engine/omaha_response_handler_action.h" 608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen#include "update_engine/p2p_manager.h" 6139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/download_action.h" 6239910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/filesystem_verifier_action.h" 6339910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/payload_consumer/postinstall_runner_action.h" 6455f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan#include "update_engine/payload_state_interface.h" 654348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasan#include "update_engine/system_state.h" 66ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold#include "update_engine/update_manager/policy.h" 67ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold#include "update_engine/update_manager/update_manager.h" 68cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley#include "update_engine/update_status_utils.h" 694e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 70ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldusing base::Bind; 71ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldusing base::Callback; 723c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthenusing base::Time; 73af183050a13b6851d7e385bb697ae290ccdaf880Darin Petkovusing base::TimeDelta; 74af183050a13b6851d7e385bb697ae290ccdaf880Darin Petkovusing base::TimeTicks; 753f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenkousing brillo::MessageLoop; 76ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldusing chromeos_update_manager::EvalStatus; 77ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldusing chromeos_update_manager::Policy; 78ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldusing chromeos_update_manager::UpdateCheckParams; 794348879380222dc8c74b0976e527bf3da66ba08fJay Srinivasanusing std::set; 80bc91a2743fd3ffabb3ead3181ad8da3060afe1f1Alex Deymousing std::shared_ptr; 814e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesusing std::string; 824e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesusing std::vector; 834e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 844e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesnamespace chromeos_update_engine { 854e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 86362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkovconst int UpdateAttempter::kMaxDeltaUpdateFailures = 3; 87362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov 884516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyesnamespace { 894516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyesconst int kMaxConsecutiveObeyProxyRequests = 20; 9070e476ed0a09f8ca2d0a9e3f0e1cd78ccefd5fbeGilad Arnold 9172ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo// Minimum threshold to broadcast an status update in progress and time. 9272ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoconst double kBroadcastThresholdProgress = 0.01; // 1% 9372ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymoconst int kBroadcastThresholdSeconds = 10; 9472ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo 9502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell// By default autest bypasses scattering. If we want to test scattering, 9602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell// use kScheduledAUTestURLRequest. The URL used is same in both cases, but 9702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell// different params are passed to CheckForUpdate(). 9802c1864e204997175302b1aebe3e0be9c6699ea5David Pursellconst char kAUTestURLRequest[] = "autest"; 9902c1864e204997175302b1aebe3e0be9c6699ea5David Pursellconst char kScheduledAUTestURLRequest[] = "autest-scheduled"; 100d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko} // namespace 1014516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes 102d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold// Turns a generic ErrorCode::kError to a generic error code specific 103eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood// to |action| (e.g., ErrorCode::kFilesystemVerifierError). If |code| is 104d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold// not ErrorCode::kError, or the action is not matched, returns |code| 105777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov// unchanged. 106a99981fda75fe0b17e96c700e3ddc93eca1cebe5David ZeuthenErrorCode GetErrorCodeForAction(AbstractAction* action, 107a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) { 108d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold if (code != ErrorCode::kError) 109777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov return code; 110777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov 111777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov const string type = action->Type(); 112777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov if (type == OmahaRequestAction::StaticType()) 113d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold return ErrorCode::kOmahaRequestError; 114777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov if (type == OmahaResponseHandlerAction::StaticType()) 115d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold return ErrorCode::kOmahaResponseHandlerError; 116eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood if (type == FilesystemVerifierAction::StaticType()) 117eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood return ErrorCode::kFilesystemVerifierError; 118777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov if (type == PostinstallRunnerAction::StaticType()) 119d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold return ErrorCode::kPostinstallRunnerError; 120777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov 121777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov return code; 122777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov} 123777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov 124305345001d85ca2282112c2a30fe75c7a4773491Alex DeymoUpdateAttempter::UpdateAttempter( 125305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo SystemState* system_state, 12633e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo CertificateChecker* cert_checker, 127305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo LibCrosProxy* libcros_proxy, 128305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo org::chromium::debugdProxyInterface* debugd_proxy) 1291f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold : processor_(new ActionProcessor()), 1301f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold system_state_(system_state), 13133e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo cert_checker_(cert_checker), 1320cd976de289c9f17d2c10814720fbd6d62d7432dAlex Deymo#if USE_LIBCROS 133305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo chrome_proxy_resolver_(libcros_proxy), 1340cd976de289c9f17d2c10814720fbd6d62d7432dAlex Deymo#endif // USE_LIBCROS 135305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo debugd_proxy_(debugd_proxy) { 136c6c135c3e555a856b762e4f383d1d2768363589dDarin Petkov} 137c6c135c3e555a856b762e4f383d1d2768363589dDarin Petkov 138ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad ArnoldUpdateAttempter::~UpdateAttempter() { 13933e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo // CertificateChecker might not be initialized in unittests. 14033e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo if (cert_checker_) 14133e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo cert_checker_->SetObserver(nullptr); 1422b4268c8f89d115b0895b3f0172f42c11d9b1d7cAlex Deymo // Release ourselves as the ActionProcessor's delegate to prevent 1432b4268c8f89d115b0895b3f0172f42c11d9b1d7cAlex Deymo // re-scheduling the updates due to the processing stopped. 1442b4268c8f89d115b0895b3f0172f42c11d9b1d7cAlex Deymo processor_->set_delegate(nullptr); 145ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold} 146ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 1471f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnoldvoid UpdateAttempter::Init() { 1481f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold // Pulling from the SystemState can only be done after construction, since 1491f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold // this is an aggregate of various objects (such as the UpdateAttempter), 1501f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold // which requires them all to be constructed prior to it being used. 1511f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold prefs_ = system_state_->prefs(); 1521f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold omaha_request_params_ = system_state_->request_params(); 153906191f88cb2448691e54f7a6a3b464854053154Alex Deymo 15433e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo if (cert_checker_) 15533e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo cert_checker_->SetObserver(this); 15633e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo 157906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // In case of update_engine restart without a reboot we need to restore the 158906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // reboot needed state. 159906191f88cb2448691e54f7a6a3b464854053154Alex Deymo if (GetBootTimeAtUpdate(nullptr)) 160906191f88cb2448691e54f7a6a3b464854053154Alex Deymo status_ = UpdateStatus::UPDATED_NEED_REBOOT; 161906191f88cb2448691e54f7a6a3b464854053154Alex Deymo else 162906191f88cb2448691e54f7a6a3b464854053154Alex Deymo status_ = UpdateStatus::IDLE; 1639bc7aaebc6390d10bb76a2c92521167da14ecbfaAlex Deymo 1640cd976de289c9f17d2c10814720fbd6d62d7432dAlex Deymo#if USE_LIBCROS 1659bc7aaebc6390d10bb76a2c92521167da14ecbfaAlex Deymo chrome_proxy_resolver_.Init(); 1660cd976de289c9f17d2c10814720fbd6d62d7432dAlex Deymo#endif // USE_LIBCROS 1671f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold} 1681f84723f499b3b309efac11324ed4e6c937341b6Gilad Arnold 169ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldvoid UpdateAttempter::ScheduleUpdates() { 17054fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold if (IsUpdateRunningOrScheduled()) 17154fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold return; 17254fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold 173ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold chromeos_update_manager::UpdateManager* const update_manager = 174ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold system_state_->update_manager(); 175ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold CHECK(update_manager); 176ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold Callback<void(EvalStatus, const UpdateCheckParams&)> callback = Bind( 177ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold &UpdateAttempter::OnUpdateScheduled, base::Unretained(this)); 178ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // We limit the async policy request to a reasonably short time, to avoid a 179ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // starvation due to a transient bug. 180ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold update_manager->AsyncPolicyRequest(callback, &Policy::UpdateCheckAllowed); 181ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold waiting_for_scheduled_check_ = true; 182c6c135c3e555a856b762e4f383d1d2768363589dDarin Petkov} 183c6c135c3e555a856b762e4f383d1d2768363589dDarin Petkov 184c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymovoid UpdateAttempter::CertificateChecked(ServerToCheck server_to_check, 185c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo CertificateCheckResult result) { 186c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo metrics::ReportCertificateCheckMetrics(system_state_, 187c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo server_to_check, 188c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo result); 189c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo} 190c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo 191985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthenbool UpdateAttempter::CheckAndReportDailyMetrics() { 192985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen int64_t stored_value; 193f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo Time now = system_state_->clock()->GetWallclockTime(); 194985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen if (system_state_->prefs()->Exists(kPrefsDailyMetricsLastReportedAt) && 195985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen system_state_->prefs()->GetInt64(kPrefsDailyMetricsLastReportedAt, 196985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen &stored_value)) { 197f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo Time last_reported_at = Time::FromInternalValue(stored_value); 198f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo TimeDelta time_reported_since = now - last_reported_at; 199985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen if (time_reported_since.InSeconds() < 0) { 200985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen LOG(WARNING) << "Last reported daily metrics " 201985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << utils::FormatTimeDelta(time_reported_since) << " ago " 202985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << "which is negative. Either the system clock is wrong or " 203985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << "the kPrefsDailyMetricsLastReportedAt state variable " 204985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << "is wrong."; 205985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen // In this case, report daily metrics to reset. 206985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } else { 207985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen if (time_reported_since.InSeconds() < 24*60*60) { 208985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen LOG(INFO) << "Last reported daily metrics " 209985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << utils::FormatTimeDelta(time_reported_since) << " ago."; 210985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen return false; 211985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } 212985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen LOG(INFO) << "Last reported daily metrics " 213985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << utils::FormatTimeDelta(time_reported_since) << " ago, " 214985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen << "which is more than 24 hours ago."; 215985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } 216985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } 217985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 218985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen LOG(INFO) << "Reporting daily metrics."; 219985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen system_state_->prefs()->SetInt64(kPrefsDailyMetricsLastReportedAt, 220985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen now.ToInternalValue()); 221985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 222985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen ReportOSAge(); 223985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 224985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen return true; 225985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen} 226985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 227985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthenvoid UpdateAttempter::ReportOSAge() { 228985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen struct stat sb; 229985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 23088b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko if (system_state_ == nullptr) 231985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen return; 232985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 233985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen if (stat("/etc/lsb-release", &sb) != 0) { 234d9aca3b95945f51c3cae2e716a6b4accfd88bf13David Zeuthen PLOG(ERROR) << "Error getting file status for /etc/lsb-release " 235d9aca3b95945f51c3cae2e716a6b4accfd88bf13David Zeuthen << "(Note: this may happen in some unit tests)"; 236985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen return; 237985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } 238985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 239f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo Time lsb_release_timestamp = utils::TimeFromStructTimespec(&sb.st_ctim); 240f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo Time now = system_state_->clock()->GetWallclockTime(); 241f329b933db41d26644a97afef928eb1b319d6d99Alex Deymo TimeDelta age = now - lsb_release_timestamp; 242985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen if (age.InSeconds() < 0) { 243985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen LOG(ERROR) << "The OS age (" << utils::FormatTimeDelta(age) 244d9aca3b95945f51c3cae2e716a6b4accfd88bf13David Zeuthen << ") is negative. Maybe the clock is wrong? " 245d9aca3b95945f51c3cae2e716a6b4accfd88bf13David Zeuthen << "(Note: this may happen in some unit tests.)"; 246985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen return; 247985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen } 248985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 24933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::ReportDailyMetrics(system_state_, age); 250985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen} 251985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 25228e2f39b85e0a4d0d093123562e70d8906c03befGilad Arnoldvoid UpdateAttempter::Update(const string& app_version, 25328e2f39b85e0a4d0d093123562e70d8906c03befGilad Arnold const string& omaha_url, 254ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold const string& target_channel, 255ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold const string& target_version_prefix, 256fb2f4614a4492f954c2e53a2797ef6be66e99b81Andrew de los Reyes bool obey_proxies, 2577d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyen bool interactive) { 258ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // This is normally called frequently enough so it's appropriate to use as a 259ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // hook for reporting daily metrics. 260ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // TODO(garnold) This should be hooked to a separate (reliable and consistent) 261ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // timeout event. 262985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen CheckAndReportDailyMetrics(); 263985b112a749ccbe025ea4aa0245b13f92c28a057David Zeuthen 26444dc3bfd45eaddc1e7b586f8839babe4540418b5Gilad Arnold // Notify of the new update attempt, clearing prior interactive requests. 265ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (forced_update_pending_callback_.get()) 266ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold forced_update_pending_callback_->Run(false, false); 26744dc3bfd45eaddc1e7b586f8839babe4540418b5Gilad Arnold 268c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes fake_update_success_ = false; 269cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley if (status_ == UpdateStatus::UPDATED_NEED_REBOOT) { 270116fda3221ff3df037ea1feb271883c87644c839Thieu Le // Although we have applied an update, we still want to ping Omaha 271116fda3221ff3df037ea1feb271883c87644c839Thieu Le // to ensure the number of active statistics is accurate. 27233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen // 27333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen // Also convey to the UpdateEngine.Check.Result metric that we're 27433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen // not performing an update check because of this. 2756b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes LOG(INFO) << "Not updating b/c we already updated and we're waiting for " 276116fda3221ff3df037ea1feb271883c87644c839Thieu Le << "reboot, we'll ping Omaha instead"; 27733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::ReportUpdateCheckMetrics(system_state_, 27833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::CheckResult::kRebootPending, 27933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::CheckReaction::kUnset, 28033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::DownloadErrorCode::kUnset); 281116fda3221ff3df037ea1feb271883c87644c839Thieu Le PingOmaha(); 2826b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes return; 2836b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes } 284cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley if (status_ != UpdateStatus::IDLE) { 2856b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes // Update in progress. Do nothing 2866b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes return; 2876b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes } 288480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 289480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (!CalculateUpdateParams(app_version, 290480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan omaha_url, 291ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold target_channel, 292ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold target_version_prefix, 293480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan obey_proxies, 2947d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyen interactive)) { 295480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return; 296480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan } 297480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 298480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan BuildUpdateActions(interactive); 299480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 300cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::CHECKING_FOR_UPDATE); 301480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 302ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Update the last check time here; it may be re-updated when an Omaha 303ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // response is received, but this will prevent us from repeatedly scheduling 304ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // checks in the case where a response is not received. 305ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold UpdateLastCheckedTime(); 306ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 307480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Just in case we didn't update boot flags yet, make sure they're updated 308480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // before any update processing starts. 309480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan start_action_processor_ = true; 310480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan UpdateBootFlags(); 311480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan} 312480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 3131c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasanvoid UpdateAttempter::RefreshDevicePolicy() { 3141c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan // Lazy initialize the policy provider, or reload the latest policy data. 3151c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan if (!policy_provider_.get()) 3161c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan policy_provider_.reset(new policy::PolicyProvider()); 3171c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan policy_provider_->Reload(); 3181c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 31988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko const policy::DevicePolicy* device_policy = nullptr; 3201c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan if (policy_provider_->device_policy_is_loaded()) 3211c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan device_policy = &policy_provider_->GetDevicePolicy(); 3221c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 3231c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan if (device_policy) 3241c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan LOG(INFO) << "Device policies/settings present"; 3251c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan else 3261c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan LOG(INFO) << "No device policies/settings present."; 3271c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 3281c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan system_state_->set_device_policy(device_policy); 32992d9c8bc5cd418e34944d6fc4bae44e3b4370246David Zeuthen system_state_->p2p_manager()->SetDevicePolicy(device_policy); 3301c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan} 3311c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 3328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenvoid UpdateAttempter::CalculateP2PParams(bool interactive) { 3338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen bool use_p2p_for_downloading = false; 3348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen bool use_p2p_for_sharing = false; 3358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 3368f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // Never use p2p for downloading in interactive checks unless the 3378f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // developer has opted in for it via a marker file. 3388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // 3398f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // (Why would a developer want to opt in? If he's working on the 3408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // update_engine or p2p codebases so he can actually test his 3418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // code.). 3428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 34388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko if (system_state_ != nullptr) { 3448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!system_state_->p2p_manager()->IsP2PEnabled()) { 3458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "p2p is not enabled - disallowing p2p for both" 3468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen << " downloading and sharing."; 3478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } else { 3488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // Allow p2p for sharing, even in interactive checks. 3498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen use_p2p_for_sharing = true; 3508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!interactive) { 3518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Non-interactive check - allowing p2p for downloading"; 3528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen use_p2p_for_downloading = true; 3538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } else { 354052d290ce38bd67629e3f0f5d4e4b7cfa8b7c201David Zeuthen LOG(INFO) << "Forcibly disabling use of p2p for downloading " 355052d290ce38bd67629e3f0f5d4e4b7cfa8b7c201David Zeuthen << "since this update attempt is interactive."; 3568f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 3578f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 3588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 3598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 36074b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold PayloadStateInterface* const payload_state = system_state_->payload_state(); 36174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state->SetUsingP2PForDownloading(use_p2p_for_downloading); 36274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state->SetUsingP2PForSharing(use_p2p_for_sharing); 3638f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen} 3648f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 365480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool UpdateAttempter::CalculateUpdateParams(const string& app_version, 366480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan const string& omaha_url, 367ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold const string& target_channel, 368ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold const string& target_version_prefix, 369480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan bool obey_proxies, 3707d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyen bool interactive) { 3711023a6029771fb8dea867e14193df8e58a59a662Darin Petkov http_response_code_ = 0; 37274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold PayloadStateInterface* const payload_state = system_state_->payload_state(); 3737fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy 374749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo // Refresh the policy before computing all the update parameters. 375749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo RefreshDevicePolicy(); 376749ecf1c000ce0243c2eee986282dd568535bafeAlex Deymo 377ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Set the target version prefix, if provided. 378ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (!target_version_prefix.empty()) 379ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold omaha_request_params_->set_target_version_prefix(target_version_prefix); 380480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 381b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnold CalculateScatteringParams(interactive); 3827fbbe8a9e57ec52f7bc597d0cb607036300ac54cPatrick Dubroy 3838f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen CalculateP2PParams(interactive); 38474b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold if (payload_state->GetUsingP2PForDownloading() || 38574b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state->GetUsingP2PForSharing()) { 3868f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // OK, p2p is to be used - start it and perform housekeeping. 3878f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!StartP2PAndPerformHousekeeping()) { 3888f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen // If this fails, disable p2p for this attempt 3898f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Forcibly disabling use of p2p since starting p2p or " 3908f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen << "performing housekeeping failed."; 39174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state->SetUsingP2PForDownloading(false); 39274b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state->SetUsingP2PForSharing(false); 3938f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 3948f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 3958f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 396ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan if (!omaha_request_params_->Init(app_version, 3977d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyen omaha_url, 398ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan interactive)) { 3991c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan LOG(ERROR) << "Unable to initialize Omaha request params."; 400480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return false; 401a4a8a8ccc2d9e0285728ed247b43f09433e63323Darin Petkov } 4023aefa8634c9e9f31b9fdae5a57444c70c2f03928Darin Petkov 403ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Set the target channel, if one was provided. 404ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (target_channel.empty()) { 405ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(INFO) << "No target channel mandated by policy."; 406ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold } else { 407ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(INFO) << "Setting target channel as mandated: " << target_channel; 408ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Pass in false for powerwash_allowed until we add it to the policy 409ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // protobuf. 410d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo string error_message; 411d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo if (!omaha_request_params_->SetTargetChannel(target_channel, false, 412d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo &error_message)) { 413d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo LOG(ERROR) << "Setting the channel failed: " << error_message; 414d942f9d3c8529f896329b19261df6eba044de1b2Alex Deymo } 415fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo // Notify observers the target channel change. 416fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo BroadcastChannel(); 417ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 418ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Since this is the beginning of a new attempt, update the download 419ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // channel. The download channel won't be updated until the next attempt, 420ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // even if target channel changes meanwhile, so that how we'll know if we 421ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // should cancel the current download attempt if there's such a change in 422ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // target channel. 423ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold omaha_request_params_->UpdateDownloadChannel(); 424ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan } 425ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan 426afd70ed1393d936579acbd9242c326be47213a69Gilad Arnold LOG(INFO) << "target_version_prefix = " 427ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan << omaha_request_params_->target_version_prefix() 428480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan << ", scatter_factor_in_seconds = " 429480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan << utils::FormatSecs(scatter_factor_.InSeconds()); 430480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 431480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "Wall Clock Based Wait Enabled = " 432ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan << omaha_request_params_->wall_clock_based_wait_enabled() 433480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan << ", Update Check Count Wait Enabled = " 434ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan << omaha_request_params_->update_check_count_wait_enabled() 43521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan << ", Waiting Period = " << utils::FormatSecs( 436ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->waiting_period().InSeconds()); 4370a70874c61118a2b276edc731ad890c6826be2beJay Srinivasan 4388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Use p2p For Downloading = " 43974b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold << payload_state->GetUsingP2PForDownloading() 4408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen << ", Use p2p For Sharing = " 44174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold << payload_state->GetUsingP2PForSharing(); 4428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 4434516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes obeying_proxies_ = true; 4444516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes if (obey_proxies || proxy_manual_checks_ == 0) { 4454516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes LOG(INFO) << "forced to obey proxies"; 4464516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes // If forced to obey proxies, every 20th request will not use proxies 4474516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes proxy_manual_checks_++; 4484516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes LOG(INFO) << "proxy manual checks: " << proxy_manual_checks_; 4494516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes if (proxy_manual_checks_ >= kMaxConsecutiveObeyProxyRequests) { 4504516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes proxy_manual_checks_ = 0; 4514516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes obeying_proxies_ = false; 4524516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes } 4534516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes } else if (base::RandInt(0, 4) == 0) { 4544516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes obeying_proxies_ = false; 4554516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes } 4564516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes LOG_IF(INFO, !obeying_proxies_) << "To help ensure updates work, this update " 4574516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes "check we are ignoring the proxy settings and using " 4584516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes "direct connections."; 4594516810fe41a39c0c55d2095679898787259ae38Andrew de los Reyes 460362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov DisableDeltaUpdateIfNeeded(); 461480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return true; 462480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan} 463480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 464b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnoldvoid UpdateAttempter::CalculateScatteringParams(bool interactive) { 46521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Take a copy of the old scatter value before we update it, as 46621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // we need to update the waiting period if this value changes. 46721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan TimeDelta old_scatter_factor = scatter_factor_; 4686f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan const policy::DevicePolicy* device_policy = system_state_->device_policy(); 46921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan if (device_policy) { 4709abb763fa3840d69cc1098c0233162557a7f99eaBen Chan int64_t new_scatter_factor_in_secs = 0; 47121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan device_policy->GetScatterFactorInSeconds(&new_scatter_factor_in_secs); 472d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko if (new_scatter_factor_in_secs < 0) // sanitize input, just in case. 47321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan new_scatter_factor_in_secs = 0; 47421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan scatter_factor_ = TimeDelta::FromSeconds(new_scatter_factor_in_secs); 47521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } 47621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 47721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan bool is_scatter_enabled = false; 47821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan if (scatter_factor_.InSeconds() == 0) { 47921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Scattering disabled since scatter factor is set to 0"; 480b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnold } else if (interactive) { 481b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnold LOG(INFO) << "Scattering disabled as this is an interactive update check"; 482bccbc387ed23ec18adcd0ef8b50d958ef38cd619Alex Deymo } else if (!system_state_->hardware()->IsOOBEComplete(nullptr)) { 48321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Scattering disabled since OOBE is not complete yet"; 48421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } else { 48521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan is_scatter_enabled = true; 48621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Scattering is enabled"; 48721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } 48821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 48921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan if (is_scatter_enabled) { 49021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // This means the scattering policy is turned on. 49121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Now check if we need to update the waiting period. The two cases 49221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // in which we'd need to update the waiting period are: 49321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // 1. First time in process or a scheduled check after a user-initiated one. 494ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan // (omaha_request_params_->waiting_period will be zero in this case). 49521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // 2. Admin has changed the scattering policy value. 49621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // (new scattering value will be different from old one in this case). 4979abb763fa3840d69cc1098c0233162557a7f99eaBen Chan int64_t wait_period_in_secs = 0; 498ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan if (omaha_request_params_->waiting_period().InSeconds() == 0) { 49921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // First case. Check if we have a suitable value to set for 50021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // the waiting period. 50121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan if (prefs_->GetInt64(kPrefsWallClockWaitPeriod, &wait_period_in_secs) && 50221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan wait_period_in_secs > 0 && 50321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan wait_period_in_secs <= scatter_factor_.InSeconds()) { 50421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // This means: 50521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // 1. There's a persisted value for the waiting period available. 50621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // 2. And that persisted value is still valid. 50721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // So, in this case, we should reuse the persisted value instead of 50821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // generating a new random value to improve the chances of a good 50921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // distribution for scattering. 510ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_waiting_period( 511ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan TimeDelta::FromSeconds(wait_period_in_secs)); 51221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Using persisted wall-clock waiting period: " << 513ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan utils::FormatSecs( 514ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->waiting_period().InSeconds()); 515d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko } else { 51621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // This means there's no persisted value for the waiting period 51721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // available or its value is invalid given the new scatter_factor value. 51821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // So, we should go ahead and regenerate a new value for the 51921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // waiting period. 52021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Persisted value not present or not valid (" 52121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan << utils::FormatSecs(wait_period_in_secs) 52221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan << ") for wall-clock waiting period."; 52321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan GenerateNewWaitingPeriod(); 52421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } 52521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } else if (scatter_factor_ != old_scatter_factor) { 52621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // This means there's already a waiting period value, but we detected 52721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // a change in the scattering policy value. So, we should regenerate the 52821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // waiting period to make sure it's within the bounds of the new scatter 52921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // factor value. 53021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan GenerateNewWaitingPeriod(); 53121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } else { 53221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Neither the first time scattering is enabled nor the scattering value 53321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // changed. Nothing to do. 53421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Keeping current wall-clock waiting period: " << 535ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan utils::FormatSecs( 536ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->waiting_period().InSeconds()); 53721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } 53821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 539ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan // The invariant at this point is that omaha_request_params_->waiting_period 54021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // is non-zero no matter which path we took above. 541ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan LOG_IF(ERROR, omaha_request_params_->waiting_period().InSeconds() == 0) 54221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan << "Waiting Period should NOT be zero at this point!!!"; 54321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 54421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Since scattering is enabled, wall clock based wait will always be 54521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // enabled. 546ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_wall_clock_based_wait_enabled(true); 54721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 54821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // If we don't have any issues in accessing the file system to update 54921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // the update check count value, we'll turn that on as well. 55021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan bool decrement_succeeded = DecrementUpdateCheckCount(); 551ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_update_check_count_wait_enabled( 552ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan decrement_succeeded); 55321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } else { 55421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // This means the scattering feature is turned off or disabled for 55521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // this particular update check. Make sure to disable 55621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // all the knobs and artifacts so that we don't invoke any scattering 55721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // related code. 558ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_wall_clock_based_wait_enabled(false); 559ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_update_check_count_wait_enabled(false); 560ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_waiting_period(TimeDelta::FromSeconds(0)); 56121be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan prefs_->Delete(kPrefsWallClockWaitPeriod); 56221be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan prefs_->Delete(kPrefsUpdateCheckCount); 56321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Don't delete the UpdateFirstSeenAt file as we don't want manual checks 56421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // that result in no-updates (e.g. due to server side throttling) to 56521be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // cause update starvation by having the client generate a new 56621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // UpdateFirstSeenAt for each scheduled check that follows a manual check. 56721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan } 56821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan} 56921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 57021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasanvoid UpdateAttempter::GenerateNewWaitingPeriod() { 571ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_waiting_period(TimeDelta::FromSeconds( 572ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan base::RandInt(1, scatter_factor_.InSeconds()))); 57321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 57421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan LOG(INFO) << "Generated new wall-clock waiting period: " << utils::FormatSecs( 575ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->waiting_period().InSeconds()); 57621be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 57721be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // Do a best-effort to persist this in all cases. Even if the persistence 57821be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // fails, we'll still be able to scatter based on our in-memory value. 57921be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // The persistence only helps in ensuring a good overall distribution 58021be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan // across multiple devices if they tend to reboot too often. 581519cfc71f0a2f7f01adb51acd19b5cd23d2c93a2Gilad Arnold system_state_->payload_state()->SetScatteringWaitPeriod( 582519cfc71f0a2f7f01adb51acd19b5cd23d2c93a2Gilad Arnold omaha_request_params_->waiting_period()); 58321be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan} 58421be0753ca991afed45998ecd4c157c245f1fad0Jay Srinivasan 585d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosavoid UpdateAttempter::BuildPostInstallActions( 586d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa InstallPlanAction* previous_action) { 587d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa shared_ptr<PostinstallRunnerAction> postinstall_runner_action( 588b15a0b8eaf18c9e9341706df9f4ab59ce595a67cAlex Deymo new PostinstallRunnerAction(system_state_->boot_control())); 58972ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo postinstall_runner_action->set_delegate(this); 590d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa actions_.push_back(shared_ptr<AbstractAction>(postinstall_runner_action)); 591d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa BondActions(previous_action, 592d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa postinstall_runner_action.get()); 593d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa} 594d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 595480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanvoid UpdateAttempter::BuildUpdateActions(bool interactive) { 596f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov CHECK(!processor_->IsRunning()); 597f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov processor_->set_delegate(this); 5984e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 5994e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Actions: 600c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo std::unique_ptr<LibcurlHttpFetcher> update_check_fetcher( 60133e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo new LibcurlHttpFetcher(GetProxyResolver(), system_state_->hardware())); 60233e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo update_check_fetcher->set_server_to_check(ServerToCheck::kUpdate); 603fb2f4614a4492f954c2e53a2797ef6be66e99b81Andrew de los Reyes // Try harder to connect to the network, esp when not interactive. 604fb2f4614a4492f954c2e53a2797ef6be66e99b81Andrew de los Reyes // See comment in libcurl_http_fetcher.cc. 605fb2f4614a4492f954c2e53a2797ef6be66e99b81Andrew de los Reyes update_check_fetcher->set_no_network_max_retries(interactive ? 1 : 3); 6066a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov shared_ptr<OmahaRequestAction> update_check_action( 6076f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan new OmahaRequestAction(system_state_, 60888b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko nullptr, 609c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo std::move(update_check_fetcher), 610116fda3221ff3df037ea1feb271883c87644c839Thieu Le false)); 6114e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes shared_ptr<OmahaResponseHandlerAction> response_handler_action( 6126f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan new OmahaResponseHandlerAction(system_state_)); 613eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood shared_ptr<FilesystemVerifierAction> src_filesystem_verifier_action( 614e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo new FilesystemVerifierAction(system_state_->boot_control(), 615e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo VerifierMode::kComputeSourceHash)); 61683692e4fd17b5669eeb3edb24b8c4cd8152c7283Don Garrett 6178c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov shared_ptr<OmahaRequestAction> download_started_action( 6186f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan new OmahaRequestAction(system_state_, 6198c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov new OmahaEvent( 620e17f86bae4299882232d3e6858ada68692e80501Darin Petkov OmahaEvent::kTypeUpdateDownloadStarted), 621706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo brillo::make_unique_ptr(new LibcurlHttpFetcher( 622706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo GetProxyResolver(), 623706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_->hardware())), 624116fda3221ff3df037ea1feb271883c87644c839Thieu Le false)); 62533e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo 6267f9aea2748370b0a26e1d5c36db7d8bbf3ba1245Bruno Rocha LibcurlHttpFetcher* download_fetcher = 62733e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo new LibcurlHttpFetcher(GetProxyResolver(), system_state_->hardware()); 62833e91e78bfe98c063b0c3b6d590976e275685686Alex Deymo download_fetcher->set_server_to_check(ServerToCheck::kDownload); 6291b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo shared_ptr<DownloadAction> download_action(new DownloadAction( 6301b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo prefs_, 6311b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo system_state_->boot_control(), 6321b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo system_state_->hardware(), 6331b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo system_state_, 6341b3556cbe66b3f5be35f6117d4013ddc199b064cAlex Deymo new MultiRangeHttpFetcher(download_fetcher))); // passes ownership 6358c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov shared_ptr<OmahaRequestAction> download_finished_action( 636706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new OmahaRequestAction( 637706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_, 638706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new OmahaEvent(OmahaEvent::kTypeUpdateDownloadFinished), 639706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo brillo::make_unique_ptr( 640706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new LibcurlHttpFetcher(GetProxyResolver(), 641706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_->hardware())), 642706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo false)); 643eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood shared_ptr<FilesystemVerifierAction> dst_filesystem_verifier_action( 644e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo new FilesystemVerifierAction(system_state_->boot_control(), 645e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo VerifierMode::kVerifyTargetHash)); 6468c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov shared_ptr<OmahaRequestAction> update_complete_action( 647706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new OmahaRequestAction( 648706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_, 649706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new OmahaEvent(OmahaEvent::kTypeUpdateComplete), 650706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo brillo::make_unique_ptr( 651706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo new LibcurlHttpFetcher(GetProxyResolver(), 652706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_->hardware())), 653706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo false)); 6546a5b3229b44c1f81ee153829e9b501e547f29926Darin Petkov 65563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes download_action->set_delegate(this); 6564e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes response_handler_action_ = response_handler_action; 6579b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov download_action_ = download_action; 6584e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 6594e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes actions_.push_back(shared_ptr<AbstractAction>(update_check_action)); 6604e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes actions_.push_back(shared_ptr<AbstractAction>(response_handler_action)); 661f9185170a9763e493e77ffdc5b1f057c3bd3b11eAndrew de los Reyes actions_.push_back(shared_ptr<AbstractAction>( 662eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood src_filesystem_verifier_action)); 6638c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov actions_.push_back(shared_ptr<AbstractAction>(download_started_action)); 6644e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes actions_.push_back(shared_ptr<AbstractAction>(download_action)); 6658c2980e8b973a21468c9fece0490cd440afc0660Darin Petkov actions_.push_back(shared_ptr<AbstractAction>(download_finished_action)); 666eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood actions_.push_back(shared_ptr<AbstractAction>( 667eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood dst_filesystem_verifier_action)); 6684e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 6694e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // Bond them together. We have to use the leaf-types when calling 6704e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes // BondActions(). 671f98bff879c8e90840582f6a60a93918465f2d8b9Andrew de los Reyes BondActions(update_check_action.get(), 672f98bff879c8e90840582f6a60a93918465f2d8b9Andrew de los Reyes response_handler_action.get()); 673f9185170a9763e493e77ffdc5b1f057c3bd3b11eAndrew de los Reyes BondActions(response_handler_action.get(), 674eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood src_filesystem_verifier_action.get()); 675eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood BondActions(src_filesystem_verifier_action.get(), 676f9185170a9763e493e77ffdc5b1f057c3bd3b11eAndrew de los Reyes download_action.get()); 677f98bff879c8e90840582f6a60a93918465f2d8b9Andrew de los Reyes BondActions(download_action.get(), 678eb9e6d8d8813b2d5a81a14e0184f7b4798573606Allie Wood dst_filesystem_verifier_action.get()); 679e5e5fe926e9ea45b1a381af1bee91a86643ffd72Alex Deymo BuildPostInstallActions(dst_filesystem_verifier_action.get()); 680d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 681d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa actions_.push_back(shared_ptr<AbstractAction>(update_complete_action)); 682d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 683d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa // Enqueue the actions 684020600db42428e7e96bb0d2e05da225e68650955Alex Deymo for (const shared_ptr<AbstractAction>& action : actions_) { 685020600db42428e7e96bb0d2e05da225e68650955Alex Deymo processor_->EnqueueAction(action.get()); 686d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa } 687d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa} 688d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 68944b9b7ed0a702e54afccb86228668c59151859beChris Sosabool UpdateAttempter::Rollback(bool powerwash) { 69044b9b7ed0a702e54afccb86228668c59151859beChris Sosa if (!CanRollback()) { 69144b9b7ed0a702e54afccb86228668c59151859beChris Sosa return false; 69244b9b7ed0a702e54afccb86228668c59151859beChris Sosa } 693d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 69444b9b7ed0a702e54afccb86228668c59151859beChris Sosa // Extra check for enterprise-enrolled devices since they don't support 69544b9b7ed0a702e54afccb86228668c59151859beChris Sosa // powerwash. 69644b9b7ed0a702e54afccb86228668c59151859beChris Sosa if (powerwash) { 69744b9b7ed0a702e54afccb86228668c59151859beChris Sosa // Enterprise-enrolled devices have an empty owner in their device policy. 69844b9b7ed0a702e54afccb86228668c59151859beChris Sosa string owner; 69944b9b7ed0a702e54afccb86228668c59151859beChris Sosa RefreshDevicePolicy(); 70044b9b7ed0a702e54afccb86228668c59151859beChris Sosa const policy::DevicePolicy* device_policy = system_state_->device_policy(); 70144b9b7ed0a702e54afccb86228668c59151859beChris Sosa if (device_policy && (!device_policy->GetOwner(&owner) || owner.empty())) { 70244b9b7ed0a702e54afccb86228668c59151859beChris Sosa LOG(ERROR) << "Enterprise device detected. " 70344b9b7ed0a702e54afccb86228668c59151859beChris Sosa << "Cannot perform a powerwash for enterprise devices."; 70444b9b7ed0a702e54afccb86228668c59151859beChris Sosa return false; 70544b9b7ed0a702e54afccb86228668c59151859beChris Sosa } 70644b9b7ed0a702e54afccb86228668c59151859beChris Sosa } 70744b9b7ed0a702e54afccb86228668c59151859beChris Sosa 70844b9b7ed0a702e54afccb86228668c59151859beChris Sosa processor_->set_delegate(this); 709aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 71028e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa // Initialize the default request params. 71128e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa if (!omaha_request_params_->Init("", "", true)) { 71228e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa LOG(ERROR) << "Unable to initialize Omaha request params."; 71328e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa return false; 71428e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa } 71528e479c3b08cb4d1280905f5d3510f8ec4ed719cChris Sosa 716d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa LOG(INFO) << "Setting rollback options."; 717d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa InstallPlan install_plan; 71844b9b7ed0a702e54afccb86228668c59151859beChris Sosa 719763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo install_plan.target_slot = GetRollbackSlot(); 720763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo install_plan.source_slot = system_state_->boot_control()->GetCurrentSlot(); 721763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo 722706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo TEST_AND_RETURN_FALSE( 723706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo install_plan.LoadPartitionsFromSlots(system_state_->boot_control())); 724d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa install_plan.powerwash_required = powerwash; 725d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 726d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa LOG(INFO) << "Using this install plan:"; 727d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa install_plan.Dump(); 728d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 729d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa shared_ptr<InstallPlanAction> install_plan_action( 730d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa new InstallPlanAction(install_plan)); 731d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa actions_.push_back(shared_ptr<AbstractAction>(install_plan_action)); 732d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 733d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa BuildPostInstallActions(install_plan_action.get()); 734d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 735d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa // Enqueue the actions 736020600db42428e7e96bb0d2e05da225e68650955Alex Deymo for (const shared_ptr<AbstractAction>& action : actions_) { 737020600db42428e7e96bb0d2e05da225e68650955Alex Deymo processor_->EnqueueAction(action.get()); 738d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa } 739aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 740aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Update the payload state for Rollback. 741aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa system_state_->payload_state()->Rollback(); 742aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 743cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::ATTEMPTING_ROLLBACK); 744d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 745d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa // Just in case we didn't update boot flags yet, make sure they're updated 746d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa // before any update processing starts. This also schedules the start of the 747d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa // actions we just posted. 748d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa start_action_processor_ = true; 749d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa UpdateBootFlags(); 750aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa return true; 7514e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes} 7524e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 75359e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenkobool UpdateAttempter::CanRollback() const { 75444b9b7ed0a702e54afccb86228668c59151859beChris Sosa // We can only rollback if the update_engine isn't busy and we have a valid 75544b9b7ed0a702e54afccb86228668c59151859beChris Sosa // rollback partition. 756cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley return (status_ == UpdateStatus::IDLE && 757763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo GetRollbackSlot() != BootControlInterface::kInvalidSlot); 7582bddadd17e31ca1341604f8652432a8619557688Alex Vakulenko} 7592bddadd17e31ca1341604f8652432a8619557688Alex Vakulenko 760763e7dbaac735da0ae802933a1015b6b7874bce2Alex DeymoBootControlInterface::Slot UpdateAttempter::GetRollbackSlot() const { 761763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << "UpdateAttempter::GetRollbackSlot"; 762763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo const unsigned int num_slots = system_state_->boot_control()->GetNumSlots(); 763763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo const BootControlInterface::Slot current_slot = 764763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo system_state_->boot_control()->GetCurrentSlot(); 76559e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenko 766763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << " Installed slots: " << num_slots; 767763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << " Booted from slot: " 768763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo << BootControlInterface::SlotName(current_slot); 7692bddadd17e31ca1341604f8652432a8619557688Alex Vakulenko 770763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo if (current_slot == BootControlInterface::kInvalidSlot || num_slots < 2) { 771763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << "Device is not updateable."; 772763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo return BootControlInterface::kInvalidSlot; 77359e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenko } 77459e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenko 775763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo vector<BootControlInterface::Slot> bootable_slots; 776f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo for (BootControlInterface::Slot slot = 0; slot < num_slots; slot++) { 777763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo if (slot != current_slot && 778763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo system_state_->boot_control()->IsSlotBootable(slot)) { 779763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << "Found bootable slot " 780763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo << BootControlInterface::SlotName(slot); 781763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo return slot; 78259e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenko } 78359e253e555072d11f3646fc1286459cbc6aa5419Alex Vakulenko } 784763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo LOG(INFO) << "No other bootable slot found."; 785763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo return BootControlInterface::kInvalidSlot; 7862bddadd17e31ca1341604f8652432a8619557688Alex Vakulenko} 7872bddadd17e31ca1341604f8652432a8619557688Alex Vakulenko 78828e2f39b85e0a4d0d093123562e70d8906c03befGilad Arnoldvoid UpdateAttempter::CheckForUpdate(const string& app_version, 789e73acab3a647460ae98da60e2473d287ddf43675Jay Srinivasan const string& omaha_url, 790b92f0df60b3b1d8ad0ac95fea74cc4fbbf93d204Gilad Arnold bool interactive) { 791ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(INFO) << "Forced update check requested."; 79202c1864e204997175302b1aebe3e0be9c6699ea5David Pursell forced_app_version_.clear(); 79302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell forced_omaha_url_.clear(); 79402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 79502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // Certain conditions must be met to allow setting custom version and update 79602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // server URLs. However, kScheduledAUTestURLRequest and kAUTestURLRequest are 79702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // always allowed regardless of device state. 79802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell if (IsAnyUpdateSourceAllowed()) { 79902c1864e204997175302b1aebe3e0be9c6699ea5David Pursell forced_app_version_ = app_version; 80002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell forced_omaha_url_ = omaha_url; 80102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } 80202c1864e204997175302b1aebe3e0be9c6699ea5David Pursell if (omaha_url == kScheduledAUTestURLRequest) { 803ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo forced_omaha_url_ = constants::kOmahaDefaultAUTestURL; 80402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // Pretend that it's not user-initiated even though it is, 80502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // so as to test scattering logic, etc. which get kicked off 80602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // only in scheduled update checks. 80702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell interactive = false; 80802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } else if (omaha_url == kAUTestURLRequest) { 809ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo forced_omaha_url_ = constants::kOmahaDefaultAUTestURL; 81002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } 81102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 81254fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold if (forced_update_pending_callback_.get()) { 81354fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // Make sure that a scheduling request is made prior to calling the forced 81454fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // update pending callback. 81554fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 816ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold forced_update_pending_callback_->Run(true, interactive); 81754fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold } 81863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes} 81963b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes 820296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkovbool UpdateAttempter::RebootIfNeeded() { 821cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley if (status_ != UpdateStatus::UPDATED_NEED_REBOOT) { 822296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov LOG(INFO) << "Reboot requested, but status is " 823296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov << UpdateStatusToString(status_) << ", so not rebooting."; 824296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov return false; 825296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov } 82665f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat 82765f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat if (USE_POWER_MANAGEMENT && RequestPowerManagerReboot()) 82865f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat return true; 82965f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat 83065f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat return RebootDirectly(); 831296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov} 832296889c68c92b04d307035c5803681f8d2c8f9d3Darin Petkov 8333c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthenvoid UpdateAttempter::WriteUpdateCompletedMarker() { 834906191f88cb2448691e54f7a6a3b464854053154Alex Deymo string boot_id; 835906191f88cb2448691e54f7a6a3b464854053154Alex Deymo if (!utils::GetBootId(&boot_id)) 8363c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen return; 837906191f88cb2448691e54f7a6a3b464854053154Alex Deymo prefs_->SetString(kPrefsUpdateCompletedOnBootId, boot_id); 8383c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen 8393c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen int64_t value = system_state_->clock()->GetBootTime().ToInternalValue(); 840906191f88cb2448691e54f7a6a3b464854053154Alex Deymo prefs_->SetInt64(kPrefsUpdateCompletedBootTime, value); 8413c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen} 8423c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen 84365f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Eratbool UpdateAttempter::RequestPowerManagerReboot() { 844305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo org::chromium::PowerManagerProxyInterface* power_manager_proxy = 845305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo system_state_->power_manager_proxy(); 846305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (!power_manager_proxy) { 847305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo LOG(WARNING) << "No PowerManager proxy defined, skipping reboot."; 84865f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat return false; 84965f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat } 85065f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat LOG(INFO) << "Calling " << power_manager::kPowerManagerInterface << "." 85165f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat << power_manager::kRequestRestartMethod; 8523f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::ErrorPtr error; 853305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo return power_manager_proxy->RequestRestart( 854305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo power_manager::REQUEST_RESTART_FOR_UPDATE, &error); 85565f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat} 85665f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat 85765f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Eratbool UpdateAttempter::RebootDirectly() { 85865f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat vector<string> command; 85965f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat command.push_back("/sbin/shutdown"); 86065f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat command.push_back("-r"); 86165f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat command.push_back("now"); 8620103c36caa2e38e034e0d22185736b9ccfb35c58Alex Vakulenko LOG(INFO) << "Running \"" << base::JoinString(command, " ") << "\""; 86365f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat int rc = 0; 86488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko Subprocess::SynchronousExec(command, &rc, nullptr); 86565f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat return rc == 0; 86665f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat} 86765f1da02c7a366893c9fe5d448ed3c8db73d5b4eDaniel Erat 868ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldvoid UpdateAttempter::OnUpdateScheduled(EvalStatus status, 869ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold const UpdateCheckParams& params) { 870ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold waiting_for_scheduled_check_ = false; 871ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 872ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (status == EvalStatus::kSucceeded) { 873ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (!params.updates_enabled) { 874ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(WARNING) << "Updates permanently disabled."; 87554fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // Signal disabled status, then switch right back to idle. This is 87654fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // necessary for ensuring that observers waiting for a signal change will 87754fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // actually notice one on subsequent calls. Note that we don't need to 87854fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // re-schedule a check in this case as updates are permanently disabled; 87954fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold // further (forced) checks may still initiate a scheduling call. 880cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::DISABLED); 881cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::IDLE); 882ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold return; 883ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold } 884ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 885ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(INFO) << "Running " 886ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold << (params.is_interactive ? "interactive" : "periodic") 887ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold << " update."; 888ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 889ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold string app_version, omaha_url; 890ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold if (params.is_interactive) { 891ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold app_version = forced_app_version_; 892ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold omaha_url = forced_omaha_url_; 893ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold } 894ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 895ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold Update(app_version, omaha_url, params.target_channel, 896ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold params.target_version_prefix, false, params.is_interactive); 897ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold } else { 898ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold LOG(WARNING) 899ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold << "Update check scheduling failed (possibly timed out); retrying."; 900ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold ScheduleUpdates(); 901ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold } 902ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 903ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // This check ensures that future update checks will be or are already 904ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // scheduled. The check should never fail. A check failure means that there's 905ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // a bug that will most likely prevent further automatic update checks. It 906ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // seems better to crash in such cases and restart the update_engine daemon 907ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // into, hopefully, a known good state. 90854fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold CHECK(IsUpdateRunningOrScheduled()); 909ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold} 910ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 911ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnoldvoid UpdateAttempter::UpdateLastCheckedTime() { 912ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold last_checked_time_ = system_state_->clock()->GetWallclockTime().ToTimeT(); 913ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold} 914ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 91563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes// Delegate methods: 9164e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesvoid UpdateAttempter::ProcessingDone(const ActionProcessor* processor, 917a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) { 91863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes LOG(INFO) << "Processing Done."; 9196b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes actions_.clear(); 92009f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 9214f8ee27b3592351cd71897d192065758340932d1Chris Sosa // Reset cpu shares back to normal. 922ab0d976fa47844870d55c87ab530072cea0c8c53Alex Deymo cpu_limiter_.StopLimiter(); 923c6c135c3e555a856b762e4f383d1d2768363589dDarin Petkov 924cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley if (status_ == UpdateStatus::REPORTING_ERROR_EVENT) { 92509f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov LOG(INFO) << "Error event sent."; 9261ebd813ad19214d0b59ade04005c3b84ae765e42Gilad Arnold 9277d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyen // Inform scheduler of new status; 928cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::IDLE); 92954fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 9301ebd813ad19214d0b59ade04005c3b84ae765e42Gilad Arnold 931c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes if (!fake_update_success_) { 932c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes return; 933c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes } 934c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes LOG(INFO) << "Booted from FW B and tried to install new firmware, " 935c1d5c93ddf56e193fd501e5f8fc3fc45efdc560fAndrew de los Reyes "so requesting reboot from user."; 93609f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov } 93709f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 938d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold if (code == ErrorCode::kSuccess) { 9393c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen WriteUpdateCompletedMarker(); 940362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov prefs_->SetInt64(kPrefsDeltaUpdateFailures, 0); 941ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan prefs_->SetString(kPrefsPreviousVersion, 942ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->app_version()); 9439b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov DeltaPerformer::ResetUpdateProgress(prefs_, false); 944480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 9459a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen system_state_->payload_state()->UpdateSucceeded(); 9469a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 947480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Since we're done with scattering fully at this point, this is the 948480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // safest point delete the state files, as we're sure that the status is 949480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // set to reboot (which means no more updates will be applied until reboot) 950480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // This deletion is required for correctness as we want the next update 951480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // check to re-create a new random number for the update check count. 952480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Similarly, we also delete the wall-clock-wait period that was persisted 953480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // so that we start with a new random value for the next update check 954480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // after reboot so that the same device is not favored or punished in any 955480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // way. 956480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan prefs_->Delete(kPrefsUpdateCheckCount); 957519cfc71f0a2f7f01adb51acd19b5cd23d2c93a2Gilad Arnold system_state_->payload_state()->SetScatteringWaitPeriod(TimeDelta()); 95834b5d86d057d450325dd06d35ae182ac6da306e4Jay Srinivasan prefs_->Delete(kPrefsUpdateFirstSeenAt); 959480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 960cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::UPDATED_NEED_REBOOT); 96154fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 96219409b74019d787100b768306e75ab3e5882898dJay Srinivasan LOG(INFO) << "Update successfully applied, waiting to reboot."; 9639d65b7b9249124a433b9a018a1952435f7f75c4dDarin Petkov 96488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko // This pointer is null during rollback operations, and the stats 96588b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko // don't make much sense then anyway. 966af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett if (response_handler_action_) { 967af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett const InstallPlan& install_plan = 968af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett response_handler_action_->install_plan(); 969af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett 970af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett // Generate an unique payload identifier. 971af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett const string target_version_uid = 972af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett install_plan.payload_hash + ":" + install_plan.metadata_signature; 973af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett 974af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett // Expect to reboot into the new version to send the proper metric during 975af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett // next boot. 976af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett system_state_->payload_state()->ExpectRebootInNewVersion( 977af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett target_version_uid); 978af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett } else { 979af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett // If we just finished a rollback, then we expect to have no Omaha 980af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett // response. Otherwise, it's an error. 981af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett if (system_state_->payload_state()->GetRollbackVersion().empty()) { 982af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett LOG(ERROR) << "Can't send metrics because expected " 983af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett "response_handler_action_ missing."; 984af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett } 985af9085e6b77f3f53a2d824b720414e0b1ab2e8a0Don Garrett } 98609f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov return; 98763b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes } 98809f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 9891023a6029771fb8dea867e14193df8e58a59a662Darin Petkov if (ScheduleErrorEventAction()) { 99009f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov return; 9911023a6029771fb8dea867e14193df8e58a59a662Darin Petkov } 9921023a6029771fb8dea867e14193df8e58a59a662Darin Petkov LOG(INFO) << "No update."; 993cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::IDLE); 99454fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 99563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes} 99663b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes 99763b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyesvoid UpdateAttempter::ProcessingStopped(const ActionProcessor* processor) { 9984f8ee27b3592351cd71897d192065758340932d1Chris Sosa // Reset cpu shares back to normal. 999ab0d976fa47844870d55c87ab530072cea0c8c53Alex Deymo cpu_limiter_.StopLimiter(); 100063b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes download_progress_ = 0.0; 1001cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::IDLE); 100254fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 10036b78e29f80e98c4ad009c830012682220dc9de3bAndrew de los Reyes actions_.clear(); 100488b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko error_event_.reset(nullptr); 100563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes} 100663b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes 100763b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes// Called whenever an action has finished processing, either successfully 100863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes// or otherwise. 100963b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyesvoid UpdateAttempter::ActionCompleted(ActionProcessor* processor, 101063b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes AbstractAction* action, 1011a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) { 10121023a6029771fb8dea867e14193df8e58a59a662Darin Petkov // Reset download progress regardless of whether or not the download 10131023a6029771fb8dea867e14193df8e58a59a662Darin Petkov // action succeeded. Also, get the response code from HTTP request 10141023a6029771fb8dea867e14193df8e58a59a662Darin Petkov // actions (update download as well as the initial update check 10151023a6029771fb8dea867e14193df8e58a59a662Darin Petkov // actions). 101663b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes const string type = action->Type(); 10171023a6029771fb8dea867e14193df8e58a59a662Darin Petkov if (type == DownloadAction::StaticType()) { 101863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes download_progress_ = 0.0; 1019cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold DownloadAction* download_action = static_cast<DownloadAction*>(action); 10201023a6029771fb8dea867e14193df8e58a59a662Darin Petkov http_response_code_ = download_action->GetHTTPResponseCode(); 10211023a6029771fb8dea867e14193df8e58a59a662Darin Petkov } else if (type == OmahaRequestAction::StaticType()) { 10221023a6029771fb8dea867e14193df8e58a59a662Darin Petkov OmahaRequestAction* omaha_request_action = 1023cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold static_cast<OmahaRequestAction*>(action); 10241023a6029771fb8dea867e14193df8e58a59a662Darin Petkov // If the request is not an event, then it's the update-check. 10251023a6029771fb8dea867e14193df8e58a59a662Darin Petkov if (!omaha_request_action->IsEvent()) { 10261023a6029771fb8dea867e14193df8e58a59a662Darin Petkov http_response_code_ = omaha_request_action->GetHTTPResponseCode(); 1027a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold 1028a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold // Record the number of consecutive failed update checks. 1029a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold if (http_response_code_ == kHttpResponseInternalServerError || 1030a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold http_response_code_ == kHttpResponseServiceUnavailable) { 1031a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold consecutive_failed_update_checks_++; 1032a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold } else { 1033a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold consecutive_failed_update_checks_ = 0; 1034a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold } 1035a6dab94046bcd6c560c822e0175c75427368ab20Gilad Arnold 1036a0258a557d36ff78eacdacd39bdc88c5e6c1056eGilad Arnold // Store the server-dictated poll interval, if any. 1037a0258a557d36ff78eacdacd39bdc88c5e6c1056eGilad Arnold server_dictated_poll_interval_ = 1038a0258a557d36ff78eacdacd39bdc88c5e6c1056eGilad Arnold std::max(0, omaha_request_action->GetOutputObject().poll_interval); 10391023a6029771fb8dea867e14193df8e58a59a662Darin Petkov } 10401023a6029771fb8dea867e14193df8e58a59a662Darin Petkov } 1041d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold if (code != ErrorCode::kSuccess) { 10427ed561bfe6019ed4b988142e97505d7c643e119cDarin Petkov // If the current state is at or past the download phase, count the failure 10437ed561bfe6019ed4b988142e97505d7c643e119cDarin Petkov // in case a switch to full update becomes necessary. Ignore network 10447ed561bfe6019ed4b988142e97505d7c643e119cDarin Petkov // transfer timeouts and failures. 1045cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley if (status_ >= UpdateStatus::DOWNLOADING && 1046d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold code != ErrorCode::kDownloadTransferError) { 1047362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov MarkDeltaUpdateFailure(); 1048362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov } 1049777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov // On failure, schedule an error event to be sent to Omaha. 1050777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov CreatePendingErrorEvent(action, code); 105163b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes return; 105209f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov } 105363b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes // Find out which action completed. 105463b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes if (type == OmahaResponseHandlerAction::StaticType()) { 10559b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov // Note that the status will be updated to DOWNLOADING when some bytes get 10569b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov // actually downloaded from the server and the BytesReceived callback is 10579b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov // invoked. This avoids notifying the user that a download has started in 10589b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov // cases when the server and the client are unable to initiate the download. 10599b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov CHECK(action == response_handler_action_.get()); 10609b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov const InstallPlan& plan = response_handler_action_->install_plan(); 1061ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold UpdateLastCheckedTime(); 1062fb1020e30511825c1c39f3764f07ef237a6f668eChris Sosa new_version_ = plan.version; 106351dcf260754837962dd22db3b7babee181471e7dJay Srinivasan new_payload_size_ = plan.payload_size; 10649b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov SetupDownload(); 1065ab0d976fa47844870d55c87ab530072cea0c8c53Alex Deymo cpu_limiter_.StartLimiter(); 1066cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::UPDATE_AVAILABLE); 106763b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes } else if (type == DownloadAction::StaticType()) { 1068cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::FINALIZING); 10694e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes } 10704e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes} 10714e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 1072542c19bf271011913a9f352f58e140224c936736Alex Deymovoid UpdateAttempter::BytesReceived(uint64_t bytes_progressed, 1073542c19bf271011913a9f352f58e140224c936736Alex Deymo uint64_t bytes_received, 1074542c19bf271011913a9f352f58e140224c936736Alex Deymo uint64_t total) { 1075542c19bf271011913a9f352f58e140224c936736Alex Deymo // The PayloadState keeps track of how many bytes were actually downloaded 1076542c19bf271011913a9f352f58e140224c936736Alex Deymo // from a given URL for the URL skipping logic. 1077542c19bf271011913a9f352f58e140224c936736Alex Deymo system_state_->payload_state()->DownloadProgress(bytes_progressed); 1078542c19bf271011913a9f352f58e140224c936736Alex Deymo 107972ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo double progress = 0; 108072ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo if (total) 108172ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo progress = static_cast<double>(bytes_received) / static_cast<double>(total); 108272ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo if (status_ != UpdateStatus::DOWNLOADING || bytes_received == total) { 1083af183050a13b6851d7e385bb697ae290ccdaf880Darin Petkov download_progress_ = progress; 1084cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::DOWNLOADING); 108572ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo } else { 108672ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo ProgressUpdate(progress); 108763b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes } 108863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes} 108963b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes 1090542c19bf271011913a9f352f58e140224c936736Alex Deymovoid UpdateAttempter::DownloadComplete() { 1091542c19bf271011913a9f352f58e140224c936736Alex Deymo system_state_->payload_state()->DownloadComplete(); 1092542c19bf271011913a9f352f58e140224c936736Alex Deymo} 1093542c19bf271011913a9f352f58e140224c936736Alex Deymo 1094f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymobool UpdateAttempter::OnCheckForUpdates(brillo::ErrorPtr* error) { 1095f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo CheckForUpdate( 1096f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo "" /* app_version */, "" /* omaha_url */, true /* interactive */); 1097f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo return true; 1098f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo} 1099f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo 1100f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymobool UpdateAttempter::OnTrackChannel(const string& channel, 1101f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo brillo::ErrorPtr* error) { 1102f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo LOG(INFO) << "Setting destination channel to: " << channel; 1103f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo string error_message; 1104f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo if (!system_state_->request_params()->SetTargetChannel( 1105f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo channel, false /* powerwash_allowed */, &error_message)) { 1106f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo brillo::Error::AddTo(error, 1107f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo FROM_HERE, 1108f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo brillo::errors::dbus::kDomain, 1109c7cc45e4ac9ca1f4693dfc93e4ff203992d446a1Alex Vakulenko "set_target_error", 1110f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo error_message); 1111f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo return false; 1112f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo } 1113fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo // Notify observers the target channel change. 1114fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo BroadcastChannel(); 1115f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo return true; 1116f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo} 1117f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo 1118f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymobool UpdateAttempter::GetWeaveState(int64_t* last_checked_time, 1119f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo double* progress, 1120f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo UpdateStatus* update_status, 1121f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo string* current_channel, 1122f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo string* tracking_channel) { 1123f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo *last_checked_time = last_checked_time_; 1124f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo *progress = download_progress_; 1125f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo *update_status = status_; 1126f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo OmahaRequestParams* rp = system_state_->request_params(); 1127f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo *current_channel = rp->current_channel(); 1128f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo *tracking_channel = rp->target_channel(); 1129f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo return true; 1130f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo} 1131f7ead8100211e7a285b48b52f4a235647274ab6eAlex Deymo 113272ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymovoid UpdateAttempter::ProgressUpdate(double progress) { 113372ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo // Self throttle based on progress. Also send notifications if progress is 113472ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo // too slow. 113572ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo if (progress == 1.0 || 113672ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo progress - download_progress_ >= kBroadcastThresholdProgress || 113772ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo TimeTicks::Now() - last_notify_time_ >= 113872ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo TimeDelta::FromSeconds(kBroadcastThresholdSeconds)) { 113972ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo download_progress_ = progress; 114072ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo BroadcastStatus(); 114172ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo } 114272ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo} 114372ea95ab7705448b044cafc6b8cf2a2f4d929bd9Alex Deymo 1144c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasanbool UpdateAttempter::ResetStatus() { 1145c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan LOG(INFO) << "Attempting to reset state from " 1146cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley << UpdateStatusToString(status_) << " to UpdateStatus::IDLE"; 1147c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan 1148c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan switch (status_) { 1149cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley case UpdateStatus::IDLE: 1150c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan // no-op. 1151c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan return true; 1152c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan 1153cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley case UpdateStatus::UPDATED_NEED_REBOOT: { 11541c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan bool ret_value = true; 1155cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley status_ = UpdateStatus::IDLE; 1156c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan 11571c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan // Remove the reboot marker so that if the machine is rebooted 1158c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan // after resetting to idle state, it doesn't go back to 1159cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley // UpdateStatus::UPDATED_NEED_REBOOT state. 1160906191f88cb2448691e54f7a6a3b464854053154Alex Deymo ret_value = prefs_->Delete(kPrefsUpdateCompletedOnBootId) && ret_value; 1161906191f88cb2448691e54f7a6a3b464854053154Alex Deymo ret_value = prefs_->Delete(kPrefsUpdateCompletedBootTime) && ret_value; 11621c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 11639870c0e0a35669674198f596be71056ba0c78d62Alex Deymo // Update the boot flags so the current slot has higher priority. 11649870c0e0a35669674198f596be71056ba0c78d62Alex Deymo BootControlInterface* boot_control = system_state_->boot_control(); 11659870c0e0a35669674198f596be71056ba0c78d62Alex Deymo if (!boot_control->SetActiveBootSlot(boot_control->GetCurrentSlot())) 11669870c0e0a35669674198f596be71056ba0c78d62Alex Deymo ret_value = false; 11679870c0e0a35669674198f596be71056ba0c78d62Alex Deymo 11684243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Notify the PayloadState that the successful payload was canceled. 11694243291a6655972fe89d4747a0089834c9e47c20Alex Deymo system_state_->payload_state()->ResetUpdateStatus(); 11704243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 117187c08866cfc596234a1484147d3943d109418e7eAlex Deymo // The previous version is used to report back to omaha after reboot that 117287c08866cfc596234a1484147d3943d109418e7eAlex Deymo // we actually rebooted into the new version from this "prev-version". We 117387c08866cfc596234a1484147d3943d109418e7eAlex Deymo // need to clear out this value now to prevent it being sent on the next 117487c08866cfc596234a1484147d3943d109418e7eAlex Deymo // updatecheck request. 117587c08866cfc596234a1484147d3943d109418e7eAlex Deymo ret_value = prefs_->SetString(kPrefsPreviousVersion, "") && ret_value; 117687c08866cfc596234a1484147d3943d109418e7eAlex Deymo 1177906191f88cb2448691e54f7a6a3b464854053154Alex Deymo LOG(INFO) << "Reset status " << (ret_value ? "successful" : "failed"); 11781c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan return ret_value; 1179c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan } 1180c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan 1181c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan default: 1182c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan LOG(ERROR) << "Reset not allowed in this state."; 1183c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan return false; 1184c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan } 1185c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan} 1186c1ba09a8f4d3eda4654b34bf01d41fd9ad1d9f38Jay Srinivasan 11874e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyesbool UpdateAttempter::GetStatus(int64_t* last_checked_time, 11884e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes double* progress, 118928e2f39b85e0a4d0d093123562e70d8906c03befGilad Arnold string* current_operation, 119028e2f39b85e0a4d0d093123562e70d8906c03befGilad Arnold string* new_version, 119151dcf260754837962dd22db3b7babee181471e7dJay Srinivasan int64_t* new_payload_size) { 119263b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes *last_checked_time = last_checked_time_; 119363b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes *progress = download_progress_; 119463b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes *current_operation = UpdateStatusToString(status_); 119563b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes *new_version = new_version_; 119651dcf260754837962dd22db3b7babee181471e7dJay Srinivasan *new_payload_size = new_payload_size_; 11974e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes return true; 11984e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes} 11994e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 12006dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyesvoid UpdateAttempter::UpdateBootFlags() { 120158dd1348495a13a59edf630f54b1d236ee869339Darin Petkov if (update_boot_flags_running_) { 120258dd1348495a13a59edf630f54b1d236ee869339Darin Petkov LOG(INFO) << "Update boot flags running, nothing to do."; 120358dd1348495a13a59edf630f54b1d236ee869339Darin Petkov return; 120458dd1348495a13a59edf630f54b1d236ee869339Darin Petkov } 12056dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyes if (updated_boot_flags_) { 12066dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyes LOG(INFO) << "Already updated boot flags. Skipping."; 120758dd1348495a13a59edf630f54b1d236ee869339Darin Petkov if (start_action_processor_) { 120858dd1348495a13a59edf630f54b1d236ee869339Darin Petkov ScheduleProcessingStart(); 120958dd1348495a13a59edf630f54b1d236ee869339Darin Petkov } 12106dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyes return; 12116dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyes } 121258dd1348495a13a59edf630f54b1d236ee869339Darin Petkov // This is purely best effort. Failures should be logged by Subprocess. Run 121358dd1348495a13a59edf630f54b1d236ee869339Darin Petkov // the script asynchronously to avoid blocking the event loop regardless of 121458dd1348495a13a59edf630f54b1d236ee869339Darin Petkov // the script runtime. 121558dd1348495a13a59edf630f54b1d236ee869339Darin Petkov update_boot_flags_running_ = true; 1216aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymo LOG(INFO) << "Marking booted slot as good."; 1217aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymo if (!system_state_->boot_control()->MarkBootSuccessfulAsync(Bind( 1218aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymo &UpdateAttempter::CompleteUpdateBootFlags, base::Unretained(this)))) { 1219aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymo LOG(ERROR) << "Failed to mark current boot as successful."; 1220aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymo CompleteUpdateBootFlags(false); 122158dd1348495a13a59edf630f54b1d236ee869339Darin Petkov } 122258dd1348495a13a59edf630f54b1d236ee869339Darin Petkov} 122358dd1348495a13a59edf630f54b1d236ee869339Darin Petkov 1224aa26f6240865d43f8cecc97bde7828f9b82bc17dAlex Deymovoid UpdateAttempter::CompleteUpdateBootFlags(bool successful) { 122558dd1348495a13a59edf630f54b1d236ee869339Darin Petkov update_boot_flags_running_ = false; 12266dbf30a3c752c402f5a308de3b59d4c860de2d58Andrew de los Reyes updated_boot_flags_ = true; 122758dd1348495a13a59edf630f54b1d236ee869339Darin Petkov if (start_action_processor_) { 122858dd1348495a13a59edf630f54b1d236ee869339Darin Petkov ScheduleProcessingStart(); 122958dd1348495a13a59edf630f54b1d236ee869339Darin Petkov } 123058dd1348495a13a59edf630f54b1d236ee869339Darin Petkov} 123158dd1348495a13a59edf630f54b1d236ee869339Darin Petkov 123261635a95b9e6c62e31ed61fb5738c55bb5c92048Darin Petkovvoid UpdateAttempter::BroadcastStatus() { 1233fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo for (const auto& observer : service_observers_) { 1234fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo observer->SendStatusUpdate(last_checked_time_, 1235fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo download_progress_, 1236fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo status_, 1237fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo new_version_, 1238fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo new_payload_size_); 1239fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo } 1240af183050a13b6851d7e385bb697ae290ccdaf880Darin Petkov last_notify_time_ = TimeTicks::Now(); 1241fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo} 1242fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo 1243fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymovoid UpdateAttempter::BroadcastChannel() { 1244fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo for (const auto& observer : service_observers_) { 1245fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo observer->SendChannelChangeUpdate( 1246fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo system_state_->request_params()->target_channel()); 1247fa78f14d818e8e0b8ed5d05ebc389bf833342e7aAlex Deymo } 124863b96d74b2ffe5999243ab5c33f588030bcb42ceAndrew de los Reyes} 12494e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes 125055f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasanuint32_t UpdateAttempter::GetErrorCodeFlags() { 125155f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan uint32_t flags = 0; 125255f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 1253056b0abc1273a6eebfd73060a1d0344ef02b8696J. Richard Barnette if (!system_state_->hardware()->IsNormalBootMode()) 1254d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold flags |= static_cast<uint32_t>(ErrorCode::kDevModeFlag); 125555f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 125655f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan if (response_handler_action_.get() && 125755f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan response_handler_action_->install_plan().is_resume) 1258d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold flags |= static_cast<uint32_t>(ErrorCode::kResumedFlag); 125955f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 1260056b0abc1273a6eebfd73060a1d0344ef02b8696J. Richard Barnette if (!system_state_->hardware()->IsOfficialBuild()) 1261d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold flags |= static_cast<uint32_t>(ErrorCode::kTestImageFlag); 126255f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 1263ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo if (omaha_request_params_->update_url() != 1264ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo constants::kOmahaDefaultProductionURL) { 1265d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold flags |= static_cast<uint32_t>(ErrorCode::kTestOmahaUrlFlag); 1266ac41a82e4be1be43913292d13d58b5eb2c572f53Alex Deymo } 126755f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 126855f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan return flags; 126955f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan} 127055f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan 1271a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthenbool UpdateAttempter::ShouldCancel(ErrorCode* cancel_reason) { 12721c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan // Check if the channel we're attempting to update to is the same as the 12731c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan // target channel currently chosen by the user. 12741c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan OmahaRequestParams* params = system_state_->request_params(); 12751c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan if (params->download_channel() != params->target_channel()) { 12761c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan LOG(ERROR) << "Aborting download as target channel: " 12771c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan << params->target_channel() 12781c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan << " is different from the download channel: " 12791c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan << params->download_channel(); 1280d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold *cancel_reason = ErrorCode::kUpdateCanceledByChannelChange; 12811c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan return true; 12821c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan } 12831c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 12841c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan return false; 12851c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan} 12861c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan 12877d623ebf9eee346fdeee71f1ccb32ebaf4bd3318Nam T. Nguyenvoid UpdateAttempter::SetStatusAndNotify(UpdateStatus status) { 128861635a95b9e6c62e31ed61fb5738c55bb5c92048Darin Petkov status_ = status; 128961635a95b9e6c62e31ed61fb5738c55bb5c92048Darin Petkov BroadcastStatus(); 129061635a95b9e6c62e31ed61fb5738c55bb5c92048Darin Petkov} 129161635a95b9e6c62e31ed61fb5738c55bb5c92048Darin Petkov 1292777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkovvoid UpdateAttempter::CreatePendingErrorEvent(AbstractAction* action, 1293a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode code) { 129409f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov if (error_event_.get()) { 129509f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov // This shouldn't really happen. 129609f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov LOG(WARNING) << "There's already an existing pending error event."; 129709f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov return; 129809f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov } 1299777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov 1300abc7bc0f5d88f110b463191bb8384f95d3c4230aDarin Petkov // For now assume that a generic Omaha response action failure means that 1301abc7bc0f5d88f110b463191bb8384f95d3c4230aDarin Petkov // there's no update so don't send an event. Also, double check that the 1302abc7bc0f5d88f110b463191bb8384f95d3c4230aDarin Petkov // failure has not occurred while sending an error event -- in which case 1303abc7bc0f5d88f110b463191bb8384f95d3c4230aDarin Petkov // don't schedule another. This shouldn't really happen but just in case... 1304abc7bc0f5d88f110b463191bb8384f95d3c4230aDarin Petkov if ((action->Type() == OmahaResponseHandlerAction::StaticType() && 1305d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold code == ErrorCode::kError) || 1306cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley status_ == UpdateStatus::REPORTING_ERROR_EVENT) { 1307777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov return; 1308777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov } 1309777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov 131056d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan // Classify the code to generate the appropriate result so that 131156d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan // the Borgmon charts show up the results correctly. 131256d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan // Do this before calling GetErrorCodeForAction which could potentially 131356d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan // augment the bit representation of code and thus cause no matches for 131456d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan // the switch cases below. 131556d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan OmahaEvent::Result event_result; 131656d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan switch (code) { 1317d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold case ErrorCode::kOmahaUpdateIgnoredPerPolicy: 1318d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold case ErrorCode::kOmahaUpdateDeferredPerPolicy: 1319d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold case ErrorCode::kOmahaUpdateDeferredForBackoff: 132056d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan event_result = OmahaEvent::kResultUpdateDeferred; 132156d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan break; 132256d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan default: 132356d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan event_result = OmahaEvent::kResultError; 132456d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan break; 132556d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan } 132656d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan 1327777dbfae01be95ac66f385cd96dc6e4b421fefe5Darin Petkov code = GetErrorCodeForAction(action, code); 1328d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold fake_update_success_ = code == ErrorCode::kPostinstallBootedFromFirmwareB; 132918c7bce69dc040dc8e9c2a1dc207f7447fb06e84Darin Petkov 133055f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan // Compute the final error code with all the bit flags to be sent to Omaha. 1331d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold code = static_cast<ErrorCode>( 1332d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold static_cast<uint32_t>(code) | GetErrorCodeFlags()); 133309f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete, 133456d5aa471205bf2271219252ec94b5f0c986a68bJay Srinivasan event_result, 133509f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov code)); 133609f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov} 133709f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 133809f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkovbool UpdateAttempter::ScheduleErrorEventAction() { 133988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko if (error_event_.get() == nullptr) 134009f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov return false; 134109f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 13426f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan LOG(ERROR) << "Update failed."; 13436f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan system_state_->payload_state()->UpdateFailed(error_event_->error_code); 13446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 134555f50c24c2624487b803ba2f93588494cc69e523Jay Srinivasan // Send it to Omaha. 1346af9a863cd7aa4aa4ef12227908a10bc07440a0f0Alex Deymo LOG(INFO) << "Reporting the error event"; 134709f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov shared_ptr<OmahaRequestAction> error_event_action( 13486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan new OmahaRequestAction(system_state_, 134909f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov error_event_.release(), // Pass ownership. 1350c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo brillo::make_unique_ptr(new LibcurlHttpFetcher( 1351706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo GetProxyResolver(), 1352706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_->hardware())), 1353116fda3221ff3df037ea1feb271883c87644c839Thieu Le false)); 135409f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov actions_.push_back(shared_ptr<AbstractAction>(error_event_action)); 1355f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov processor_->EnqueueAction(error_event_action.get()); 1356cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::REPORTING_ERROR_EVENT); 1357f42cc1c604fe5b0be29847a24f9bd5acf42ba394Darin Petkov processor_->StartProcessing(); 135809f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov return true; 135909f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov} 136009f96c384e1e5f4d3a1229babd9a1b204daf4927Darin Petkov 136158dd1348495a13a59edf630f54b1d236ee869339Darin Petkovvoid UpdateAttempter::ScheduleProcessingStart() { 136258dd1348495a13a59edf630f54b1d236ee869339Darin Petkov LOG(INFO) << "Scheduling an action processor start."; 136358dd1348495a13a59edf630f54b1d236ee869339Darin Petkov start_action_processor_ = false; 136460ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo MessageLoop::current()->PostTask( 136560ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo FROM_HERE, 136660ca1a7bca7cc804ec80b510483081ef894de4cdAlex Deymo Bind([this] { this->processor_->StartProcessing(); })); 136758dd1348495a13a59edf630f54b1d236ee869339Darin Petkov} 136858dd1348495a13a59edf630f54b1d236ee869339Darin Petkov 1369362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkovvoid UpdateAttempter::DisableDeltaUpdateIfNeeded() { 1370362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov int64_t delta_failures; 1371ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan if (omaha_request_params_->delta_okay() && 1372362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov prefs_->GetInt64(kPrefsDeltaUpdateFailures, &delta_failures) && 1373362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov delta_failures >= kMaxDeltaUpdateFailures) { 1374362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov LOG(WARNING) << "Too many delta update failures, forcing full update."; 1375ae4697c073b84b260990a141acd53c6806da0708Jay Srinivasan omaha_request_params_->set_delta_okay(false); 1376362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov } 1377362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov} 1378362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov 1379362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkovvoid UpdateAttempter::MarkDeltaUpdateFailure() { 13802dd0109675fac379289a9d092fa4a6f6e05e0038Darin Petkov // Don't try to resume a failed delta update. 13812dd0109675fac379289a9d092fa4a6f6e05e0038Darin Petkov DeltaPerformer::ResetUpdateProgress(prefs_, false); 1382362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov int64_t delta_failures; 1383362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov if (!prefs_->GetInt64(kPrefsDeltaUpdateFailures, &delta_failures) || 1384362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov delta_failures < 0) { 1385362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov delta_failures = 0; 1386362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov } 1387362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov prefs_->SetInt64(kPrefsDeltaUpdateFailures, ++delta_failures); 1388362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov} 1389362757765e7697dd93e8de05fa0a59f29242eb89Darin Petkov 13909b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkovvoid UpdateAttempter::SetupDownload() { 13919bedeb51f80c9547269eef6c2ec09596033bb818Gilad Arnold MultiRangeHttpFetcher* fetcher = 1392cf175a098081f3f0e9ca52d997a7ce1585c14c2dGilad Arnold static_cast<MultiRangeHttpFetcher*>(download_action_->http_fetcher()); 1393819fef2e0fa08984cf31e848e704442c500ea4f9Andrew de los Reyes fetcher->ClearRanges(); 13949b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov if (response_handler_action_->install_plan().is_resume) { 1395b21ce5dabf502906e21fef4066ebe141c9ba4b49Darin Petkov // Resuming an update so fetch the update manifest metadata first. 13969b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov int64_t manifest_metadata_size = 0; 1397f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo int64_t manifest_signature_size = 0; 13989b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov prefs_->GetInt64(kPrefsManifestMetadataSize, &manifest_metadata_size); 1399f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo prefs_->GetInt64(kPrefsManifestSignatureSize, &manifest_signature_size); 1400f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo fetcher->AddRange(0, manifest_metadata_size + manifest_signature_size); 1401b21ce5dabf502906e21fef4066ebe141c9ba4b49Darin Petkov // If there're remaining unprocessed data blobs, fetch them. Be careful not 1402b21ce5dabf502906e21fef4066ebe141c9ba4b49Darin Petkov // to request data beyond the end of the payload to avoid 416 HTTP response 1403b21ce5dabf502906e21fef4066ebe141c9ba4b49Darin Petkov // error codes. 14049b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov int64_t next_data_offset = 0; 14059b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov prefs_->GetInt64(kPrefsUpdateStateNextDataOffset, &next_data_offset); 1406f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo uint64_t resume_offset = 1407f25eb491ff60f21659a7e2b230ee1c83957034c7Alex Deymo manifest_metadata_size + manifest_signature_size + next_data_offset; 140851dcf260754837962dd22db3b7babee181471e7dJay Srinivasan if (resume_offset < response_handler_action_->install_plan().payload_size) { 1409e4ad2508de4d69d7a90d3ce441efe2c82c55bd1dGilad Arnold fetcher->AddRange(resume_offset); 1410b21ce5dabf502906e21fef4066ebe141c9ba4b49Darin Petkov } 14119b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov } else { 1412e4ad2508de4d69d7a90d3ce441efe2c82c55bd1dGilad Arnold fetcher->AddRange(0); 14139b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov } 14149b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov} 14159b23057b7f9ad6c366d92a59fcffcc87375bae08Darin Petkov 1416116fda3221ff3df037ea1feb271883c87644c839Thieu Levoid UpdateAttempter::PingOmaha() { 1417d88a85764b608141adc54f49fdba824919b7d88cThieu Le if (!processor_->IsRunning()) { 1418c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo shared_ptr<OmahaRequestAction> ping_action(new OmahaRequestAction( 1419c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo system_state_, 1420c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo nullptr, 1421c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo brillo::make_unique_ptr(new LibcurlHttpFetcher( 1422c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo GetProxyResolver(), 1423706a5abae125b8f5ba58a9b7e1e51570bbaa2089Alex Deymo system_state_->hardware())), 1424c1c17b4ed6a3896b6343e737fd89682fa0c8436bAlex Deymo true)); 1425d88a85764b608141adc54f49fdba824919b7d88cThieu Le actions_.push_back(shared_ptr<OmahaRequestAction>(ping_action)); 142688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko processor_->set_delegate(nullptr); 1427d88a85764b608141adc54f49fdba824919b7d88cThieu Le processor_->EnqueueAction(ping_action.get()); 1428d88a85764b608141adc54f49fdba824919b7d88cThieu Le // Call StartProcessing() synchronously here to avoid any race conditions 1429d88a85764b608141adc54f49fdba824919b7d88cThieu Le // caused by multiple outstanding ping Omaha requests. If we call 1430d88a85764b608141adc54f49fdba824919b7d88cThieu Le // StartProcessing() asynchronously, the device can be suspended before we 1431d88a85764b608141adc54f49fdba824919b7d88cThieu Le // get a chance to callback to StartProcessing(). When the device resumes 1432d88a85764b608141adc54f49fdba824919b7d88cThieu Le // (assuming the device sleeps longer than the next update check period), 1433d88a85764b608141adc54f49fdba824919b7d88cThieu Le // StartProcessing() is called back and at the same time, the next update 1434d88a85764b608141adc54f49fdba824919b7d88cThieu Le // check is fired which eventually invokes StartProcessing(). A crash 1435d88a85764b608141adc54f49fdba824919b7d88cThieu Le // can occur because StartProcessing() checks to make sure that the 1436d88a85764b608141adc54f49fdba824919b7d88cThieu Le // processor is idle which it isn't due to the two concurrent ping Omaha 1437d88a85764b608141adc54f49fdba824919b7d88cThieu Le // requests. 1438d88a85764b608141adc54f49fdba824919b7d88cThieu Le processor_->StartProcessing(); 1439d88a85764b608141adc54f49fdba824919b7d88cThieu Le } else { 144058dd1348495a13a59edf630f54b1d236ee869339Darin Petkov LOG(WARNING) << "Action processor running, Omaha ping suppressed."; 144158dd1348495a13a59edf630f54b1d236ee869339Darin Petkov } 1442d88a85764b608141adc54f49fdba824919b7d88cThieu Le 1443ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // Update the last check time here; it may be re-updated when an Omaha 1444ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // response is received, but this will prevent us from repeatedly scheduling 1445ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold // checks in the case where a response is not received. 1446ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold UpdateLastCheckedTime(); 1447ec7f91625b799abf67ea3119490f2f1de8e4e677Gilad Arnold 1448d88a85764b608141adc54f49fdba824919b7d88cThieu Le // Update the status which will schedule the next update check 1449cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley SetStatusAndNotify(UpdateStatus::UPDATED_NEED_REBOOT); 145054fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold ScheduleUpdates(); 1451116fda3221ff3df037ea1feb271883c87644c839Thieu Le} 1452116fda3221ff3df037ea1feb271883c87644c839Thieu Le 1453480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1454480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasanbool UpdateAttempter::DecrementUpdateCheckCount() { 14559abb763fa3840d69cc1098c0233162557a7f99eaBen Chan int64_t update_check_count_value; 1456480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1457480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (!prefs_->Exists(kPrefsUpdateCheckCount)) { 1458480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // This file does not exist. This means we haven't started our update 1459480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // check count down yet, so nothing more to do. This file will be created 1460480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // later when we first satisfy the wall-clock-based-wait period. 1461480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "No existing update check count. That's normal."; 1462480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return true; 1463480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan } 1464480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1465480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (prefs_->GetInt64(kPrefsUpdateCheckCount, &update_check_count_value)) { 1466480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Only if we're able to read a proper integer value, then go ahead 1467480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // and decrement and write back the result in the same file, if needed. 1468480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "Update check count = " << update_check_count_value; 1469480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1470480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (update_check_count_value == 0) { 1471480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // It could be 0, if, for some reason, the file didn't get deleted 1472480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // when we set our status to waiting for reboot. so we just leave it 1473480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // as is so that we can prevent another update_check wait for this client. 1474480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "Not decrementing update check count as it's already 0."; 1475480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return true; 1476480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan } 1477480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1478480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (update_check_count_value > 0) 1479480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan update_check_count_value--; 1480480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan else 1481480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan update_check_count_value = 0; 1482480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1483480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Write out the new value of update_check_count_value. 1484480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan if (prefs_->SetInt64(kPrefsUpdateCheckCount, update_check_count_value)) { 1485480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // We successfully wrote out te new value, so enable the 1486480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // update check based wait. 1487480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "New update check count = " << update_check_count_value; 1488480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return true; 1489480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan } 1490480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan } 1491480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1492480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan LOG(INFO) << "Deleting update check count state due to read/write errors."; 1493480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan 1494480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // We cannot read/write to the file, so disable the update check based wait 1495480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // so that we don't get stuck in this OS version by any chance (which could 1496480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // happen if there's some bug that causes to read/write incorrectly). 1497480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan // Also attempt to delete the file to do our best effort to cleanup. 1498480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan prefs_->Delete(kPrefsUpdateCheckCount); 1499480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan return false; 1500480ddfa079ebd01ed87e495332dec121d9ae781fJay Srinivasan} 1501d317e40be46e1b69f624a8165472c99fe6346a1eChris Sosa 15028f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 1503e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthenvoid UpdateAttempter::UpdateEngineStarted() { 1504dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // If we just booted into a new update, keep the previous OS version 1505dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // in case we rebooted because of a crash of the old version, so we 150688b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko // can do a proper crash report with correct information. 1507dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // This must be done before calling 1508dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // system_state_->payload_state()->UpdateEngineStarted() since it will 1509dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // delete SystemUpdated marker file. 1510dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko if (system_state_->system_rebooted() && 1511dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko prefs_->Exists(kPrefsSystemUpdatedMarker)) { 1512dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko if (!prefs_->GetString(kPrefsPreviousVersion, &prev_version_)) { 1513dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko // If we fail to get the version string, make sure it stays empty. 1514dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko prev_version_.clear(); 1515dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko } 1516dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko } 1517dea2eac2c565ed5b587278b865e2c07b805a8333Alex Vakulenko 1518e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen system_state_->payload_state()->UpdateEngineStarted(); 15198f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen StartP2PAtStartup(); 15208f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen} 15218f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15228f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenbool UpdateAttempter::StartP2PAtStartup() { 152388b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko if (system_state_ == nullptr || 15248f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen !system_state_->p2p_manager()->IsP2PEnabled()) { 15258f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Not starting p2p at startup since it's not enabled."; 15268f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15278f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 15288f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15298f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (system_state_->p2p_manager()->CountSharedFiles() < 1) { 15308f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Not starting p2p at startup since our application " 15318f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen << "is not sharing any files."; 15328f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15338f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 15348f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15358f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return StartP2PAndPerformHousekeeping(); 15368f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen} 15378f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15388f191b22a1a1ab2b803d65ee488729206e648695David Zeuthenbool UpdateAttempter::StartP2PAndPerformHousekeeping() { 153988b591f24cb3f94f982d7024c2e8ed25c2cc26a2Alex Vakulenko if (system_state_ == nullptr) 15408f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15418f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15428f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!system_state_->p2p_manager()->IsP2PEnabled()) { 15438f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Not starting p2p since it's not enabled."; 15448f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15458f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 15468f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15478f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Ensuring that p2p is running."; 15488f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!system_state_->p2p_manager()->EnsureP2PRunning()) { 15498f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(ERROR) << "Error starting p2p."; 15508f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15518f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 15528f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15538f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Performing p2p housekeeping."; 15548f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen if (!system_state_->p2p_manager()->PerformHousekeeping()) { 15558f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(ERROR) << "Error performing housekeeping for p2p."; 15568f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return false; 15578f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen } 15588f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen 15598f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen LOG(INFO) << "Done performing p2p housekeeping."; 15608f191b22a1a1ab2b803d65ee488729206e648695David Zeuthen return true; 1561e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen} 1562e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1563f329b933db41d26644a97afef928eb1b319d6d99Alex Deymobool UpdateAttempter::GetBootTimeAtUpdate(Time *out_boot_time) { 1564906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // In case of an update_engine restart without a reboot, we stored the boot_id 1565906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // when the update was completed by setting a pref, so we can check whether 1566906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // the last update was on this boot or a previous one. 1567906191f88cb2448691e54f7a6a3b464854053154Alex Deymo string boot_id; 1568906191f88cb2448691e54f7a6a3b464854053154Alex Deymo TEST_AND_RETURN_FALSE(utils::GetBootId(&boot_id)); 1569906191f88cb2448691e54f7a6a3b464854053154Alex Deymo 1570906191f88cb2448691e54f7a6a3b464854053154Alex Deymo string update_completed_on_boot_id; 1571906191f88cb2448691e54f7a6a3b464854053154Alex Deymo if (!prefs_->Exists(kPrefsUpdateCompletedOnBootId) || 1572906191f88cb2448691e54f7a6a3b464854053154Alex Deymo !prefs_->GetString(kPrefsUpdateCompletedOnBootId, 1573906191f88cb2448691e54f7a6a3b464854053154Alex Deymo &update_completed_on_boot_id) || 1574906191f88cb2448691e54f7a6a3b464854053154Alex Deymo update_completed_on_boot_id != boot_id) 15753c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen return false; 15763c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen 1577906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // Short-circuit avoiding the read in case out_boot_time is nullptr. 1578906191f88cb2448691e54f7a6a3b464854053154Alex Deymo if (out_boot_time) { 1579906191f88cb2448691e54f7a6a3b464854053154Alex Deymo int64_t boot_time = 0; 1580906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // Since the kPrefsUpdateCompletedOnBootId was correctly set, this pref 1581906191f88cb2448691e54f7a6a3b464854053154Alex Deymo // should not fail. 1582906191f88cb2448691e54f7a6a3b464854053154Alex Deymo TEST_AND_RETURN_FALSE( 1583906191f88cb2448691e54f7a6a3b464854053154Alex Deymo prefs_->GetInt64(kPrefsUpdateCompletedBootTime, &boot_time)); 1584906191f88cb2448691e54f7a6a3b464854053154Alex Deymo *out_boot_time = Time::FromInternalValue(boot_time); 15853c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen } 15863c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen return true; 15873c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen} 15883c55abd5fa1e3db40974b2e8d94f2ddce65fe40dDavid Zeuthen 158954fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnoldbool UpdateAttempter::IsUpdateRunningOrScheduled() { 1590cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley return ((status_ != UpdateStatus::IDLE && 1591cc8ce0e3b11ac76412c26c687d11140cbe18ad91Christopher Wiley status_ != UpdateStatus::UPDATED_NEED_REBOOT) || 159254fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold waiting_for_scheduled_check_); 159354fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold} 159454fa66dc58f965b276433e08ecebbe268f66de4cGilad Arnold 159502c1864e204997175302b1aebe3e0be9c6699ea5David Pursellbool UpdateAttempter::IsAnyUpdateSourceAllowed() { 1596907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // We allow updates from any source if either of these are true: 1597907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // * The device is running an unofficial (dev/test) image. 1598907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // * The debugd dev features are accessible (i.e. in devmode with no owner). 1599907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // This protects users running a base image, while still allowing a specific 1600907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // window (gated by the debug dev features) where `cros flash` is usable. 160102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell if (!system_state_->hardware()->IsOfficialBuild()) { 160202c1864e204997175302b1aebe3e0be9c6699ea5David Pursell LOG(INFO) << "Non-official build; allowing any update source."; 160302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell return true; 160402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } 160502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 1606907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // Even though the debugd tools are also gated on devmode, checking here can 1607907b4fa4009e5221f7b5f13cc03d9382e693c0c2David Pursell // save us a D-Bus call so it's worth doing explicitly. 160802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell if (system_state_->hardware()->IsNormalBootMode()) { 160902c1864e204997175302b1aebe3e0be9c6699ea5David Pursell LOG(INFO) << "Not in devmode; disallowing custom update sources."; 161002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell return false; 161102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } 161202c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 161302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // Official images in devmode are allowed a custom update source iff the 161402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // debugd dev tools are enabled. 1615305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo if (!debugd_proxy_) 161602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell return false; 1617305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo int32_t dev_features = debugd::DEV_FEATURES_DISABLED; 16183f39d5cc753905874d8d93bef94f857b8808f19eAlex Vakulenko brillo::ErrorPtr error; 1619305345001d85ca2282112c2a30fe75c7a4773491Alex Deymo bool success = debugd_proxy_->QueryDevFeatures(&dev_features, &error); 162002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 162102c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // Some boards may not include debugd so it's expected that this may fail, 162202c1864e204997175302b1aebe3e0be9c6699ea5David Pursell // in which case we default to disallowing custom update sources. 162302c1864e204997175302b1aebe3e0be9c6699ea5David Pursell if (success && !(dev_features & debugd::DEV_FEATURES_DISABLED)) { 162402c1864e204997175302b1aebe3e0be9c6699ea5David Pursell LOG(INFO) << "Debugd dev tools enabled; allowing any update source."; 162502c1864e204997175302b1aebe3e0be9c6699ea5David Pursell return true; 162602c1864e204997175302b1aebe3e0be9c6699ea5David Pursell } 162702c1864e204997175302b1aebe3e0be9c6699ea5David Pursell LOG(INFO) << "Debugd dev tools disabled; disallowing custom update sources."; 162802c1864e204997175302b1aebe3e0be9c6699ea5David Pursell return false; 162902c1864e204997175302b1aebe3e0be9c6699ea5David Pursell} 163002c1864e204997175302b1aebe3e0be9c6699ea5David Pursell 16314e9b9f4d57a0c95fb1b9281077f0eef5fdf5e345Andrew de los Reyes} // namespace chromeos_update_engine 1632