default_policy.cc revision 78ecbfc254c574e52cfe63310a801381a0035c43
1a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// Use of this source code is governed by a BSD-style license that can be
3a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// found in the LICENSE file.
4a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
5a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold#include "update_engine/update_manager/default_policy.h"
6a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
7a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnoldnamespace {
8a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
9a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// A fixed minimum interval between consecutive allowed update checks. This
10a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// needs to be long enough to prevent busywork and/or DDoS attacks on Omaha, but
11a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// at the same time short enough to allow the machine to update itself
12a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold// reasonably soon.
13a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnoldconst int kCheckIntervalInSeconds = 15 * 60;
14a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
15a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold}  // namespace
16a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
17a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnoldnamespace chromeos_update_manager {
18a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
19a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad ArnoldDefaultPolicy::DefaultPolicy(chromeos_update_engine::ClockInterface* clock)
20a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold    : clock_(clock), aux_state_(new DefaultPolicyState()) {}
21a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
22a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad ArnoldEvalStatus DefaultPolicy::UpdateCheckAllowed(
23a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold    EvaluationContext* ec, State* state, std::string* error,
24a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold    UpdateCheckParams* result) const {
25a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  result->updates_enabled = true;
26a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  result->target_channel.clear();
27d4b303246eae1fcd0b4820657f1d787e8238146fGilad Arnold  result->target_version_prefix.clear();
2844dc3bfd45eaddc1e7b586f8839babe4540418b5Gilad Arnold  result->is_interactive = false;
29a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
30a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  // Ensure that the minimum interval is set. If there's no clock, this defaults
31a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  // to always allowing the update.
32a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  if (!aux_state_->IsLastCheckAllowedTimeSet() ||
33a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold      ec->IsMonotonicTimeGreaterThan(
34a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold          aux_state_->last_check_allowed_time() +
35a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold          base::TimeDelta::FromSeconds(kCheckIntervalInSeconds))) {
36a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold    if (clock_)
37a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold      aux_state_->set_last_check_allowed_time(clock_->GetMonotonicTime());
38a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold    return EvalStatus::kSucceeded;
39a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  }
40a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
41a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold  return EvalStatus::kAskMeAgainLater;
42a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold}
43a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold
44dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad ArnoldEvalStatus DefaultPolicy::UpdateCanStart(
45dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    EvaluationContext* ec,
46dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    State* state,
47dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    std::string* error,
48dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    UpdateDownloadParams* result,
49d78caf9baf2026a356130f4754af2c504f423945Gilad Arnold    const UpdateState update_state) const {
50dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->update_can_start = true;
51dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->cannot_start_reason = UpdateCannotStartReason::kUndefined;
52dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->download_url_idx = 0;
5314a9e70709b4cda5afc97ac6219bc660810b2077Gilad Arnold  result->download_url_allowed = true;
54dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->download_url_num_errors = 0;
55b2f9919a0e4a77dd885625cb52ff7322974bd338Gilad Arnold  result->p2p_downloading_allowed = false;
56b2f9919a0e4a77dd885625cb52ff7322974bd338Gilad Arnold  result->p2p_sharing_allowed = false;
57dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->do_increment_failures = false;
58dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->backoff_expiry = base::Time();
59dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->scatter_wait_period = base::TimeDelta();
60dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  result->scatter_check_threshold = 0;
61dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  return EvalStatus::kSucceeded;
62dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold}
63dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold
64dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad ArnoldEvalStatus DefaultPolicy::UpdateDownloadAllowed(
65dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    EvaluationContext* ec,
66dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    State* state,
67dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    std::string* error,
68dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold    bool* result) const {
69dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  *result = true;
70dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold  return EvalStatus::kSucceeded;
71dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold}
72dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold
7378ecbfc254c574e52cfe63310a801381a0035c43Gilad ArnoldEvalStatus DefaultPolicy::P2PEnabled(
7478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    EvaluationContext* ec,
7578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    State* state,
7678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    std::string* error,
7778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    bool* result) const {
7878ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  *result = false;
7978ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  return EvalStatus::kSucceeded;
8078ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold}
8178ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold
8278ecbfc254c574e52cfe63310a801381a0035c43Gilad ArnoldEvalStatus DefaultPolicy::P2PEnabledChanged(
8378ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    EvaluationContext* ec,
8478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    State* state,
8578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    std::string* error,
8678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    bool* result,
8778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold    bool prev_result) const {
8878ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  // This policy will always prohibit P2P, so this is signaling to the caller
8978ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  // that the decision is final (because the current value is the same as the
9078ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  // previous one) and there's no need to issue another call.
9178ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  *result = false;
9278ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold  return EvalStatus::kSucceeded;
9378ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold}
9478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold
95a23e408368ad34e21ee90ebd0dcb55cd03417d22Gilad Arnold}  // namespace chromeos_update_manager
96