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/policy/device_status_collector.h" | 5 #include "chrome/browser/chromeos/policy/device_status_collector.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 #include <cstdio> | 11 #include <cstdio> |
12 #include <limits> | 12 #include <limits> |
13 #include <memory> | 13 #include <memory> |
14 #include <sstream> | 14 #include <sstream> |
15 | 15 |
16 #include "base/bind.h" | 16 #include "base/bind.h" |
17 #include "base/bind_helpers.h" | 17 #include "base/bind_helpers.h" |
18 #include "base/files/file_enumerator.h" | 18 #include "base/files/file_enumerator.h" |
19 #include "base/files/file_util.h" | 19 #include "base/files/file_util.h" |
20 #include "base/format_macros.h" | 20 #include "base/format_macros.h" |
21 #include "base/location.h" | 21 #include "base/location.h" |
22 #include "base/logging.h" | 22 #include "base/logging.h" |
23 #include "base/macros.h" | 23 #include "base/macros.h" |
24 #include "base/memory/ptr_util.h" | 24 #include "base/memory/ptr_util.h" |
25 #include "base/posix/eintr_wrapper.h" | 25 #include "base/posix/eintr_wrapper.h" |
26 #include "base/strings/string_number_conversions.h" | 26 #include "base/strings/string_number_conversions.h" |
27 #include "base/strings/string_util.h" | 27 #include "base/strings/string_util.h" |
| 28 #include "base/strings/stringprintf.h" |
28 #include "base/sys_info.h" | 29 #include "base/sys_info.h" |
29 #include "base/task_runner_util.h" | 30 #include "base/task_runner_util.h" |
30 #include "base/values.h" | 31 #include "base/values.h" |
| 32 #include "base/version.h" |
31 #include "chrome/browser/browser_process.h" | 33 #include "chrome/browser/browser_process.h" |
32 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" | 34 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
33 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h" | 35 #include "chrome/browser/chromeos/login/users/chrome_user_manager.h" |
34 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" | 36 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" |
35 #include "chrome/browser/chromeos/policy/device_local_account.h" | 37 #include "chrome/browser/chromeos/policy/device_local_account.h" |
36 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 38 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
37 #include "chrome/browser/chromeos/settings/cros_settings.h" | 39 #include "chrome/browser/chromeos/settings/cros_settings.h" |
38 #include "chrome/common/pref_names.h" | 40 #include "chrome/common/pref_names.h" |
| 41 #include "chromeos/dbus/dbus_thread_manager.h" |
| 42 #include "chromeos/dbus/update_engine_client.h" |
39 #include "chromeos/disks/disk_mount_manager.h" | 43 #include "chromeos/disks/disk_mount_manager.h" |
40 #include "chromeos/network/device_state.h" | 44 #include "chromeos/network/device_state.h" |
41 #include "chromeos/network/network_handler.h" | 45 #include "chromeos/network/network_handler.h" |
42 #include "chromeos/network/network_state.h" | 46 #include "chromeos/network/network_state.h" |
43 #include "chromeos/network/network_state_handler.h" | 47 #include "chromeos/network/network_state_handler.h" |
44 #include "chromeos/settings/cros_settings_names.h" | 48 #include "chromeos/settings/cros_settings_names.h" |
45 #include "chromeos/system/statistics_provider.h" | 49 #include "chromeos/system/statistics_provider.h" |
46 #include "components/policy/core/common/cloud/cloud_policy_constants.h" | 50 #include "components/policy/core/common/cloud/cloud_policy_constants.h" |
47 #include "components/prefs/pref_registry_simple.h" | 51 #include "components/prefs/pref_registry_simple.h" |
48 #include "components/prefs/pref_service.h" | 52 #include "components/prefs/pref_service.h" |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 if (AccountId::FromUserEmail(device_local_account.user_id) == | 232 if (AccountId::FromUserEmail(device_local_account.user_id) == |
229 user->GetAccountId()) { | 233 user->GetAccountId()) { |
230 return base::WrapUnique( | 234 return base::WrapUnique( |
231 new policy::DeviceLocalAccount(device_local_account)); | 235 new policy::DeviceLocalAccount(device_local_account)); |
232 } | 236 } |
233 } | 237 } |
234 LOG(WARNING) << "Kiosk app not found in list of device-local accounts"; | 238 LOG(WARNING) << "Kiosk app not found in list of device-local accounts"; |
235 return std::unique_ptr<policy::DeviceLocalAccount>(); | 239 return std::unique_ptr<policy::DeviceLocalAccount>(); |
236 } | 240 } |
237 | 241 |
| 242 base::Version GetPlatformVersion() { |
| 243 int32_t major_version; |
| 244 int32_t minor_version; |
| 245 int32_t bugfix_version; |
| 246 base::SysInfo::OperatingSystemVersionNumbers(&major_version, &minor_version, |
| 247 &bugfix_version); |
| 248 return base::Version(base::StringPrintf("%d.%d.%d", major_version, |
| 249 minor_version, bugfix_version)); |
| 250 } |
| 251 |
238 } // namespace | 252 } // namespace |
239 | 253 |
240 namespace policy { | 254 namespace policy { |
241 | 255 |
242 DeviceStatusCollector::DeviceStatusCollector( | 256 DeviceStatusCollector::DeviceStatusCollector( |
243 PrefService* local_state, | 257 PrefService* local_state, |
244 chromeos::system::StatisticsProvider* provider, | 258 chromeos::system::StatisticsProvider* provider, |
245 const LocationUpdateRequester& location_update_requester, | 259 const LocationUpdateRequester& location_update_requester, |
246 const VolumeInfoFetcher& volume_info_fetcher, | 260 const VolumeInfoFetcher& volume_info_fetcher, |
247 const CPUStatisticsFetcher& cpu_statistics_fetcher, | 261 const CPUStatisticsFetcher& cpu_statistics_fetcher, |
248 const CPUTempFetcher& cpu_temp_fetcher) | 262 const CPUTempFetcher& cpu_temp_fetcher) |
249 : max_stored_past_activity_days_(kMaxStoredPastActivityDays), | 263 : max_stored_past_activity_days_(kMaxStoredPastActivityDays), |
250 max_stored_future_activity_days_(kMaxStoredFutureActivityDays), | 264 max_stored_future_activity_days_(kMaxStoredFutureActivityDays), |
251 local_state_(local_state), | 265 local_state_(local_state), |
252 last_idle_check_(Time()), | 266 last_idle_check_(Time()), |
253 last_reported_day_(0), | |
254 duration_for_last_reported_day_(0), | |
255 geolocation_update_in_progress_(false), | |
256 volume_info_fetcher_(volume_info_fetcher), | 267 volume_info_fetcher_(volume_info_fetcher), |
257 cpu_statistics_fetcher_(cpu_statistics_fetcher), | 268 cpu_statistics_fetcher_(cpu_statistics_fetcher), |
258 cpu_temp_fetcher_(cpu_temp_fetcher), | 269 cpu_temp_fetcher_(cpu_temp_fetcher), |
259 statistics_provider_(provider), | 270 statistics_provider_(provider), |
260 last_cpu_active_(0), | 271 cros_settings_(chromeos::CrosSettings::Get()), |
261 last_cpu_idle_(0), | |
262 location_update_requester_(location_update_requester), | 272 location_update_requester_(location_update_requester), |
263 report_version_info_(false), | |
264 report_activity_times_(false), | |
265 report_boot_mode_(false), | |
266 report_location_(false), | |
267 report_network_interfaces_(false), | |
268 report_users_(false), | |
269 report_hardware_status_(false), | |
270 report_session_status_(false), | |
271 weak_factory_(this) { | 273 weak_factory_(this) { |
272 if (volume_info_fetcher_.is_null()) | 274 if (volume_info_fetcher_.is_null()) |
273 volume_info_fetcher_ = base::Bind(&GetVolumeInfo); | 275 volume_info_fetcher_ = base::Bind(&GetVolumeInfo); |
274 | 276 |
275 if (cpu_statistics_fetcher_.is_null()) | 277 if (cpu_statistics_fetcher_.is_null()) |
276 cpu_statistics_fetcher_ = base::Bind(&ReadCPUStatistics); | 278 cpu_statistics_fetcher_ = base::Bind(&ReadCPUStatistics); |
277 | 279 |
278 if (cpu_temp_fetcher_.is_null()) | 280 if (cpu_temp_fetcher_.is_null()) |
279 cpu_temp_fetcher_ = base::Bind(&ReadCPUTempInfo); | 281 cpu_temp_fetcher_ = base::Bind(&ReadCPUTempInfo); |
280 | 282 |
281 idle_poll_timer_.Start(FROM_HERE, | 283 idle_poll_timer_.Start(FROM_HERE, |
282 TimeDelta::FromSeconds(kIdlePollIntervalSeconds), | 284 TimeDelta::FromSeconds(kIdlePollIntervalSeconds), |
283 this, &DeviceStatusCollector::CheckIdleState); | 285 this, &DeviceStatusCollector::CheckIdleState); |
284 hardware_status_sampling_timer_.Start( | 286 hardware_status_sampling_timer_.Start( |
285 FROM_HERE, | 287 FROM_HERE, |
286 TimeDelta::FromSeconds(kHardwareStatusSampleIntervalSeconds), | 288 TimeDelta::FromSeconds(kHardwareStatusSampleIntervalSeconds), |
287 this, &DeviceStatusCollector::SampleHardwareStatus); | 289 this, &DeviceStatusCollector::SampleHardwareStatus); |
288 | 290 |
289 cros_settings_ = chromeos::CrosSettings::Get(); | |
290 | |
291 | |
292 // Watch for changes to the individual policies that control what the status | 291 // Watch for changes to the individual policies that control what the status |
293 // reports contain. | 292 // reports contain. |
294 base::Closure callback = | 293 base::Closure callback = |
295 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, | 294 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, |
296 base::Unretained(this)); | 295 base::Unretained(this)); |
297 version_info_subscription_ = cros_settings_->AddSettingsObserver( | 296 version_info_subscription_ = cros_settings_->AddSettingsObserver( |
298 chromeos::kReportDeviceVersionInfo, callback); | 297 chromeos::kReportDeviceVersionInfo, callback); |
299 activity_times_subscription_ = cros_settings_->AddSettingsObserver( | 298 activity_times_subscription_ = cros_settings_->AddSettingsObserver( |
300 chromeos::kReportDeviceActivityTimes, callback); | 299 chromeos::kReportDeviceActivityTimes, callback); |
301 boot_mode_subscription_ = cros_settings_->AddSettingsObserver( | 300 boot_mode_subscription_ = cros_settings_->AddSettingsObserver( |
302 chromeos::kReportDeviceBootMode, callback); | 301 chromeos::kReportDeviceBootMode, callback); |
303 location_subscription_ = cros_settings_->AddSettingsObserver( | 302 location_subscription_ = cros_settings_->AddSettingsObserver( |
304 chromeos::kReportDeviceLocation, callback); | 303 chromeos::kReportDeviceLocation, callback); |
305 network_interfaces_subscription_ = cros_settings_->AddSettingsObserver( | 304 network_interfaces_subscription_ = cros_settings_->AddSettingsObserver( |
306 chromeos::kReportDeviceNetworkInterfaces, callback); | 305 chromeos::kReportDeviceNetworkInterfaces, callback); |
307 users_subscription_ = cros_settings_->AddSettingsObserver( | 306 users_subscription_ = cros_settings_->AddSettingsObserver( |
308 chromeos::kReportDeviceUsers, callback); | 307 chromeos::kReportDeviceUsers, callback); |
309 hardware_status_subscription_ = cros_settings_->AddSettingsObserver( | 308 hardware_status_subscription_ = cros_settings_->AddSettingsObserver( |
310 chromeos::kReportDeviceHardwareStatus, callback); | 309 chromeos::kReportDeviceHardwareStatus, callback); |
311 session_status_subscription_ = cros_settings_->AddSettingsObserver( | 310 session_status_subscription_ = cros_settings_->AddSettingsObserver( |
312 chromeos::kReportDeviceSessionStatus, callback); | 311 chromeos::kReportDeviceSessionStatus, callback); |
| 312 os_update_status_subscription_ = cros_settings_->AddSettingsObserver( |
| 313 chromeos::kReportOsUpdateStatus, callback); |
| 314 running_kiosk_app_subscription_ = cros_settings_->AddSettingsObserver( |
| 315 chromeos::kReportRunningKioskApp, callback); |
313 | 316 |
314 // The last known location is persisted in local state. This makes location | 317 // The last known location is persisted in local state. This makes location |
315 // information available immediately upon startup and avoids the need to | 318 // information available immediately upon startup and avoids the need to |
316 // reacquire the location on every user session change or browser crash. | 319 // reacquire the location on every user session change or browser crash. |
317 content::Geoposition position; | 320 content::Geoposition position; |
318 std::string timestamp_str; | 321 std::string timestamp_str; |
319 int64_t timestamp; | 322 int64_t timestamp; |
320 const base::DictionaryValue* location = | 323 const base::DictionaryValue* location = |
321 local_state_->GetDictionary(prefs::kDeviceLocation); | 324 local_state_->GetDictionary(prefs::kDeviceLocation); |
322 if (location->GetDouble(kLatitude, &position.latitude) && | 325 if (location->GetDouble(kLatitude, &position.latitude) && |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 local_state_->ClearPref(prefs::kDeviceLocation); | 431 local_state_->ClearPref(prefs::kDeviceLocation); |
429 } | 432 } |
430 | 433 |
431 if (!report_hardware_status_) { | 434 if (!report_hardware_status_) { |
432 ClearCachedHardwareStatus(); | 435 ClearCachedHardwareStatus(); |
433 } else if (!already_reporting_hardware_status) { | 436 } else if (!already_reporting_hardware_status) { |
434 // Turning on hardware status reporting - fetch an initial sample | 437 // Turning on hardware status reporting - fetch an initial sample |
435 // immediately instead of waiting for the sampling timer to fire. | 438 // immediately instead of waiting for the sampling timer to fire. |
436 SampleHardwareStatus(); | 439 SampleHardwareStatus(); |
437 } | 440 } |
| 441 |
| 442 // Os update status and running kiosk app reporting are disabled by default. |
| 443 if (!cros_settings_->GetBoolean(chromeos::kReportOsUpdateStatus, |
| 444 &report_os_update_status_)) { |
| 445 report_os_update_status_ = false; |
| 446 } |
| 447 if (!cros_settings_->GetBoolean(chromeos::kReportRunningKioskApp, |
| 448 &report_running_kiosk_app_)) { |
| 449 report_running_kiosk_app_ = false; |
| 450 } |
438 } | 451 } |
439 | 452 |
440 Time DeviceStatusCollector::GetCurrentTime() { | 453 Time DeviceStatusCollector::GetCurrentTime() { |
441 return Time::Now(); | 454 return Time::Now(); |
442 } | 455 } |
443 | 456 |
444 // Remove all out-of-range activity times from the local store. | 457 // Remove all out-of-range activity times from the local store. |
445 void DeviceStatusCollector::PruneStoredActivityPeriods(Time base_time) { | 458 void DeviceStatusCollector::PruneStoredActivityPeriods(Time base_time) { |
446 Time min_time = | 459 Time min_time = |
447 base_time - TimeDelta::FromDays(max_stored_past_activity_days_); | 460 base_time - TimeDelta::FromDays(max_stored_past_activity_days_); |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
897 status->add_system_ram_free(usage.bytes_of_ram_free); | 910 status->add_system_ram_free(usage.bytes_of_ram_free); |
898 } | 911 } |
899 | 912 |
900 // Add CPU temp info. | 913 // Add CPU temp info. |
901 status->clear_cpu_temp_info(); | 914 status->clear_cpu_temp_info(); |
902 for (const em::CPUTempInfo& info : cpu_temp_info_) { | 915 for (const em::CPUTempInfo& info : cpu_temp_info_) { |
903 *status->add_cpu_temp_info() = info; | 916 *status->add_cpu_temp_info() = info; |
904 } | 917 } |
905 } | 918 } |
906 | 919 |
| 920 bool DeviceStatusCollector::GetOsUpdateStatus( |
| 921 em::DeviceStatusReportRequest* status) { |
| 922 const base::Version platform_version(GetPlatformVersion()); |
| 923 if (!platform_version.IsValid()) |
| 924 return false; |
| 925 |
| 926 const std::string required_platform_version_string = |
| 927 chromeos::KioskAppManager::Get() |
| 928 ->GetAutoLaunchAppRequiredPlatformVersion(); |
| 929 if (required_platform_version_string.empty()) |
| 930 return false; |
| 931 |
| 932 const base::Version required_platfrom_version( |
| 933 required_platform_version_string); |
| 934 |
| 935 em::OsUpdateStatus* os_update_status = status->mutable_os_update_status(); |
| 936 os_update_status->set_new_required_platform_version( |
| 937 required_platfrom_version.GetString()); |
| 938 |
| 939 if (platform_version == required_platfrom_version) { |
| 940 os_update_status->set_update_status(em::OsUpdateStatus::OS_UP_TO_DATE); |
| 941 return true; |
| 942 } |
| 943 |
| 944 const chromeos::UpdateEngineClient::Status update_engine_status = |
| 945 chromeos::DBusThreadManager::Get() |
| 946 ->GetUpdateEngineClient() |
| 947 ->GetLastStatus(); |
| 948 if (update_engine_status.status == |
| 949 chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING || |
| 950 update_engine_status.status == |
| 951 chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING || |
| 952 update_engine_status.status == |
| 953 chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING) { |
| 954 os_update_status->set_update_status( |
| 955 em::OsUpdateStatus::OS_IMAGE_DOWNLOAD_IN_PROGRESS); |
| 956 os_update_status->set_new_platform_version( |
| 957 update_engine_status.new_version); |
| 958 } else if (update_engine_status.status == |
| 959 chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) { |
| 960 os_update_status->set_update_status( |
| 961 em::OsUpdateStatus::OS_UPDATE_NEED_REBOOT); |
| 962 } else { |
| 963 os_update_status->set_update_status( |
| 964 em::OsUpdateStatus::OS_IMAGE_DOWNLOAD_NOT_STARTED); |
| 965 } |
| 966 |
| 967 return true; |
| 968 } |
| 969 |
| 970 bool DeviceStatusCollector::GetRunningKioskApp( |
| 971 em::DeviceStatusReportRequest* status) { |
| 972 std::unique_ptr<const DeviceLocalAccount> account = |
| 973 GetAutoLaunchedKioskSessionInfo(); |
| 974 // Only generate running kiosk app reports if we are in an auto-launched kiosk |
| 975 // session. |
| 976 if (!account) |
| 977 return false; |
| 978 |
| 979 em::AppStatus* running_kiosk_app = status->mutable_running_kiosk_app(); |
| 980 running_kiosk_app->set_app_id(account->kiosk_app_id); |
| 981 |
| 982 const std::string app_version = GetAppVersion(account->kiosk_app_id); |
| 983 if (app_version.empty()) { |
| 984 DLOG(ERROR) << "Unable to get version for extension: " |
| 985 << account->kiosk_app_id; |
| 986 } else { |
| 987 running_kiosk_app->set_extension_version(app_version); |
| 988 } |
| 989 |
| 990 chromeos::KioskAppManager::App app_info; |
| 991 if (chromeos::KioskAppManager::Get()->GetApp(account->kiosk_app_id, |
| 992 &app_info)) { |
| 993 running_kiosk_app->set_required_platform_version( |
| 994 app_info.required_platform_version); |
| 995 } |
| 996 return true; |
| 997 } |
| 998 |
907 bool DeviceStatusCollector::GetDeviceStatus( | 999 bool DeviceStatusCollector::GetDeviceStatus( |
908 em::DeviceStatusReportRequest* status) { | 1000 em::DeviceStatusReportRequest* status) { |
909 if (report_activity_times_) | 1001 if (report_activity_times_) |
910 GetActivityTimes(status); | 1002 GetActivityTimes(status); |
911 | 1003 |
912 if (report_version_info_) | 1004 if (report_version_info_) |
913 GetVersionInfo(status); | 1005 GetVersionInfo(status); |
914 | 1006 |
915 if (report_boot_mode_) | 1007 if (report_boot_mode_) |
916 GetBootMode(status); | 1008 GetBootMode(status); |
917 | 1009 |
918 if (report_location_) | 1010 if (report_location_) |
919 GetLocation(status); | 1011 GetLocation(status); |
920 | 1012 |
921 if (report_network_interfaces_) | 1013 if (report_network_interfaces_) |
922 GetNetworkInterfaces(status); | 1014 GetNetworkInterfaces(status); |
923 | 1015 |
924 if (report_users_) | 1016 if (report_users_) |
925 GetUsers(status); | 1017 GetUsers(status); |
926 | 1018 |
927 if (report_hardware_status_) | 1019 if (report_hardware_status_) |
928 GetHardwareStatus(status); | 1020 GetHardwareStatus(status); |
929 | 1021 |
| 1022 bool os_update_status_reported = false; |
| 1023 if (report_os_update_status_) |
| 1024 os_update_status_reported = GetOsUpdateStatus(status); |
| 1025 |
| 1026 bool running_kiosk_app_reported = false; |
| 1027 if (report_running_kiosk_app_) |
| 1028 running_kiosk_app_reported = GetRunningKioskApp(status); |
| 1029 |
930 return (report_activity_times_ || | 1030 return (report_activity_times_ || |
931 report_version_info_ || | 1031 report_version_info_ || |
932 report_boot_mode_ || | 1032 report_boot_mode_ || |
933 report_location_ || | 1033 report_location_ || |
934 report_network_interfaces_ || | 1034 report_network_interfaces_ || |
935 report_users_ || | 1035 report_users_ || |
936 report_hardware_status_); | 1036 report_hardware_status_ || |
| 1037 os_update_status_reported || |
| 1038 running_kiosk_app_reported); |
937 } | 1039 } |
938 | 1040 |
939 bool DeviceStatusCollector::GetDeviceSessionStatus( | 1041 bool DeviceStatusCollector::GetDeviceSessionStatus( |
940 em::SessionStatusReportRequest* status) { | 1042 em::SessionStatusReportRequest* status) { |
941 // Only generate session status reports if session status reporting is | 1043 // Only generate session status reports if session status reporting is |
942 // enabled. | 1044 // enabled. |
943 if (!report_session_status_) | 1045 if (!report_session_status_) |
944 return false; | 1046 return false; |
945 | 1047 |
946 std::unique_ptr<const DeviceLocalAccount> account = | 1048 std::unique_ptr<const DeviceLocalAccount> account = |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1051 ScheduleGeolocationUpdateRequest(); | 1153 ScheduleGeolocationUpdateRequest(); |
1052 } | 1154 } |
1053 | 1155 |
1054 void DeviceStatusCollector::ReceiveVolumeInfo( | 1156 void DeviceStatusCollector::ReceiveVolumeInfo( |
1055 const std::vector<em::VolumeInfo>& info) { | 1157 const std::vector<em::VolumeInfo>& info) { |
1056 if (report_hardware_status_) | 1158 if (report_hardware_status_) |
1057 volume_info_ = info; | 1159 volume_info_ = info; |
1058 } | 1160 } |
1059 | 1161 |
1060 } // namespace policy | 1162 } // namespace policy |
OLD | NEW |