xref: /aosp_15_r20/external/libbrillo/brillo/osrelease_reader.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
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 Li void OsReleaseReader::Load() {
15*1a96fba6SXin Li   Load(base::FilePath("/"));
16*1a96fba6SXin Li }
17*1a96fba6SXin Li 
GetString(const std::string & key,std::string * value) const18*1a96fba6SXin Li bool 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 Li void 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 Li void 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 Li std::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