blob: cdcf73544391e5ed3d70179cb844df2cc6b88f5f [file] [log] [blame]
Darin Petkov73058b42010-10-06 16:32:19 -07001// Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
adlr@google.com3defe6a2009-12-04 20:57:17 +00002// 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/omaha_response_handler_action.h"
Darin Petkov73058b42010-10-06 16:32:19 -07006
adlr@google.com3defe6a2009-12-04 20:57:17 +00007#include <string>
Darin Petkov73058b42010-10-06 16:32:19 -07008
9#include <base/logging.h>
10
11#include "update_engine/prefs_interface.h"
adlr@google.com3defe6a2009-12-04 20:57:17 +000012#include "update_engine/utils.h"
13
14using std::string;
15
16namespace chromeos_update_engine {
17
adlr@google.com3defe6a2009-12-04 20:57:17 +000018void OmahaResponseHandlerAction::PerformAction() {
19 CHECK(HasInputObject());
20 ScopedActionCompleter completer(processor_, this);
Darin Petkov6a5b3222010-07-13 14:55:28 -070021 const OmahaResponse& response = GetInputObject();
adlr@google.com3defe6a2009-12-04 20:57:17 +000022 if (!response.update_exists) {
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080023 got_no_update_response_ = true;
adlr@google.com3defe6a2009-12-04 20:57:17 +000024 LOG(INFO) << "There are no updates. Aborting.";
25 return;
26 }
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070027 install_plan_.download_url = response.codebase;
28 install_plan_.size = response.size;
29 install_plan_.download_hash = response.hash;
Darin Petkov73058b42010-10-06 16:32:19 -070030 // TODO(petkov): Decide here if this is going to be a regular update or
31 // resume-after-boot. This should also set the number of ops performed so far
32 // to invalid if no need to resume.
33 LOG_IF(WARNING, !prefs_->SetString(kPrefsUpdateCheckResponseHash,
34 response.hash))
35 << "Unable to save the update check response hash.";
adlr@google.com3defe6a2009-12-04 20:57:17 +000036 TEST_AND_RETURN(GetInstallDev(
37 (!boot_device_.empty() ? boot_device_ : utils::BootDevice()),
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070038 &install_plan_.install_path));
39 install_plan_.kernel_install_path =
40 utils::BootKernelDevice(install_plan_.install_path);
adlr@google.com3defe6a2009-12-04 20:57:17 +000041
Andrew de los Reyes3270f742010-07-15 22:28:14 -070042 install_plan_.is_full_update = !response.is_delta;
adlr@google.com3defe6a2009-12-04 20:57:17 +000043
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070044 TEST_AND_RETURN(HasOutputPipe());
adlr@google.com3defe6a2009-12-04 20:57:17 +000045 if (HasOutputPipe())
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070046 SetOutputObject(install_plan_);
adlr@google.com3defe6a2009-12-04 20:57:17 +000047 LOG(INFO) << "Using this install plan:";
Andrew de los Reyes63b96d72010-05-10 13:08:54 -070048 install_plan_.Dump();
Darin Petkov6a5b3222010-07-13 14:55:28 -070049
Darin Petkovc1a8b422010-07-19 11:34:49 -070050 completer.set_code(kActionCodeSuccess);
adlr@google.com3defe6a2009-12-04 20:57:17 +000051}
52
53bool OmahaResponseHandlerAction::GetInstallDev(const std::string& boot_dev,
54 std::string* install_dev) {
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070055 TEST_AND_RETURN_FALSE(utils::StringHasPrefix(boot_dev, "/dev/"));
adlr@google.com3defe6a2009-12-04 20:57:17 +000056 string ret(boot_dev);
Andrew de los Reyesf98bff82010-05-06 13:33:25 -070057 string::reverse_iterator it = ret.rbegin(); // last character in string
58 // Right now, we just switch '3' and '5' partition numbers.
59 TEST_AND_RETURN_FALSE((*it == '3') || (*it == '5'));
60 *it = (*it == '3') ? '5' : '3';
adlr@google.com3defe6a2009-12-04 20:57:17 +000061 *install_dev = ret;
62 return true;
63}
64
65} // namespace chromeos_update_engine