| // Copyright (c) 2014 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "update_engine/update_manager/real_device_policy_provider.h" |
| |
| #include <stdint.h> |
| |
| #include <base/logging.h> |
| #include <base/time/time.h> |
| #include <policy/device_policy.h> |
| |
| #include "update_engine/update_manager/generic_variables.h" |
| #include "update_engine/update_manager/real_shill_provider.h" |
| #include "update_engine/utils.h" |
| |
| using base::TimeDelta; |
| using policy::DevicePolicy; |
| using std::set; |
| using std::string; |
| |
| namespace { |
| |
| const int kDevicePolicyRefreshRateInMinutes = 60; |
| |
| } // namespace |
| |
| namespace chromeos_update_manager { |
| |
| RealDevicePolicyProvider::~RealDevicePolicyProvider() { |
| CancelMainLoopEvent(scheduled_refresh_); |
| } |
| |
| bool RealDevicePolicyProvider::Init() { |
| CHECK(policy_provider_ != nullptr); |
| |
| // On Init() we try to get the device policy and keep updating it. |
| RefreshDevicePolicyAndReschedule(); |
| |
| return true; |
| } |
| |
| void RealDevicePolicyProvider::RefreshDevicePolicyAndReschedule() { |
| RefreshDevicePolicy(); |
| scheduled_refresh_ = RunFromMainLoopAfterTimeout( |
| base::Bind(&RealDevicePolicyProvider::RefreshDevicePolicyAndReschedule, |
| base::Unretained(this)), |
| TimeDelta::FromMinutes(kDevicePolicyRefreshRateInMinutes)); |
| } |
| |
| template<typename T> |
| void RealDevicePolicyProvider::UpdateVariable( |
| AsyncCopyVariable<T>* var, |
| bool (policy::DevicePolicy::*getter_method)(T*) const) { |
| T new_value; |
| if (policy_provider_->device_policy_is_loaded() && |
| (policy_provider_->GetDevicePolicy().*getter_method)(&new_value)) { |
| var->SetValue(new_value); |
| } else { |
| var->UnsetValue(); |
| } |
| } |
| |
| template<typename T> |
| void RealDevicePolicyProvider::UpdateVariable( |
| AsyncCopyVariable<T>* var, |
| bool (RealDevicePolicyProvider::*getter_method)(T*) const) { |
| T new_value; |
| if (policy_provider_->device_policy_is_loaded() && |
| (this->*getter_method)(&new_value)) { |
| var->SetValue(new_value); |
| } else { |
| var->UnsetValue(); |
| } |
| } |
| |
| bool RealDevicePolicyProvider::ConvertAllowedConnectionTypesForUpdate( |
| set<ConnectionType>* allowed_types) const { |
| set<string> allowed_types_str; |
| if (!policy_provider_->GetDevicePolicy() |
| .GetAllowedConnectionTypesForUpdate(&allowed_types_str)) { |
| return false; |
| } |
| allowed_types->clear(); |
| for (auto& type_str : allowed_types_str) { |
| ConnectionType type = |
| RealShillProvider::ParseConnectionType(type_str.c_str()); |
| if (type != ConnectionType::kUnknown) { |
| allowed_types->insert(type); |
| } else { |
| LOG(WARNING) << "Policy includes unknown connection type: " << type_str; |
| } |
| } |
| return true; |
| } |
| |
| bool RealDevicePolicyProvider::ConvertScatterFactor( |
| base::TimeDelta* scatter_factor) const { |
| int64_t scatter_factor_in_seconds; |
| if (!policy_provider_->GetDevicePolicy().GetScatterFactorInSeconds( |
| &scatter_factor_in_seconds)) { |
| return false; |
| } |
| if (scatter_factor_in_seconds < 0) { |
| LOG(WARNING) << "Ignoring negative scatter factor: " |
| << scatter_factor_in_seconds; |
| return false; |
| } |
| *scatter_factor = base::TimeDelta::FromSeconds(scatter_factor_in_seconds); |
| return true; |
| } |
| |
| void RealDevicePolicyProvider::RefreshDevicePolicy() { |
| if (!policy_provider_->Reload()) { |
| LOG(INFO) << "No device policies/settings present."; |
| } |
| |
| var_device_policy_is_loaded_.SetValue( |
| policy_provider_->device_policy_is_loaded()); |
| |
| UpdateVariable(&var_release_channel_, &DevicePolicy::GetReleaseChannel); |
| UpdateVariable(&var_release_channel_delegated_, |
| &DevicePolicy::GetReleaseChannelDelegated); |
| UpdateVariable(&var_update_disabled_, &DevicePolicy::GetUpdateDisabled); |
| UpdateVariable(&var_target_version_prefix_, |
| &DevicePolicy::GetTargetVersionPrefix); |
| UpdateVariable(&var_scatter_factor_, |
| &RealDevicePolicyProvider::ConvertScatterFactor); |
| UpdateVariable( |
| &var_allowed_connection_types_for_update_, |
| &RealDevicePolicyProvider::ConvertAllowedConnectionTypesForUpdate); |
| UpdateVariable(&var_owner_, &DevicePolicy::GetOwner); |
| UpdateVariable(&var_http_downloads_enabled_, |
| &DevicePolicy::GetHttpDownloadsEnabled); |
| UpdateVariable(&var_au_p2p_enabled_, &DevicePolicy::GetAuP2PEnabled); |
| } |
| |
| } // namespace chromeos_update_manager |