adlr@google.com | 3defe6a | 2009-12-04 20:57:17 +0000 | [diff] [blame^] | 1 | // Copyright (c) 2009 The Chromium 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/omaha_request_prep_action.h" |
| 6 | #include <sys/utsname.h> |
| 7 | #include <string> |
| 8 | #include "update_engine/utils.h" |
| 9 | |
| 10 | using std::string; |
| 11 | |
| 12 | // This gathers local system information and prepares info used by the |
| 13 | // update check action. |
| 14 | |
| 15 | namespace chromeos_update_engine { |
| 16 | |
| 17 | void OmahaRequestPrepAction::PerformAction() { |
| 18 | // TODO(adlr): honor force_full_update_ |
| 19 | const string machine_id(GetMachineId()); |
| 20 | const string version(GetLsbValue("GOOGLE_RELEASE")); |
| 21 | const string sp(version + "_" + GetMachineType()); |
| 22 | const string track(GetLsbValue("GOOGLE_TRACK")); |
| 23 | |
| 24 | UpdateCheckParams out(machine_id, // machine_id |
| 25 | machine_id, // user_id (use machine_id) |
| 26 | UpdateCheckParams::kOsPlatform, |
| 27 | UpdateCheckParams::kOsVersion, |
| 28 | sp, // e.g. 0.2.3.3_i686 |
| 29 | UpdateCheckParams::kAppId, |
| 30 | version, // app version (from lsb-release) |
| 31 | "en-US", //lang |
| 32 | track); // track |
| 33 | |
| 34 | CHECK(HasOutputPipe()); |
| 35 | SetOutputObject(out); |
| 36 | processor_->ActionComplete(this, true); |
| 37 | } |
| 38 | |
| 39 | std::string OmahaRequestPrepAction::GetMachineId() const { |
| 40 | FILE* fp = popen("/sbin/ifconfig", "r"); |
| 41 | if (!fp) |
| 42 | return ""; |
| 43 | string data; |
| 44 | for (;;) { |
| 45 | char buffer[1000]; |
| 46 | size_t r = fread(buffer, 1, sizeof(buffer), fp); |
| 47 | if (r <= 0) |
| 48 | break; |
| 49 | data.insert(data.end(), buffer, buffer + r); |
| 50 | } |
| 51 | fclose(fp); |
| 52 | // scan data for MAC address |
| 53 | string::size_type pos = data.find(" HWaddr "); |
| 54 | if (pos == string::npos) |
| 55 | return ""; |
| 56 | // 3 * 6 - 1 is the number of bytes of the hwaddr. |
| 57 | return data.substr(pos + strlen(" HWaddr "), 3 * 6 - 1); |
| 58 | } |
| 59 | |
| 60 | std::string OmahaRequestPrepAction::GetLsbValue(const std::string& key) const { |
| 61 | string files[] = {utils::kStatefulPartition + "/etc/lsb-release", |
| 62 | "/etc/lsb-release"}; |
| 63 | for (unsigned int i = 0; i < arraysize(files); i++) { |
| 64 | string file_data; |
| 65 | if (!utils::ReadFileToString(root_ + files[i], &file_data)) |
| 66 | continue; |
| 67 | string::size_type pos = 0; |
| 68 | if (!utils::StringHasPrefix(file_data, key + "=")) { |
| 69 | pos = file_data.find(string("\n") + key + "="); |
| 70 | if (pos != string::npos) |
| 71 | pos++; // advance past \n |
| 72 | } |
| 73 | if (pos == string::npos) |
| 74 | continue; |
| 75 | pos += key.size() + 1; // advance past the key and the '=' |
| 76 | string::size_type endpos = file_data.find('\n', pos); |
| 77 | string::size_type length = |
| 78 | (endpos == string::npos ? string::npos : endpos - pos); |
| 79 | return file_data.substr(pos, length); |
| 80 | } |
| 81 | // not found |
| 82 | return ""; |
| 83 | } |
| 84 | |
| 85 | std::string OmahaRequestPrepAction::GetMachineType() const { |
| 86 | struct utsname buf; |
| 87 | string ret; |
| 88 | if (uname(&buf) == 0) |
| 89 | ret = buf.machine; |
| 90 | return ret; |
| 91 | } |
| 92 | |
| 93 | } // namespace chromeos_update_engine |