update_attempter.cc revision 965d708dea9479a307ef176079f3b5e0a4cf34af
1// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "update_engine/update_attempter.h" 6 7#include <stdint.h> 8 9#include <algorithm> 10#include <memory> 11#include <set> 12#include <string> 13#include <utility> 14#include <vector> 15 16#include <base/bind.h> 17#include <base/files/file_util.h> 18#include <base/logging.h> 19#include <base/rand_util.h> 20#include <base/strings/string_util.h> 21#include <base/strings/stringprintf.h> 22#include <chromeos/dbus/service_constants.h> 23 24#include <glib.h> 25#include <metrics/metrics_library.h> 26#include <policy/device_policy.h> 27#include <policy/libpolicy.h> 28 29#include "update_engine/certificate_checker.h" 30#include "update_engine/clock_interface.h" 31#include "update_engine/constants.h" 32#include "update_engine/dbus_service.h" 33#include "update_engine/dbus_wrapper_interface.h" 34#include "update_engine/download_action.h" 35#include "update_engine/filesystem_copier_action.h" 36#include "update_engine/glib_utils.h" 37#include "update_engine/hardware_interface.h" 38#include "update_engine/libcurl_http_fetcher.h" 39#include "update_engine/metrics.h" 40#include "update_engine/multi_range_http_fetcher.h" 41#include "update_engine/omaha_request_action.h" 42#include "update_engine/omaha_request_params.h" 43#include "update_engine/omaha_response_handler_action.h" 44#include "update_engine/p2p_manager.h" 45#include "update_engine/payload_state_interface.h" 46#include "update_engine/postinstall_runner_action.h" 47#include "update_engine/prefs_interface.h" 48#include "update_engine/subprocess.h" 49#include "update_engine/system_state.h" 50#include "update_engine/update_manager/policy.h" 51#include "update_engine/update_manager/update_manager.h" 52#include "update_engine/utils.h" 53 54using base::Bind; 55using base::Callback; 56using base::StringPrintf; 57using base::Time; 58using base::TimeDelta; 59using base::TimeTicks; 60using chromeos_update_manager::EvalStatus; 61using chromeos_update_manager::Policy; 62using chromeos_update_manager::UpdateCheckParams; 63using std::set; 64using std::shared_ptr; 65using std::string; 66using std::vector; 67 68namespace chromeos_update_engine { 69 70const int UpdateAttempter::kMaxDeltaUpdateFailures = 3; 71 72namespace { 73const int kMaxConsecutiveObeyProxyRequests = 20; 74 75const char* kUpdateCompletedMarker = 76 "/var/run/update_engine_autoupdate_completed"; 77} // namespace 78 79const char* UpdateStatusToString(UpdateStatus status) { 80 switch (status) { 81 case UPDATE_STATUS_IDLE: 82 return update_engine::kUpdateStatusIdle; 83 case UPDATE_STATUS_CHECKING_FOR_UPDATE: 84 return update_engine::kUpdateStatusCheckingForUpdate; 85 case UPDATE_STATUS_UPDATE_AVAILABLE: 86 return update_engine::kUpdateStatusUpdateAvailable; 87 case UPDATE_STATUS_DOWNLOADING: 88 return update_engine::kUpdateStatusDownloading; 89 case UPDATE_STATUS_VERIFYING: 90 return update_engine::kUpdateStatusVerifying; 91 case UPDATE_STATUS_FINALIZING: 92 return update_engine::kUpdateStatusFinalizing; 93 case UPDATE_STATUS_UPDATED_NEED_REBOOT: 94 return update_engine::kUpdateStatusUpdatedNeedReboot; 95 case UPDATE_STATUS_REPORTING_ERROR_EVENT: 96 return update_engine::kUpdateStatusReportingErrorEvent; 97 case UPDATE_STATUS_ATTEMPTING_ROLLBACK: 98 return update_engine::kUpdateStatusAttemptingRollback; 99 case UPDATE_STATUS_DISABLED: 100 return update_engine::kUpdateStatusDisabled; 101 default: 102 return "unknown status"; 103 } 104} 105 106// Turns a generic ErrorCode::kError to a generic error code specific 107// to |action| (e.g., ErrorCode::kFilesystemCopierError). If |code| is 108// not ErrorCode::kError, or the action is not matched, returns |code| 109// unchanged. 110ErrorCode GetErrorCodeForAction(AbstractAction* action, 111 ErrorCode code) { 112 if (code != ErrorCode::kError) 113 return code; 114 115 const string type = action->Type(); 116 if (type == OmahaRequestAction::StaticType()) 117 return ErrorCode::kOmahaRequestError; 118 if (type == OmahaResponseHandlerAction::StaticType()) 119 return ErrorCode::kOmahaResponseHandlerError; 120 if (type == FilesystemCopierAction::StaticType()) 121 return ErrorCode::kFilesystemCopierError; 122 if (type == PostinstallRunnerAction::StaticType()) 123 return ErrorCode::kPostinstallRunnerError; 124 125 return code; 126} 127 128UpdateAttempter::UpdateAttempter(SystemState* system_state, 129 DBusWrapperInterface* dbus_iface) 130 : UpdateAttempter(system_state, dbus_iface, kUpdateCompletedMarker) {} 131 132UpdateAttempter::UpdateAttempter(SystemState* system_state, 133 DBusWrapperInterface* dbus_iface, 134 const string& update_completed_marker) 135 : processor_(new ActionProcessor()), 136 system_state_(system_state), 137 dbus_iface_(dbus_iface), 138 chrome_proxy_resolver_(dbus_iface), 139 update_completed_marker_(update_completed_marker) { 140 if (!update_completed_marker_.empty() && 141 utils::FileExists(update_completed_marker_.c_str())) { 142 status_ = UPDATE_STATUS_UPDATED_NEED_REBOOT; 143 } else { 144 status_ = UPDATE_STATUS_IDLE; 145 } 146} 147 148UpdateAttempter::~UpdateAttempter() { 149 CleanupCpuSharesManagement(); 150} 151 152void UpdateAttempter::Init() { 153 // Pulling from the SystemState can only be done after construction, since 154 // this is an aggregate of various objects (such as the UpdateAttempter), 155 // which requires them all to be constructed prior to it being used. 156 prefs_ = system_state_->prefs(); 157 omaha_request_params_ = system_state_->request_params(); 158} 159 160void UpdateAttempter::ScheduleUpdates() { 161 if (IsUpdateRunningOrScheduled()) 162 return; 163 164 chromeos_update_manager::UpdateManager* const update_manager = 165 system_state_->update_manager(); 166 CHECK(update_manager); 167 Callback<void(EvalStatus, const UpdateCheckParams&)> callback = Bind( 168 &UpdateAttempter::OnUpdateScheduled, base::Unretained(this)); 169 // We limit the async policy request to a reasonably short time, to avoid a 170 // starvation due to a transient bug. 171 update_manager->AsyncPolicyRequest(callback, &Policy::UpdateCheckAllowed); 172 waiting_for_scheduled_check_ = true; 173} 174 175bool UpdateAttempter::CheckAndReportDailyMetrics() { 176 int64_t stored_value; 177 Time now = system_state_->clock()->GetWallclockTime(); 178 if (system_state_->prefs()->Exists(kPrefsDailyMetricsLastReportedAt) && 179 system_state_->prefs()->GetInt64(kPrefsDailyMetricsLastReportedAt, 180 &stored_value)) { 181 Time last_reported_at = Time::FromInternalValue(stored_value); 182 TimeDelta time_reported_since = now - last_reported_at; 183 if (time_reported_since.InSeconds() < 0) { 184 LOG(WARNING) << "Last reported daily metrics " 185 << utils::FormatTimeDelta(time_reported_since) << " ago " 186 << "which is negative. Either the system clock is wrong or " 187 << "the kPrefsDailyMetricsLastReportedAt state variable " 188 << "is wrong."; 189 // In this case, report daily metrics to reset. 190 } else { 191 if (time_reported_since.InSeconds() < 24*60*60) { 192 LOG(INFO) << "Last reported daily metrics " 193 << utils::FormatTimeDelta(time_reported_since) << " ago."; 194 return false; 195 } 196 LOG(INFO) << "Last reported daily metrics " 197 << utils::FormatTimeDelta(time_reported_since) << " ago, " 198 << "which is more than 24 hours ago."; 199 } 200 } 201 202 LOG(INFO) << "Reporting daily metrics."; 203 system_state_->prefs()->SetInt64(kPrefsDailyMetricsLastReportedAt, 204 now.ToInternalValue()); 205 206 ReportOSAge(); 207 208 return true; 209} 210 211void UpdateAttempter::ReportOSAge() { 212 struct stat sb; 213 214 if (system_state_ == nullptr) 215 return; 216 217 if (stat("/etc/lsb-release", &sb) != 0) { 218 PLOG(ERROR) << "Error getting file status for /etc/lsb-release " 219 << "(Note: this may happen in some unit tests)"; 220 return; 221 } 222 223 Time lsb_release_timestamp = utils::TimeFromStructTimespec(&sb.st_ctim); 224 Time now = system_state_->clock()->GetWallclockTime(); 225 TimeDelta age = now - lsb_release_timestamp; 226 if (age.InSeconds() < 0) { 227 LOG(ERROR) << "The OS age (" << utils::FormatTimeDelta(age) 228 << ") is negative. Maybe the clock is wrong? " 229 << "(Note: this may happen in some unit tests.)"; 230 return; 231 } 232 233 string metric = "Installer.OSAgeDays"; 234 LOG(INFO) << "Uploading " << utils::FormatTimeDelta(age) 235 << " for metric " << metric; 236 system_state_->metrics_lib()->SendToUMA( 237 metric, 238 static_cast<int>(age.InDays()), 239 0, // min: 0 days 240 6*30, // max: 6 months (approx) 241 kNumDefaultUmaBuckets); 242 243 metrics::ReportDailyMetrics(system_state_, age); 244} 245 246void UpdateAttempter::Update(const string& app_version, 247 const string& omaha_url, 248 const string& target_channel, 249 const string& target_version_prefix, 250 bool obey_proxies, 251 bool interactive) { 252 // This is normally called frequently enough so it's appropriate to use as a 253 // hook for reporting daily metrics. 254 // TODO(garnold) This should be hooked to a separate (reliable and consistent) 255 // timeout event. 256 CheckAndReportDailyMetrics(); 257 258 // Notify of the new update attempt, clearing prior interactive requests. 259 if (forced_update_pending_callback_.get()) 260 forced_update_pending_callback_->Run(false, false); 261 262 chrome_proxy_resolver_.Init(); 263 fake_update_success_ = false; 264 if (status_ == UPDATE_STATUS_UPDATED_NEED_REBOOT) { 265 // Although we have applied an update, we still want to ping Omaha 266 // to ensure the number of active statistics is accurate. 267 // 268 // Also convey to the UpdateEngine.Check.Result metric that we're 269 // not performing an update check because of this. 270 LOG(INFO) << "Not updating b/c we already updated and we're waiting for " 271 << "reboot, we'll ping Omaha instead"; 272 metrics::ReportUpdateCheckMetrics(system_state_, 273 metrics::CheckResult::kRebootPending, 274 metrics::CheckReaction::kUnset, 275 metrics::DownloadErrorCode::kUnset); 276 PingOmaha(); 277 return; 278 } 279 if (status_ != UPDATE_STATUS_IDLE) { 280 // Update in progress. Do nothing 281 return; 282 } 283 284 if (!CalculateUpdateParams(app_version, 285 omaha_url, 286 target_channel, 287 target_version_prefix, 288 obey_proxies, 289 interactive)) { 290 return; 291 } 292 293 BuildUpdateActions(interactive); 294 295 SetStatusAndNotify(UPDATE_STATUS_CHECKING_FOR_UPDATE); 296 297 // Update the last check time here; it may be re-updated when an Omaha 298 // response is received, but this will prevent us from repeatedly scheduling 299 // checks in the case where a response is not received. 300 UpdateLastCheckedTime(); 301 302 // Just in case we didn't update boot flags yet, make sure they're updated 303 // before any update processing starts. 304 start_action_processor_ = true; 305 UpdateBootFlags(); 306} 307 308void UpdateAttempter::RefreshDevicePolicy() { 309 // Lazy initialize the policy provider, or reload the latest policy data. 310 if (!policy_provider_.get()) 311 policy_provider_.reset(new policy::PolicyProvider()); 312 policy_provider_->Reload(); 313 314 const policy::DevicePolicy* device_policy = nullptr; 315 if (policy_provider_->device_policy_is_loaded()) 316 device_policy = &policy_provider_->GetDevicePolicy(); 317 318 if (device_policy) 319 LOG(INFO) << "Device policies/settings present"; 320 else 321 LOG(INFO) << "No device policies/settings present."; 322 323 system_state_->set_device_policy(device_policy); 324 system_state_->p2p_manager()->SetDevicePolicy(device_policy); 325} 326 327void UpdateAttempter::CalculateP2PParams(bool interactive) { 328 bool use_p2p_for_downloading = false; 329 bool use_p2p_for_sharing = false; 330 331 // Never use p2p for downloading in interactive checks unless the 332 // developer has opted in for it via a marker file. 333 // 334 // (Why would a developer want to opt in? If he's working on the 335 // update_engine or p2p codebases so he can actually test his 336 // code.). 337 338 if (system_state_ != nullptr) { 339 if (!system_state_->p2p_manager()->IsP2PEnabled()) { 340 LOG(INFO) << "p2p is not enabled - disallowing p2p for both" 341 << " downloading and sharing."; 342 } else { 343 // Allow p2p for sharing, even in interactive checks. 344 use_p2p_for_sharing = true; 345 if (!interactive) { 346 LOG(INFO) << "Non-interactive check - allowing p2p for downloading"; 347 use_p2p_for_downloading = true; 348 } else { 349 LOG(INFO) << "Forcibly disabling use of p2p for downloading " 350 << "since this update attempt is interactive."; 351 } 352 } 353 } 354 355 PayloadStateInterface* const payload_state = system_state_->payload_state(); 356 payload_state->SetUsingP2PForDownloading(use_p2p_for_downloading); 357 payload_state->SetUsingP2PForSharing(use_p2p_for_sharing); 358} 359 360bool UpdateAttempter::CalculateUpdateParams(const string& app_version, 361 const string& omaha_url, 362 const string& target_channel, 363 const string& target_version_prefix, 364 bool obey_proxies, 365 bool interactive) { 366 http_response_code_ = 0; 367 PayloadStateInterface* const payload_state = system_state_->payload_state(); 368 369 // Refresh the policy before computing all the update parameters. 370 RefreshDevicePolicy(); 371 372 // Set the target version prefix, if provided. 373 if (!target_version_prefix.empty()) 374 omaha_request_params_->set_target_version_prefix(target_version_prefix); 375 376 CalculateScatteringParams(interactive); 377 378 CalculateP2PParams(interactive); 379 if (payload_state->GetUsingP2PForDownloading() || 380 payload_state->GetUsingP2PForSharing()) { 381 // OK, p2p is to be used - start it and perform housekeeping. 382 if (!StartP2PAndPerformHousekeeping()) { 383 // If this fails, disable p2p for this attempt 384 LOG(INFO) << "Forcibly disabling use of p2p since starting p2p or " 385 << "performing housekeeping failed."; 386 payload_state->SetUsingP2PForDownloading(false); 387 payload_state->SetUsingP2PForSharing(false); 388 } 389 } 390 391 if (!omaha_request_params_->Init(app_version, 392 omaha_url, 393 interactive)) { 394 LOG(ERROR) << "Unable to initialize Omaha request params."; 395 return false; 396 } 397 398 // Set the target channel, if one was provided. 399 if (target_channel.empty()) { 400 LOG(INFO) << "No target channel mandated by policy."; 401 } else { 402 LOG(INFO) << "Setting target channel as mandated: " << target_channel; 403 // Pass in false for powerwash_allowed until we add it to the policy 404 // protobuf. 405 omaha_request_params_->SetTargetChannel(target_channel, false); 406 407 // Since this is the beginning of a new attempt, update the download 408 // channel. The download channel won't be updated until the next attempt, 409 // even if target channel changes meanwhile, so that how we'll know if we 410 // should cancel the current download attempt if there's such a change in 411 // target channel. 412 omaha_request_params_->UpdateDownloadChannel(); 413 } 414 415 LOG(INFO) << "target_version_prefix = " 416 << omaha_request_params_->target_version_prefix() 417 << ", scatter_factor_in_seconds = " 418 << utils::FormatSecs(scatter_factor_.InSeconds()); 419 420 LOG(INFO) << "Wall Clock Based Wait Enabled = " 421 << omaha_request_params_->wall_clock_based_wait_enabled() 422 << ", Update Check Count Wait Enabled = " 423 << omaha_request_params_->update_check_count_wait_enabled() 424 << ", Waiting Period = " << utils::FormatSecs( 425 omaha_request_params_->waiting_period().InSeconds()); 426 427 LOG(INFO) << "Use p2p For Downloading = " 428 << payload_state->GetUsingP2PForDownloading() 429 << ", Use p2p For Sharing = " 430 << payload_state->GetUsingP2PForSharing(); 431 432 obeying_proxies_ = true; 433 if (obey_proxies || proxy_manual_checks_ == 0) { 434 LOG(INFO) << "forced to obey proxies"; 435 // If forced to obey proxies, every 20th request will not use proxies 436 proxy_manual_checks_++; 437 LOG(INFO) << "proxy manual checks: " << proxy_manual_checks_; 438 if (proxy_manual_checks_ >= kMaxConsecutiveObeyProxyRequests) { 439 proxy_manual_checks_ = 0; 440 obeying_proxies_ = false; 441 } 442 } else if (base::RandInt(0, 4) == 0) { 443 obeying_proxies_ = false; 444 } 445 LOG_IF(INFO, !obeying_proxies_) << "To help ensure updates work, this update " 446 "check we are ignoring the proxy settings and using " 447 "direct connections."; 448 449 DisableDeltaUpdateIfNeeded(); 450 return true; 451} 452 453void UpdateAttempter::CalculateScatteringParams(bool interactive) { 454 // Take a copy of the old scatter value before we update it, as 455 // we need to update the waiting period if this value changes. 456 TimeDelta old_scatter_factor = scatter_factor_; 457 const policy::DevicePolicy* device_policy = system_state_->device_policy(); 458 if (device_policy) { 459 int64_t new_scatter_factor_in_secs = 0; 460 device_policy->GetScatterFactorInSeconds(&new_scatter_factor_in_secs); 461 if (new_scatter_factor_in_secs < 0) // sanitize input, just in case. 462 new_scatter_factor_in_secs = 0; 463 scatter_factor_ = TimeDelta::FromSeconds(new_scatter_factor_in_secs); 464 } 465 466 bool is_scatter_enabled = false; 467 if (scatter_factor_.InSeconds() == 0) { 468 LOG(INFO) << "Scattering disabled since scatter factor is set to 0"; 469 } else if (interactive) { 470 LOG(INFO) << "Scattering disabled as this is an interactive update check"; 471 } else if (!system_state_->hardware()->IsOOBEComplete(nullptr)) { 472 LOG(INFO) << "Scattering disabled since OOBE is not complete yet"; 473 } else { 474 is_scatter_enabled = true; 475 LOG(INFO) << "Scattering is enabled"; 476 } 477 478 if (is_scatter_enabled) { 479 // This means the scattering policy is turned on. 480 // Now check if we need to update the waiting period. The two cases 481 // in which we'd need to update the waiting period are: 482 // 1. First time in process or a scheduled check after a user-initiated one. 483 // (omaha_request_params_->waiting_period will be zero in this case). 484 // 2. Admin has changed the scattering policy value. 485 // (new scattering value will be different from old one in this case). 486 int64_t wait_period_in_secs = 0; 487 if (omaha_request_params_->waiting_period().InSeconds() == 0) { 488 // First case. Check if we have a suitable value to set for 489 // the waiting period. 490 if (prefs_->GetInt64(kPrefsWallClockWaitPeriod, &wait_period_in_secs) && 491 wait_period_in_secs > 0 && 492 wait_period_in_secs <= scatter_factor_.InSeconds()) { 493 // This means: 494 // 1. There's a persisted value for the waiting period available. 495 // 2. And that persisted value is still valid. 496 // So, in this case, we should reuse the persisted value instead of 497 // generating a new random value to improve the chances of a good 498 // distribution for scattering. 499 omaha_request_params_->set_waiting_period( 500 TimeDelta::FromSeconds(wait_period_in_secs)); 501 LOG(INFO) << "Using persisted wall-clock waiting period: " << 502 utils::FormatSecs( 503 omaha_request_params_->waiting_period().InSeconds()); 504 } else { 505 // This means there's no persisted value for the waiting period 506 // available or its value is invalid given the new scatter_factor value. 507 // So, we should go ahead and regenerate a new value for the 508 // waiting period. 509 LOG(INFO) << "Persisted value not present or not valid (" 510 << utils::FormatSecs(wait_period_in_secs) 511 << ") for wall-clock waiting period."; 512 GenerateNewWaitingPeriod(); 513 } 514 } else if (scatter_factor_ != old_scatter_factor) { 515 // This means there's already a waiting period value, but we detected 516 // a change in the scattering policy value. So, we should regenerate the 517 // waiting period to make sure it's within the bounds of the new scatter 518 // factor value. 519 GenerateNewWaitingPeriod(); 520 } else { 521 // Neither the first time scattering is enabled nor the scattering value 522 // changed. Nothing to do. 523 LOG(INFO) << "Keeping current wall-clock waiting period: " << 524 utils::FormatSecs( 525 omaha_request_params_->waiting_period().InSeconds()); 526 } 527 528 // The invariant at this point is that omaha_request_params_->waiting_period 529 // is non-zero no matter which path we took above. 530 LOG_IF(ERROR, omaha_request_params_->waiting_period().InSeconds() == 0) 531 << "Waiting Period should NOT be zero at this point!!!"; 532 533 // Since scattering is enabled, wall clock based wait will always be 534 // enabled. 535 omaha_request_params_->set_wall_clock_based_wait_enabled(true); 536 537 // If we don't have any issues in accessing the file system to update 538 // the update check count value, we'll turn that on as well. 539 bool decrement_succeeded = DecrementUpdateCheckCount(); 540 omaha_request_params_->set_update_check_count_wait_enabled( 541 decrement_succeeded); 542 } else { 543 // This means the scattering feature is turned off or disabled for 544 // this particular update check. Make sure to disable 545 // all the knobs and artifacts so that we don't invoke any scattering 546 // related code. 547 omaha_request_params_->set_wall_clock_based_wait_enabled(false); 548 omaha_request_params_->set_update_check_count_wait_enabled(false); 549 omaha_request_params_->set_waiting_period(TimeDelta::FromSeconds(0)); 550 prefs_->Delete(kPrefsWallClockWaitPeriod); 551 prefs_->Delete(kPrefsUpdateCheckCount); 552 // Don't delete the UpdateFirstSeenAt file as we don't want manual checks 553 // that result in no-updates (e.g. due to server side throttling) to 554 // cause update starvation by having the client generate a new 555 // UpdateFirstSeenAt for each scheduled check that follows a manual check. 556 } 557} 558 559void UpdateAttempter::GenerateNewWaitingPeriod() { 560 omaha_request_params_->set_waiting_period(TimeDelta::FromSeconds( 561 base::RandInt(1, scatter_factor_.InSeconds()))); 562 563 LOG(INFO) << "Generated new wall-clock waiting period: " << utils::FormatSecs( 564 omaha_request_params_->waiting_period().InSeconds()); 565 566 // Do a best-effort to persist this in all cases. Even if the persistence 567 // fails, we'll still be able to scatter based on our in-memory value. 568 // The persistence only helps in ensuring a good overall distribution 569 // across multiple devices if they tend to reboot too often. 570 system_state_->payload_state()->SetScatteringWaitPeriod( 571 omaha_request_params_->waiting_period()); 572} 573 574void UpdateAttempter::BuildPostInstallActions( 575 InstallPlanAction* previous_action) { 576 shared_ptr<PostinstallRunnerAction> postinstall_runner_action( 577 new PostinstallRunnerAction()); 578 actions_.push_back(shared_ptr<AbstractAction>(postinstall_runner_action)); 579 BondActions(previous_action, 580 postinstall_runner_action.get()); 581} 582 583void UpdateAttempter::BuildUpdateActions(bool interactive) { 584 CHECK(!processor_->IsRunning()); 585 processor_->set_delegate(this); 586 587 // Actions: 588 LibcurlHttpFetcher* update_check_fetcher = 589 new LibcurlHttpFetcher(GetProxyResolver(), system_state_); 590 // Try harder to connect to the network, esp when not interactive. 591 // See comment in libcurl_http_fetcher.cc. 592 update_check_fetcher->set_no_network_max_retries(interactive ? 1 : 3); 593 update_check_fetcher->set_check_certificate(CertificateChecker::kUpdate); 594 shared_ptr<OmahaRequestAction> update_check_action( 595 new OmahaRequestAction(system_state_, 596 nullptr, 597 update_check_fetcher, // passes ownership 598 false)); 599 shared_ptr<OmahaResponseHandlerAction> response_handler_action( 600 new OmahaResponseHandlerAction(system_state_)); 601 // We start with the kernel so it's marked as invalid more quickly. 602 shared_ptr<FilesystemCopierAction> kernel_filesystem_copier_action( 603 new FilesystemCopierAction(system_state_, true, false)); 604 shared_ptr<FilesystemCopierAction> filesystem_copier_action( 605 new FilesystemCopierAction(system_state_, false, false)); 606 607 shared_ptr<OmahaRequestAction> download_started_action( 608 new OmahaRequestAction(system_state_, 609 new OmahaEvent( 610 OmahaEvent::kTypeUpdateDownloadStarted), 611 new LibcurlHttpFetcher(GetProxyResolver(), 612 system_state_), 613 false)); 614 LibcurlHttpFetcher* download_fetcher = 615 new LibcurlHttpFetcher(GetProxyResolver(), system_state_); 616 download_fetcher->set_check_certificate(CertificateChecker::kDownload); 617 shared_ptr<DownloadAction> download_action( 618 new DownloadAction(prefs_, 619 system_state_, 620 new MultiRangeHttpFetcher( 621 download_fetcher))); // passes ownership 622 shared_ptr<OmahaRequestAction> download_finished_action( 623 new OmahaRequestAction(system_state_, 624 new OmahaEvent( 625 OmahaEvent::kTypeUpdateDownloadFinished), 626 new LibcurlHttpFetcher(GetProxyResolver(), 627 system_state_), 628 false)); 629 shared_ptr<FilesystemCopierAction> filesystem_verifier_action( 630 new FilesystemCopierAction(system_state_, false, true)); 631 shared_ptr<FilesystemCopierAction> kernel_filesystem_verifier_action( 632 new FilesystemCopierAction(system_state_, true, true)); 633 shared_ptr<OmahaRequestAction> update_complete_action( 634 new OmahaRequestAction(system_state_, 635 new OmahaEvent(OmahaEvent::kTypeUpdateComplete), 636 new LibcurlHttpFetcher(GetProxyResolver(), 637 system_state_), 638 false)); 639 640 download_action->set_delegate(this); 641 response_handler_action_ = response_handler_action; 642 download_action_ = download_action; 643 644 actions_.push_back(shared_ptr<AbstractAction>(update_check_action)); 645 actions_.push_back(shared_ptr<AbstractAction>(response_handler_action)); 646 actions_.push_back(shared_ptr<AbstractAction>(filesystem_copier_action)); 647 actions_.push_back(shared_ptr<AbstractAction>( 648 kernel_filesystem_copier_action)); 649 actions_.push_back(shared_ptr<AbstractAction>(download_started_action)); 650 actions_.push_back(shared_ptr<AbstractAction>(download_action)); 651 actions_.push_back(shared_ptr<AbstractAction>(download_finished_action)); 652 actions_.push_back(shared_ptr<AbstractAction>(filesystem_verifier_action)); 653 actions_.push_back(shared_ptr<AbstractAction>( 654 kernel_filesystem_verifier_action)); 655 656 // Bond them together. We have to use the leaf-types when calling 657 // BondActions(). 658 BondActions(update_check_action.get(), 659 response_handler_action.get()); 660 BondActions(response_handler_action.get(), 661 filesystem_copier_action.get()); 662 BondActions(filesystem_copier_action.get(), 663 kernel_filesystem_copier_action.get()); 664 BondActions(kernel_filesystem_copier_action.get(), 665 download_action.get()); 666 BondActions(download_action.get(), 667 filesystem_verifier_action.get()); 668 BondActions(filesystem_verifier_action.get(), 669 kernel_filesystem_verifier_action.get()); 670 671 BuildPostInstallActions(kernel_filesystem_verifier_action.get()); 672 673 actions_.push_back(shared_ptr<AbstractAction>(update_complete_action)); 674 675 // Enqueue the actions 676 for (const shared_ptr<AbstractAction>& action : actions_) { 677 processor_->EnqueueAction(action.get()); 678 } 679} 680 681bool UpdateAttempter::Rollback(bool powerwash) { 682 if (!CanRollback()) { 683 return false; 684 } 685 686 // Extra check for enterprise-enrolled devices since they don't support 687 // powerwash. 688 if (powerwash) { 689 // Enterprise-enrolled devices have an empty owner in their device policy. 690 string owner; 691 RefreshDevicePolicy(); 692 const policy::DevicePolicy* device_policy = system_state_->device_policy(); 693 if (device_policy && (!device_policy->GetOwner(&owner) || owner.empty())) { 694 LOG(ERROR) << "Enterprise device detected. " 695 << "Cannot perform a powerwash for enterprise devices."; 696 return false; 697 } 698 } 699 700 processor_->set_delegate(this); 701 702 // Initialize the default request params. 703 if (!omaha_request_params_->Init("", "", true)) { 704 LOG(ERROR) << "Unable to initialize Omaha request params."; 705 return false; 706 } 707 708 LOG(INFO) << "Setting rollback options."; 709 InstallPlan install_plan; 710 711 TEST_AND_RETURN_FALSE(utils::GetInstallDev( 712 system_state_->hardware()->BootDevice(), 713 &install_plan.install_path)); 714 715 install_plan.kernel_install_path = 716 utils::KernelDeviceOfBootDevice(install_plan.install_path); 717 install_plan.powerwash_required = powerwash; 718 719 LOG(INFO) << "Using this install plan:"; 720 install_plan.Dump(); 721 722 shared_ptr<InstallPlanAction> install_plan_action( 723 new InstallPlanAction(install_plan)); 724 actions_.push_back(shared_ptr<AbstractAction>(install_plan_action)); 725 726 BuildPostInstallActions(install_plan_action.get()); 727 728 // Enqueue the actions 729 for (const shared_ptr<AbstractAction>& action : actions_) { 730 processor_->EnqueueAction(action.get()); 731 } 732 733 // Update the payload state for Rollback. 734 system_state_->payload_state()->Rollback(); 735 736 SetStatusAndNotify(UPDATE_STATUS_ATTEMPTING_ROLLBACK); 737 738 // Just in case we didn't update boot flags yet, make sure they're updated 739 // before any update processing starts. This also schedules the start of the 740 // actions we just posted. 741 start_action_processor_ = true; 742 UpdateBootFlags(); 743 return true; 744} 745 746bool UpdateAttempter::CanRollback() const { 747 // We can only rollback if the update_engine isn't busy and we have a valid 748 // rollback partition. 749 return (status_ == UPDATE_STATUS_IDLE && !GetRollbackPartition().empty()); 750} 751 752string UpdateAttempter::GetRollbackPartition() const { 753 vector<string> kernel_devices = 754 system_state_->hardware()->GetKernelDevices(); 755 756 string boot_kernel_device = 757 system_state_->hardware()->BootKernelDevice(); 758 759 LOG(INFO) << "UpdateAttempter::GetRollbackPartition"; 760 for (const auto& name : kernel_devices) 761 LOG(INFO) << " Available kernel device = " << name; 762 LOG(INFO) << " Boot kernel device = " << boot_kernel_device; 763 764 auto current = std::find(kernel_devices.begin(), kernel_devices.end(), 765 boot_kernel_device); 766 767 if (current == kernel_devices.end()) { 768 LOG(ERROR) << "Unable to find the boot kernel device in the list of " 769 << "available devices"; 770 return string(); 771 } 772 773 for (string const& device_name : kernel_devices) { 774 if (device_name != *current) { 775 bool bootable = false; 776 if (system_state_->hardware()->IsKernelBootable(device_name, &bootable) && 777 bootable) { 778 return device_name; 779 } 780 } 781 } 782 783 return string(); 784} 785 786vector<std::pair<string, bool>> 787 UpdateAttempter::GetKernelDevices() const { 788 vector<string> kernel_devices = 789 system_state_->hardware()->GetKernelDevices(); 790 791 string boot_kernel_device = 792 system_state_->hardware()->BootKernelDevice(); 793 794 vector<std::pair<string, bool>> info_list; 795 info_list.reserve(kernel_devices.size()); 796 797 for (string device_name : kernel_devices) { 798 bool bootable = false; 799 system_state_->hardware()->IsKernelBootable(device_name, &bootable); 800 // Add '*' to the name of the partition we booted from. 801 if (device_name == boot_kernel_device) 802 device_name += '*'; 803 info_list.emplace_back(device_name, bootable); 804 } 805 806 return info_list; 807} 808 809void UpdateAttempter::CheckForUpdate(const string& app_version, 810 const string& omaha_url, 811 bool interactive) { 812 LOG(INFO) << "Forced update check requested."; 813 forced_app_version_ = app_version; 814 forced_omaha_url_ = omaha_url; 815 if (forced_update_pending_callback_.get()) { 816 // Make sure that a scheduling request is made prior to calling the forced 817 // update pending callback. 818 ScheduleUpdates(); 819 forced_update_pending_callback_->Run(true, interactive); 820 } 821} 822 823bool UpdateAttempter::RebootIfNeeded() { 824 if (status_ != UPDATE_STATUS_UPDATED_NEED_REBOOT) { 825 LOG(INFO) << "Reboot requested, but status is " 826 << UpdateStatusToString(status_) << ", so not rebooting."; 827 return false; 828 } 829 830 if (USE_POWER_MANAGEMENT && RequestPowerManagerReboot()) 831 return true; 832 833 return RebootDirectly(); 834} 835 836void UpdateAttempter::WriteUpdateCompletedMarker() { 837 if (update_completed_marker_.empty()) 838 return; 839 840 int64_t value = system_state_->clock()->GetBootTime().ToInternalValue(); 841 string contents = StringPrintf("%" PRIi64, value); 842 843 utils::WriteFile(update_completed_marker_.c_str(), 844 contents.c_str(), 845 contents.length()); 846} 847 848bool UpdateAttempter::RequestPowerManagerReboot() { 849 GError* error = nullptr; 850 DBusGConnection* bus = dbus_iface_->BusGet(DBUS_BUS_SYSTEM, &error); 851 if (!bus) { 852 LOG(ERROR) << "Failed to get system bus: " 853 << utils::GetAndFreeGError(&error); 854 return false; 855 } 856 857 LOG(INFO) << "Calling " << power_manager::kPowerManagerInterface << "." 858 << power_manager::kRequestRestartMethod; 859 DBusGProxy* proxy = dbus_iface_->ProxyNewForName( 860 bus, 861 power_manager::kPowerManagerServiceName, 862 power_manager::kPowerManagerServicePath, 863 power_manager::kPowerManagerInterface); 864 const gboolean success = dbus_iface_->ProxyCall_1_0( 865 proxy, 866 power_manager::kRequestRestartMethod, 867 &error, 868 power_manager::REQUEST_RESTART_FOR_UPDATE); 869 dbus_iface_->ProxyUnref(proxy); 870 871 if (!success) { 872 LOG(ERROR) << "Failed to call " << power_manager::kRequestRestartMethod 873 << ": " << utils::GetAndFreeGError(&error); 874 return false; 875 } 876 877 return true; 878} 879 880bool UpdateAttempter::RebootDirectly() { 881 vector<string> command; 882 command.push_back("/sbin/shutdown"); 883 command.push_back("-r"); 884 command.push_back("now"); 885 LOG(INFO) << "Running \"" << JoinString(command, ' ') << "\""; 886 int rc = 0; 887 Subprocess::SynchronousExec(command, &rc, nullptr); 888 return rc == 0; 889} 890 891void UpdateAttempter::OnUpdateScheduled(EvalStatus status, 892 const UpdateCheckParams& params) { 893 waiting_for_scheduled_check_ = false; 894 895 if (status == EvalStatus::kSucceeded) { 896 if (!params.updates_enabled) { 897 LOG(WARNING) << "Updates permanently disabled."; 898 // Signal disabled status, then switch right back to idle. This is 899 // necessary for ensuring that observers waiting for a signal change will 900 // actually notice one on subsequent calls. Note that we don't need to 901 // re-schedule a check in this case as updates are permanently disabled; 902 // further (forced) checks may still initiate a scheduling call. 903 SetStatusAndNotify(UPDATE_STATUS_DISABLED); 904 SetStatusAndNotify(UPDATE_STATUS_IDLE); 905 return; 906 } 907 908 LOG(INFO) << "Running " 909 << (params.is_interactive ? "interactive" : "periodic") 910 << " update."; 911 912 string app_version, omaha_url; 913 if (params.is_interactive) { 914 app_version = forced_app_version_; 915 omaha_url = forced_omaha_url_; 916 } else { 917 // Flush previously generated UMA reports before periodic updates. 918 CertificateChecker::FlushReport(); 919 } 920 921 Update(app_version, omaha_url, params.target_channel, 922 params.target_version_prefix, false, params.is_interactive); 923 } else { 924 LOG(WARNING) 925 << "Update check scheduling failed (possibly timed out); retrying."; 926 ScheduleUpdates(); 927 } 928 929 // This check ensures that future update checks will be or are already 930 // scheduled. The check should never fail. A check failure means that there's 931 // a bug that will most likely prevent further automatic update checks. It 932 // seems better to crash in such cases and restart the update_engine daemon 933 // into, hopefully, a known good state. 934 CHECK(IsUpdateRunningOrScheduled()); 935} 936 937void UpdateAttempter::UpdateLastCheckedTime() { 938 last_checked_time_ = system_state_->clock()->GetWallclockTime().ToTimeT(); 939} 940 941// Delegate methods: 942void UpdateAttempter::ProcessingDone(const ActionProcessor* processor, 943 ErrorCode code) { 944 LOG(INFO) << "Processing Done."; 945 actions_.clear(); 946 947 // Reset cpu shares back to normal. 948 CleanupCpuSharesManagement(); 949 950 if (status_ == UPDATE_STATUS_REPORTING_ERROR_EVENT) { 951 LOG(INFO) << "Error event sent."; 952 953 // Inform scheduler of new status; 954 SetStatusAndNotify(UPDATE_STATUS_IDLE); 955 ScheduleUpdates(); 956 957 if (!fake_update_success_) { 958 return; 959 } 960 LOG(INFO) << "Booted from FW B and tried to install new firmware, " 961 "so requesting reboot from user."; 962 } 963 964 if (code == ErrorCode::kSuccess) { 965 WriteUpdateCompletedMarker(); 966 prefs_->SetInt64(kPrefsDeltaUpdateFailures, 0); 967 prefs_->SetString(kPrefsPreviousVersion, 968 omaha_request_params_->app_version()); 969 DeltaPerformer::ResetUpdateProgress(prefs_, false); 970 971 system_state_->payload_state()->UpdateSucceeded(); 972 973 // Since we're done with scattering fully at this point, this is the 974 // safest point delete the state files, as we're sure that the status is 975 // set to reboot (which means no more updates will be applied until reboot) 976 // This deletion is required for correctness as we want the next update 977 // check to re-create a new random number for the update check count. 978 // Similarly, we also delete the wall-clock-wait period that was persisted 979 // so that we start with a new random value for the next update check 980 // after reboot so that the same device is not favored or punished in any 981 // way. 982 prefs_->Delete(kPrefsUpdateCheckCount); 983 system_state_->payload_state()->SetScatteringWaitPeriod(TimeDelta()); 984 prefs_->Delete(kPrefsUpdateFirstSeenAt); 985 986 SetStatusAndNotify(UPDATE_STATUS_UPDATED_NEED_REBOOT); 987 ScheduleUpdates(); 988 LOG(INFO) << "Update successfully applied, waiting to reboot."; 989 990 // This pointer is null during rollback operations, and the stats 991 // don't make much sense then anyway. 992 if (response_handler_action_) { 993 const InstallPlan& install_plan = 994 response_handler_action_->install_plan(); 995 996 // Generate an unique payload identifier. 997 const string target_version_uid = 998 install_plan.payload_hash + ":" + install_plan.metadata_signature; 999 1000 // Expect to reboot into the new version to send the proper metric during 1001 // next boot. 1002 system_state_->payload_state()->ExpectRebootInNewVersion( 1003 target_version_uid); 1004 1005 // Also report the success code so that the percentiles can be 1006 // interpreted properly for the remaining error codes in UMA. 1007 utils::SendErrorCodeToUma(system_state_, code); 1008 } else { 1009 // If we just finished a rollback, then we expect to have no Omaha 1010 // response. Otherwise, it's an error. 1011 if (system_state_->payload_state()->GetRollbackVersion().empty()) { 1012 LOG(ERROR) << "Can't send metrics because expected " 1013 "response_handler_action_ missing."; 1014 } 1015 } 1016 return; 1017 } 1018 1019 if (ScheduleErrorEventAction()) { 1020 return; 1021 } 1022 LOG(INFO) << "No update."; 1023 SetStatusAndNotify(UPDATE_STATUS_IDLE); 1024 ScheduleUpdates(); 1025} 1026 1027void UpdateAttempter::ProcessingStopped(const ActionProcessor* processor) { 1028 // Reset cpu shares back to normal. 1029 CleanupCpuSharesManagement(); 1030 download_progress_ = 0.0; 1031 SetStatusAndNotify(UPDATE_STATUS_IDLE); 1032 ScheduleUpdates(); 1033 actions_.clear(); 1034 error_event_.reset(nullptr); 1035} 1036 1037// Called whenever an action has finished processing, either successfully 1038// or otherwise. 1039void UpdateAttempter::ActionCompleted(ActionProcessor* processor, 1040 AbstractAction* action, 1041 ErrorCode code) { 1042 // Reset download progress regardless of whether or not the download 1043 // action succeeded. Also, get the response code from HTTP request 1044 // actions (update download as well as the initial update check 1045 // actions). 1046 const string type = action->Type(); 1047 if (type == DownloadAction::StaticType()) { 1048 download_progress_ = 0.0; 1049 DownloadAction* download_action = static_cast<DownloadAction*>(action); 1050 http_response_code_ = download_action->GetHTTPResponseCode(); 1051 } else if (type == OmahaRequestAction::StaticType()) { 1052 OmahaRequestAction* omaha_request_action = 1053 static_cast<OmahaRequestAction*>(action); 1054 // If the request is not an event, then it's the update-check. 1055 if (!omaha_request_action->IsEvent()) { 1056 http_response_code_ = omaha_request_action->GetHTTPResponseCode(); 1057 1058 // Record the number of consecutive failed update checks. 1059 if (http_response_code_ == kHttpResponseInternalServerError || 1060 http_response_code_ == kHttpResponseServiceUnavailable) { 1061 consecutive_failed_update_checks_++; 1062 } else { 1063 consecutive_failed_update_checks_ = 0; 1064 } 1065 1066 // Store the server-dictated poll interval, if any. 1067 server_dictated_poll_interval_ = 1068 std::max(0, omaha_request_action->GetOutputObject().poll_interval); 1069 } 1070 } 1071 if (code != ErrorCode::kSuccess) { 1072 // If the current state is at or past the download phase, count the failure 1073 // in case a switch to full update becomes necessary. Ignore network 1074 // transfer timeouts and failures. 1075 if (status_ >= UPDATE_STATUS_DOWNLOADING && 1076 code != ErrorCode::kDownloadTransferError) { 1077 MarkDeltaUpdateFailure(); 1078 } 1079 // On failure, schedule an error event to be sent to Omaha. 1080 CreatePendingErrorEvent(action, code); 1081 return; 1082 } 1083 // Find out which action completed. 1084 if (type == OmahaResponseHandlerAction::StaticType()) { 1085 // Note that the status will be updated to DOWNLOADING when some bytes get 1086 // actually downloaded from the server and the BytesReceived callback is 1087 // invoked. This avoids notifying the user that a download has started in 1088 // cases when the server and the client are unable to initiate the download. 1089 CHECK(action == response_handler_action_.get()); 1090 const InstallPlan& plan = response_handler_action_->install_plan(); 1091 UpdateLastCheckedTime(); 1092 new_version_ = plan.version; 1093 new_payload_size_ = plan.payload_size; 1094 SetupDownload(); 1095 SetupCpuSharesManagement(); 1096 SetStatusAndNotify(UPDATE_STATUS_UPDATE_AVAILABLE); 1097 } else if (type == DownloadAction::StaticType()) { 1098 SetStatusAndNotify(UPDATE_STATUS_FINALIZING); 1099 } 1100} 1101 1102void UpdateAttempter::SetDownloadStatus(bool active) { 1103 download_active_ = active; 1104 LOG(INFO) << "Download status: " << (active ? "active" : "inactive"); 1105} 1106 1107void UpdateAttempter::BytesReceived(uint64_t bytes_received, uint64_t total) { 1108 if (!download_active_) { 1109 LOG(ERROR) << "BytesReceived called while not downloading."; 1110 return; 1111 } 1112 double progress = static_cast<double>(bytes_received) / 1113 static_cast<double>(total); 1114 // Self throttle based on progress. Also send notifications if 1115 // progress is too slow. 1116 const double kDeltaPercent = 0.01; // 1% 1117 if (status_ != UPDATE_STATUS_DOWNLOADING || 1118 bytes_received == total || 1119 progress - download_progress_ >= kDeltaPercent || 1120 TimeTicks::Now() - last_notify_time_ >= TimeDelta::FromSeconds(10)) { 1121 download_progress_ = progress; 1122 SetStatusAndNotify(UPDATE_STATUS_DOWNLOADING); 1123 } 1124} 1125 1126bool UpdateAttempter::ResetStatus() { 1127 LOG(INFO) << "Attempting to reset state from " 1128 << UpdateStatusToString(status_) << " to UPDATE_STATUS_IDLE"; 1129 1130 switch (status_) { 1131 case UPDATE_STATUS_IDLE: 1132 // no-op. 1133 return true; 1134 1135 case UPDATE_STATUS_UPDATED_NEED_REBOOT: { 1136 bool ret_value = true; 1137 status_ = UPDATE_STATUS_IDLE; 1138 LOG(INFO) << "Reset Successful"; 1139 1140 // Remove the reboot marker so that if the machine is rebooted 1141 // after resetting to idle state, it doesn't go back to 1142 // UPDATE_STATUS_UPDATED_NEED_REBOOT state. 1143 if (!update_completed_marker_.empty()) { 1144 if (!base::DeleteFile(base::FilePath(update_completed_marker_), false)) 1145 ret_value = false; 1146 } 1147 1148 // Notify the PayloadState that the successful payload was canceled. 1149 system_state_->payload_state()->ResetUpdateStatus(); 1150 1151 return ret_value; 1152 } 1153 1154 default: 1155 LOG(ERROR) << "Reset not allowed in this state."; 1156 return false; 1157 } 1158} 1159 1160bool UpdateAttempter::GetStatus(int64_t* last_checked_time, 1161 double* progress, 1162 string* current_operation, 1163 string* new_version, 1164 int64_t* new_payload_size) { 1165 *last_checked_time = last_checked_time_; 1166 *progress = download_progress_; 1167 *current_operation = UpdateStatusToString(status_); 1168 *new_version = new_version_; 1169 *new_payload_size = new_payload_size_; 1170 return true; 1171} 1172 1173void UpdateAttempter::UpdateBootFlags() { 1174 if (update_boot_flags_running_) { 1175 LOG(INFO) << "Update boot flags running, nothing to do."; 1176 return; 1177 } 1178 if (updated_boot_flags_) { 1179 LOG(INFO) << "Already updated boot flags. Skipping."; 1180 if (start_action_processor_) { 1181 ScheduleProcessingStart(); 1182 } 1183 return; 1184 } 1185 // This is purely best effort. Failures should be logged by Subprocess. Run 1186 // the script asynchronously to avoid blocking the event loop regardless of 1187 // the script runtime. 1188 update_boot_flags_running_ = true; 1189 LOG(INFO) << "Updating boot flags..."; 1190 vector<string> cmd{set_good_kernel_cmd_}; 1191 if (!Subprocess::Get().Exec(cmd, StaticCompleteUpdateBootFlags, this)) { 1192 CompleteUpdateBootFlags(1); 1193 } 1194} 1195 1196void UpdateAttempter::CompleteUpdateBootFlags(int return_code) { 1197 update_boot_flags_running_ = false; 1198 updated_boot_flags_ = true; 1199 if (start_action_processor_) { 1200 ScheduleProcessingStart(); 1201 } 1202} 1203 1204void UpdateAttempter::StaticCompleteUpdateBootFlags( 1205 int return_code, 1206 const string& output, 1207 void* p) { 1208 reinterpret_cast<UpdateAttempter*>(p)->CompleteUpdateBootFlags(return_code); 1209} 1210 1211void UpdateAttempter::BroadcastStatus() { 1212 if (!dbus_service_) { 1213 return; 1214 } 1215 last_notify_time_ = TimeTicks::Now(); 1216 update_engine_service_emit_status_update( 1217 dbus_service_, 1218 last_checked_time_, 1219 download_progress_, 1220 UpdateStatusToString(status_), 1221 new_version_.c_str(), 1222 new_payload_size_); 1223} 1224 1225uint32_t UpdateAttempter::GetErrorCodeFlags() { 1226 uint32_t flags = 0; 1227 1228 if (!system_state_->hardware()->IsNormalBootMode()) 1229 flags |= static_cast<uint32_t>(ErrorCode::kDevModeFlag); 1230 1231 if (response_handler_action_.get() && 1232 response_handler_action_->install_plan().is_resume) 1233 flags |= static_cast<uint32_t>(ErrorCode::kResumedFlag); 1234 1235 if (!system_state_->hardware()->IsOfficialBuild()) 1236 flags |= static_cast<uint32_t>(ErrorCode::kTestImageFlag); 1237 1238 if (omaha_request_params_->update_url() != kProductionOmahaUrl) 1239 flags |= static_cast<uint32_t>(ErrorCode::kTestOmahaUrlFlag); 1240 1241 return flags; 1242} 1243 1244bool UpdateAttempter::ShouldCancel(ErrorCode* cancel_reason) { 1245 // Check if the channel we're attempting to update to is the same as the 1246 // target channel currently chosen by the user. 1247 OmahaRequestParams* params = system_state_->request_params(); 1248 if (params->download_channel() != params->target_channel()) { 1249 LOG(ERROR) << "Aborting download as target channel: " 1250 << params->target_channel() 1251 << " is different from the download channel: " 1252 << params->download_channel(); 1253 *cancel_reason = ErrorCode::kUpdateCanceledByChannelChange; 1254 return true; 1255 } 1256 1257 return false; 1258} 1259 1260void UpdateAttempter::SetStatusAndNotify(UpdateStatus status) { 1261 status_ = status; 1262 BroadcastStatus(); 1263} 1264 1265void UpdateAttempter::CreatePendingErrorEvent(AbstractAction* action, 1266 ErrorCode code) { 1267 if (error_event_.get()) { 1268 // This shouldn't really happen. 1269 LOG(WARNING) << "There's already an existing pending error event."; 1270 return; 1271 } 1272 1273 // For now assume that a generic Omaha response action failure means that 1274 // there's no update so don't send an event. Also, double check that the 1275 // failure has not occurred while sending an error event -- in which case 1276 // don't schedule another. This shouldn't really happen but just in case... 1277 if ((action->Type() == OmahaResponseHandlerAction::StaticType() && 1278 code == ErrorCode::kError) || 1279 status_ == UPDATE_STATUS_REPORTING_ERROR_EVENT) { 1280 return; 1281 } 1282 1283 // Classify the code to generate the appropriate result so that 1284 // the Borgmon charts show up the results correctly. 1285 // Do this before calling GetErrorCodeForAction which could potentially 1286 // augment the bit representation of code and thus cause no matches for 1287 // the switch cases below. 1288 OmahaEvent::Result event_result; 1289 switch (code) { 1290 case ErrorCode::kOmahaUpdateIgnoredPerPolicy: 1291 case ErrorCode::kOmahaUpdateDeferredPerPolicy: 1292 case ErrorCode::kOmahaUpdateDeferredForBackoff: 1293 event_result = OmahaEvent::kResultUpdateDeferred; 1294 break; 1295 default: 1296 event_result = OmahaEvent::kResultError; 1297 break; 1298 } 1299 1300 code = GetErrorCodeForAction(action, code); 1301 fake_update_success_ = code == ErrorCode::kPostinstallBootedFromFirmwareB; 1302 1303 // Compute the final error code with all the bit flags to be sent to Omaha. 1304 code = static_cast<ErrorCode>( 1305 static_cast<uint32_t>(code) | GetErrorCodeFlags()); 1306 error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete, 1307 event_result, 1308 code)); 1309} 1310 1311bool UpdateAttempter::ScheduleErrorEventAction() { 1312 if (error_event_.get() == nullptr) 1313 return false; 1314 1315 LOG(ERROR) << "Update failed."; 1316 system_state_->payload_state()->UpdateFailed(error_event_->error_code); 1317 1318 // Send it to Uma. 1319 LOG(INFO) << "Reporting the error event"; 1320 utils::SendErrorCodeToUma(system_state_, error_event_->error_code); 1321 1322 // Send it to Omaha. 1323 shared_ptr<OmahaRequestAction> error_event_action( 1324 new OmahaRequestAction(system_state_, 1325 error_event_.release(), // Pass ownership. 1326 new LibcurlHttpFetcher(GetProxyResolver(), 1327 system_state_), 1328 false)); 1329 actions_.push_back(shared_ptr<AbstractAction>(error_event_action)); 1330 processor_->EnqueueAction(error_event_action.get()); 1331 SetStatusAndNotify(UPDATE_STATUS_REPORTING_ERROR_EVENT); 1332 processor_->StartProcessing(); 1333 return true; 1334} 1335 1336void UpdateAttempter::SetCpuShares(utils::CpuShares shares) { 1337 if (shares_ == shares) { 1338 return; 1339 } 1340 if (utils::SetCpuShares(shares)) { 1341 shares_ = shares; 1342 LOG(INFO) << "CPU shares = " << shares_; 1343 } 1344} 1345 1346void UpdateAttempter::SetupCpuSharesManagement() { 1347 if (manage_shares_source_) { 1348 LOG(ERROR) << "Cpu shares timeout source hasn't been destroyed."; 1349 CleanupCpuSharesManagement(); 1350 } 1351 const int kCpuSharesTimeout = 2 * 60 * 60; // 2 hours 1352 manage_shares_source_ = g_timeout_source_new_seconds(kCpuSharesTimeout); 1353 g_source_set_callback(manage_shares_source_, 1354 StaticManageCpuSharesCallback, 1355 this, 1356 nullptr); 1357 g_source_attach(manage_shares_source_, nullptr); 1358 SetCpuShares(utils::kCpuSharesLow); 1359} 1360 1361void UpdateAttempter::CleanupCpuSharesManagement() { 1362 if (manage_shares_source_) { 1363 g_source_destroy(manage_shares_source_); 1364 manage_shares_source_ = nullptr; 1365 } 1366 SetCpuShares(utils::kCpuSharesNormal); 1367} 1368 1369gboolean UpdateAttempter::StaticManageCpuSharesCallback(gpointer data) { 1370 return reinterpret_cast<UpdateAttempter*>(data)->ManageCpuSharesCallback(); 1371} 1372 1373gboolean UpdateAttempter::StaticStartProcessing(gpointer data) { 1374 reinterpret_cast<UpdateAttempter*>(data)->processor_->StartProcessing(); 1375 return FALSE; // Don't call this callback again. 1376} 1377 1378void UpdateAttempter::ScheduleProcessingStart() { 1379 LOG(INFO) << "Scheduling an action processor start."; 1380 start_action_processor_ = false; 1381 g_idle_add(&StaticStartProcessing, this); 1382} 1383 1384bool UpdateAttempter::ManageCpuSharesCallback() { 1385 SetCpuShares(utils::kCpuSharesNormal); 1386 manage_shares_source_ = nullptr; 1387 return false; // Destroy the timeout source. 1388} 1389 1390void UpdateAttempter::DisableDeltaUpdateIfNeeded() { 1391 int64_t delta_failures; 1392 if (omaha_request_params_->delta_okay() && 1393 prefs_->GetInt64(kPrefsDeltaUpdateFailures, &delta_failures) && 1394 delta_failures >= kMaxDeltaUpdateFailures) { 1395 LOG(WARNING) << "Too many delta update failures, forcing full update."; 1396 omaha_request_params_->set_delta_okay(false); 1397 } 1398} 1399 1400void UpdateAttempter::MarkDeltaUpdateFailure() { 1401 // Don't try to resume a failed delta update. 1402 DeltaPerformer::ResetUpdateProgress(prefs_, false); 1403 int64_t delta_failures; 1404 if (!prefs_->GetInt64(kPrefsDeltaUpdateFailures, &delta_failures) || 1405 delta_failures < 0) { 1406 delta_failures = 0; 1407 } 1408 prefs_->SetInt64(kPrefsDeltaUpdateFailures, ++delta_failures); 1409} 1410 1411void UpdateAttempter::SetupDownload() { 1412 MultiRangeHttpFetcher* fetcher = 1413 static_cast<MultiRangeHttpFetcher*>(download_action_->http_fetcher()); 1414 fetcher->ClearRanges(); 1415 if (response_handler_action_->install_plan().is_resume) { 1416 // Resuming an update so fetch the update manifest metadata first. 1417 int64_t manifest_metadata_size = 0; 1418 prefs_->GetInt64(kPrefsManifestMetadataSize, &manifest_metadata_size); 1419 fetcher->AddRange(0, manifest_metadata_size); 1420 // If there're remaining unprocessed data blobs, fetch them. Be careful not 1421 // to request data beyond the end of the payload to avoid 416 HTTP response 1422 // error codes. 1423 int64_t next_data_offset = 0; 1424 prefs_->GetInt64(kPrefsUpdateStateNextDataOffset, &next_data_offset); 1425 uint64_t resume_offset = manifest_metadata_size + next_data_offset; 1426 if (resume_offset < response_handler_action_->install_plan().payload_size) { 1427 fetcher->AddRange(resume_offset); 1428 } 1429 } else { 1430 fetcher->AddRange(0); 1431 } 1432} 1433 1434void UpdateAttempter::PingOmaha() { 1435 if (!processor_->IsRunning()) { 1436 shared_ptr<OmahaRequestAction> ping_action( 1437 new OmahaRequestAction(system_state_, 1438 nullptr, 1439 new LibcurlHttpFetcher(GetProxyResolver(), 1440 system_state_), 1441 true)); 1442 actions_.push_back(shared_ptr<OmahaRequestAction>(ping_action)); 1443 processor_->set_delegate(nullptr); 1444 processor_->EnqueueAction(ping_action.get()); 1445 // Call StartProcessing() synchronously here to avoid any race conditions 1446 // caused by multiple outstanding ping Omaha requests. If we call 1447 // StartProcessing() asynchronously, the device can be suspended before we 1448 // get a chance to callback to StartProcessing(). When the device resumes 1449 // (assuming the device sleeps longer than the next update check period), 1450 // StartProcessing() is called back and at the same time, the next update 1451 // check is fired which eventually invokes StartProcessing(). A crash 1452 // can occur because StartProcessing() checks to make sure that the 1453 // processor is idle which it isn't due to the two concurrent ping Omaha 1454 // requests. 1455 processor_->StartProcessing(); 1456 } else { 1457 LOG(WARNING) << "Action processor running, Omaha ping suppressed."; 1458 } 1459 1460 // Update the last check time here; it may be re-updated when an Omaha 1461 // response is received, but this will prevent us from repeatedly scheduling 1462 // checks in the case where a response is not received. 1463 UpdateLastCheckedTime(); 1464 1465 // Update the status which will schedule the next update check 1466 SetStatusAndNotify(UPDATE_STATUS_UPDATED_NEED_REBOOT); 1467 ScheduleUpdates(); 1468} 1469 1470 1471bool UpdateAttempter::DecrementUpdateCheckCount() { 1472 int64_t update_check_count_value; 1473 1474 if (!prefs_->Exists(kPrefsUpdateCheckCount)) { 1475 // This file does not exist. This means we haven't started our update 1476 // check count down yet, so nothing more to do. This file will be created 1477 // later when we first satisfy the wall-clock-based-wait period. 1478 LOG(INFO) << "No existing update check count. That's normal."; 1479 return true; 1480 } 1481 1482 if (prefs_->GetInt64(kPrefsUpdateCheckCount, &update_check_count_value)) { 1483 // Only if we're able to read a proper integer value, then go ahead 1484 // and decrement and write back the result in the same file, if needed. 1485 LOG(INFO) << "Update check count = " << update_check_count_value; 1486 1487 if (update_check_count_value == 0) { 1488 // It could be 0, if, for some reason, the file didn't get deleted 1489 // when we set our status to waiting for reboot. so we just leave it 1490 // as is so that we can prevent another update_check wait for this client. 1491 LOG(INFO) << "Not decrementing update check count as it's already 0."; 1492 return true; 1493 } 1494 1495 if (update_check_count_value > 0) 1496 update_check_count_value--; 1497 else 1498 update_check_count_value = 0; 1499 1500 // Write out the new value of update_check_count_value. 1501 if (prefs_->SetInt64(kPrefsUpdateCheckCount, update_check_count_value)) { 1502 // We successfully wrote out te new value, so enable the 1503 // update check based wait. 1504 LOG(INFO) << "New update check count = " << update_check_count_value; 1505 return true; 1506 } 1507 } 1508 1509 LOG(INFO) << "Deleting update check count state due to read/write errors."; 1510 1511 // We cannot read/write to the file, so disable the update check based wait 1512 // so that we don't get stuck in this OS version by any chance (which could 1513 // happen if there's some bug that causes to read/write incorrectly). 1514 // Also attempt to delete the file to do our best effort to cleanup. 1515 prefs_->Delete(kPrefsUpdateCheckCount); 1516 return false; 1517} 1518 1519 1520void UpdateAttempter::UpdateEngineStarted() { 1521 // If we just booted into a new update, keep the previous OS version 1522 // in case we rebooted because of a crash of the old version, so we 1523 // can do a proper crash report with correct information. 1524 // This must be done before calling 1525 // system_state_->payload_state()->UpdateEngineStarted() since it will 1526 // delete SystemUpdated marker file. 1527 if (system_state_->system_rebooted() && 1528 prefs_->Exists(kPrefsSystemUpdatedMarker)) { 1529 if (!prefs_->GetString(kPrefsPreviousVersion, &prev_version_)) { 1530 // If we fail to get the version string, make sure it stays empty. 1531 prev_version_.clear(); 1532 } 1533 } 1534 1535 system_state_->payload_state()->UpdateEngineStarted(); 1536 StartP2PAtStartup(); 1537} 1538 1539bool UpdateAttempter::StartP2PAtStartup() { 1540 if (system_state_ == nullptr || 1541 !system_state_->p2p_manager()->IsP2PEnabled()) { 1542 LOG(INFO) << "Not starting p2p at startup since it's not enabled."; 1543 return false; 1544 } 1545 1546 if (system_state_->p2p_manager()->CountSharedFiles() < 1) { 1547 LOG(INFO) << "Not starting p2p at startup since our application " 1548 << "is not sharing any files."; 1549 return false; 1550 } 1551 1552 return StartP2PAndPerformHousekeeping(); 1553} 1554 1555bool UpdateAttempter::StartP2PAndPerformHousekeeping() { 1556 if (system_state_ == nullptr) 1557 return false; 1558 1559 if (!system_state_->p2p_manager()->IsP2PEnabled()) { 1560 LOG(INFO) << "Not starting p2p since it's not enabled."; 1561 return false; 1562 } 1563 1564 LOG(INFO) << "Ensuring that p2p is running."; 1565 if (!system_state_->p2p_manager()->EnsureP2PRunning()) { 1566 LOG(ERROR) << "Error starting p2p."; 1567 return false; 1568 } 1569 1570 LOG(INFO) << "Performing p2p housekeeping."; 1571 if (!system_state_->p2p_manager()->PerformHousekeeping()) { 1572 LOG(ERROR) << "Error performing housekeeping for p2p."; 1573 return false; 1574 } 1575 1576 LOG(INFO) << "Done performing p2p housekeeping."; 1577 return true; 1578} 1579 1580bool UpdateAttempter::GetBootTimeAtUpdate(Time *out_boot_time) { 1581 if (update_completed_marker_.empty()) 1582 return false; 1583 1584 string contents; 1585 if (!utils::ReadFile(update_completed_marker_, &contents)) 1586 return false; 1587 1588 char *endp; 1589 int64_t stored_value = strtoll(contents.c_str(), &endp, 10); 1590 if (*endp != '\0') { 1591 LOG(ERROR) << "Error parsing file " << update_completed_marker_ << " " 1592 << "with content '" << contents << "'"; 1593 return false; 1594 } 1595 1596 *out_boot_time = Time::FromInternalValue(stored_value); 1597 return true; 1598} 1599 1600bool UpdateAttempter::IsUpdateRunningOrScheduled() { 1601 return ((status_ != UPDATE_STATUS_IDLE && 1602 status_ != UPDATE_STATUS_UPDATED_NEED_REBOOT) || 1603 waiting_for_scheduled_check_); 1604} 1605 1606} // namespace chromeos_update_engine 1607