1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved. 2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be 3*1a96fba6SXin Li // found in the LICENSE file. 4*1a96fba6SXin Li 5*1a96fba6SXin Li #include <brillo/osrelease_reader.h> 6*1a96fba6SXin Li 7*1a96fba6SXin Li #include <base/files/file_enumerator.h> 8*1a96fba6SXin Li #include <base/files/file_util.h> 9*1a96fba6SXin Li #include <base/logging.h> 10*1a96fba6SXin Li #include <brillo/strings/string_utils.h> 11*1a96fba6SXin Li 12*1a96fba6SXin Li namespace brillo { 13*1a96fba6SXin Li Load()14*1a96fba6SXin Livoid OsReleaseReader::Load() { 15*1a96fba6SXin Li Load(base::FilePath("/")); 16*1a96fba6SXin Li } 17*1a96fba6SXin Li GetString(const std::string & key,std::string * value) const18*1a96fba6SXin Libool OsReleaseReader::GetString(const std::string& key, 19*1a96fba6SXin Li std::string* value) const { 20*1a96fba6SXin Li CHECK(initialized_) << "OsReleaseReader.Load() must be called first."; 21*1a96fba6SXin Li return store_.GetString(key, value); 22*1a96fba6SXin Li } 23*1a96fba6SXin Li LoadTestingOnly(const base::FilePath & root_dir)24*1a96fba6SXin Livoid OsReleaseReader::LoadTestingOnly(const base::FilePath& root_dir) { 25*1a96fba6SXin Li Load(root_dir); 26*1a96fba6SXin Li } 27*1a96fba6SXin Li Load(const base::FilePath & root_dir)28*1a96fba6SXin Livoid OsReleaseReader::Load(const base::FilePath& root_dir) { 29*1a96fba6SXin Li base::FilePath osrelease = root_dir.Append("etc").Append("os-release"); 30*1a96fba6SXin Li if (!store_.Load(osrelease)) { 31*1a96fba6SXin Li // /etc/os-release might not be present (cros deploying a new configuration 32*1a96fba6SXin Li // or no fields set at all). Just print a debug message and continue. 33*1a96fba6SXin Li DLOG(INFO) << "Could not load fields from " << osrelease.value(); 34*1a96fba6SXin Li } 35*1a96fba6SXin Li 36*1a96fba6SXin Li base::FilePath osreleased = root_dir.Append("etc").Append("os-release.d"); 37*1a96fba6SXin Li base::FileEnumerator enumerator( 38*1a96fba6SXin Li osreleased, false, base::FileEnumerator::FILES); 39*1a96fba6SXin Li 40*1a96fba6SXin Li for (base::FilePath path = enumerator.Next(); !path.empty(); 41*1a96fba6SXin Li path = enumerator.Next()) { 42*1a96fba6SXin Li std::string content; 43*1a96fba6SXin Li if (!base::ReadFileToString(path, &content)) { 44*1a96fba6SXin Li PLOG(ERROR) << "Could not read " << path.value(); 45*1a96fba6SXin Li continue; 46*1a96fba6SXin Li } 47*1a96fba6SXin Li // There might be a trailing new line. Strip it to keep only the first line 48*1a96fba6SXin Li // of the file. 49*1a96fba6SXin Li content = brillo::string_utils::SplitAtFirst(content, "\n", true).first; 50*1a96fba6SXin Li store_.SetString(path.BaseName().value(), content); 51*1a96fba6SXin Li } 52*1a96fba6SXin Li initialized_ = true; 53*1a96fba6SXin Li } 54*1a96fba6SXin Li GetKeys() const55*1a96fba6SXin Listd::vector<std::string> OsReleaseReader::GetKeys() const { 56*1a96fba6SXin Li CHECK(initialized_) << "OsReleaseReader.Load() must be called first."; 57*1a96fba6SXin Li return store_.GetKeys(); 58*1a96fba6SXin Li } 59*1a96fba6SXin Li 60*1a96fba6SXin Li } // namespace brillo 61