merge in pi-release history after reset to master
diff --git a/image_properties.h b/image_properties.h
index 49fe82f..f8fe095 100644
--- a/image_properties.h
+++ b/image_properties.h
@@ -58,10 +58,6 @@
// The release channel this image was obtained from.
std::string current_channel;
- // Whether we allow arbitrary channels instead of just the ones listed in
- // kChannelsByStability.
- bool allow_arbitrary_channels = false;
-
// The Omaha URL this image should get updates from.
std::string omaha_url;
};
diff --git a/image_properties_android.cc b/image_properties_android.cc
index fa25683..1ec425d 100644
--- a/image_properties_android.cc
+++ b/image_properties_android.cc
@@ -16,13 +16,10 @@
#include "update_engine/image_properties.h"
-#include <fcntl.h>
-
#include <string>
#include <android-base/properties.h>
#include <base/logging.h>
-#include <bootloader.h>
#include <brillo/osrelease_reader.h>
#include <brillo/strings/string_utils.h>
@@ -32,7 +29,6 @@
#include "update_engine/common/prefs_interface.h"
#include "update_engine/common/utils.h"
#include "update_engine/system_state.h"
-#include "update_engine/utils_android.h"
using android::base::GetProperty;
using std::string;
@@ -51,7 +47,8 @@
// components in OEM partition.
const char kProductComponentsPath[] = "/oem/os-release.d/product_components";
-// Prefs used to store the powerwash settings.
+// Prefs used to store the target channel and powerwash settings.
+const char kPrefsImgPropChannelName[] = "img-prop-channel-name";
const char kPrefsImgPropPowerwashAllowed[] = "img-prop-powerwash-allowed";
// System properties that identifies the "board".
@@ -59,9 +56,6 @@
const char kPropBuildFingerprint[] = "ro.build.fingerprint";
const char kPropBuildType[] = "ro.build.type";
-// Default channel from factory.prop
-const char kPropDefaultChannel[] = "ro.update.default_channel";
-
// A prefix added to the path, used for testing.
const char* root_prefix = nullptr;
@@ -76,81 +70,6 @@
return default_value;
}
-// Open misc partition for read or write and output the fd in |out_fd|.
-bool OpenMisc(bool write, int* out_fd) {
- base::FilePath misc_device;
- int flags = write ? O_WRONLY | O_SYNC : O_RDONLY;
- if (root_prefix) {
- // Use a file for unittest and create one if doesn't exist.
- misc_device = base::FilePath(root_prefix).Append("misc");
- if (write)
- flags |= O_CREAT;
- } else if (!utils::DeviceForMountPoint("/misc", &misc_device)) {
- return false;
- }
-
- int fd = HANDLE_EINTR(open(misc_device.value().c_str(), flags, 0600));
- if (fd < 0) {
- PLOG(ERROR) << "Opening misc failed";
- return false;
- }
- *out_fd = fd;
- return true;
-}
-
-// The offset and size of the channel field in misc partition.
-constexpr size_t kChannelOffset =
- BOOTLOADER_MESSAGE_OFFSET_IN_MISC +
- offsetof(bootloader_message_ab, update_channel);
-constexpr size_t kChannelSize = sizeof(bootloader_message_ab::update_channel);
-
-// Read channel from misc partition to |out_channel|, return false if unable to
-// read misc or no channel is set in misc.
-bool ReadChannelFromMisc(string* out_channel) {
- int fd;
- TEST_AND_RETURN_FALSE(OpenMisc(false, &fd));
- ScopedFdCloser fd_closer(&fd);
- char channel[kChannelSize] = {0};
- ssize_t bytes_read = 0;
- if (!utils::PReadAll(
- fd, channel, kChannelSize - 1, kChannelOffset, &bytes_read) ||
- bytes_read != kChannelSize - 1) {
- PLOG(ERROR) << "Reading update channel from misc failed";
- return false;
- }
- if (channel[0] == '\0') {
- LOG(INFO) << "No channel set in misc.";
- return false;
- }
- out_channel->assign(channel);
- return true;
-}
-
-// Write |in_channel| to misc partition, return false if failed to write.
-bool WriteChannelToMisc(const string& in_channel) {
- int fd;
- TEST_AND_RETURN_FALSE(OpenMisc(true, &fd));
- ScopedFdCloser fd_closer(&fd);
- if (in_channel.size() >= kChannelSize) {
- LOG(ERROR) << "Channel name is too long: " << in_channel
- << ", the maximum length is " << kChannelSize - 1;
- return false;
- }
- char channel[kChannelSize] = {0};
- memcpy(channel, in_channel.data(), in_channel.size());
- if (!utils::PWriteAll(fd, channel, kChannelSize, kChannelOffset)) {
- PLOG(ERROR) << "Writing update channel to misc failed";
- return false;
- }
- return true;
-}
-
-string GetTargetChannel() {
- string channel;
- if (!ReadChannelFromMisc(&channel))
- channel = GetProperty(kPropDefaultChannel, "stable-channel");
- return channel;
-}
} // namespace
namespace test {
@@ -190,18 +109,18 @@
result.build_fingerprint = GetProperty(kPropBuildFingerprint, "none");
result.build_type = GetProperty(kPropBuildType, "");
- // Android doesn't have channel information in system image, we try to read
- // the channel of current slot from prefs and then fallback to use the
- // persisted target channel as current channel.
+ // Brillo images don't have a channel assigned. We stored the name of the
+ // channel where we got the image from in prefs at the time of the update, so
+ // we use that as the current channel if available. During provisioning, there
+ // is no value assigned, so we default to the "stable-channel".
string current_channel_key =
kPrefsChannelOnSlotPrefix +
std::to_string(system_state->boot_control()->GetCurrentSlot());
string current_channel;
if (!system_state->prefs()->Exists(current_channel_key) ||
!system_state->prefs()->GetString(current_channel_key, ¤t_channel))
- current_channel = GetTargetChannel();
+ current_channel = "stable-channel";
result.current_channel = current_channel;
- result.allow_arbitrary_channels = true;
// Brillo only supports the official omaha URL.
result.omaha_url = constants::kOmahaDefaultProductionURL;
@@ -211,9 +130,11 @@
MutableImageProperties LoadMutableImageProperties(SystemState* system_state) {
MutableImageProperties result;
- result.target_channel = GetTargetChannel();
- if (!system_state->prefs()->GetBoolean(kPrefsImgPropPowerwashAllowed,
- &result.is_powerwash_allowed)) {
+ PrefsInterface* const prefs = system_state->prefs();
+ if (!prefs->GetString(kPrefsImgPropChannelName, &result.target_channel))
+ result.target_channel.clear();
+ if (!prefs->GetBoolean(kPrefsImgPropPowerwashAllowed,
+ &result.is_powerwash_allowed)) {
result.is_powerwash_allowed = false;
}
return result;
@@ -221,13 +142,11 @@
bool StoreMutableImageProperties(SystemState* system_state,
const MutableImageProperties& properties) {
- bool ret = true;
- if (!WriteChannelToMisc(properties.target_channel))
- ret = false;
- if (!system_state->prefs()->SetBoolean(kPrefsImgPropPowerwashAllowed,
- properties.is_powerwash_allowed))
- ret = false;
- return ret;
+ PrefsInterface* const prefs = system_state->prefs();
+ return (
+ prefs->SetString(kPrefsImgPropChannelName, properties.target_channel) &&
+ prefs->SetBoolean(kPrefsImgPropPowerwashAllowed,
+ properties.is_powerwash_allowed));
}
void LogImageProperties() {
diff --git a/image_properties_android_unittest.cc b/image_properties_android_unittest.cc
index 607284a..7327554 100644
--- a/image_properties_android_unittest.cc
+++ b/image_properties_android_unittest.cc
@@ -23,7 +23,6 @@
#include <gtest/gtest.h>
#include "update_engine/common/constants.h"
-#include "update_engine/common/fake_prefs.h"
#include "update_engine/common/test_utils.h"
#include "update_engine/fake_system_state.h"
@@ -46,14 +45,6 @@
ASSERT_TRUE(WriteFileString(osrelease_dir_.Append(key).value(), value));
}
- void WriteChannel(const string& channel) {
- string misc(2080, '\0');
- misc += channel;
- misc.resize(4096);
- ASSERT_TRUE(
- WriteFileString(tempdir_.GetPath().Append("misc").value(), misc));
- }
-
FakeSystemState fake_system_state_;
base::ScopedTempDir tempdir_;
@@ -96,28 +87,4 @@
EXPECT_EQ("bar", props.system_id);
}
-TEST_F(ImagePropertiesTest, LoadChannelTest) {
- WriteChannel("unittest-channel");
- ImageProperties props = LoadImageProperties(&fake_system_state_);
- EXPECT_EQ("unittest-channel", props.current_channel);
-}
-
-TEST_F(ImagePropertiesTest, DefaultStableChannelTest) {
- WriteChannel("");
- ImageProperties props = LoadImageProperties(&fake_system_state_);
- EXPECT_EQ("stable-channel", props.current_channel);
-}
-
-TEST_F(ImagePropertiesTest, StoreLoadMutableChannelTest) {
- FakePrefs prefs;
- fake_system_state_.set_prefs(&prefs);
- WriteChannel("previous-channel");
- MutableImageProperties props;
- props.target_channel = "new-channel";
- EXPECT_TRUE(StoreMutableImageProperties(&fake_system_state_, props));
- MutableImageProperties loaded_props =
- LoadMutableImageProperties(&fake_system_state_);
- EXPECT_EQ(props.target_channel, loaded_props.target_channel);
-}
-
} // namespace chromeos_update_engine
diff --git a/image_properties_chromeos.cc b/image_properties_chromeos.cc
index 87c32f0..39ddeb3 100644
--- a/image_properties_chromeos.cc
+++ b/image_properties_chromeos.cc
@@ -118,7 +118,6 @@
constants::kOmahaDefaultProductionURL);
// Build fingerprint not used in Chrome OS.
result.build_fingerprint = "";
- result.allow_arbitrary_channels = false;
return result;
}
diff --git a/main.cc b/main.cc
index 0612c54..0b96307 100644
--- a/main.cc
+++ b/main.cc
@@ -14,19 +14,15 @@
// limitations under the License.
//
-#include <inttypes.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <xz.h>
-#include <algorithm>
#include <string>
-#include <vector>
#include <base/at_exit.h>
#include <base/command_line.h>
-#include <base/files/dir_reader_posix.h>
#include <base/files/file_util.h>
#include <base/logging.h>
#include <base/strings/string_util.h>
@@ -42,65 +38,7 @@
namespace chromeos_update_engine {
namespace {
-string GetTimeAsString(time_t utime) {
- struct tm tm;
- CHECK_EQ(localtime_r(&utime, &tm), &tm);
- char str[16];
- CHECK_EQ(strftime(str, sizeof(str), "%Y%m%d-%H%M%S", &tm), 15u);
- return str;
-}
-
-#ifdef __ANDROID__
-constexpr char kSystemLogsRoot[] = "/data/misc/update_engine_log";
-constexpr size_t kLogCount = 5;
-
-// Keep the most recent |kLogCount| logs but remove the old ones in
-// "/data/misc/update_engine_log/".
-void DeleteOldLogs(const string& kLogsRoot) {
- base::DirReaderPosix reader(kLogsRoot.c_str());
- if (!reader.IsValid()) {
- LOG(ERROR) << "Failed to read " << kLogsRoot;
- return;
- }
-
- std::vector<string> old_logs;
- while (reader.Next()) {
- if (reader.name()[0] == '.')
- continue;
-
- // Log files are in format "update_engine.%Y%m%d-%H%M%S",
- // e.g. update_engine.20090103-231425
- uint64_t date;
- uint64_t local_time;
- if (sscanf(reader.name(),
- "update_engine.%" PRIu64 "-%" PRIu64 "",
- &date,
- &local_time) == 2) {
- old_logs.push_back(reader.name());
- } else {
- LOG(WARNING) << "Unrecognized log file " << reader.name();
- }
- }
-
- std::sort(old_logs.begin(), old_logs.end(), std::greater<string>());
- for (size_t i = kLogCount; i < old_logs.size(); i++) {
- string log_path = kLogsRoot + "/" + old_logs[i];
- if (unlink(log_path.c_str()) == -1) {
- PLOG(WARNING) << "Failed to unlink " << log_path;
- }
- }
-}
-
-string SetupLogFile(const string& kLogsRoot) {
- DeleteOldLogs(kLogsRoot);
-
- return base::StringPrintf("%s/update_engine.%s",
- kLogsRoot.c_str(),
- GetTimeAsString(::time(nullptr)).c_str());
-}
-#else
-constexpr char kSystemLogsRoot[] = "/var/log";
-
+#ifndef __ANDROID__
void SetupLogSymlink(const string& symlink_path, const string& log_path) {
// TODO(petkov): To ensure a smooth transition between non-timestamped and
// timestamped logs, move an existing log to start the first timestamped
@@ -119,6 +57,14 @@
}
}
+string GetTimeAsString(time_t utime) {
+ struct tm tm;
+ CHECK_EQ(localtime_r(&utime, &tm), &tm);
+ char str[16];
+ CHECK_EQ(strftime(str, sizeof(str), "%Y%m%d-%H%M%S", &tm), 15u);
+ return str;
+}
+
string SetupLogFile(const string& kLogsRoot) {
const string kLogSymlink = kLogsRoot + "/update_engine.log";
const string kLogsDir = kLogsRoot + "/update_engine";
@@ -142,8 +88,13 @@
string log_file;
if (log_to_file) {
- log_file = SetupLogFile(kSystemLogsRoot);
+#ifdef __ANDROID__
+ log_file = "/data/misc/update_engine_log/update_engine.log";
+ log_settings.delete_old = logging::DELETE_OLD_LOG_FILE;
+#else
+ log_file = SetupLogFile("/var/log");
log_settings.delete_old = logging::APPEND_TO_OLD_LOG_FILE;
+#endif // __ANDROID__
log_settings.log_file = log_file.c_str();
}
logging::InitLogging(log_settings);
diff --git a/omaha_request_params.cc b/omaha_request_params.cc
index 641032b..3ba7037 100644
--- a/omaha_request_params.cc
+++ b/omaha_request_params.cc
@@ -192,7 +192,7 @@
}
bool OmahaRequestParams::IsValidChannel(const string& channel) const {
- return image_props_.allow_arbitrary_channels || GetChannelIndex(channel) >= 0;
+ return GetChannelIndex(channel) >= 0;
}
void OmahaRequestParams::set_root(const string& root) {
diff --git a/omaha_request_params.h b/omaha_request_params.h
index 9e41716..73edd6f 100644
--- a/omaha_request_params.h
+++ b/omaha_request_params.h
@@ -253,11 +253,10 @@
}
private:
- FRIEND_TEST(OmahaRequestParamsTest, ChannelIndexTest);
- FRIEND_TEST(OmahaRequestParamsTest, CollectECFWVersionsTest);
FRIEND_TEST(OmahaRequestParamsTest, IsValidChannelTest);
- FRIEND_TEST(OmahaRequestParamsTest, SetTargetChannelInvalidTest);
+ FRIEND_TEST(OmahaRequestParamsTest, ChannelIndexTest);
FRIEND_TEST(OmahaRequestParamsTest, ToMoreStableChannelFlagTest);
+ FRIEND_TEST(OmahaRequestParamsTest, CollectECFWVersionsTest);
// Returns true if |channel| is a valid channel, false otherwise.
bool IsValidChannel(const std::string& channel) const;
diff --git a/omaha_request_params_unittest.cc b/omaha_request_params_unittest.cc
index 6705c71..57ecf24 100644
--- a/omaha_request_params_unittest.cc
+++ b/omaha_request_params_unittest.cc
@@ -145,7 +145,6 @@
params.set_root(tempdir_.GetPath().value());
SetLockDown(true);
EXPECT_TRUE(params.Init("", "", false));
- params.image_props_.allow_arbitrary_channels = false;
string error_message;
EXPECT_FALSE(
params.SetTargetChannel("dogfood-channel", true, &error_message));
@@ -168,8 +167,6 @@
EXPECT_FALSE(params_.IsValidChannel("dogfood-channel"));
EXPECT_FALSE(params_.IsValidChannel("some-channel"));
EXPECT_FALSE(params_.IsValidChannel(""));
- params_.image_props_.allow_arbitrary_channels = true;
- EXPECT_TRUE(params_.IsValidChannel("some-channel"));
}
TEST_F(OmahaRequestParamsTest, SetTargetChannelWorks) {
diff --git a/omaha_response_handler_action_unittest.cc b/omaha_response_handler_action_unittest.cc
index 4e9c03f..568d11d 100644
--- a/omaha_response_handler_action_unittest.cc
+++ b/omaha_response_handler_action_unittest.cc
@@ -388,6 +388,8 @@
params.set_current_channel("canary-channel");
// The ImageProperties in Android uses prefs to store MutableImageProperties.
#ifdef __ANDROID__
+ EXPECT_CALL(*fake_system_state_.mock_prefs(), SetString(_, "stable-channel"))
+ .WillOnce(Return(true));
EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, true))
.WillOnce(Return(true));
#endif // __ANDROID__
@@ -421,6 +423,8 @@
params.set_current_channel("stable-channel");
// The ImageProperties in Android uses prefs to store MutableImageProperties.
#ifdef __ANDROID__
+ EXPECT_CALL(*fake_system_state_.mock_prefs(), SetString(_, "canary-channel"))
+ .WillOnce(Return(true));
EXPECT_CALL(*fake_system_state_.mock_prefs(), SetBoolean(_, false))
.WillOnce(Return(true));
#endif // __ANDROID__