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