// // Copyright (C) 2017 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "update_engine/update_manager/android_things_policy.h" #include <string> #include <vector> #include <base/logging.h> #include <base/time/time.h> #include "update_engine/update_manager/api_restricted_downloads_policy_impl.h" #include "update_engine/update_manager/enough_slots_ab_updates_policy_impl.h" #include "update_engine/update_manager/interactive_update_policy_impl.h" #include "update_engine/update_manager/official_build_check_policy_impl.h" using base::Time; using chromeos_update_engine::ErrorCode; using std::string; using std::vector; namespace chromeos_update_manager { const NextUpdateCheckPolicyConstants AndroidThingsPolicy::kNextUpdateCheckPolicyConstants = { .timeout_initial_interval = 7 * 60, .timeout_periodic_interval = 5 * 60 * 60, .timeout_max_backoff_interval = 26 * 60 * 60, .timeout_regular_fuzz = 10 * 60, .attempt_backoff_max_interval_in_days = 16, .attempt_backoff_fuzz_in_hours = 12, }; EvalStatus AndroidThingsPolicy::UpdateCheckAllowed( EvaluationContext* ec, State* state, string* error, UpdateCheckParams* result) const { // Set the default return values. result->updates_enabled = true; result->target_channel.clear(); result->target_version_prefix.clear(); result->rollback_allowed = false; result->rollback_allowed_milestones = -1; result->interactive = false; // Build a list of policies to consult. Note that each policy may modify the // result structure, even if it signals kContinue. EnoughSlotsAbUpdatesPolicyImpl enough_slots_ab_updates_policy; OnlyUpdateOfficialBuildsPolicyImpl only_update_official_builds_policy; InteractiveUpdatePolicyImpl interactive_update_policy; NextUpdateCheckTimePolicyImpl next_update_check_time_policy( kNextUpdateCheckPolicyConstants); vector<Policy const*> policies_to_consult = { // Do not perform any updates if there are not enough slots to do // A/B updates &enough_slots_ab_updates_policy, // Check to see if an interactive update was requested. &interactive_update_policy, // Unofficial builds should not perform periodic update checks. &only_update_official_builds_policy, // Ensure that periodic update checks are timed properly. &next_update_check_time_policy, }; // Now that the list of policy implementations, and the order to consult them, // as been setup, do that. If none of the policies make a definitive // decisions about whether or not to check for updates, then allow the update // check to happen. EvalStatus status = ConsultPolicies(policies_to_consult, &Policy::UpdateCheckAllowed, ec, state, error, result); if (status != EvalStatus::kContinue) { return status; } else { // It is time to check for an update. LOG(INFO) << "Allowing update check."; return EvalStatus::kSucceeded; } } // Uses the |UpdateRestrictions| to determine if the download and apply can // occur at this time. EvalStatus AndroidThingsPolicy::UpdateCanBeApplied( EvaluationContext* ec, State* state, string* error, ErrorCode* result, chromeos_update_engine::InstallPlan* install_plan) const { // Build a list of policies to consult. Note that each policy may modify the // result structure, even if it signals kContinue. ApiRestrictedDownloadsPolicyImpl api_restricted_downloads_policy; vector<Policy const*> policies_to_consult = { // Do not apply the update if all updates are restricted by the API. &api_restricted_downloads_policy, }; // Now that the list of policy implementations, and the order to consult them, // as been setup, do that. If none of the policies make a definitive // decisions about whether or not to check for updates, then allow the update // check to happen. EvalStatus status = ConsultPolicies(policies_to_consult, &Policy::UpdateCanBeApplied, ec, state, error, result, install_plan); if (EvalStatus::kContinue != status) { return status; } else { // The update can proceed. LOG(INFO) << "Allowing update to be applied."; *result = ErrorCode::kSuccess; return EvalStatus::kSucceeded; } } // Always returns |EvalStatus::kSucceeded| EvalStatus AndroidThingsPolicy::UpdateCanStart(EvaluationContext* ec, State* state, string* error, UpdateDownloadParams* result, UpdateState update_state) const { // Update is good to go. result->update_can_start = true; return EvalStatus::kSucceeded; } // Always returns |EvalStatus::kSucceeded| EvalStatus AndroidThingsPolicy::UpdateDownloadAllowed(EvaluationContext* ec, State* state, string* error, bool* result) const { // By default, we allow updates. *result = true; return EvalStatus::kSucceeded; } // P2P is always disabled. Returns |result|==|false| and // |EvalStatus::kSucceeded| EvalStatus AndroidThingsPolicy::P2PEnabled(EvaluationContext* ec, State* state, string* error, bool* result) const { *result = false; return EvalStatus::kSucceeded; } // This will return immediately with |EvalStatus::kSucceeded| and set // |result|==|false| EvalStatus AndroidThingsPolicy::P2PEnabledChanged(EvaluationContext* ec, State* state, string* error, bool* result, bool prev_result) const { *result = false; return EvalStatus::kSucceeded; } } // namespace chromeos_update_manager