OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/chromeos/system/statistics_provider.h" | 5 #include "chrome/browser/chromeos/system/statistics_provider.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/chromeos/chromeos_version.h" | 8 #include "base/chromeos/chromeos_version.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/files/file_path.h" | 10 #include "base/files/file_path.h" |
11 #include "base/logging.h" | 11 #include "base/logging.h" |
12 #include "base/memory/singleton.h" | 12 #include "base/memory/singleton.h" |
13 #include "base/path_service.h" | 13 #include "base/path_service.h" |
14 #include "base/synchronization/waitable_event.h" | 14 #include "base/synchronization/waitable_event.h" |
15 #include "base/threading/thread_restrictions.h" | 15 #include "base/threading/thread_restrictions.h" |
16 #include "base/time/time.h" | 16 #include "base/time/time.h" |
17 #include "chromeos/app_mode/kiosk_oem_manifest_parser.h" | 17 #include "chromeos/app_mode/kiosk_oem_manifest_parser.h" |
18 #include "chromeos/chromeos_constants.h" | 18 #include "chromeos/chromeos_constants.h" |
19 #include "chromeos/chromeos_switches.h" | 19 #include "chromeos/chromeos_switches.h" |
20 #include "chromeos/system/name_value_pairs_parser.h" | 20 #include "chromeos/system/name_value_pairs_parser.h" |
21 #include "content/public/browser/browser_thread.h" | 21 #include "content/public/browser/browser_thread.h" |
22 | 22 |
23 #if defined(GOOGLE_CHROME_BUILD) | |
24 // TODO(phajdan.jr): Drop that dependency, http://crbug.com/180711 . | |
25 #include "chrome/common/chrome_version_info.h" | |
26 #endif | |
27 | |
28 using content::BrowserThread; | 23 using content::BrowserThread; |
29 | 24 |
30 namespace chromeos { | 25 namespace chromeos { |
31 namespace system { | 26 namespace system { |
32 namespace { | 27 namespace { |
33 | 28 |
34 // Path to the tool used to get system info, and delimiters for the output | 29 // Path to the tool used to get system info, and delimiters for the output |
35 // format of the tool. | 30 // format of the tool. |
36 const char* kCrosSystemTool[] = { "/usr/bin/crossystem" }; | 31 const char* kCrosSystemTool[] = { "/usr/bin/crossystem" }; |
37 const char kCrosSystemEq[] = "="; | 32 const char kCrosSystemEq[] = "="; |
(...skipping 11 matching lines...) Expand all Loading... |
49 const char kMachineHardwareInfoFile[] = "/tmp/machine-info"; | 44 const char kMachineHardwareInfoFile[] = "/tmp/machine-info"; |
50 const char kMachineHardwareInfoEq[] = "="; | 45 const char kMachineHardwareInfoEq[] = "="; |
51 const char kMachineHardwareInfoDelim[] = " \n"; | 46 const char kMachineHardwareInfoDelim[] = " \n"; |
52 | 47 |
53 // File to get ECHO coupon info from, and key/value delimiters of | 48 // File to get ECHO coupon info from, and key/value delimiters of |
54 // the file. | 49 // the file. |
55 const char kEchoCouponFile[] = "/var/cache/echo/vpd_echo.txt"; | 50 const char kEchoCouponFile[] = "/var/cache/echo/vpd_echo.txt"; |
56 const char kEchoCouponEq[] = "="; | 51 const char kEchoCouponEq[] = "="; |
57 const char kEchoCouponDelim[] = "\n"; | 52 const char kEchoCouponDelim[] = "\n"; |
58 | 53 |
59 // File to get machine OS info from, and key/value delimiters of the file. | |
60 const char kMachineOSInfoFile[] = "/etc/lsb-release"; | |
61 const char kMachineOSInfoEq[] = "="; | |
62 const char kMachineOSInfoDelim[] = "\n"; | |
63 | |
64 // File to get VPD info from, and key/value delimiters of the file. | 54 // File to get VPD info from, and key/value delimiters of the file. |
65 const char kVpdFile[] = "/var/log/vpd_2.0.txt"; | 55 const char kVpdFile[] = "/var/log/vpd_2.0.txt"; |
66 const char kVpdEq[] = "="; | 56 const char kVpdEq[] = "="; |
67 const char kVpdDelim[] = "\n"; | 57 const char kVpdDelim[] = "\n"; |
68 | 58 |
69 // Timeout that we should wait for statistics to get loaded | 59 // Timeout that we should wait for statistics to get loaded |
70 const int kTimeoutSecs = 3; | 60 const int kTimeoutSecs = 3; |
71 | 61 |
72 // The location of OEM manifest file used to trigger OOBE flow for kiosk mode. | 62 // The location of OEM manifest file used to trigger OOBE flow for kiosk mode. |
73 const CommandLine::CharType kOemManifestFilePath[] = | 63 const CommandLine::CharType kOemManifestFilePath[] = |
74 FILE_PATH_LITERAL("/usr/share/oem/oobe/manifest.json"); | 64 FILE_PATH_LITERAL("/usr/share/oem/oobe/manifest.json"); |
75 | 65 |
76 } // namespace | 66 } // namespace |
77 | 67 |
78 // Key values for GetMachineStatistic()/GetMachineFlag() calls. | 68 // Key values for GetMachineStatistic()/GetMachineFlag() calls. |
79 const char kDevSwitchBootMode[] = "devsw_boot"; | 69 const char kDevSwitchBootMode[] = "devsw_boot"; |
80 const char kHardwareClass[] = "hardware_class"; | 70 const char kHardwareClass[] = "hardware_class"; |
81 const char kMachineInfoBoard[] = | |
82 "CHROMEOS_RELEASE_BOARD"; | |
83 const char kOffersCouponCodeKey[] = "ubind_attribute"; | 71 const char kOffersCouponCodeKey[] = "ubind_attribute"; |
84 const char kOffersGroupCodeKey[] = "gbind_attribute"; | 72 const char kOffersGroupCodeKey[] = "gbind_attribute"; |
85 const char kOemCanExitEnterpriseEnrollmentKey[] = | 73 const char kOemCanExitEnterpriseEnrollmentKey[] = |
86 "oem_can_exit_enrollment"; | 74 "oem_can_exit_enrollment"; |
87 const char kOemDeviceRequisitionKey[] = | 75 const char kOemDeviceRequisitionKey[] = |
88 "oem_device_requisition"; | 76 "oem_device_requisition"; |
89 const char kOemIsEnterpriseManagedKey[] = | 77 const char kOemIsEnterpriseManagedKey[] = |
90 "oem_enterprise_managed"; | 78 "oem_enterprise_managed"; |
91 const char kOemKeyboardDrivenOobeKey[] = | 79 const char kOemKeyboardDrivenOobeKey[] = |
92 "oem_keyboard_driven_oobe"; | 80 "oem_keyboard_driven_oobe"; |
(...skipping 13 matching lines...) Expand all Loading... |
106 static StatisticsProviderImpl* GetInstance(); | 94 static StatisticsProviderImpl* GetInstance(); |
107 | 95 |
108 protected: | 96 protected: |
109 StatisticsProviderImpl(); | 97 StatisticsProviderImpl(); |
110 void LoadOemManifestFromFile(const base::FilePath& file); | 98 void LoadOemManifestFromFile(const base::FilePath& file); |
111 | 99 |
112 private: | 100 private: |
113 typedef std::map<std::string, bool> MachineFlags; | 101 typedef std::map<std::string, bool> MachineFlags; |
114 friend struct DefaultSingletonTraits<StatisticsProviderImpl>; | 102 friend struct DefaultSingletonTraits<StatisticsProviderImpl>; |
115 | 103 |
116 // Loads the machine info file, which is necessary to get the Chrome channel. | |
117 // Treat MachineOSInfoFile specially, as distribution channel information | |
118 // (stable, beta, dev, canary) is required at earlier stage than everything | |
119 // else. Rather than posting a delayed task, read and parse the machine OS | |
120 // info file immediately. | |
121 void LoadMachineOSInfoFile(); | |
122 | |
123 // Loads the machine statistcs by examining the system. | 104 // Loads the machine statistcs by examining the system. |
124 void LoadMachineStatistics(); | 105 void LoadMachineStatistics(); |
125 | 106 |
126 bool initialized_; | 107 bool initialized_; |
127 bool load_statistics_started_; | 108 bool load_statistics_started_; |
128 NameValuePairsParser::NameValueMap machine_info_; | 109 NameValuePairsParser::NameValueMap machine_info_; |
129 MachineFlags machine_flags_; | 110 MachineFlags machine_flags_; |
130 base::WaitableEvent on_statistics_loaded_; | 111 base::WaitableEvent on_statistics_loaded_; |
131 | 112 |
132 DISALLOW_COPY_AND_ASSIGN(StatisticsProviderImpl); | 113 DISALLOW_COPY_AND_ASSIGN(StatisticsProviderImpl); |
133 }; | 114 }; |
134 | 115 |
135 void StatisticsProviderImpl::Init() { | 116 void StatisticsProviderImpl::Init() { |
136 DCHECK(!initialized_); | 117 DCHECK(!initialized_); |
137 initialized_ = true; | 118 initialized_ = true; |
138 | |
139 // Load the machine info file immediately to get the channel info. | |
140 LoadMachineOSInfoFile(); | |
141 } | 119 } |
142 | 120 |
143 bool StatisticsProviderImpl::GetMachineStatistic( | 121 bool StatisticsProviderImpl::GetMachineStatistic( |
144 const std::string& name, std::string* result) { | 122 const std::string& name, std::string* result) { |
145 DCHECK(initialized_); | 123 DCHECK(initialized_); |
146 DCHECK(load_statistics_started_); | 124 DCHECK(load_statistics_started_); |
147 | 125 |
148 VLOG(1) << "Statistic is requested for " << name; | 126 VLOG(1) << "Statistic is requested for " << name; |
149 // Block if the statistics are not loaded yet. Per LOG(WARNING) below, | 127 // Block if the statistics are not loaded yet. Per LOG(WARNING) below, |
150 // the statistics are loaded before requested as of now. For regular | 128 // the statistics are loaded before requested as of now. For regular |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 } | 172 } |
195 | 173 |
196 // manual_reset needs to be true, as we want to keep the signaled state. | 174 // manual_reset needs to be true, as we want to keep the signaled state. |
197 StatisticsProviderImpl::StatisticsProviderImpl() | 175 StatisticsProviderImpl::StatisticsProviderImpl() |
198 : initialized_(false), | 176 : initialized_(false), |
199 load_statistics_started_(false), | 177 load_statistics_started_(false), |
200 on_statistics_loaded_(true /* manual_reset */, | 178 on_statistics_loaded_(true /* manual_reset */, |
201 false /* initially_signaled */) { | 179 false /* initially_signaled */) { |
202 } | 180 } |
203 | 181 |
204 void StatisticsProviderImpl::LoadMachineOSInfoFile() { | |
205 NameValuePairsParser parser(&machine_info_); | |
206 if (parser.GetNameValuePairsFromFile(base::FilePath(kMachineOSInfoFile), | |
207 kMachineOSInfoEq, | |
208 kMachineOSInfoDelim)) { | |
209 #if defined(GOOGLE_CHROME_BUILD) | |
210 const char kChromeOSReleaseTrack[] = "CHROMEOS_RELEASE_TRACK"; | |
211 NameValuePairsParser::NameValueMap::iterator iter = | |
212 machine_info_.find(kChromeOSReleaseTrack); | |
213 if (iter != machine_info_.end()) | |
214 chrome::VersionInfo::SetChannel(iter->second); | |
215 #endif | |
216 } | |
217 } | |
218 | |
219 void StatisticsProviderImpl::StartLoadingMachineStatistics() { | 182 void StatisticsProviderImpl::StartLoadingMachineStatistics() { |
220 DCHECK(initialized_); | 183 DCHECK(initialized_); |
221 DCHECK(!load_statistics_started_); | 184 DCHECK(!load_statistics_started_); |
222 load_statistics_started_ = true; | 185 load_statistics_started_ = true; |
223 | 186 |
224 VLOG(1) << "Started loading statistics"; | 187 VLOG(1) << "Started loading statistics"; |
225 BrowserThread::PostBlockingPoolTask( | 188 BrowserThread::PostBlockingPoolTask( |
226 FROM_HERE, | 189 FROM_HERE, |
227 base::Bind(&StatisticsProviderImpl::LoadMachineStatistics, | 190 base::Bind(&StatisticsProviderImpl::LoadMachineStatistics, |
228 base::Unretained(this))); | 191 base::Unretained(this))); |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 StatisticsProvider* StatisticsProvider::GetInstance() { | 297 StatisticsProvider* StatisticsProvider::GetInstance() { |
335 if (base::chromeos::IsRunningOnChromeOS()) { | 298 if (base::chromeos::IsRunningOnChromeOS()) { |
336 return StatisticsProviderImpl::GetInstance(); | 299 return StatisticsProviderImpl::GetInstance(); |
337 } else { | 300 } else { |
338 return StatisticsProviderStubImpl::GetInstance(); | 301 return StatisticsProviderStubImpl::GetInstance(); |
339 } | 302 } |
340 } | 303 } |
341 | 304 |
342 } // namespace system | 305 } // namespace system |
343 } // namespace chromeos | 306 } // namespace chromeos |
OLD | NEW |