Index: chrome/browser/chromeos/policy/device_status_collector.cc |
diff --git a/chrome/browser/chromeos/policy/device_status_collector.cc b/chrome/browser/chromeos/policy/device_status_collector.cc |
index fdf71837622a40c30c5dd91fe7ad5fa26240213d..9ae33ad2df23afaceeeab9d5e4fc58163c8454d3 100644 |
--- a/chrome/browser/chromeos/policy/device_status_collector.cc |
+++ b/chrome/browser/chromeos/policy/device_status_collector.cc |
@@ -25,9 +25,11 @@ |
#include "base/posix/eintr_wrapper.h" |
#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
+#include "base/strings/stringprintf.h" |
#include "base/sys_info.h" |
#include "base/task_runner_util.h" |
#include "base/values.h" |
+#include "base/version.h" |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h" |
#include "chrome/browser/chromeos/login/users/chrome_user_manager.h" |
@@ -36,6 +38,8 @@ |
#include "chrome/browser/chromeos/profiles/profile_helper.h" |
#include "chrome/browser/chromeos/settings/cros_settings.h" |
#include "chrome/common/pref_names.h" |
+#include "chromeos/dbus/dbus_thread_manager.h" |
+#include "chromeos/dbus/update_engine_client.h" |
#include "chromeos/disks/disk_mount_manager.h" |
#include "chromeos/network/device_state.h" |
#include "chromeos/network/network_handler.h" |
@@ -235,6 +239,16 @@ std::unique_ptr<policy::DeviceLocalAccount> GetCurrentKioskDeviceLocalAccount( |
return std::unique_ptr<policy::DeviceLocalAccount>(); |
} |
+base::Version GetPlatformVersion() { |
+ int32_t major_version; |
+ int32_t minor_version; |
+ int32_t bugfix_version; |
+ base::SysInfo::OperatingSystemVersionNumbers(&major_version, &minor_version, |
+ &bugfix_version); |
+ return base::Version(base::StringPrintf("%d.%d.%d", major_version, |
+ minor_version, bugfix_version)); |
+} |
+ |
} // namespace |
namespace policy { |
@@ -250,24 +264,12 @@ DeviceStatusCollector::DeviceStatusCollector( |
max_stored_future_activity_days_(kMaxStoredFutureActivityDays), |
local_state_(local_state), |
last_idle_check_(Time()), |
- last_reported_day_(0), |
- duration_for_last_reported_day_(0), |
- geolocation_update_in_progress_(false), |
volume_info_fetcher_(volume_info_fetcher), |
cpu_statistics_fetcher_(cpu_statistics_fetcher), |
cpu_temp_fetcher_(cpu_temp_fetcher), |
statistics_provider_(provider), |
- last_cpu_active_(0), |
- last_cpu_idle_(0), |
+ cros_settings_(chromeos::CrosSettings::Get()), |
location_update_requester_(location_update_requester), |
- report_version_info_(false), |
- report_activity_times_(false), |
- report_boot_mode_(false), |
- report_location_(false), |
- report_network_interfaces_(false), |
- report_users_(false), |
- report_hardware_status_(false), |
- report_session_status_(false), |
weak_factory_(this) { |
if (volume_info_fetcher_.is_null()) |
volume_info_fetcher_ = base::Bind(&GetVolumeInfo); |
@@ -286,9 +288,6 @@ DeviceStatusCollector::DeviceStatusCollector( |
TimeDelta::FromSeconds(kHardwareStatusSampleIntervalSeconds), |
this, &DeviceStatusCollector::SampleHardwareStatus); |
- cros_settings_ = chromeos::CrosSettings::Get(); |
- |
- |
// Watch for changes to the individual policies that control what the status |
// reports contain. |
base::Closure callback = |
@@ -310,6 +309,10 @@ DeviceStatusCollector::DeviceStatusCollector( |
chromeos::kReportDeviceHardwareStatus, callback); |
session_status_subscription_ = cros_settings_->AddSettingsObserver( |
chromeos::kReportDeviceSessionStatus, callback); |
+ os_update_status_subscription_ = cros_settings_->AddSettingsObserver( |
+ chromeos::kReportOsUpdateStatus, callback); |
+ running_kiosk_app_subscription_ = cros_settings_->AddSettingsObserver( |
+ chromeos::kReportRunningKioskApp, callback); |
// The last known location is persisted in local state. This makes location |
// information available immediately upon startup and avoids the need to |
@@ -435,6 +438,16 @@ void DeviceStatusCollector::UpdateReportingSettings() { |
// immediately instead of waiting for the sampling timer to fire. |
SampleHardwareStatus(); |
} |
+ |
+ // Os update status and running kiosk app reporting are disabled by default. |
+ if (!cros_settings_->GetBoolean(chromeos::kReportOsUpdateStatus, |
+ &report_os_update_status_)) { |
+ report_os_update_status_ = false; |
+ } |
+ if (!cros_settings_->GetBoolean(chromeos::kReportRunningKioskApp, |
+ &report_running_kiosk_app_)) { |
+ report_running_kiosk_app_ = false; |
+ } |
} |
Time DeviceStatusCollector::GetCurrentTime() { |
@@ -904,6 +917,85 @@ void DeviceStatusCollector::GetHardwareStatus( |
} |
} |
+bool DeviceStatusCollector::GetOsUpdateStatus( |
+ em::DeviceStatusReportRequest* status) { |
+ const base::Version platform_version(GetPlatformVersion()); |
+ if (!platform_version.IsValid()) |
+ return false; |
+ |
+ const std::string required_platform_version_string = |
+ chromeos::KioskAppManager::Get() |
+ ->GetAutoLaunchAppRequiredPlatformVersion(); |
+ if (required_platform_version_string.empty()) |
+ return false; |
+ |
+ const base::Version required_platfrom_version( |
+ required_platform_version_string); |
+ |
+ em::OsUpdateStatus* os_update_status = status->mutable_os_update_status(); |
+ os_update_status->set_new_required_platform_version( |
+ required_platfrom_version.GetString()); |
+ |
+ if (platform_version == required_platfrom_version) { |
+ os_update_status->set_update_status(em::OsUpdateStatus::OS_UP_TO_DATE); |
+ return true; |
+ } |
+ |
+ const chromeos::UpdateEngineClient::Status update_engine_status = |
+ chromeos::DBusThreadManager::Get() |
+ ->GetUpdateEngineClient() |
+ ->GetLastStatus(); |
+ if (update_engine_status.status == |
+ chromeos::UpdateEngineClient::UPDATE_STATUS_DOWNLOADING || |
+ update_engine_status.status == |
+ chromeos::UpdateEngineClient::UPDATE_STATUS_VERIFYING || |
+ update_engine_status.status == |
+ chromeos::UpdateEngineClient::UPDATE_STATUS_FINALIZING) { |
+ os_update_status->set_update_status( |
+ em::OsUpdateStatus::OS_IMAGE_DOWNLOAD_IN_PROGRESS); |
+ os_update_status->set_new_platform_version( |
+ update_engine_status.new_version); |
+ } else if (update_engine_status.status == |
+ chromeos::UpdateEngineClient::UPDATE_STATUS_UPDATED_NEED_REBOOT) { |
+ os_update_status->set_update_status( |
+ em::OsUpdateStatus::OS_UPDATE_NEED_REBOOT); |
+ } else { |
+ os_update_status->set_update_status( |
+ em::OsUpdateStatus::OS_IMAGE_DOWNLOAD_NOT_STARTED); |
+ } |
+ |
+ return true; |
+} |
+ |
+bool DeviceStatusCollector::GetRunningKioskApp( |
+ em::DeviceStatusReportRequest* status) { |
+ std::unique_ptr<const DeviceLocalAccount> account = |
+ GetAutoLaunchedKioskSessionInfo(); |
+ // Only generate running kiosk app reports if we are in an auto-launched kiosk |
+ // session. |
+ if (!account) |
+ return false; |
+ |
+ em::AppStatus* running_kiosk_app = status->mutable_running_kiosk_app(); |
+ running_kiosk_app->set_app_id(account->kiosk_app_id); |
+ |
+ const std::string app_version = GetAppVersion(account->kiosk_app_id); |
+ if (app_version.empty()) { |
+ DLOG(ERROR) << "Unable to get version for extension: " |
+ << account->kiosk_app_id; |
+ } else { |
+ running_kiosk_app->set_extension_version(app_version); |
+ } |
+ |
+ chromeos::KioskAppManager::App app_info; |
+ if (chromeos::KioskAppManager::Get()->GetApp(account->kiosk_app_id, |
+ &app_info)) { |
+ running_kiosk_app->set_required_platform_version( |
+ app_info.required_platform_version); |
+ } |
+ return true; |
+} |
+ |
bool DeviceStatusCollector::GetDeviceStatus( |
em::DeviceStatusReportRequest* status) { |
if (report_activity_times_) |
@@ -927,13 +1019,23 @@ bool DeviceStatusCollector::GetDeviceStatus( |
if (report_hardware_status_) |
GetHardwareStatus(status); |
+ bool os_update_status_reported = false; |
+ if (report_os_update_status_) |
+ os_update_status_reported = GetOsUpdateStatus(status); |
+ |
+ bool running_kiosk_app_reported = false; |
+ if (report_running_kiosk_app_) |
+ running_kiosk_app_reported = GetRunningKioskApp(status); |
+ |
return (report_activity_times_ || |
report_version_info_ || |
report_boot_mode_ || |
report_location_ || |
report_network_interfaces_ || |
report_users_ || |
- report_hardware_status_); |
+ report_hardware_status_ || |
+ os_update_status_reported || |
+ running_kiosk_app_reported); |
} |
bool DeviceStatusCollector::GetDeviceSessionStatus( |