Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: chrome/browser/chromeos/policy/device_status_collector.cc

Issue 2132663002: kiosk: Add status report for os update and running app (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update doc for running_kiosk_app Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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(
Thiemo Nagel 2016/07/10 08:47:47 Would it make sense to set_new_platform_version()
xiyuan 2016/07/11 16:29:17 Done. There could be edge cases that update_engin
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698