Add EC and Firmware Versions to the Omaha Response. This CL adds 2 additional utils methods to get the version for both the fw and ec versions. I've added a unittest to verify these work and piped in the values into the omaha response. BUG=chromium:219871 TEST=Unittests + on device Change-Id: Iadf70fff858988f52797d94bcdb062bb2482bbf3 Reviewed-on: https://gerrit.chromium.org/gerrit/49713 Commit-Queue: Chris Sosa <[email protected]> Reviewed-by: Chris Sosa <[email protected]> Tested-by: Chris Sosa <[email protected]>
diff --git a/utils.cc b/utils.cc index a6d8d91..d24a61f 100644 --- a/utils.cc +++ b/utils.cc
@@ -18,6 +18,7 @@ #include <unistd.h> #include <algorithm> +#include <vector> #include <base/file_path.h> #include <base/file_util.h> @@ -25,6 +26,7 @@ #include <base/posix/eintr_wrapper.h> #include <base/rand_util.h> #include <base/string_number_conversions.h> +#include <base/string_split.h> #include <base/string_util.h> #include <base/stringprintf.h> #include <glib.h> @@ -41,6 +43,7 @@ using base::Time; using base::TimeDelta; using std::min; +using std::pair; using std::string; using std::vector; @@ -82,23 +85,70 @@ return !dev_mode; } -string GetHardwareClass() { - // TODO(petkov): Convert to a library call once a crossystem library is - // available (crosbug.com/13291). +string ReadValueFromCrosSystem(const string& key){ int exit_code = 0; vector<string> cmd(1, "/usr/bin/crossystem"); - cmd.push_back("hwid"); + cmd.push_back(key); - string hwid; - bool success = Subprocess::SynchronousExec(cmd, &exit_code, &hwid); + string return_value; + bool success = Subprocess::SynchronousExec(cmd, &exit_code, &return_value); if (success && !exit_code) { - TrimWhitespaceASCII(hwid, TRIM_ALL, &hwid); - return hwid; + TrimWhitespaceASCII(return_value, TRIM_ALL, &return_value); + return return_value; } - LOG(ERROR) << "Unable to read HWID (" << exit_code << ") " << hwid; + LOG(ERROR) << "Unable to read " << key << " (" << exit_code << ") " + << return_value; return ""; } +string GetHardwareClass() { + return ReadValueFromCrosSystem("hwid"); +} + +string GetFirmwareVersion() { + return ReadValueFromCrosSystem("fwid"); +} + +string GetECVersion(const char* input_line) { + string line; + if(input_line == NULL) { + int exit_code = 0; + vector<string> cmd(1, "/usr/sbin/mosys"); + cmd.push_back("-k"); + cmd.push_back("ec"); + cmd.push_back("info"); + + bool success = Subprocess::SynchronousExec(cmd, &exit_code, &line); + if (!success || exit_code) { + LOG(ERROR) << "Unable to read ec info from mosys (" << exit_code << ")"; + return ""; + } + } else { + line = input_line; + } + + TrimWhitespaceASCII(line, TRIM_ALL, &line); + + // At this point we want to conver the format key=value pair from mosys to + // a vector of key value pairs. + vector<pair<string, string> > kv_pairs; + if (base::SplitStringIntoKeyValuePairs(line, '=', ' ', &kv_pairs)) { + for (vector<pair<string, string> >::iterator it = kv_pairs.begin(); + it != kv_pairs.end(); ++it) { + // Finally match against the fw_verion which may have quotes. + if (it->first == "fw_version") { + string output; + // Trim any quotes. + TrimString(it->second, "\"", &output); + return output; + } + } + } + LOG(ERROR) << "Unable to parse fwid from ec info."; + return ""; +} + + bool WriteFile(const char* path, const char* data, int data_len) { DirectFileWriter writer; TEST_AND_RETURN_FALSE_ERRNO(0 == writer.Open(path,