1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2014 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 16c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 1748415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#ifndef UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_ 1848415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#define UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_ 1948415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold 2048415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#include <string> 21c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 22f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold#include <base/time/time.h> 230d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo#include <gtest/gtest_prod.h> // for FRIEND_TEST 240d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo 2563784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/policy.h" 2663784a578dd26880454d70797519358a2326291bAlex Deymo#include "update_engine/update_manager/prng.h" 27c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 2863784a578dd26880454d70797519358a2326291bAlex Deymonamespace chromeos_update_manager { 29c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 30dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold// Output information from UpdateBackoffAndDownloadUrl. 31dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnoldstruct UpdateBackoffAndDownloadUrlResult { 32dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // Whether the failed attempt count (maintained by the caller) needs to be 33dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // incremented. 34dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold bool do_increment_failures; 35dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // The current backoff expiry. Null if backoff is not in effect. 36dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold base::Time backoff_expiry; 37dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // The new URL index to use and number of download errors associated with it. 38dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // Significant iff |do_increment_failures| is false and |backoff_expiry| is 39dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // null. Negative value means no usable URL was found. 40b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold int url_idx; 41dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold int url_num_errors; 42b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold}; 43b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold 44dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold// Parameters for update scattering, as returned by UpdateScattering. 45f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnoldstruct UpdateScatteringResult { 46f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold bool is_scattering; 47f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold base::TimeDelta wait_period; 48f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold int check_threshold; 49f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold}; 50f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 51c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo// ChromeOSPolicy implements the policy-related logic used in ChromeOS. 52c705cc86983dd46df4261ce692cb7558a515e282Alex Deymoclass ChromeOSPolicy : public Policy { 53c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo public: 54c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo ChromeOSPolicy() {} 55610277efc6f7e5239158dfa4bb3b1021804326e0Alex Deymo ~ChromeOSPolicy() override {} 56c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 57c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo // Policy overrides. 58157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateCheckAllowed( 590d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo EvaluationContext* ec, State* state, std::string* error, 600d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo UpdateCheckParams* result) const override; 61af2f6ae066a8117113f6ff3d112c8d00eb5d8c67Gilad Arnold 62157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateCanStart( 63f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold EvaluationContext* ec, 64f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold State* state, 65f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold std::string* error, 6642f253b5318dbe6d0ecf48f7f9a639363fa253e2Gilad Arnold UpdateDownloadParams* result, 67d78caf9baf2026a356130f4754af2c504f423945Gilad Arnold UpdateState update_state) const override; 68c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 69157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko EvalStatus UpdateDownloadAllowed( 700adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold EvaluationContext* ec, 710adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold State* state, 720adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold std::string* error, 730adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold bool* result) const override; 740adbc94a889cc2d1558dabf0c70ac3be8853051fGilad Arnold 7578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold EvalStatus P2PEnabled( 7678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold EvaluationContext* ec, 7778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold State* state, 7878ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold std::string* error, 7978ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold bool* result) const override; 8078ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold 8178ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold EvalStatus P2PEnabledChanged( 8278ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold EvaluationContext* ec, 8378ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold State* state, 8478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold std::string* error, 8578ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold bool* result, 8678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold bool prev_result) const override; 8778ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold 88b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold protected: 89b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // Policy override. 90157fe307f162d13f53e7f98f6e2da7c60c0ff001Alex Vakulenko std::string PolicyName() const override { return "ChromeOSPolicy"; } 91b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold 92c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo private: 9363784a578dd26880454d70797519358a2326291bAlex Deymo friend class UmChromeOSPolicyTest; 9463784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 950d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo FirstCheckIsAtMostInitialIntervalAfterStart); 9638b1402462bd15025a53bea993ca3d93cdf0d8deGilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckBaseIntervalAndFuzz); 9738b1402462bd15025a53bea993ca3d93cdf0d8deGilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckBackoffIntervalAndFuzz); 98a0258a557d36ff78eacdacd39bdc88c5e6c1056eGilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, RecurringCheckServerDictatedPollInterval); 9963784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, ExponentialBackoffIsCapped); 10063784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForTheTimeout); 101a1eabcdc93d118146639139257c2f5ccc3ffb061Gilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, UpdateCheckAllowedWaitsForOOBE); 10263784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 103f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateCanStartNotAllowedScatteringNewWaitPeriodApplies); 10463784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 105f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateCanStartNotAllowedScatteringPrevWaitPeriodStillApplies); 10663784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 107f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateCanStartNotAllowedScatteringNewCountThresholdApplies); 10863784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 109f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateCanStartNotAllowedScatteringPrevCountThresholdStillApplies); 11063784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, UpdateCanStartAllowedScatteringSatisfied); 11163784a578dd26880454d70797519358a2326291bAlex Deymo FRIEND_TEST(UmChromeOSPolicyTest, 112f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateCanStartAllowedInteractivePreventsScattering); 113349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, 11478ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold UpdateCanStartAllowedP2PDownloadingBlockedDueToNumAttempts); 115349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold FRIEND_TEST(UmChromeOSPolicyTest, 11678ecbfc254c574e52cfe63310a801381a0035c43Gilad Arnold UpdateCanStartAllowedP2PDownloadingBlockedDueToAttemptsPeriod); 117f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 118f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // Auxiliary constant (zero by default). 119f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold const base::TimeDelta kZeroInterval; 1200d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo 1210d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // Default update check timeout interval/fuzz values used to compute the 1220d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // NextUpdateCheckTime(), in seconds. Actual fuzz is within +/- half of the 1230d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // indicated value. 124a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold static const int kTimeoutInitialInterval; 125a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold static const int kTimeoutPeriodicInterval; 126a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold static const int kTimeoutMaxBackoffInterval; 127a2e8eaa743e04f9168aa7c64e88c2182d2ac4048Gilad Arnold static const int kTimeoutRegularFuzz; 1280d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo 129dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // Maximum update attempt backoff interval and fuzz. 130dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold static const int kAttemptBackoffMaxIntervalInDays; 131dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold static const int kAttemptBackoffFuzzInHours; 132dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold 133349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold // Maximum number of times we'll allow using P2P for the same update payload. 134349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold static const int kMaxP2PAttempts; 135349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold // Maximum period of time allowed for download a payload via P2P, in seconds. 136349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold static const int kMaxP2PAttemptsPeriodInSeconds; 137349ac835564382091a80be19f0b9929ead5c55e0Gilad Arnold 1380d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // A private policy implementation returning the wallclock timestamp when 1390d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // the next update check should happen. 140a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold // TODO(garnold) We should probably change that to infer a monotonic 141a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold // timestamp, which will make the update check intervals more resilient to 142a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold // clock skews. Might require switching some of the variables exported by the 143a65fced5f4c2b551616b26ee90a800b44090735fGilad Arnold // UpdaterProvider to report monotonic time, as well. 1440d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo EvalStatus NextUpdateCheckTime(EvaluationContext* ec, State* state, 1450d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo std::string* error, 1460d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo base::Time* next_update_check) const; 1470d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo 1480d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // Returns a TimeDelta based on the provided |interval| seconds +/- half 1490d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // |fuzz| seconds. The return value is guaranteed to be a non-negative 1500d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo // TimeDelta. 1510d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo static base::TimeDelta FuzzedInterval(PRNG* prng, int interval, int fuzz); 1520d11c602430f1d6ba474bdf35317197963083e7cAlex Deymo 153dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // A private policy for determining backoff and the download URL to use. 154dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // Within |update_state|, |backoff_expiry| and |is_backoff_disabled| are used 155dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // for determining whether backoff is still in effect; if not, 156dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // |download_errors| is scanned past |failures_last_updated|, and a new 157dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // download URL from |download_urls| is found and written to |result->url_idx| 158dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // (-1 means no usable URL exists); |download_errors_max| determines the 159dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // maximum number of attempts per URL, according to the Omaha response. If an 160dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // update failure is identified then |result->do_increment_failures| is set to 161dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // true; if backoff is enabled, a new backoff period is computed (from the 162dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // time of failure) based on |num_failures|. Otherwise, backoff expiry is 163dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // nullified, indicating that no backoff is in effect. 164dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // 165dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // If backing off but the previous backoff expiry is unchanged, returns 166dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // |EvalStatus::kAskMeAgainLater|. Otherwise: 167dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // 168dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // * If backing off with a new expiry time, then |result->backoff_expiry| is 169dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // set to this time. 170b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // 171dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // * Else, |result->backoff_expiry| is set to null, indicating that no backoff 172dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // is in effect. 173dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // 174dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // In any of these cases, returns |EvalStatus::kSucceeded|. If an error 175dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold // occurred, returns |EvalStatus::kFailed|. 176dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold EvalStatus UpdateBackoffAndDownloadUrl( 177dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold EvaluationContext* ec, State* state, std::string* error, 178dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold UpdateBackoffAndDownloadUrlResult* result, 179dc4bb268eb6e6ddcd087d5eccfd88c8e92252920Gilad Arnold const UpdateState& update_state) const; 180b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold 181f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // A private policy for checking whether scattering is due. Writes in |result| 182f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // the decision as to whether or not to scatter; a wallclock-based scatter 183f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // wait period, which ranges from zero (do not wait) and no greater than the 184f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // current scatter factor provided by the device policy (if available) or the 185f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // maximum wait period determined by Omaha; and an update check-based 186f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold // threshold between zero (no threshold) and the maximum number determined by 187b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // the update engine. Within |update_state|, |scatter_wait_period| should 188b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // contain the last scattering period returned by this function, or zero if no 189b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // wait period is known; |scatter_check_threshold| is the last update check 190b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // threshold, or zero if no such threshold is known. If not scattering, or if 191b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // any of the scattering values has changed, returns |EvalStatus::kSucceeded|; 192b3b05446d3ef9620c90084e11cd1ae4eca20f4a2Gilad Arnold // otherwise, |EvalStatus::kAskMeAgainLater|. 193f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold EvalStatus UpdateScattering(EvaluationContext* ec, State* state, 194f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold std::string* error, 195f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold UpdateScatteringResult* result, 196f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold const UpdateState& update_state) const; 197f62a4b81b66dfcb848191efe8470646a0c986f08Gilad Arnold 198c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo DISALLOW_COPY_AND_ASSIGN(ChromeOSPolicy); 199c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo}; 200c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 20163784a578dd26880454d70797519358a2326291bAlex Deymo} // namespace chromeos_update_manager 202c705cc86983dd46df4261ce692cb7558a515e282Alex Deymo 20348415f1f6c6c356bfa9ac85b76d8ebcf053f7157Gilad Arnold#endif // UPDATE_ENGINE_UPDATE_MANAGER_CHROMEOS_POLICY_H_ 204