buffet: Populate firmwareVersion

BUG=brillo:103
TEST=buffet_BasicDBusAPI confirms this works as intended.
Change-Id: I90e3da7f7a4fd7901e4a605413d81cbd14a43d09
Reviewed-on: https://chromium-review.googlesource.com/247234
Tested-by: Christopher Wiley <wiley@chromium.org>
Reviewed-by: Alex Vakulenko <avakulenko@chromium.org>
Commit-Queue: Christopher Wiley <wiley@chromium.org>
diff --git a/buffet/states/state_manager.cc b/buffet/states/state_manager.cc
index b621d02..d98015d 100644
--- a/buffet/states/state_manager.cc
+++ b/buffet/states/state_manager.cc
@@ -9,6 +9,7 @@
 #include <base/logging.h>
 #include <base/values.h>
 #include <chromeos/errors/error_codes.h>
+#include <chromeos/key_value_store.h>
 #include <chromeos/strings/string_utils.h>
 
 #include "buffet/states/error_codes.h"
@@ -17,6 +18,13 @@
 
 namespace buffet {
 
+namespace {
+
+const char kBaseStateFirmwareVersion[] = "base.firmwareVersion";
+
+}  // namespace
+
+
 StateManager::StateManager(StateChangeQueueInterface* state_change_queue)
     : state_change_queue_(state_change_queue) {
   CHECK(state_change_queue_) << "State change queue not specified";
@@ -63,6 +71,23 @@
         << "Failed to load the state defaults.";
     json_file_path = enumerator2.Next();
   }
+
+  // Populate state fields that belong to the system.
+  base::FilePath lsb_release_path("/etc/lsb-release");
+  chromeos::KeyValueStore lsb_release_store;
+  std::string firmware_version;
+  if (lsb_release_store.Load(lsb_release_path)) {
+    if (!lsb_release_store.GetString("CHROMEOS_RELEASE_VERSION",
+                                     &firmware_version))
+      LOG(ERROR) << "Missing key for firmware version in version file.";
+
+  } else {
+    LOG(ERROR) << "Failed to read file for firmwareVersion.";
+  }
+  CHECK(SetPropertyValue(kBaseStateFirmwareVersion,
+                         firmware_version,
+                         base::Time::Now(),
+                         nullptr));
 }
 
 std::unique_ptr<base::DictionaryValue> StateManager::GetStateValuesAsJson(