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

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

Issue 776803003: Updated DeviceStatusReportRequest to contain new monitoring data. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed more review feedback. Created 6 years 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 <limits> 7 #include <limits>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
11 #include "base/location.h" 11 #include "base/location.h"
12 #include "base/logging.h" 12 #include "base/logging.h"
13 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/scoped_ptr.h"
14 #include "base/prefs/pref_registry_simple.h" 14 #include "base/prefs/pref_registry_simple.h"
15 #include "base/prefs/pref_service.h" 15 #include "base/prefs/pref_service.h"
16 #include "base/prefs/scoped_user_pref_update.h" 16 #include "base/prefs/scoped_user_pref_update.h"
17 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
18 #include "base/values.h" 18 #include "base/values.h"
19 #include "chrome/browser/browser_process.h" 19 #include "chrome/browser/browser_process.h"
20 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h" 20 #include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
21 #include "chrome/browser/chromeos/settings/cros_settings.h" 21 #include "chrome/browser/chromeos/settings/cros_settings.h"
22 #include "chrome/common/chrome_version_info.h" 22 #include "chrome/common/chrome_version_info.h"
23 #include "chrome/common/pref_names.h" 23 #include "chrome/common/pref_names.h"
24 #include "chromeos/network/device_state.h" 24 #include "chromeos/network/device_state.h"
25 #include "chromeos/network/network_handler.h" 25 #include "chromeos/network/network_handler.h"
26 #include "chromeos/network/network_state.h"
26 #include "chromeos/network/network_state_handler.h" 27 #include "chromeos/network/network_state_handler.h"
27 #include "chromeos/settings/cros_settings_names.h" 28 #include "chromeos/settings/cros_settings_names.h"
28 #include "chromeos/system/statistics_provider.h" 29 #include "chromeos/system/statistics_provider.h"
29 #include "components/policy/core/common/cloud/cloud_policy_constants.h" 30 #include "components/policy/core/common/cloud/cloud_policy_constants.h"
30 #include "components/user_manager/user_manager.h" 31 #include "components/user_manager/user_manager.h"
31 #include "components/user_manager/user_type.h" 32 #include "components/user_manager/user_type.h"
32 #include "content/public/browser/browser_thread.h" 33 #include "content/public/browser/browser_thread.h"
33 #include "policy/proto/device_management_backend.pb.h" 34 #include "policy/proto/device_management_backend.pb.h"
34 #include "third_party/cros_system_api/dbus/service_constants.h" 35 #include "third_party/cros_system_api/dbus/service_constants.h"
35 36
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 last_reported_day_(0), 88 last_reported_day_(0),
88 duration_for_last_reported_day_(0), 89 duration_for_last_reported_day_(0),
89 geolocation_update_in_progress_(false), 90 geolocation_update_in_progress_(false),
90 statistics_provider_(provider), 91 statistics_provider_(provider),
91 report_version_info_(false), 92 report_version_info_(false),
92 report_activity_times_(false), 93 report_activity_times_(false),
93 report_boot_mode_(false), 94 report_boot_mode_(false),
94 report_location_(false), 95 report_location_(false),
95 report_network_interfaces_(false), 96 report_network_interfaces_(false),
96 report_users_(false), 97 report_users_(false),
98 report_hardware_status_(false),
97 weak_factory_(this) { 99 weak_factory_(this) {
98 if (location_update_requester) 100 if (location_update_requester)
99 location_update_requester_ = *location_update_requester; 101 location_update_requester_ = *location_update_requester;
100 idle_poll_timer_.Start(FROM_HERE, 102 idle_poll_timer_.Start(FROM_HERE,
101 TimeDelta::FromSeconds(kIdlePollIntervalSeconds), 103 TimeDelta::FromSeconds(kIdlePollIntervalSeconds),
102 this, &DeviceStatusCollector::CheckIdleState); 104 this, &DeviceStatusCollector::CheckIdleState);
103 105
104 cros_settings_ = chromeos::CrosSettings::Get(); 106 cros_settings_ = chromeos::CrosSettings::Get();
105 107
106 // Watch for changes to the individual policies that control what the status 108 // Watch for changes to the individual policies that control what the status
107 // reports contain. 109 // reports contain.
108 base::Closure callback = 110 base::Closure callback =
109 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, 111 base::Bind(&DeviceStatusCollector::UpdateReportingSettings,
110 base::Unretained(this)); 112 base::Unretained(this));
111 version_info_subscription_ = cros_settings_->AddSettingsObserver( 113 version_info_subscription_ = cros_settings_->AddSettingsObserver(
112 chromeos::kReportDeviceVersionInfo, callback); 114 chromeos::kReportDeviceVersionInfo, callback);
113 activity_times_subscription_ = cros_settings_->AddSettingsObserver( 115 activity_times_subscription_ = cros_settings_->AddSettingsObserver(
114 chromeos::kReportDeviceActivityTimes, callback); 116 chromeos::kReportDeviceActivityTimes, callback);
115 boot_mode_subscription_ = cros_settings_->AddSettingsObserver( 117 boot_mode_subscription_ = cros_settings_->AddSettingsObserver(
116 chromeos::kReportDeviceBootMode, callback); 118 chromeos::kReportDeviceBootMode, callback);
117 location_subscription_ = cros_settings_->AddSettingsObserver( 119 location_subscription_ = cros_settings_->AddSettingsObserver(
118 chromeos::kReportDeviceLocation, callback); 120 chromeos::kReportDeviceLocation, callback);
119 network_interfaces_subscription_ = cros_settings_->AddSettingsObserver( 121 network_interfaces_subscription_ = cros_settings_->AddSettingsObserver(
120 chromeos::kReportDeviceNetworkInterfaces, callback); 122 chromeos::kReportDeviceNetworkInterfaces, callback);
121 users_subscription_ = cros_settings_->AddSettingsObserver( 123 users_subscription_ = cros_settings_->AddSettingsObserver(
122 chromeos::kReportDeviceUsers, callback); 124 chromeos::kReportDeviceUsers, callback);
125 hardware_status_subscription_ = cros_settings_->AddSettingsObserver(
126 chromeos::kReportDeviceHardwareStatus, callback);
123 127
124 // The last known location is persisted in local state. This makes location 128 // The last known location is persisted in local state. This makes location
125 // information available immediately upon startup and avoids the need to 129 // information available immediately upon startup and avoids the need to
126 // reacquire the location on every user session change or browser crash. 130 // reacquire the location on every user session change or browser crash.
127 content::Geoposition position; 131 content::Geoposition position;
128 std::string timestamp_str; 132 std::string timestamp_str;
129 int64 timestamp; 133 int64 timestamp;
130 const base::DictionaryValue* location = 134 const base::DictionaryValue* location =
131 local_state_->GetDictionary(prefs::kDeviceLocation); 135 local_state_->GetDictionary(prefs::kDeviceLocation);
132 if (location->GetDouble(kLatitude, &position.latitude) && 136 if (location->GetDouble(kLatitude, &position.latitude) &&
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 void DeviceStatusCollector::UpdateReportingSettings() { 179 void DeviceStatusCollector::UpdateReportingSettings() {
176 // Attempt to fetch the current value of the reporting settings. 180 // Attempt to fetch the current value of the reporting settings.
177 // If trusted values are not available, register this function to be called 181 // If trusted values are not available, register this function to be called
178 // back when they are available. 182 // back when they are available.
179 if (chromeos::CrosSettingsProvider::TRUSTED != 183 if (chromeos::CrosSettingsProvider::TRUSTED !=
180 cros_settings_->PrepareTrustedValues( 184 cros_settings_->PrepareTrustedValues(
181 base::Bind(&DeviceStatusCollector::UpdateReportingSettings, 185 base::Bind(&DeviceStatusCollector::UpdateReportingSettings,
182 weak_factory_.GetWeakPtr()))) { 186 weak_factory_.GetWeakPtr()))) {
183 return; 187 return;
184 } 188 }
189
190 // All reporting settings default to 'enabled'.
185 if (!cros_settings_->GetBoolean( 191 if (!cros_settings_->GetBoolean(
186 chromeos::kReportDeviceVersionInfo, &report_version_info_)) { 192 chromeos::kReportDeviceVersionInfo, &report_version_info_)) {
187 report_version_info_ = true; 193 report_version_info_ = true;
188 } 194 }
189 if (!cros_settings_->GetBoolean( 195 if (!cros_settings_->GetBoolean(
190 chromeos::kReportDeviceActivityTimes, &report_activity_times_)) { 196 chromeos::kReportDeviceActivityTimes, &report_activity_times_)) {
191 report_activity_times_ = true; 197 report_activity_times_ = true;
192 } 198 }
193 if (!cros_settings_->GetBoolean( 199 if (!cros_settings_->GetBoolean(
194 chromeos::kReportDeviceBootMode, &report_boot_mode_)) { 200 chromeos::kReportDeviceBootMode, &report_boot_mode_)) {
195 report_boot_mode_ = true; 201 report_boot_mode_ = true;
196 } 202 }
197 if (!cros_settings_->GetBoolean( 203 if (!cros_settings_->GetBoolean(
198 chromeos::kReportDeviceLocation, &report_location_)) {
199 report_location_ = false;
200 }
201 if (!cros_settings_->GetBoolean(
202 chromeos::kReportDeviceNetworkInterfaces, &report_network_interfaces_)) { 204 chromeos::kReportDeviceNetworkInterfaces, &report_network_interfaces_)) {
203 report_network_interfaces_ = true; 205 report_network_interfaces_ = true;
204 } 206 }
205 if (!cros_settings_->GetBoolean( 207 if (!cros_settings_->GetBoolean(
206 chromeos::kReportDeviceUsers, &report_users_)) { 208 chromeos::kReportDeviceUsers, &report_users_)) {
207 report_users_ = true; 209 report_users_ = true;
208 } 210 }
211 if (!cros_settings_->GetBoolean(
212 chromeos::kReportDeviceHardwareStatus, &report_hardware_status_)) {
213 report_hardware_status_ = true;
214 }
215
216 // Device location reporting is disabled by default because it is
217 // not launched yet.
218 if (!cros_settings_->GetBoolean(
219 chromeos::kReportDeviceLocation, &report_location_)) {
220 report_location_ = false;
221 }
209 222
210 if (report_location_) { 223 if (report_location_) {
211 ScheduleGeolocationUpdateRequest(); 224 ScheduleGeolocationUpdateRequest();
212 } else { 225 } else {
213 geolocation_update_timer_.Stop(); 226 geolocation_update_timer_.Stop();
214 position_ = content::Geoposition(); 227 position_ = content::Geoposition();
215 local_state_->ClearPref(prefs::kDeviceLocation); 228 local_state_->ClearPref(prefs::kDeviceLocation);
216 } 229 }
217 } 230 }
218 231
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
376 if (position_.heading >= 0. && position_.heading <= 360) 389 if (position_.heading >= 0. && position_.heading <= 360)
377 location->set_heading(position_.heading); 390 location->set_heading(position_.heading);
378 if (position_.speed >= 0.) 391 if (position_.speed >= 0.)
379 location->set_speed(position_.speed); 392 location->set_speed(position_.speed);
380 location->set_error_code(em::DeviceLocation::ERROR_CODE_NONE); 393 location->set_error_code(em::DeviceLocation::ERROR_CODE_NONE);
381 } 394 }
382 } 395 }
383 396
384 void DeviceStatusCollector::GetNetworkInterfaces( 397 void DeviceStatusCollector::GetNetworkInterfaces(
385 em::DeviceStatusReportRequest* request) { 398 em::DeviceStatusReportRequest* request) {
386 // Maps flimflam device type strings to proto enum constants. 399 // Maps shill device type strings to proto enum constants.
387 static const struct { 400 static const struct {
388 const char* type_string; 401 const char* type_string;
389 em::NetworkInterface::NetworkDeviceType type_constant; 402 em::NetworkInterface::NetworkDeviceType type_constant;
390 } kDeviceTypeMap[] = { 403 } kDeviceTypeMap[] = {
391 { shill::kTypeEthernet, em::NetworkInterface::TYPE_ETHERNET, }, 404 { shill::kTypeEthernet, em::NetworkInterface::TYPE_ETHERNET, },
392 { shill::kTypeWifi, em::NetworkInterface::TYPE_WIFI, }, 405 { shill::kTypeWifi, em::NetworkInterface::TYPE_WIFI, },
393 { shill::kTypeWimax, em::NetworkInterface::TYPE_WIMAX, }, 406 { shill::kTypeWimax, em::NetworkInterface::TYPE_WIMAX, },
394 { shill::kTypeBluetooth, em::NetworkInterface::TYPE_BLUETOOTH, }, 407 { shill::kTypeBluetooth, em::NetworkInterface::TYPE_BLUETOOTH, },
395 { shill::kTypeCellular, em::NetworkInterface::TYPE_CELLULAR, }, 408 { shill::kTypeCellular, em::NetworkInterface::TYPE_CELLULAR, },
396 }; 409 };
397 410
411 // Maps shill device connection status to proto enum constants.
412 static const struct {
413 const char* state_string;
414 em::NetworkState::ConnectionState state_constant;
415 } kConnectionStateMap[] = {
416 { shill::kStateIdle, em::NetworkState::IDLE },
417 { shill::kStateCarrier, em::NetworkState::CARRIER },
418 { shill::kStateAssociation, em::NetworkState::ASSOCIATION },
419 { shill::kStateConfiguration, em::NetworkState::CONFIGURATION },
420 { shill::kStateReady, em::NetworkState::READY },
421 { shill::kStatePortal, em::NetworkState::PORTAL },
422 { shill::kStateOffline, em::NetworkState::OFFLINE },
423 { shill::kStateOnline, em::NetworkState::ONLINE },
424 { shill::kStateDisconnect, em::NetworkState::DISCONNECT },
425 { shill::kStateFailure, em::NetworkState::FAILURE },
426 { shill::kStateActivationFailure,
427 em::NetworkState::ACTIVATION_FAILURE },
428 };
429
398 chromeos::NetworkStateHandler::DeviceStateList device_list; 430 chromeos::NetworkStateHandler::DeviceStateList device_list;
399 chromeos::NetworkHandler::Get()->network_state_handler()->GetDeviceList( 431 chromeos::NetworkStateHandler* network_state_handler =
400 &device_list); 432 chromeos::NetworkHandler::Get()->network_state_handler();
433 network_state_handler->GetDeviceList(&device_list);
401 434
402 chromeos::NetworkStateHandler::DeviceStateList::const_iterator device; 435 chromeos::NetworkStateHandler::DeviceStateList::const_iterator device;
403 for (device = device_list.begin(); device != device_list.end(); ++device) { 436 for (device = device_list.begin(); device != device_list.end(); ++device) {
404 // Determine the type enum constant for |device|. 437 // Determine the type enum constant for |device|.
405 size_t type_idx = 0; 438 size_t type_idx = 0;
406 for (; type_idx < arraysize(kDeviceTypeMap); ++type_idx) { 439 for (; type_idx < arraysize(kDeviceTypeMap); ++type_idx) {
407 if ((*device)->type() == kDeviceTypeMap[type_idx].type_string) 440 if ((*device)->type() == kDeviceTypeMap[type_idx].type_string)
408 break; 441 break;
409 } 442 }
410 443
411 // If the type isn't in |kDeviceTypeMap|, the interface is not relevant for 444 // If the type isn't in |kDeviceTypeMap|, the interface is not relevant for
412 // reporting. This filters out VPN devices. 445 // reporting. This filters out VPN devices.
413 if (type_idx >= arraysize(kDeviceTypeMap)) 446 if (type_idx >= arraysize(kDeviceTypeMap))
414 continue; 447 continue;
415 448
416 em::NetworkInterface* interface = request->add_network_interface(); 449 em::NetworkInterface* interface = request->add_network_interface();
417 interface->set_type(kDeviceTypeMap[type_idx].type_constant); 450 interface->set_type(kDeviceTypeMap[type_idx].type_constant);
418 if (!(*device)->mac_address().empty()) 451 if (!(*device)->mac_address().empty())
419 interface->set_mac_address((*device)->mac_address()); 452 interface->set_mac_address((*device)->mac_address());
420 if (!(*device)->meid().empty()) 453 if (!(*device)->meid().empty())
421 interface->set_meid((*device)->meid()); 454 interface->set_meid((*device)->meid());
422 if (!(*device)->imei().empty()) 455 if (!(*device)->imei().empty())
423 interface->set_imei((*device)->imei()); 456 interface->set_imei((*device)->imei());
457 if (!(*device)->path().empty())
458 interface->set_device_path((*device)->path());
459 }
460
461 // Walk the various networks and store their state in the status report.
462 chromeos::NetworkStateHandler::NetworkStateList state_list;
463 network_state_handler->GetNetworkListByType(
464 chromeos::NetworkTypePattern::Default(),
465 true, // configured_only
466 false, // visible_only,
467 0, // no limit to number of results
468 &state_list);
469
470 for (const chromeos::NetworkState* state: state_list) {
471 // Determine the connection state and signal strength for |state|.
472 em::NetworkState::ConnectionState connection_state_enum =
473 em::NetworkState::UNKNOWN;
474 const std::string connection_state_string(state->connection_state());
475 for (size_t i = 0; i < arraysize(kConnectionStateMap); ++i) {
476 if (connection_state_string == kConnectionStateMap[i].state_string) {
477 connection_state_enum = kConnectionStateMap[i].state_constant;
478 break;
479 }
480 }
481
482 // Copy fields from NetworkState into the status report.
483 em::NetworkState* proto_state = request->add_network_state();
484 proto_state->set_connection_state(connection_state_enum);
485 proto_state->set_signal_strength(state->signal_strength());
486 if (!state->device_path().empty())
487 proto_state->set_device_path(state->device_path());
424 } 488 }
425 } 489 }
426 490
427 void DeviceStatusCollector::GetUsers(em::DeviceStatusReportRequest* request) { 491 void DeviceStatusCollector::GetUsers(em::DeviceStatusReportRequest* request) {
428 policy::BrowserPolicyConnectorChromeOS* connector = 492 policy::BrowserPolicyConnectorChromeOS* connector =
429 g_browser_process->platform_part()->browser_policy_connector_chromeos(); 493 g_browser_process->platform_part()->browser_policy_connector_chromeos();
430 const user_manager::UserList& users = 494 const user_manager::UserList& users =
431 user_manager::UserManager::Get()->GetUsers(); 495 user_manager::UserManager::Get()->GetUsers();
432 user_manager::UserList::const_iterator user; 496 user_manager::UserList::const_iterator user;
433 for (user = users.begin(); user != users.end(); ++user) { 497 for (user = users.begin(); user != users.end(); ++user) {
434 // Only users with gaia accounts (regular) are reported. 498 // Only users with gaia accounts (regular) are reported.
435 if (!(*user)->HasGaiaAccount()) 499 if (!(*user)->HasGaiaAccount())
436 continue; 500 continue;
437 501
438 em::DeviceUser* device_user = request->add_user(); 502 em::DeviceUser* device_user = request->add_user();
439 const std::string& email = (*user)->email(); 503 const std::string& email = (*user)->email();
440 if (connector->GetUserAffiliation(email) == USER_AFFILIATION_MANAGED) { 504 if (connector->GetUserAffiliation(email) == USER_AFFILIATION_MANAGED) {
441 device_user->set_type(em::DeviceUser::USER_TYPE_MANAGED); 505 device_user->set_type(em::DeviceUser::USER_TYPE_MANAGED);
442 device_user->set_email(email); 506 device_user->set_email(email);
443 } else { 507 } else {
444 device_user->set_type(em::DeviceUser::USER_TYPE_UNMANAGED); 508 device_user->set_type(em::DeviceUser::USER_TYPE_UNMANAGED);
445 // Do not report the email address of unmanaged users. 509 // Do not report the email address of unmanaged users.
446 } 510 }
447 } 511 }
448 } 512 }
449 513
450 void DeviceStatusCollector::GetStatus(em::DeviceStatusReportRequest* request) { 514 void DeviceStatusCollector::GetHardwareStatus(
451 // TODO(mnissler): Remove once the old cloud policy stack is retired. The old 515 em::DeviceStatusReportRequest* status) {
452 // stack doesn't support reporting successful submissions back to here, so 516 // TODO(atwilson): Fill in hardware status fields.
453 // just assume whatever ends up in |request| gets submitted successfully.
454 GetDeviceStatus(request);
455 OnSubmittedSuccessfully();
456 } 517 }
457 518
458 bool DeviceStatusCollector::GetDeviceStatus( 519 bool DeviceStatusCollector::GetDeviceStatus(
459 em::DeviceStatusReportRequest* status) { 520 em::DeviceStatusReportRequest* status) {
460 if (report_activity_times_) 521 if (report_activity_times_)
461 GetActivityTimes(status); 522 GetActivityTimes(status);
462 523
463 if (report_version_info_) 524 if (report_version_info_)
464 GetVersionInfo(status); 525 GetVersionInfo(status);
465 526
466 if (report_boot_mode_) 527 if (report_boot_mode_)
467 GetBootMode(status); 528 GetBootMode(status);
468 529
469 if (report_location_) 530 if (report_location_)
470 GetLocation(status); 531 GetLocation(status);
471 532
472 if (report_network_interfaces_) 533 if (report_network_interfaces_)
473 GetNetworkInterfaces(status); 534 GetNetworkInterfaces(status);
474 535
475 if (report_users_) { 536 if (report_users_) {
476 GetUsers(status); 537 GetUsers(status);
477 } 538 }
478 539
540 if (report_hardware_status_)
541 GetHardwareStatus(status);
542
479 return true; 543 return true;
480 } 544 }
481 545
482 bool DeviceStatusCollector::GetSessionStatus( 546 bool DeviceStatusCollector::GetSessionStatus(
483 em::SessionStatusReportRequest* status) { 547 em::SessionStatusReportRequest* status) {
484 return false; 548 return false;
485 } 549 }
486 550
487 void DeviceStatusCollector::OnSubmittedSuccessfully() { 551 void DeviceStatusCollector::OnSubmittedSuccessfully() {
488 TrimStoredActivityPeriods(last_reported_day_, duration_for_last_reported_day_, 552 TrimStoredActivityPeriods(last_reported_day_, duration_for_last_reported_day_,
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 location.SetDouble(kSpeed, position.speed); 613 location.SetDouble(kSpeed, position.speed);
550 location.SetString(kTimestamp, 614 location.SetString(kTimestamp,
551 base::Int64ToString(position.timestamp.ToInternalValue())); 615 base::Int64ToString(position.timestamp.ToInternalValue()));
552 local_state_->Set(prefs::kDeviceLocation, location); 616 local_state_->Set(prefs::kDeviceLocation, location);
553 } 617 }
554 618
555 ScheduleGeolocationUpdateRequest(); 619 ScheduleGeolocationUpdateRequest();
556 } 620 }
557 621
558 } // namespace policy 622 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698